パートナーシップ
TwelveLabsとLanceDBを使用したセマンティックビデオ推薦システムの構築

ジェームズ・リー
開発者は、Twelve LabsのEmbed API、LanceDB、およびGenevaを組み合わせることで、タグやキーワードではなく意味に基づいてコンテンツをマッチングするセマンティックビデオ推薦システムを構築できます。これには、Marengo 2.7によるベクトルの生成、LanceDBでのベクトル保存、そしてGenevaとRayによる分散パイプラインのスケーリングが含まれます。
開発者は、Twelve LabsのEmbed API、LanceDB、およびGenevaを組み合わせることで、タグやキーワードではなく意味に基づいてコンテンツをマッチングするセマンティックビデオ推薦システムを構築できます。これには、Marengo 2.7によるベクトルの生成、LanceDBでのベクトル保存、そしてGenevaとRayによる分散パイプラインのスケーリングが含まれます。

この記事の内容
ニュースレターに登録する
ニュースレターに登録する
ビデオ理解に関する最新の技術進歩、チュートリアル、業界の動向をお届けします
ビデオ理解に関する最新の技術進歩、チュートリアル、業界の動向をお届けします
AIを活用してビデオを検索、分析、探索します。
2025/09/01
5分
記事へのリンクをコピー
注意: この投稿の例では、読みやすさを優先してトリミングされたサンプルコードを使用しています。実行可能なノートブックで完全なコードを確認したい場合は、こちらからダウンロードできます。
ほとんどのレコメンデーションシステムは、タイトル、タグ、文字起こしなどのメタデータに依存しています。そのアプローチも有効ですが、ビデオの内部で実際に何が起きているかを見落としてしまいます。システム自体が視覚的および音声的なコンテンツを直接理解できたらどうでしょうか?
この記事では、TwelveLabs、LanceDB、そしてLanceDBのフィーチャーエンジニアリングパッケージであるGenevaを使用して、セマンティックレコメンデーションエンジンを構築する方法を紹介します。このシナリオでは、TwelveLabsがビデオの意味を表す強力なマルチモーダル埋め込みを提供します。LanceDBは、これらの埋め込みをメタデータとともに保存し、シンプルなPython APIを介して高速なベクトル検索を提供します。GenevaはLanceDBを基盤とし、Rayを使用してパイプラインをクラスター間でスケールさせます。これにより、ローカルのノートパソコンでも何百台ものマシンでも、まったく同じコードを実行できます。
なぜTwelveLabs、LanceDB、そしてGenevaなのか?
TwelveLabsを使用すると、ストーリーの流れ、雰囲気、アクションを捉える方法でビデオを埋め込むことができます。「夕暮れ時に波に乗るサーファー」のようなクエリで、そのようにクリップにタグ付けされていなくても、一致するビデオを返すことができます。
LanceDBは、Apache Arrowをベースに構築されたベクトルデータベースです。これには3つの大きな強みがあります。
開発者にとって自然に感じられるシンプルなPython API。
外部サービスを必要とせず、ローカルに動作する組み込み型データベース。
ネイティブなマルチモーダルサポートにより、ビデオ、画像、テキスト、およびベクトルを同様に簡単に保存できます。
GenevaはLanceDB上に構築されており、分散データ処理機能を追加します。その下で動作するRayにより、多くのワーカーにまたがって埋め込みの生成とクエリをスケーリングします。
この組み合わせにより、インジェスト、埋め込み、保存、検索、およびスケールというパイプライン全体がカバーされます。
ビデオの読み込みとマテリアライズ
まず、HuggingFaceのFineVideoと呼ばれるサンプルデータセットから始めます。ローダーは、生のビデオバイトに加えて、キャプション、タイトル、ID、およびメタデータを含むRecordBatchを作成します。
def load_videos(): dataset = load_dataset("HuggingFaceFV/finevideo", split="train", streaming=True) batch = [] processed = 0 for row in dataset: if processed >= 10: break video_bytes = row['mp4'] json_metadata = row['json'] batch.append({ "video": video_bytes, "caption": json_metadata.get("youtube_title", "No description"), "youtube_title": json_metadata.get("youtube_title", ""), "video_id": f"video_{processed}", "duration": json_metadata.get("duration_seconds", 0), "resolution": json_metadata.get("resolution", "") }) processed += 1 return pa.RecordBatch.from_pylist(batch)
これにより、生のビデオバイトと人間が読めるメタデータの両方を保持するテーブルが作成されます。この利点は、ビデオデータと構造化データを分離する必要がないことです。LanceDBはこれら両方をシームレスに処理します。
Genevaを使用すると、このデータセットをLanceDBをバックエンドとするテーブルにマテリアライズできます。
db = geneva.connect("/content/quickstart/") tbl = db.create_table("videos", load_videos(), mode="overwrite")
この時点で、ビデオの組み込みデータベースが完成しました。埋め込みが追加される前であっても、この構造により、クエリ、変換、またはビジュアライゼーションを簡単に実行できます。
TwelveLabsによるビデオの埋め込み
次のステップでは、TwelveLabsのMarengo 2.7モデルを使って埋め込みを生成します。このモデルは、ビデオの意味を表す1024次元のベクトルを出力します。ビデオ全体の埋め込みを取得するために、「clip」スコープと「video」スコープの両方を使用します。
task = client.embed.tasks.create( model_name="Marengo-retrieval-2.7", video_file=video_file, video_embedding_scope=["clip", "video"] ) status = client.embed.tasks.wait_for_done(task.id) result = client.embed.tasks.retrieve(task.id) video_segments = [seg for seg in result.video_embedding.segments if seg.embedding_scope == "video"] embedding_array = np.array(video_segments[0].float_, dtype=np.float32)
ここでは、clipスコープとvideoスコープの両方を要求し、ビデオの全コンテキストを確実にキャプチャします。ベクトルは視覚情報や音情報のパターンを捉えるため、メタデータがまばらであっても、同様のアクティビティが近くにクラスタリングされます。
Genevaを使用すると、埋め込みはテーブルの別の列になります。
tbl.add_columns({"embedding": GenVideoEmbeddings( twelve_labs_api_key=os.environ['TWELVE_LABS_API_KEY'] )}) tbl.backfill("embedding", concurrency=1)
backfill(バックフィル)を呼び出すことで、すべての行を処理し埋め込みを計算します。開発環境では同時実行数を1に設定しますが、本番環境ではGenevaを高い同時実行数で実行し、Rayによってワーカー間で並列処理させることができます。これが、少数のビデオから数百万の規模へとスケールさせる方法です。
LanceDBによる検索
埋め込みが保存されると、LanceDBはベクトル検索のためのクリーンなAPIを提供します。クエリはプレーンテキストにすることができ、それをTwelveLabsが埋め込んだ後に、LanceDB内のビデオベクトルと比較します。
query = "educational tutorial" query_result = client.embed.create( model_name="Marengo-retrieval-2.7", text=query ) qvec = np.array(query_result.text_embedding.segments[0].float_) lance_db = lancedb.connect("/content/quickstart/") lance_tbl = lance_db.open_table("videos") results = (lance_tbl .search(qvec) .metric("cosine") .limit(3) .to_pandas())
LanceDBはArrowネイティブであるため、結果はpandasのDataFrameとして返されます。これにより、分析やWebアプリケーションとの統合が非常に簡単になります。
Pegasusによる要約
ベクトルのマッチングだけでは不十分な場合もあります。TwelveLabsはビデオの要約を生成するPegasusも提供しています。これらの要約をLanceDBの別の列として追加し、検索結果をより分かりやすくすることができます。
index = client.indexes.create( index_name=f"lancedb_demo_{int(time.time())}", models=[{"model_name": "pegasus1.2", "model_options": ["visual", "audio"]}] )
このステップにより、各推奨事項とともに人間の読める短い要約を表示できるようになり、ユーザーエクスペリエンスが向上します。
GenevaとRayによるスケーリング
Genevaがない場合、取り込みや埋め込みの処理を手動で管理する必要があります。これは十数本のビデオであれば問題ありませんが、規模が大きくなるとすぐに対応できなくなります。Genevaは宣言的なパイプラインを提供し、Rayがそれらを並列に実行します。
懸念事項 | LanceDBのみ | GenevaとRayを使用 |
インジェスト | 手動のローダー | 宣言的パイプライン |
埋め込み | シーケンシャル(順次処理) | 多数のワーカー間で並列処理 |
ストレージ | ローカルテーブル | 分散LanceDBテーブル |
MLおよび分析 | カスタムスクリプト | 組み込みの分散UDF(ユーザ定義関数) |
つまり、ローカルでプロトタイプを作成し、ワークフローを書き直すことなくクラスター上の本番環境へ移行することができます。
まとめ
TwelveLabs、LanceDB、およびGenevaを組み合わせることで、ビデオコンテンツのコンテキストを直接理解するレコメンデーションシステムを構築できます。
TwelveLabsは、キーワードを超えて意味を捉える埋め込みと要約を提供します。
LanceDBは使いやすく、組み込みデータベースとして動作し、ビデオ、画像、テキスト、ベクトルなどのマルチモーダルデータを保存します。
Rayを備えたGenevaを使用すると、同じコードを使用してローカル開発から分散クラスターにスケールアップできます。
このスタックは、大規模にセマンティックなビデオレコメンデーションを必要とするメディアプラットフォーム、教育用アプリ、または分析ツールにとって、実用的な基盤となります。
試してみる
TwelveLabs プレイグラウンド – APIキーに登録して、すぐにビデオ埋め込みの生成を開始しましょう: https://playground.twelvelabs.io
LanceDB クイックスタート – LanceDBをローカルにインストールし、Pythonで最初のベクトル検索を試してみましょう: https://lancedb.com/docs/quickstart
Geneva ドキュメント – パイプラインをスケールし、Rayを使用して分散埋め込みジョブを実行する方法を学びましょう: https://lancedb.com/docs/geneva
このチュートリアルの完全なノートブック – すべての詳細が含まれた、完全に動作するコードを確認できます: https://colab.research.google.com/drive/1jZiMT1QFYGvPgrps2Vpge9CtlRKFY1L0?usp=sharing#scrollTo=046o2pt62413
注意: この投稿の例では、読みやすさを優先してトリミングされたサンプルコードを使用しています。実行可能なノートブックで完全なコードを確認したい場合は、こちらからダウンロードできます。
ほとんどのレコメンデーションシステムは、タイトル、タグ、文字起こしなどのメタデータに依存しています。そのアプローチも有効ですが、ビデオの内部で実際に何が起きているかを見落としてしまいます。システム自体が視覚的および音声的なコンテンツを直接理解できたらどうでしょうか?
この記事では、TwelveLabs、LanceDB、そしてLanceDBのフィーチャーエンジニアリングパッケージであるGenevaを使用して、セマンティックレコメンデーションエンジンを構築する方法を紹介します。このシナリオでは、TwelveLabsがビデオの意味を表す強力なマルチモーダル埋め込みを提供します。LanceDBは、これらの埋め込みをメタデータとともに保存し、シンプルなPython APIを介して高速なベクトル検索を提供します。GenevaはLanceDBを基盤とし、Rayを使用してパイプラインをクラスター間でスケールさせます。これにより、ローカルのノートパソコンでも何百台ものマシンでも、まったく同じコードを実行できます。
なぜTwelveLabs、LanceDB、そしてGenevaなのか?
TwelveLabsを使用すると、ストーリーの流れ、雰囲気、アクションを捉える方法でビデオを埋め込むことができます。「夕暮れ時に波に乗るサーファー」のようなクエリで、そのようにクリップにタグ付けされていなくても、一致するビデオを返すことができます。
LanceDBは、Apache Arrowをベースに構築されたベクトルデータベースです。これには3つの大きな強みがあります。
開発者にとって自然に感じられるシンプルなPython API。
外部サービスを必要とせず、ローカルに動作する組み込み型データベース。
ネイティブなマルチモーダルサポートにより、ビデオ、画像、テキスト、およびベクトルを同様に簡単に保存できます。
GenevaはLanceDB上に構築されており、分散データ処理機能を追加します。その下で動作するRayにより、多くのワーカーにまたがって埋め込みの生成とクエリをスケーリングします。
この組み合わせにより、インジェスト、埋め込み、保存、検索、およびスケールというパイプライン全体がカバーされます。
ビデオの読み込みとマテリアライズ
まず、HuggingFaceのFineVideoと呼ばれるサンプルデータセットから始めます。ローダーは、生のビデオバイトに加えて、キャプション、タイトル、ID、およびメタデータを含むRecordBatchを作成します。
def load_videos(): dataset = load_dataset("HuggingFaceFV/finevideo", split="train", streaming=True) batch = [] processed = 0 for row in dataset: if processed >= 10: break video_bytes = row['mp4'] json_metadata = row['json'] batch.append({ "video": video_bytes, "caption": json_metadata.get("youtube_title", "No description"), "youtube_title": json_metadata.get("youtube_title", ""), "video_id": f"video_{processed}", "duration": json_metadata.get("duration_seconds", 0), "resolution": json_metadata.get("resolution", "") }) processed += 1 return pa.RecordBatch.from_pylist(batch)
これにより、生のビデオバイトと人間が読めるメタデータの両方を保持するテーブルが作成されます。この利点は、ビデオデータと構造化データを分離する必要がないことです。LanceDBはこれら両方をシームレスに処理します。
Genevaを使用すると、このデータセットをLanceDBをバックエンドとするテーブルにマテリアライズできます。
db = geneva.connect("/content/quickstart/") tbl = db.create_table("videos", load_videos(), mode="overwrite")
この時点で、ビデオの組み込みデータベースが完成しました。埋め込みが追加される前であっても、この構造により、クエリ、変換、またはビジュアライゼーションを簡単に実行できます。
TwelveLabsによるビデオの埋め込み
次のステップでは、TwelveLabsのMarengo 2.7モデルを使って埋め込みを生成します。このモデルは、ビデオの意味を表す1024次元のベクトルを出力します。ビデオ全体の埋め込みを取得するために、「clip」スコープと「video」スコープの両方を使用します。
task = client.embed.tasks.create( model_name="Marengo-retrieval-2.7", video_file=video_file, video_embedding_scope=["clip", "video"] ) status = client.embed.tasks.wait_for_done(task.id) result = client.embed.tasks.retrieve(task.id) video_segments = [seg for seg in result.video_embedding.segments if seg.embedding_scope == "video"] embedding_array = np.array(video_segments[0].float_, dtype=np.float32)
ここでは、clipスコープとvideoスコープの両方を要求し、ビデオの全コンテキストを確実にキャプチャします。ベクトルは視覚情報や音情報のパターンを捉えるため、メタデータがまばらであっても、同様のアクティビティが近くにクラスタリングされます。
Genevaを使用すると、埋め込みはテーブルの別の列になります。
tbl.add_columns({"embedding": GenVideoEmbeddings( twelve_labs_api_key=os.environ['TWELVE_LABS_API_KEY'] )}) tbl.backfill("embedding", concurrency=1)
backfill(バックフィル)を呼び出すことで、すべての行を処理し埋め込みを計算します。開発環境では同時実行数を1に設定しますが、本番環境ではGenevaを高い同時実行数で実行し、Rayによってワーカー間で並列処理させることができます。これが、少数のビデオから数百万の規模へとスケールさせる方法です。
LanceDBによる検索
埋め込みが保存されると、LanceDBはベクトル検索のためのクリーンなAPIを提供します。クエリはプレーンテキストにすることができ、それをTwelveLabsが埋め込んだ後に、LanceDB内のビデオベクトルと比較します。
query = "educational tutorial" query_result = client.embed.create( model_name="Marengo-retrieval-2.7", text=query ) qvec = np.array(query_result.text_embedding.segments[0].float_) lance_db = lancedb.connect("/content/quickstart/") lance_tbl = lance_db.open_table("videos") results = (lance_tbl .search(qvec) .metric("cosine") .limit(3) .to_pandas())
LanceDBはArrowネイティブであるため、結果はpandasのDataFrameとして返されます。これにより、分析やWebアプリケーションとの統合が非常に簡単になります。
Pegasusによる要約
ベクトルのマッチングだけでは不十分な場合もあります。TwelveLabsはビデオの要約を生成するPegasusも提供しています。これらの要約をLanceDBの別の列として追加し、検索結果をより分かりやすくすることができます。
index = client.indexes.create( index_name=f"lancedb_demo_{int(time.time())}", models=[{"model_name": "pegasus1.2", "model_options": ["visual", "audio"]}] )
このステップにより、各推奨事項とともに人間の読める短い要約を表示できるようになり、ユーザーエクスペリエンスが向上します。
GenevaとRayによるスケーリング
Genevaがない場合、取り込みや埋め込みの処理を手動で管理する必要があります。これは十数本のビデオであれば問題ありませんが、規模が大きくなるとすぐに対応できなくなります。Genevaは宣言的なパイプラインを提供し、Rayがそれらを並列に実行します。
懸念事項 | LanceDBのみ | GenevaとRayを使用 |
インジェスト | 手動のローダー | 宣言的パイプライン |
埋め込み | シーケンシャル(順次処理) | 多数のワーカー間で並列処理 |
ストレージ | ローカルテーブル | 分散LanceDBテーブル |
MLおよび分析 | カスタムスクリプト | 組み込みの分散UDF(ユーザ定義関数) |
つまり、ローカルでプロトタイプを作成し、ワークフローを書き直すことなくクラスター上の本番環境へ移行することができます。
まとめ
TwelveLabs、LanceDB、およびGenevaを組み合わせることで、ビデオコンテンツのコンテキストを直接理解するレコメンデーションシステムを構築できます。
TwelveLabsは、キーワードを超えて意味を捉える埋め込みと要約を提供します。
LanceDBは使いやすく、組み込みデータベースとして動作し、ビデオ、画像、テキスト、ベクトルなどのマルチモーダルデータを保存します。
Rayを備えたGenevaを使用すると、同じコードを使用してローカル開発から分散クラスターにスケールアップできます。
このスタックは、大規模にセマンティックなビデオレコメンデーションを必要とするメディアプラットフォーム、教育用アプリ、または分析ツールにとって、実用的な基盤となります。
試してみる
TwelveLabs プレイグラウンド – APIキーに登録して、すぐにビデオ埋め込みの生成を開始しましょう: https://playground.twelvelabs.io
LanceDB クイックスタート – LanceDBをローカルにインストールし、Pythonで最初のベクトル検索を試してみましょう: https://lancedb.com/docs/quickstart
Geneva ドキュメント – パイプラインをスケールし、Rayを使用して分散埋め込みジョブを実行する方法を学びましょう: https://lancedb.com/docs/geneva
このチュートリアルの完全なノートブック – すべての詳細が含まれた、完全に動作するコードを確認できます: https://colab.research.google.com/drive/1jZiMT1QFYGvPgrps2Vpge9CtlRKFY1L0?usp=sharing#scrollTo=046o2pt62413
注意: この投稿の例では、読みやすさを優先してトリミングされたサンプルコードを使用しています。実行可能なノートブックで完全なコードを確認したい場合は、こちらからダウンロードできます。
ほとんどのレコメンデーションシステムは、タイトル、タグ、文字起こしなどのメタデータに依存しています。そのアプローチも有効ですが、ビデオの内部で実際に何が起きているかを見落としてしまいます。システム自体が視覚的および音声的なコンテンツを直接理解できたらどうでしょうか?
この記事では、TwelveLabs、LanceDB、そしてLanceDBのフィーチャーエンジニアリングパッケージであるGenevaを使用して、セマンティックレコメンデーションエンジンを構築する方法を紹介します。このシナリオでは、TwelveLabsがビデオの意味を表す強力なマルチモーダル埋め込みを提供します。LanceDBは、これらの埋め込みをメタデータとともに保存し、シンプルなPython APIを介して高速なベクトル検索を提供します。GenevaはLanceDBを基盤とし、Rayを使用してパイプラインをクラスター間でスケールさせます。これにより、ローカルのノートパソコンでも何百台ものマシンでも、まったく同じコードを実行できます。
なぜTwelveLabs、LanceDB、そしてGenevaなのか?
TwelveLabsを使用すると、ストーリーの流れ、雰囲気、アクションを捉える方法でビデオを埋め込むことができます。「夕暮れ時に波に乗るサーファー」のようなクエリで、そのようにクリップにタグ付けされていなくても、一致するビデオを返すことができます。
LanceDBは、Apache Arrowをベースに構築されたベクトルデータベースです。これには3つの大きな強みがあります。
開発者にとって自然に感じられるシンプルなPython API。
外部サービスを必要とせず、ローカルに動作する組み込み型データベース。
ネイティブなマルチモーダルサポートにより、ビデオ、画像、テキスト、およびベクトルを同様に簡単に保存できます。
GenevaはLanceDB上に構築されており、分散データ処理機能を追加します。その下で動作するRayにより、多くのワーカーにまたがって埋め込みの生成とクエリをスケーリングします。
この組み合わせにより、インジェスト、埋め込み、保存、検索、およびスケールというパイプライン全体がカバーされます。
ビデオの読み込みとマテリアライズ
まず、HuggingFaceのFineVideoと呼ばれるサンプルデータセットから始めます。ローダーは、生のビデオバイトに加えて、キャプション、タイトル、ID、およびメタデータを含むRecordBatchを作成します。
def load_videos(): dataset = load_dataset("HuggingFaceFV/finevideo", split="train", streaming=True) batch = [] processed = 0 for row in dataset: if processed >= 10: break video_bytes = row['mp4'] json_metadata = row['json'] batch.append({ "video": video_bytes, "caption": json_metadata.get("youtube_title", "No description"), "youtube_title": json_metadata.get("youtube_title", ""), "video_id": f"video_{processed}", "duration": json_metadata.get("duration_seconds", 0), "resolution": json_metadata.get("resolution", "") }) processed += 1 return pa.RecordBatch.from_pylist(batch)
これにより、生のビデオバイトと人間が読めるメタデータの両方を保持するテーブルが作成されます。この利点は、ビデオデータと構造化データを分離する必要がないことです。LanceDBはこれら両方をシームレスに処理します。
Genevaを使用すると、このデータセットをLanceDBをバックエンドとするテーブルにマテリアライズできます。
db = geneva.connect("/content/quickstart/") tbl = db.create_table("videos", load_videos(), mode="overwrite")
この時点で、ビデオの組み込みデータベースが完成しました。埋め込みが追加される前であっても、この構造により、クエリ、変換、またはビジュアライゼーションを簡単に実行できます。
TwelveLabsによるビデオの埋め込み
次のステップでは、TwelveLabsのMarengo 2.7モデルを使って埋め込みを生成します。このモデルは、ビデオの意味を表す1024次元のベクトルを出力します。ビデオ全体の埋め込みを取得するために、「clip」スコープと「video」スコープの両方を使用します。
task = client.embed.tasks.create( model_name="Marengo-retrieval-2.7", video_file=video_file, video_embedding_scope=["clip", "video"] ) status = client.embed.tasks.wait_for_done(task.id) result = client.embed.tasks.retrieve(task.id) video_segments = [seg for seg in result.video_embedding.segments if seg.embedding_scope == "video"] embedding_array = np.array(video_segments[0].float_, dtype=np.float32)
ここでは、clipスコープとvideoスコープの両方を要求し、ビデオの全コンテキストを確実にキャプチャします。ベクトルは視覚情報や音情報のパターンを捉えるため、メタデータがまばらであっても、同様のアクティビティが近くにクラスタリングされます。
Genevaを使用すると、埋め込みはテーブルの別の列になります。
tbl.add_columns({"embedding": GenVideoEmbeddings( twelve_labs_api_key=os.environ['TWELVE_LABS_API_KEY'] )}) tbl.backfill("embedding", concurrency=1)
backfill(バックフィル)を呼び出すことで、すべての行を処理し埋め込みを計算します。開発環境では同時実行数を1に設定しますが、本番環境ではGenevaを高い同時実行数で実行し、Rayによってワーカー間で並列処理させることができます。これが、少数のビデオから数百万の規模へとスケールさせる方法です。
LanceDBによる検索
埋め込みが保存されると、LanceDBはベクトル検索のためのクリーンなAPIを提供します。クエリはプレーンテキストにすることができ、それをTwelveLabsが埋め込んだ後に、LanceDB内のビデオベクトルと比較します。
query = "educational tutorial" query_result = client.embed.create( model_name="Marengo-retrieval-2.7", text=query ) qvec = np.array(query_result.text_embedding.segments[0].float_) lance_db = lancedb.connect("/content/quickstart/") lance_tbl = lance_db.open_table("videos") results = (lance_tbl .search(qvec) .metric("cosine") .limit(3) .to_pandas())
LanceDBはArrowネイティブであるため、結果はpandasのDataFrameとして返されます。これにより、分析やWebアプリケーションとの統合が非常に簡単になります。
Pegasusによる要約
ベクトルのマッチングだけでは不十分な場合もあります。TwelveLabsはビデオの要約を生成するPegasusも提供しています。これらの要約をLanceDBの別の列として追加し、検索結果をより分かりやすくすることができます。
index = client.indexes.create( index_name=f"lancedb_demo_{int(time.time())}", models=[{"model_name": "pegasus1.2", "model_options": ["visual", "audio"]}] )
このステップにより、各推奨事項とともに人間の読める短い要約を表示できるようになり、ユーザーエクスペリエンスが向上します。
GenevaとRayによるスケーリング
Genevaがない場合、取り込みや埋め込みの処理を手動で管理する必要があります。これは十数本のビデオであれば問題ありませんが、規模が大きくなるとすぐに対応できなくなります。Genevaは宣言的なパイプラインを提供し、Rayがそれらを並列に実行します。
懸念事項 | LanceDBのみ | GenevaとRayを使用 |
インジェスト | 手動のローダー | 宣言的パイプライン |
埋め込み | シーケンシャル(順次処理) | 多数のワーカー間で並列処理 |
ストレージ | ローカルテーブル | 分散LanceDBテーブル |
MLおよび分析 | カスタムスクリプト | 組み込みの分散UDF(ユーザ定義関数) |
つまり、ローカルでプロトタイプを作成し、ワークフローを書き直すことなくクラスター上の本番環境へ移行することができます。
まとめ
TwelveLabs、LanceDB、およびGenevaを組み合わせることで、ビデオコンテンツのコンテキストを直接理解するレコメンデーションシステムを構築できます。
TwelveLabsは、キーワードを超えて意味を捉える埋め込みと要約を提供します。
LanceDBは使いやすく、組み込みデータベースとして動作し、ビデオ、画像、テキスト、ベクトルなどのマルチモーダルデータを保存します。
Rayを備えたGenevaを使用すると、同じコードを使用してローカル開発から分散クラスターにスケールアップできます。
このスタックは、大規模にセマンティックなビデオレコメンデーションを必要とするメディアプラットフォーム、教育用アプリ、または分析ツールにとって、実用的な基盤となります。
試してみる
TwelveLabs プレイグラウンド – APIキーに登録して、すぐにビデオ埋め込みの生成を開始しましょう: https://playground.twelvelabs.io
LanceDB クイックスタート – LanceDBをローカルにインストールし、Pythonで最初のベクトル検索を試してみましょう: https://lancedb.com/docs/quickstart
Geneva ドキュメント – パイプラインをスケールし、Rayを使用して分散埋め込みジョブを実行する方法を学びましょう: https://lancedb.com/docs/geneva
このチュートリアルの完全なノートブック – すべての詳細が含まれた、完全に動作するコードを確認できます: https://colab.research.google.com/drive/1jZiMT1QFYGvPgrps2Vpge9CtlRKFY1L0?usp=sharing#scrollTo=046o2pt62413




