MongoDB ベクトル検索を構成して、クラスター内のテキストデータのベクトル埋め込みを自動的に生成および管理できます。クラスターに 1 クリックのAIセマンティック検索インデックスを作成し、Voyage AI埋め込みモデルを使用すると、インデックス作成、アップデート、ベクトルによるクエリが簡素化されます。
自動埋め込みを有効にすると、 MongoDB ベクトル検索 は、コレクション内の指定されたテキストフィールドのインデックス時に、およびクエリ内のテキスト string に対して、自動埋め込み用にインデックスされたフィールドに対して指定された埋め込みモデルを使用して埋め込みを自動的に生成します。
最初の同期
自動埋め込み用のMongoDB ベクトル検索インデックスを作成すると、 MongoDB は最初の同期を実行して、コレクション内のすべての既存のドキュメントの埋め込みを生成します。
ドキュメントをスキャンします。
MongoDB ベクトル検索 は、インデックス付きテキストフィールドを含むコレクション内のすべてのドキュメントをスキャンします。
埋め込みを生成します。
各ドキュメントについて、 MongoDB ベクトル検索 はインデックス付きフィールドから Vyage AI埋め込みモデルにテキストを送信し、ベクトル埋め込みを生成します。
埋め込みを保存します。
MongoDB ベクトル検索 は、生成された埋め込みを同じクラスター上の別の内部システムコレクション(
__mdb_internal_search)に保存し、データローカリティを維持しつつ埋め込みをアプリケーションデータから分離します。インデックスを構築します。
埋め込みが生成されると、 MongoDB ベクトル検索 は生成された埋め込みを使用してインデックスを構築し、ベクトル検索を有効にします。
最初の同期中に、 MongoDB はドキュメントをバッチで処理し、特別な Flex 推論処理階層を使用してスループット を最適化します。
注意
最初の同期期間は、ドキュメント数、 インデックス付きフィールドのテキストの長さ、および利用可能なレート制限割り当てによって異なります。大規模なコレクションの最初の同期が完了するまでに数時間かかる場合があります。
進行中の更新
最初の同期後、 MongoDB ベクトル検索 は、変更されるたびに埋め込みをデータと自動的に同期し続けます。
ドキュメント挿入
インデックス付きテキストフィールドを含む新しいドキュメントを挿入すると、 MongoDB ベクトル検索 は自動的に次のことを行います。
変更ストリームを通じて新しいドキュメントを検出します。
構成されたモデルを使用してテキストフィールドの埋め込みを生成します。
埋め込みを システムコレクションに保存します。
MongoDB ベクトル検索インデックスをアップデートして、新しい埋め込みを含めます。
Document Updates
ドキュメントを更新し、インデックス付きテキストフィールドが変更されると、 MongoDB ベクトル検索 は自動的に次のことを行います。
変更ストリーム を通じてフィールドの変更を検出します。
アップデートされたテキストの新しい埋め込みを生成します。
システムコレクション内の古い埋め込みを置き換えます。
MongoDB ベクトル検索インデックスを新しい埋め込みでアップデートします。
注意
MongoDB ベクトル検索、自動埋め込み用にインデックスされていないフィールドへの更新に対して埋め込み再生成がトリガーされません。
ドキュメントの削除
ドキュメントを削除すると、 MongoDB ベクトル検索 はシステムコレクションから対応する埋め込みを自動的に削除し、インデックスを更新します。
モデルホスティングとマルチテナンシー
自動埋め込みでは、マルチテナント環境でMongoDBによってホストおよび管理される Vyage AI の埋め込みモデルを使用します。
モデル インフラストラクチャ
ホストされたサービス: すべての埋め込みモデルはMongoDBによってホストおよび維持されます。モデル参照プラットフォームは、米国リージョンの Google Cloudクラウドにある MongoDB のインフラストラクチャ上で実行されます。モデル インフラストラクチャを配置、設定、または管理する必要はありません。
APIベース アクセス: Vyage AI APIキーを使用するように構成された自己管理型配置の場合、 MongoDB は埋め込みを生成するために Vyage AI のAPIエンドポイントにテキストを送信します。埋め込みはMongoDBに返され、クラスターに保存されます。
マルチテナント アーキテクチャ: 埋め込みサービスは複数のユーザーで共有されます。このマルチテナント モデルは、次の機能を提供します。
共有インフラストラクチャによるコスト効率
モデルの自動更新と改善
高可用性とスケーラビリティ
データプライバシー
自動埋め込みサービスに送信されたテキストは、埋め込みを生成するためにのみ使用され、モデル訓練には保存されたり使用されたりすることはありません。
埋め込みはMongoDBクラスターに返され、独自のデータベース内に保存されます。
自動埋め込みサービスを使用するすべての通信は、暗号化された接続を介して行われます。
レート制限
埋め込みサービスはマルチテナントです。したがって、 MongoDB はすべてのカスタマー間で均等に使用できるようにするためにレート制限を強制します。レート制限とその自動埋め込み操作への影響の詳細については、「 レート制限 」を参照してください。
クエリ処理
自動埋め込みを使用してベクトル検索クエリーを実行すると、 MongoDB はクエリ テキストの埋め込み生成を自動的に処理します。
クエリ テキストの送信:
queryステージの$vectorSearchフィールドに、事前に生成されたベクトルではなく、テキスト string を入力します。埋め込み生成: MongoDB はクエリテキストを自動埋め込みサービスに送信し、インデックスで指定された同じモデル(または
modelオプションでオーバーライドする場合は互換性のあるモデル)を使用して埋め込みを生成します。ベクトル検索: 生成されたクエリ埋め込みは、構成された類似性関数(cosine、dot積、またはユークリッド)を使用してインデックス作成された埋め込みを検索するために使用されます。
返された結果: MongoDB は、クエリに類似する順に順位付けされたドキュメントを返します。
クエリ レートの制限
自動埋め込みを使用する各クエリは、埋め込みを生成するためにAPI呼び出しが必要であるため、自動埋め込みレート制限にカウントされます。クエリスループットとコストの管理の詳細については、「 レート制限 」を参照してください。
操作への影響
最初の同期
大規模なコレクションでは、レート制限に達すると、最初の同期が完了するまでにかなりの時間がかかる可能性があります。
MongoDB は失敗した埋め込みリクエストを自動的に再試行し、指数バックオフを実装します。
進行中の更新
ドキュメントの更新は、レート制限の対象として、発生に応じて処理されます。
更新がレート制限を超える場合、キャパシティーが利用可能になったときにキューに入れられ、処理されます。
アプリケーションは正常に機能し続けます。埋め込み生成のみが遅延する可能性があります。
クエリ
クエリ レート制限は、実行可能な同時検索の数に影響します。
クエリ レート制限を超えると、クエリはレート制限を超えたことを示すエラーを返します。
頻繁に使用するクエリ結果をキャッシュする か、スループットを向上させるために 有料階層にアップグレードする ことを検討してください。
生成された埋め込みコレクション
自動埋め込みでは、ベクトル埋め込みを保存するために別の予約データベースが使用されます。インデックスの 生成された埋め込みコレクションを見つけ、 生成された埋め込みコレクションから埋め込みを検索できます。
- 埋め込みストレージ
MongoDB は生成された埋め込みを非同期に保存し、内部的な 生成された埋め込みコレクションに永続化します。この生成された埋め込みコレクションは、同じクラスター上の
__mdb_internal_searchという名前の専用内部データベースに存在します。クラスター内のすべての自動埋め込みインデックスには、このデータベース内に対応する生成された埋め込みコレクションが 1 つだけ あります 。詳細については、「 生成された埋め込みコレクション 」を参照してください。警告
__mdb_internal_searchデータベースは、 MongoDBによって作成および管理される予約済みの内部名前空間です。このデータベースまたはそのコレクションは操作 しない でください。この 予約された名前空間を変更すると、インデックスが失敗し、検索結果が一貫性を失う可能性があります。- 生成された埋め込みコレクションの構造
生成された埋め込みコレクションには、 ソース コレクションドキュメントごとに 1 つのドキュメントが含まれます。生成された各埋め込みコレクションドキュメントには、ソースと同じ
_id、ソースのフィルター フィールドのコピー、および各自動埋め込みフィールドの生成された埋め込みベクトルが含まれます。次のフィールドが表示されます。
フィールドタイプ説明_idObjectId
ソースドキュメントと同じ
_id。<filter-field>Any
ソースドキュメントからフィルターフィールドのコピー。
_autoEmbedオブジェクト
各 自動埋め込みフィールドの埋め込みベクトルが含まれます。
_autoEmbed.<fieldPath>浮動小数、または量子化されたベクトルの配列
自動埋め込みフィールドの生成された埋め込みベクトルが含まれます。
生成された埋め込みコレクションを見つける
警告
__mdb_internal_searchデータベースは、 MongoDBによって作成および管理される予約済みの内部名前空間です。このデータベースまたはそのコレクションは操作 しない でください。この 予約された名前空間を変更すると、インデックスが失敗し、検索結果が一貫性を失う可能性があります。
インデックスのIDを取得します。
次のプレースホルダーを置き換えた後、次のクエリを実行します。
<database_name>- 自動埋め込みインデックスを含むデータベースの名前。<collection_name>- 自動埋め込みインデックスを含むコレクションの名前。<index_name>- 自動埋め込みインデックスの名前。
1 use <database_name> 2 db.<collection_name>.aggregate( [ { $listSearchIndexes: { name: "<index_name>" } } ] )
1 [ 2 { 3 id: '69f382ecd6fa583100184fe7', 4 name: 'auto-embed-index', 5 type: 'vectorSearch', 6 status: 'READY', 7 numDocs: 0, 8 latestDefinition: { ... }, 9 statusDetail: [ ... ] 10 } 11 ]
生成された埋め込みコレクションのストレージ サイズの確認
生成された埋め込みコレクションのストレージサイズを確認して、生成された埋め込みによるディスクとインデックス領域の消費を理解できます。これは、キャパシティープランニング、予期しない増加のデバッグ、インデックスを削除または再定義した後のクリーンアップの検証に役立ちます。
重要
ストレージサイズを確認する前に、生成された埋め込みコレクションの名前を見つけます。詳細については、「 生成された埋め込みコレクションの検索 」を参照してください。
Atlas にログインし、Data Explorer に移動します。
まだ表示されていない場合は、以下から目的の組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
サイドバーで、Database セクションの下の Data Explorer をクリックします。
Data Explorer ページでは、__mdb_internal_searchデータベースが他のデータベースと一緒に表示されます。このデータベースビューには、次の内容が表示されます。
Storage size -データベースによって使用されるディスク領域の合計。
Data size -データベース内のすべてのドキュメントの合計サイズ。
Collections -データベース内のコレクションの数。
Indexes -データベース内の インデックス の数。
自動埋め込みで使用されるクラスター ディスク領域の量を確認するには、 Storage size でソートします。
個々のコレクションメトリクスを表示します。
生成された各埋め込みコレクションを確認するには、__mdb_internal_search をクリックします。
Storage size -コレクションで使用されているディスク領域の合計。
Data size -コレクション内のすべてのドキュメントの合計サイズ。
Documents -コレクション内のドキュメントの数。
Avg. document size -コレクション内のドキュメントの平均サイズ。
Indexes -コレクションの インデックス の数。
Total index size -コレクションのすべてのインデックスの合計サイズ。
注意
auto_embedding_leasesコレクションはリーダーの選挙に使用され、通常は キロバイトのストレージのみを使用します。
生成された埋め込みコレクションのストレージサイズを確認します。
<generated_embeddings_collection_name> を生成された埋め込みコレクションの名前に置き換えてから、次のクエリを実行します。
1 use __mdb_internal_search 2 const mvColl = "<generated_embeddings_collection_name>" 3 db.getCollection(mvColl).stats()
collStats コマンドは、生成された埋め込みコレクションの詳細なストレージメトリクスを提供します。スクリプト付きアクセス、 シャーディングされたクラスターの集計、またはスケジュールされたモニタリングが必要な場合は、このアプローチを使用します。
次の collStats フィールドはストレージ情報を提供します。
フィールド | 説明 |
|---|---|
| 生成された埋め込みコレクション内のドキュメントの数。生成された埋め込みを持つソースドキュメントごとに 1 つのドキュメントが存在します。 |
| すべてのドキュメントの非圧縮論理サイズ(バイト単位)。 |
| WiredTiger圧縮後のコレクションのデータファイルのディスク上のサイズ(バイト単位)。 |
| 生成された埋め込みコレクションのすべてのMongoDBインデックスのディスク上のサイズ(バイト単位)。 |
|
|
| 非圧縮ドキュメントの平均サイズ。ドキュメントごとの埋め込みサイズを検証するのに役立ちます。 |
注意
storageSizeとtotalIndexSizeは実際のディスク使用量を反映します。sizeは非圧縮論理ビューであり、通常は大きくなります。これらのメトリクスは、 MongoDBクラスター内のストレージのみを示します。
mongotホスト上の Luceneベクトルインデックスで使用されるディスクは含まれません。
__mdb_internal_searchデータベースに対して次のコマンドを実行します。
1 use __mdb_internal_search 2 3 const mvColl = "<generated_embeddings_collection_name>"; 4 5 db.runCommand({ collStats: mvColl }).count 6 db.runCommand({ collStats: mvColl, scale: 1024 * 1024 })
1 { 2 ns: '__mdb_internal_search.69f382ecd6fa583100184fe7-96dad03b0a735a19fd9f1a22f9694efc-1-0', 3 size: 5142, 4 count: 1250000, 5 avgObjSize: 4312, 6 numOrphanDocs: 0, 7 storageSize: 1830, 8 freeStorageSize: 7, 9 capped: false, 10 wiredTiger: { ... }, 11 nindexes: 1, 12 indexDetails: { ... }, 13 indexBuilds: [], 14 totalIndexSize: 42, 15 indexSizes: { _id_: 0 }, 16 totalSize: 1872, 17 scaleFactor: 1048576, 18 ok: 1, 19 '$clusterTime': { 20 clusterTime: Timestamp({ t: 1777646199, i: 1 }), 21 signature: { 22 hash: Binary.createFromBase64('pomqluUIpiZzLro3VWhO4dt2LKE=', 0), 23 keyId: Long('7634583163557117960') 24 } 25 }, 26 operationTime: Timestamp({ t: 1777646199, i: 1 }) 27 }
形式のサマリーとしては、次のコマンドを実行します。
1 const s = db.runCommand({ collStats: mvColl, scale: 1024 * 1024 }); 2 ({ 3 count: s.count, 4 avgObjSizeKB: (s.avgObjSize / 1024).toFixed(2), 5 dataMB: s.size, 6 storageMB: s.storageSize, 7 indexesMB: s.totalIndexSize, 8 totalMB: s.totalSize, 9 })
1 { 2 "count": 1250000, 3 "avgObjSizeKB": "4.21", 4 "dataMB": 5142, 5 "storageMB": 1830, 6 "indexesMB": 42, 7 "totalMB": 1872 8 }
1 from pymongo import MongoClient 2 3 MV_DATABASE = "__mdb_internal_search" 4 MB = 1024 * 1024 5 6 def get_mv_storage_stats(client, mv_collection_name): 7 """Return storage metrics for a generated embeddings collection.""" 8 db = client[MV_DATABASE] 9 stats = db.command("collStats", mv_collection_name, scale=MB) 10 return { 11 "count": stats["count"], 12 "avg_obj_kb": round(stats["avgObjSize"] / 1024, 2), 13 "data_mb": stats["size"], 14 "storage_mb": stats["storageSize"], 15 "indexes_mb": stats["totalIndexSize"], 16 "total_mb": stats["totalSize"], 17 } 18 19 client = MongoClient("mongodb+srv://<user>:<pwd>@<cluster>/") 20 print(get_mv_storage_stats(client, "<generated_embeddings_collection_name>"))
出力例:
{'count': 1250000, 'avg_obj_kb': 4.21, 'data_mb': 5142, 'storage_mb': 1830, 'indexes_mb': 42, 'total_mb': 1872}
シャーディングされたソース コレクションでは、各シャードは __mdb_internal_searchデータベースに独自の生成された埋め込みコレクションを持ちます。 mongos ではこれらのコレクションは表示されないため、各シャードの mongod を直接クエリし、結果を合計する必要があります。
次のスクリプトは、各シャードに接続し、生成された埋め込みコレクションをクエリし、シャードごとと合計メトリクスを返します。
1 from pymongo import MongoClient 2 3 MV_DATABASE = "__mdb_internal_search" 4 MB = 1024 * 1024 5 6 def _resolve_mv_name(client, source_db, source_collection, index_name): 7 """Find the generated embeddings collection name for an index.""" 8 src = client[source_db][source_collection] 9 indexes = list(src.aggregate([{"$listSearchIndexes": {"name": index_name}}])) 10 if not indexes: 11 raise LookupError(f"No search index named {index_name!r}") 12 index_id = indexes[0]["id"] 13 matches = [n for n in client[MV_DATABASE].list_collection_names() 14 if n.startswith(index_id)] 15 if not matches: 16 return None 17 matches.sort(reverse=True) 18 return matches[0] 19 20 def get_mv_storage_per_shard(shard_uris, source_db, source_collection, index_name): 21 """Get per-shard and total storage for a sharded cluster.""" 22 per_shard = {} 23 totals = {"count": 0, "data_mb": 0, "storage_mb": 0, 24 "indexes_mb": 0, "total_mb": 0} 25 26 for shard_name, uri in shard_uris.items(): 27 client = MongoClient(uri) 28 mv_name = _resolve_mv_name(client, source_db, source_collection, index_name) 29 30 if mv_name is None: 31 per_shard[shard_name] = {"note": "no MV found (still building?)"} 32 continue 33 34 s = client[MV_DATABASE].command("collStats", mv_name, scale=MB) 35 row = { 36 "mv": mv_name, 37 "count": s["count"], 38 "data_mb": s["size"], 39 "storage_mb": s["storageSize"], 40 "indexes_mb": s["totalIndexSize"], 41 "total_mb": s["totalSize"], 42 } 43 per_shard[shard_name] = row 44 45 for k in totals: 46 totals[k] += row[k] 47 48 return {"per_shard": per_shard, "totals": totals} 49 50 # Usage 51 shard_uris = { 52 "shard-00": "mongodb://<user>:<pwd>@shard-00.example.net:27017/?replicaSet=shard-00", 53 "shard-01": "mongodb://<user>:<pwd>@shard-01.example.net:27017/?replicaSet=shard-01", 54 "shard-02": "mongodb://<user>:<pwd>@shard-02.example.net:27017/?replicaSet=shard-02", 55 } 56 57 result = get_mv_storage_per_shard( 58 shard_uris, 59 source_db="<source_db>", 60 source_collection="<source_collection>", 61 index_name="<index_name>", 62 ) 63 64 for shard, row in result["per_shard"].items(): 65 print(shard, row) 66 print("TOTAL:", result["totals"])
shard-00 {'mv': '69e183...-1-3', 'count': 416000, 'data_mb': 1714, 'storage_mb': 612, 'indexes_mb': 14, 'total_mb': 626} shard-01 {'mv': '69e183...-1-3', 'count': 418200, 'data_mb': 1721, 'storage_mb': 615, 'indexes_mb': 14, 'total_mb': 629} shard-02 {'mv': '69e183...-1-3', 'count': 415800, 'data_mb': 1707, 'storage_mb': 603, 'indexes_mb': 14, 'total_mb': 617} TOTAL: {'count': 1250000, 'data_mb': 5142, 'storage_mb': 1830, 'indexes_mb': 42, 'total_mb': 1872}
クラスター上のすべての自動埋め込みインデックスのストレージを確認するには、__mdb_internal_search のすべてのコレクションに対して collStats を合計します。これは、キャパシティーのレビューと、孤立した生成埋め込みコレクションの識別に役立ちます。
単一のレプリカセットまたはシャーディングされたクラスターの各シャードで、mongosh で以下を実行します。
1 use __mdb_internal_search 2 3 const MB = 1024 * 1024; 4 const rows = db.getCollectionNames().map(name => { 5 const s = db.runCommand({ collStats: name, scale: MB }); 6 return { 7 collection: name, 8 count: s.count, 9 storageMB: s.storageSize, 10 indexesMB: s.totalIndexSize, 11 totalMB: s.totalSize, 12 }; 13 }); 14 15 const total = rows.reduce((a, r) => ({ 16 storageMB: a.storageMB + r.storageMB, 17 indexesMB: a.indexesMB + r.indexesMB, 18 totalMB: a.totalMB + r.totalMB, 19 }), { storageMB: 0, indexesMB: 0, totalMB: 0 }); 20 21 print("Per-collection:"); 22 printjson(rows); 23 print("Cluster total:"); 24 printjson(total);
1 Per-collection: 2 [ 3 { "collection": "69e183...-1-3", "count": 1250000, "storageMB": 1830, "indexesMB": 42, "totalMB": 1872 }, 4 { "collection": "71fa42...-1-1", "count": 84000, "storageMB": 121, "indexesMB": 3, "totalMB": 124 } 5 ] 6 Cluster total: 7 { "storageMB": 1951, "indexesMB": 45, "totalMB": 1996 } 8 }
注意
シャーディングされたクラスターでは、各シャードでこのコマンドを実行し、結果を合計します。
生成された埋め込みコレクションから埋め込みを取得する
Atlas にログインします。
ドキュメントの埋め込みを検索します。
次のプレースホルダーを置き換えた後、次のクエリを実行します。
<generated_embeddings_collection_name>- 生成された埋め込みコレクションの名前。<document_id>- ソースコレクション内のドキュメントの_id。<auto_embed_field>- 自動埋め込み用にインデックスされたフィールドの名前。
1 use __mdb_internal_search 2 const mvColl = "<generated_embeddings_collection_name>" 3 db.getCollection(mvColl).findOne( 4 { _id: "<document_id>" }, 5 { _id: 1, "_autoEmbed.<auto_embed_field>": 1 } 6 )
1 [ 2 { _autoEmbed: {}, _id: "ObjectId('573a1390f29313caabcd5c0f')" }, 3 { _autoEmbed: {}, _id: "ObjectId('573a1390f29313caabcd5c0f')" }, 4 { 5 _autoEmbed: { 6 fullplot: Binary.fromInt8Array(new Int8Array([ 7 5, -30, 16, 4, -57, -8, -17, -13, 16, 11, -22, 15, 8 -7, 13, 8, -2, -1, -14, 27, 10, -9, 20, 14, -2, 9 3, -56, -21, 10, -24, 12, 10, 9, 12, 7, 4, 14, 10 -7, -24, -15, 16, 13, 21, -4, -16, -12, -15, 3, -33, 11 5, -21, 2, -1, 0, 16, 7, 13, 19, 4, 5, -14, 12 -34, 7, -16, 38, 4, 4, 7, -22, 8, 14, 15, -14, 13 -4, 6, 22, -17, 8, 27, 8, 13, 46, -12, -7, -9, 14 -20, 13, 10, 4, -14, -11, 31, -7, 0, -3, 1, 16, 15 9, 5, 6, -2, 16 ... 924 more items 17 ])) 18 }, 19 _id: "ObjectId('573a1390f29313caabcd5c0f')" 20 }, 21 { 22 _autoEmbed: { 23 fullplot: Binary.fromInt8Array(new Int8Array([ 24 -5, -22, 22, -6, -43, -13, -5, 4, 5, 2, 4, 13, 25 0, -3, -3, -50, -5, -2, -2, 27, -5, 36, 27, 12, 26 -12, -6, -1, 9, -7, 25, 4, -28, 3, 9, 3, 23, 27 8, 11, 11, 25, -19, 27, 17, 18, -1, 0, 5, -12, 28 13, -5, -3, 3, -17, 16, -15, 43, -1, 1, 1, -6, 29 -26, 16, -11, 13, 14, 0, -9, -23, 25, -16, 11, -25, 30 7, 9, -1, 0, 33, -8, -3, -18, 3, 4, -20, -14, 31 17, -2, -2, -10, 17, -25, -11, 9, 1, 2, -8, 7, 32 20, 18, 17, -2, 33 ... 924 more items 34 ])) 35 }, 36 _id: "ObjectId('573a1390f29313caabcd5c0f')" 37 }, 38 { 39 _autoEmbed: { 40 fullplot: Binary.fromInt8Array(new Int8Array([ 41 0, -1, 47, 6, -20, -14, 29, -2, 13, -1, 20, 11, 42 -18, -7, 12, -10, -25, 10, 7, -15, 11, 9, -14, 12, 43 -9, -22, 16, 0, 18, 5, 9, -26, 14, -27, 6, 20, 44 -19, -8, 1, -5, 21, 13, -37, -7, 0, -21, -51, 1, 45 -38, -14, 4, 6, -23, 15, 19, 33, 8, 0, -7, -3, 46 -25, 8, -29, 25, -1, 12, 4, -21, -1, 0, -14, -3, 47 -6, -3, 7, 30, 8, -8, 34, -19, -12, -29, -15, -14, 48 1, -4, 6, -2, -36, -18, -2, 4, 23, 17, -13, 1, 49 0, 7, 25, -19, 50 ... 924 more items 51 ])) 52 }, 53 _id: "ObjectId('573a1390f29313caabcd5c0f')" 54 } 55 ]
複数のドキュメントの埋め込みを検索します。
次のプレースホルダーを置き換えた後、次のクエリを実行します。
<generated_embeddings_collection_name>- 生成された埋め込みコレクションの名前。<document_id>- ソースコレクション内のドキュメントの_id。<auto_embed_field>- 自動埋め込み用にインデックスされたフィールドの名前。<number_of_documents>- 返されるドキュメントの数。
1 use __mdb_internal_search 2 const mvColl = "<generated_embeddings_collection_name>" 3 db.getCollection(mvColl).find( 4 {}, 5 { _id: "<document_id>", "_autoEmbed.<auto_embed_field>": { $slice: 5 } } 6 ).limit(<number_of_documents>)
1 [ 2 { _autoEmbed: {}, _id: "ObjectId('573a1390f29313caabcd5c0f')" }, 3 { _autoEmbed: {}, _id: "ObjectId('573a1390f29313caabcd5c0f')" }, 4 { 5 _autoEmbed: { 6 fullplot: Binary.fromInt8Array(new Int8Array([ 7 5, -30, 16, 4, -57, -8, -17, -13, 16, 11, -22, 15, 8 -7, 13, 8, -2, -1, -14, 27, 10, -9, 20, 14, -2, 9 3, -56, -21, 10, -24, 12, 10, 9, 12, 7, 4, 14, 10 -7, -24, -15, 16, 13, 21, -4, -16, -12, -15, 3, -33, 11 5, -21, 2, -1, 0, 16, 7, 13, 19, 4, 5, -14, 12 -34, 7, -16, 38, 4, 4, 7, -22, 8, 14, 15, -14, 13 -4, 6, 22, -17, 8, 27, 8, 13, 46, -12, -7, -9, 14 -20, 13, 10, 4, -14, -11, 31, -7, 0, -3, 1, 16, 15 9, 5, 6, -2, 16 ... 924 more items 17 ])) 18 }, 19 _id: "ObjectId('573a1390f29313caabcd5c0f')" 20 }, 21 { 22 _autoEmbed: { 23 fullplot: Binary.fromInt8Array(new Int8Array([ 24 -5, -22, 22, -6, -43, -13, -5, 4, 5, 2, 4, 13, 25 0, -3, -3, -50, -5, -2, -2, 27, -5, 36, 27, 12, 26 -12, -6, -1, 9, -7, 25, 4, -28, 3, 9, 3, 23, 27 8, 11, 11, 25, -19, 27, 17, 18, -1, 0, 5, -12, 28 13, -5, -3, 3, -17, 16, -15, 43, -1, 1, 1, -6, 29 -26, 16, -11, 13, 14, 0, -9, -23, 25, -16, 11, -25, 30 7, 9, -1, 0, 33, -8, -3, -18, 3, 4, -20, -14, 31 17, -2, -2, -10, 17, -25, -11, 9, 1, 2, -8, 7, 32 20, 18, 17, -2, 33 ... 924 more items 34 ])) 35 }, 36 _id: "ObjectId('573a1390f29313caabcd5c0f')" 37 }, 38 { 39 _autoEmbed: { 40 fullplot: Binary.fromInt8Array(new Int8Array([ 41 0, -1, 47, 6, -20, -14, 29, -2, 13, -1, 20, 11, 42 -18, -7, 12, -10, -25, 10, 7, -15, 11, 9, -14, 12, 43 -9, -22, 16, 0, 18, 5, 9, -26, 14, -27, 6, 20, 44 -19, -8, 1, -5, 21, 13, -37, -7, 0, -21, -51, 1, 45 -38, -14, 4, 6, -23, 15, 19, 33, 8, 0, -7, -3, 46 -25, 8, -29, 25, -1, 12, 4, -21, -1, 0, -14, -3, 47 -6, -3, 7, 30, 8, -8, 34, -19, -12, -29, -15, -14, 48 1, -4, 6, -2, -36, -18, -2, 4, 23, 17, -13, 1, 49 0, 7, 25, -19, 50 ... 924 more items 51 ])) 52 }, 53 _id: "ObjectId('573a1390f29313caabcd5c0f')" 54 } 55 ]
生成された埋め込みコレクションから埋め込みを検索するには、次のPythonスクリプト を使用できます。スクリプトを実行するにはPyMongoドライバー をインストールします。
次のコードをコピーして、get_embedding.pyファイルに貼り付けます。
1 from pymongo import MongoClient 2 3 MV_DATABASE = "__mdb_internal_search" 4 5 def get_mv_collection(client, source_db, source_collection, index_name): 6 """Resolve the MV collection for an auto-embedding index.""" 7 # 1. Look up the index ID via $listSearchIndexes on the source collection. 8 src = client[source_db][source_collection] 9 indexes = list(src.aggregate([{"$listSearchIndexes": {"name": index_name}}])) 10 if not indexes: 11 raise LookupError(f"No search index named {index_name!r} on {source_db}.{source_collection}") 12 index_id = indexes[0]["id"] 13 14 # 2. Find the MV collection in __mdb_internal_search whose name starts with the index ID. 15 mv_db = client[MV_DATABASE] 16 matches = [n for n in mv_db.list_collection_names() if n.startswith(index_id)] 17 if not matches: 18 raise LookupError(f"No MV collection found for index {index_id} (index may still be building)") 19 if len(matches) > 1: 20 # Possible briefly during an auto-embed field update; pick the newest. 21 matches.sort(reverse=True) 22 return mv_db[matches[0]] 23 24 def get_embedding(client, source_db, source_collection, index_name, embed_path, source_id): 25 """Fetch the embedding for a single source document.""" 26 mv = get_mv_collection(client, source_db, source_collection, index_name) 27 doc = mv.find_one( 28 {"_id": source_id}, 29 {"_id": 1, f"_autoEmbed.{embed_path}": 1}, 30 ) 31 if doc is None: 32 return None 33 return doc["_autoEmbed"][embed_path] 34 35 # --- Usage --- 36 client = MongoClient("mongodb+srv://<user>:<pwd>@<cluster>/") 37 38 embedding = get_embedding( 39 client, 40 source_db="<source_db>", 41 source_collection="<source_collection>", 42 index_name="<auto_embed_index_name>", 43 embed_path="<auto_embed_field>", 44 source_id="<document_id>", 45 ) 46 47 print(f"dims: {len(embedding)}") 48 print(f"first 5: {embedding[:5]}")
get_embedding.pyファイル内の次のプレースホルダーを置き換えます。
プレースホルダー | 説明 |
|---|---|
| MongoDBデプロイのユーザー名。 |
| MongoDBデプロイのパスワード。 |
| MongoDBデプロイの クラスター接続文字列。 |
| ソースコレクションを含むデータベースの名前。 |
| ソースコレクションの名前。 |
| 自動埋め込みインデックスの名前。 |
|
|
| 自動埋め込み用にインデックスが作成されたフィールドの名前。 |
| 返されるドキュメントの数。 |
生成された埋め込みコレクションから埋め込みをストリーミングするには、次のPythonスクリプト を使用できます。
次のコードをコピーして、stream_embedding.pyファイルに貼り付けます。
1 from pymongo import MongoClient 2 3 # --- Usage --- 4 client = MongoClient("mongodb+srv://<user>:<pwd>@<cluster>/") 5 6 mv = get_mv_collection(client, "<source_db>", "<source_collection>", "<auto_embed_index_name>") 7 8 cursor = mv.find( 9 {}, 10 {"_id": 1, "_autoEmbed.<auto_embed_field>": 1}, 11 batch_size=500, 12 ) 13 14 for doc in cursor: 15 src_id = doc["_id"] 16 vec = doc["_autoEmbed"]["<auto_embed_field>"]
トラブルシューティング
次のセクションでは、自動埋め込みに関する一般的な問題をトラブルシューティングするためのガイダンスを提供します。
- インデックスIDに一致する埋め込みコレクションは生成されませんでした
- インデックスはまだ :quialvel`Building` または Pending 状態である場合があります。生成された埋め込みコレクションは、最初の書込みで遅延して作成されます。
$listSearchIndexesを使用してステータスを確認します。 - ソースのドキュメントが欠落している
_id - 指定されたドキュメントがまだ生成されていないこと、またはドキュメントがインデックスのフィルター式によってフィルタリングされたことの埋め込み。
- 複数のコレクションがインデックスIDに一致する
- 自動埋め込みフィールドの構成が更新されました。新しい生成埋め込みコレクションが作成されましたが、古いコレクションはクリーンアップされるまで一時的に存在する場合があります。