AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

自動埋め込みの仕組み

MongoDB Vector Search を構成して、クラスター内のテキストデータの vector embeddings を自動的に生成およびマネージドできます。クラスターに 1 クリックのAIセマンティック検索インデックスを作成し、Voyage AI embedding modelを使用すると、インデックスの作成、更新、ベクトルによるクエリが簡素化されます。

自動埋め込みを有効にすると、 MongoDB ベクトル検索 は、コレクション内の指定されたテキストフィールドのインデックス時に、およびクエリ内のテキスト string に対して、自動埋め込み用にインデックスされたフィールドに対して指定された embedding model を使用して埋め込みを自動的に生成します。

自動埋め込み用のMongoDB ベクトル検索インデックスを作成すると、 MongoDB は最初の同期を実行して、コレクション内のすべての既存のdocumentの埋め込みを生成します。

  1. Scans document.

    MongoDB ベクトル検索 は、インデックス付きテキストフィールドを含むコレクション内のすべてのdocumentをスキャンします。

  2. 埋め込みを生成します。

    各documentについて、 MongoDB ベクトル検索 はインデックス付きフィールドから Voyage AI embedding modelにテキストを送信し、vector embeddingsを生成します。

  3. 埋め込みを保存します。

    MongoDB ベクトル検索 は、生成された埋め込みを同じクラスター上の別の内部システムコレクション(__mdb_internal_search)に保存し、データローカリティを維持しつつ埋め込みをアプリケーションデータから分離します。

  4. インデックスの構築.

    埋め込みが生成されると、 MongoDB ベクトル検索 は生成された埋め込みを使用してインデックスを構築し、ベクトル検索を有効にします。

最初の同期中に、 MongoDB は document をバッチで処理し、特別な Flex 推論プロセシング階層を使用してスループット を最適化します。

注意

最初の同期期間は、document数、 インデックス付きフィールドのテキストの長さ、および利用可能なレート制限割り当てによって異なります。大規模なコレクションの最初の同期が完了するまでに数時間かかる場合があります。

最初の同期後、 MongoDB ベクトル検索 は、変更されるたびに埋め込みをデータと自動的に同期し続けます。

インデックス付きテキストフィールドを含む新しいドキュメントを挿入すると、 MongoDB ベクトル検索 は自動的に次のことを行います。

  1. 変更ストリームを通じて新しいdocumentを検出します。

  2. 構成されたmodelを使用してテキストフィールドの埋め込みを生成します。

  3. 埋め込みを システムコレクションに保存します。

  4. MongoDB ベクトル検索インデックスを更新して、新しい埋め込みを含めます。

documentを更新し、インデックス付きテキストフィールドが変更されると、 MongoDB ベクトル検索 は自動的に次のことを行います。

  1. 変更ストリーム を通じてフィールドの変更を検出します。

  2. 更新されたテキストの新しい埋め込みを生成します。

  3. システムコレクション内の古い埋め込みを置き換えます。

  4. MongoDB ベクトル検索インデックスを新しい埋め込みでアップデートします。

注意

MongoDB ベクトル検索、自動埋め込み用にインデックスされていないフィールドへの更新に対して埋め込み再生成がトリガーされません。

documentを削除すると、 MongoDB ベクトル検索 はシステムコレクションから対応する埋め込みを自動的に削除し、インデックスを更新します。

自動埋め込みでは、マルチテナント環境でMongoDBによってホストおよび管理される Voyage AI の embedding model を使用します。

  • ホストされたサービス: すべてのembedding modelはMongoDBによってホストおよび維持されます。model参照プラットフォームは、米国リージョンの Google Cloudクラウドにある MongoDB のインフラストラクチャ上で実行されます。モデル インフラストラクチャを配置、設定、または管理する必要はありません。

  • APIベース アクセス: Voyage AI APIキーを使用するように構成された自己管理型配置の場合、 MongoDB は埋め込みを生成するために Voyage AI のAPIエンドポイントにテキストを送信します。埋め込みはMongoDBに返され、クラスターに保存されます。

  • マルチテナント アーキテクチャ: 埋め込みサービスは複数のユーザーで共有されます。このマルチテナント model は、次の機能を提供します。

    • 共有インフラストラクチャによるコスト効率

    • modelの自動更新と改善

    • 高可用性とスケーラビリティ

  • 自動埋め込みサービスに送信されたテキストは、埋め込みを生成するためにのみ使用され、model訓練には保存されたり使用されたりすることはありません。

  • 埋め込みはMongoDBクラスターに返され、独自のデータベース内に保存されます。

  • 自動埋め込みサービスを使用するすべての通信は、暗号化された接続を介して行われます。

埋め込みサービスはマルチテナントです。したがって、 MongoDB はすべてのカスタマー間で均等に使用できるようにするためにレート制限を強制します。レート制限とそれが自動埋め込み操作にどのように影響するかについて詳しくは、「 レート制限 」を参照してください。

自動埋め込みを使用してベクトル検索クエリーを実行すると、 MongoDB はクエリ テキストの埋め込み生成を自動的に処理します。

  1. クエリ テキストの送信:query ステージの $vectorSearchフィールドに、事前に生成されたベクトルではなく、テキスト string を入力します。

  2. 埋め込み生成: MongoDB はクエリテキストを自動埋め込みサービスに送信し、インデックスで指定された同じmodel(または model オプションでオーバーライドする場合は互換性のあるmodel)を使用して埋め込みを生成します。

  3. ベクトル検索: 生成されたクエリ埋め込みは、構成された類似性関数(cosine、dotProduct、またはユークリッド)を使用してインデックス作成された埋め込みを検索するために使用されます。

  4. 返された結果: MongoDB は、クエリに類似する順に順位付けされた document を返します。

自動埋め込みを使用する各クエリは、埋め込みを生成するためにAPI呼び出しが必要であるため、自動埋め込みレート制限にカウントされます。クエリスループットとコストの管理の詳細については、レート制限を参照してください。

  • 大規模なコレクションでは、レート制限に達すると、最初の同期が完了するまでにかなりの時間がかかる可能性があります。

  • MongoDB は失敗した埋め込みリクエストを自動的に再試行し、指数バックオフを実装します。

  • 検索モニタリングを使用して同期の進行状況をモニターできます。

  • documentの更新は、レート制限の対象として、発生に応じて処理されます。

  • 更新がレート制限を超える場合、キャパシティーが利用可能になったときにキューに入れられ、処理されます。

  • アプリケーションは正常に機能し続けます。埋め込み生成のみが遅延する可能性があります。

  • クエリ レート制限は、実行可能な同時検索の数に影響します。

  • クエリ レート制限を超えると、クエリはレート制限を超えたことを示すエラーを返します。

  • 頻繁に使用するクエリ結果をキャッシュする か、スループットを向上させるために 有料階層にアップグレードする ことを検討してください。

自動埋め込みでは、vector embeddings を保存するために別の予約データベースが使用されます。インデックスの生成された埋め込みコレクションを見つけ生成された埋め込みコレクションから埋め込みを検索できます。

埋め込みストレージ

MongoDB は生成された埋め込みを非同期に保存し、内部的な 生成された埋め込みコレクションに永続化します。この生成された埋め込みコレクションは、同じクラスター上の __mdb_internal_search という名前の専用内部データベースに存在します。クラスター内のすべての自動埋め込みインデックスには、このデータベース内に対応する生成された埋め込みコレクションが 1 つだけ あります 。詳細については、生成された埋め込みコレクション を参照してください。

警告

__mdb_internal_searchデータベースは、 MongoDBによって作成およびマネージドされる予約済みの内部名前空間です。このデータベースまたはそのコレクションは操作 しない でください。この 予約された名前空間を変更すると、インデックスが失敗し、検索結果が一貫性を失う可能性があります。

生成された埋め込みコレクションの構造

生成された埋め込みコレクションには、 ソース コレクションdocumentごとに 1 つのdocumentが含まれます。生成された各埋め込みコレクションdocumentには、ソースと同じ _id、ソースのフィルター フィールドのコピー、および各自動埋め込みフィールドの生成された埋め込みベクトルが含まれます。

次のフィールドが表示されます。

フィールド
タイプ
説明

_id

ObjectId

ソース document と同じ _id

<filter-field>

Any

ソースdocumentからフィルターフィールドのコピー。

_autoEmbed

オブジェクト

各 自動埋め込みフィールドの埋め込みベクトルが含まれます。

_autoEmbed.
<fieldPath>

float、または量子化されたベクトルの配列

自動埋め込みフィールドの生成された埋め込みベクトルが含まれます。

警告

__mdb_internal_searchデータベースは、 MongoDBによって作成およびマネージドされる予約済みの内部名前空間です。このデータベースまたはそのコレクションは操作 しない でください。この 予約された名前空間を変更すると、インデックスが失敗し、検索結果が一貫性を失う可能性があります。

mongoshを使用して、 自動埋め込みインデックスの生成された埋め込みコレクションを見つけます。

1
2

次のプレースホルダーを置き換えた後、次のクエリを実行する。

  • <database_name> - 自動埋め込みインデックスを含むデータベースの名前。

  • <collection_name> - 自動埋め込みインデックスを含むコレクションの名前。

  • <index_name> - 自動埋め込みインデックスの名前。

例: 自動埋め込みインデックスのIDを取得する
1use <database_name>
2db.<collection_name>.aggregate( [ { $listSearchIndexes: { name: "<index_name>" } } ] )
例: 自動埋め込みインデックスのIDを取得する
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]
3

<index_id> を、前のステップのコマンドによって返された自動埋め込みインデックスのIDに置き換えてから、次のクエリを実行する。

GET 例: 生成された埋め込みコレクションを取得する
1use __mdb_internal_search
2db.getCollectionNames().filter(n => n.startsWith("<index_id>"))
GET 例: 生成された埋め込みコレクションを取得する
[ '69f382ecd6fa583100184fe7-96dad03b0a735a19fd9f1a22f9694efc-1-0' ]

出力は、生成された埋め込みコレクションの名前です。

mongosh を使用して、 自動埋め込みインデックスの生成埋め込みコレクション内の document の数を見つけます。

1
2

次のプレースホルダーを置き換えた後、次のクエリを実行する。

  • <generated_embeddings_collection_name> - 生成された埋め込みコレクションの名前。
例: 作成されたdocument数を確認する
1use __mdb_internal_search
2const mvColl = "<generated_embeddings_collection_name>"
3db.getCollection(mvColl).countDocuments()
例: 作成されたdocument数を確認する
1100

生成された埋め込みコレクションのストレージサイズを確認して、生成された埋め込みによるディスクとインデックス領域の消費を理解できます。これは、キャパシティープランニング、予期しない増加のデバッグ、インデックスを削除または再定義した後のクリーンアップの検証に役立ちます。

重要

ストレージサイズを確認する前に、生成された埋め込みコレクションの名前を見つけます。詳細については、「生成された埋め込みコレクションの検索」を参照してください。

``mongosh`` を使用して、生成された埋め込みコレクションのストレージ サイズを検索します。

1
2

<generated_embeddings_collection_name> を生成された埋め込みコレクションの名前に置き換えてから、次のクエリを実行します。

例: 生成された埋め込みコレクションのストレージサイズを確認する
1use __mdb_internal_search
2const mvColl = "<generated_embeddings_collection_name>"
3db.getCollection(mvColl).stats()

collStats コマンドは、生成された埋め込みコレクションの詳細なストレージメトリクスを提供します。スクリプト付きアクセス、 シャーディングされたクラスターの集計、またはスケジュールされたモニタリングが必要な場合は、このアプローチを使用します。

次の collStats フィールドはストレージ情報を提供します。

フィールド
説明

count

生成された埋め込みコレクション内のdocumentの数。生成された埋め込みを持つソースdocumentごとに 1 つのdocumentが存在します。

size

すべてのdocumentの非圧縮論理サイズ(バイト単位)。

storageSize

WiredTiger圧縮後のコレクションのデータファイルのディスク上のサイズ(バイト単位)。

totalIndexSize

生成された埋め込みコレクションのすべてのMongoDBインデックスのディスク上のサイズ(バイト単位)。

totalSize

storageSizetotalIndexSize の合計。ディスク使用量の合計を表します。

avgObjSize

非圧縮documentの平均サイズ。documentごとの埋め込みサイズを検証するのに役立ちます。

注意

  • storageSizetotalIndexSize は実際のディスク使用量を反映します。

  • size は非圧縮論理ビューであり、通常は大きくなります。

  • これらのメトリクスは、 MongoDBクラスター内のストレージのみを示します。mongot ホスト上の Luceneベクトルインデックスで使用されるディスクは含まれません。

mongoshまたはPyMongoを使用して、レプリカセット上で生成された埋め込みコレクションのストレージサイズを確認します。

__mdb_internal_searchデータベースに対して次のコマンドを実行します。

1use __mdb_internal_search
2
3const mvColl = "<generated_embeddings_collection_name>";
4
5db.runCommand({ collStats: mvColl }).count
6db.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}

形式のサマリーとしては、次のコマンドを実行する。

1const 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}
1from pymongo import MongoClient
2
3MV_DATABASE = "__mdb_internal_search"
4MB = 1024 * 1024
5
6def 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
19client = MongoClient("mongodb+srv://<user>:<pwd>@<cluster>/")
20print(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

すべてのシャードを一覧表示するには、次のコマンドを実行します。

db.adminCommand({ listShards: 1 })
2

各シャードについて、そのレプリカセットに直接接続します。

3

そのシャードで生成された埋め込みコレクションに対して collStats コマンドを実行します。

4

すべてのシャードにわたって countstorageSizetotalIndexSizetotalSize を追加し、クラスター全体の合計を作成します。

次のスクリプトは、各シャードに接続し、生成された埋め込みコレクションをクエリし、シャードごとと合計メトリクスを返します。

例:シャーディングされたクラスターのストレージを確認する
1from pymongo import MongoClient
2
3MV_DATABASE = "__mdb_internal_search"
4MB = 1024 * 1024
5
6def _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
20def 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
51shard_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
57result = 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
64for shard, row in result["per_shard"].items():
65 print(shard, row)
66print("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 で以下を実行します。

1use __mdb_internal_search
2
3const MB = 1024 * 1024;
4const rows = db.getCollectionNames().map(name => {
5const s = db.runCommand({ collStats: name, scale: MB });
6return {
7 collection: name,
8 count: s.count,
9 storageMB: s.storageSize,
10 indexesMB: s.totalIndexSize,
11 totalMB: s.totalSize,
12};
13});
14
15const total = rows.reduce((a, r) => ({
16storageMB: a.storageMB + r.storageMB,
17indexesMB: a.indexesMB + r.indexesMB,
18totalMB: a.totalMB + r.totalMB,
19}), { storageMB: 0, indexesMB: 0, totalMB: 0 });
20
21print("Per-collection:");
22printjson(rows);
23print("Cluster total:");
24printjson(total);
1Per-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]
6Cluster total:
7 { "storageMB": 1951, "indexesMB": 45, "totalMB": 1996 }
8}

注意

シャーディングされたクラスターでは、各シャードでこのコマンドを実行し、結果を合計します。

mongoshを使用して、生成された埋め込みコレクションから埋め込みを検索します。

1
2

次のプレースホルダーを置き換えた後、次のクエリを実行する。

  • <generated_embeddings_collection_name> - 生成された埋め込みコレクションの名前。

  • <document_id> - ソースコレクション内のdocumentの _id

  • <auto_embed_field> - 自動埋め込み用にインデックスされたフィールドの名前。

例: 生成された埋め込みコレクションから埋め込みを検索する
1use __mdb_internal_search
2const mvColl = "<generated_embeddings_collection_name>"
3db.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]

mongoshを使用して、生成された埋め込みコレクションから埋め込みを検索します。

1
2

次のプレースホルダーを置き換えた後、次のクエリを実行する。

  • <generated_embeddings_collection_name> - 生成された埋め込みコレクションの名前。

  • <document_id> - ソースコレクション内のdocumentの _id

  • <auto_embed_field> - 自動埋め込み用にインデックスされたフィールドの名前。

  • <number_of_documents> - 返されるdocumentの数。

例: 生成された埋め込みコレクションから埋め込みを検索する
1use __mdb_internal_search
2const mvColl = "<generated_embeddings_collection_name>"
3db.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]

PyMongoを使用して、生成された埋め込みコレクションから埋め込みを検索します。

生成された埋め込みコレクションから埋め込みを検索するには、次のPythonスクリプト を使用できます。スクリプトを実行するにはPyMongoドライバーをインストールします。

1
2
例: 生成された埋め込みコレクションから埋め込みを検索する
1from pymongo import MongoClient
2
3MV_DATABASE = "__mdb_internal_search"
4
5def 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
24def 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 ---
36client = MongoClient("mongodb+srv://<user>:<pwd>@<cluster>/")
37
38embedding = 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
47print(f"dims: {len(embedding)}")
48print(f"first 5: {embedding[:5]}")
3
プレースホルダー
説明

<user>

MongoDB配置のユーザー名。

<pwd>

MongoDB配置のパスワード。

<cluster>

MongoDB配置のクラスター接続文字列。

<source_db>

ソースコレクションを含むデータベースの名前。

<source_collection>

ソースコレクションの名前。

<index_name>

自動埋め込みインデックスの名前。

<source_id>

_id ソースコレクション内のdocumentの

<auto_embed_field>

自動埋め込み用にインデックスが作成されたフィールドの名前。

<number_of_documents>

返されるdocumentの数。

4
python get_embedding.py

生成された埋め込みコレクションから埋め込みをストリーミングするには、次のPythonスクリプト を使用できます。

1
2
例: 生成された埋め込みコレクションからのストリーム埋め込み
1from pymongo import MongoClient
2
3# --- Usage ---
4client = MongoClient("mongodb+srv://<user>:<pwd>@<cluster>/")
5
6mv = get_mv_collection(client, "<source_db>", "<source_collection>", "<auto_embed_index_name>")
7
8cursor = mv.find(
9 {},
10 {"_id": 1, "_autoEmbed.<auto_embed_field>": 1},
11 batch_size=500,
12)
13
14for doc in cursor:
15 src_id = doc["_id"]
16 vec = doc["_autoEmbed"]["<auto_embed_field>"]
3
プレースホルダー
説明

<user>

MongoDB配置のユーザー名。

<pwd>

MongoDB配置のパスワード。

<cluster>

MongoDB配置のクラスター接続文字列。

<source_db>

ソースコレクションを含むデータベースの名前。

<source_collection>

ソースコレクションの名前。

<auto_embed_index_name>

自動埋め込みインデックスの名前。

<auto_embed_field>

自動埋め込み用にインデックスが作成されたフィールドの名前。

4
python stream_embedding.py

次のセクションでは、自動埋め込みに関する一般的な問題をトラブルシューティングするためのガイダンスを提供します。

インデックスIDに一致する埋め込みコレクションは生成されませんでした
インデックスがまだ Building または Pending 状態にある可能性があります。生成された埋め込みコレクションは、最初の書き込み時にレイジーに作成されます。$listSearchIndexes を使用してステータスを確認します。
ソースのdocumentが欠落している _id
指定されたdocumentがまだ生成されていないこと、またはdocumentがインデックスのフィルター式によってフィルタリングされたことの埋め込み。
複数のコレクションがインデックスIDに一致する
自動埋め込みフィールドの構成が更新されました。新しい生成埋め込みコレクションが作成されましたが、古いコレクションはクリーンアップされるまで一時的に存在する場合があります。