Você pode configurar o MongoDB Vector Search para gerar e gerenciar automaticamente vector embeddings para os dados de texto em seu cluster. Você pode criar um índice de pesquisa semântica de IA com um clique em seu cluster e usar Voyage AI embedding model, simplificando a indexação, a atualização e a query com vetores.
Quando você ativa a Incorporação automatizada, o MongoDB pesquisa vetorial gera automaticamente embeddings usando o embedding model especificado no momento do índice para o campo de texto especificado em sua coleção e no momento da query para sua string de texto em sua query em relação ao campo indexado para embeddings automatizados.
Sincronização inicial
Quando você cria um índice do MongoDB Vector Search para Automated Embedding, o MongoDB executa uma sincronização inicial para gerar embeddings para todos os existing documents em sua coleção:
Digitaliza document.
A pesquisa vetorial do MongoDB scans all documents na coleção que contêm o campo de texto indexado.
Gera incorporações.
Para cada document, o MongoDB Vector Search envia o texto do campo indexado para o embedding model Voyage AI para gerar vector embeddings.
Armazena embedding.
O MongoDB pesquisa vetorial armazena as embeddings geradas em uma coleção de sistema interno separado (
__mdb_internal_search) no mesmo cluster para manter as embeddings isoladas dos dados do aplicativo e, ao mesmo tempo, manter a localidade dos dados.construir índice.
Após as incorporações serem geradas, o MongoDB Vector Search cria o índice utilizando as incorporações geradas para habilitar a pesquisa vetorial.
Durante a sincronização inicial, o MongoDB processa documents em lotes e usa uma especial Flex inference processing tier para otimizar a taxa de transferência.
Observação
A duração da sincronização inicial depende do número de document, do comprimento do texto no campo indexado e da cota limite de taxa disponível. Pode levar várias horas para concluir a sincronização inicial para coleções grandes.
Atualizações contínuas
Após a sincronização inicial, o MongoDB pesquisa vetorial mantém os embeddings sincronizados automaticamente com seus dados à medida que eles são alterados.
Inserções de document
Quando você insere um novo document com o campo de texto indexado, o MongoDB Vector Search automaticamente:
Detecta o novo document por meio de fluxos de alteração.
Gera embeddings para o campo de texto utilizando o model configurado.
Armazena as incorporações na coleção do sistema.
Atualiza o índice do MongoDB pesquisa vetorial para incluir as novas embeddings.
Document Updates
Quando você atualiza um document e o campo de texto indexado é alterado, o MongoDB pesquisa vetorial automaticamente:
Detecta a alteração de campo por meio de change streams.
Gera novas incorporações para o texto atualizado.
Substitui os antigos embeddings na coleção do sistema.
Atualiza o índice do MongoDB pesquisa vetorial com os novos embeddings.
Observação
A MongoDB pesquisa vetorial não trigger a regeneração de embedding para atualizações de campos que não estejam indexados para Embedding Automático.
Document Exclusões
Quando você exclui um document, o MongoDB pesquisa vetorial remove automaticamente os embeddings correspondentes da coleção do sistema e atualiza o índice.
Model Hosting e Multilocação
A incorporação automatizada usa os embedding models da Voyage AI, que são hospedados e gerenciados pelo MongoDB em um ambiente de vários inquilinos:
model Infrastructure
Serviço hospedado: todos os modelos de embedding model são hospedados e mantidos pelo MongoDB. A plataforma de inferência do model é executada na infraestrutura do MongoDB na nuvem do Google Cloud em uma região dos EUA. Você não precisa implantar, configurar ou gerenciar nenhuma infraestrutura de model.
Acesso baseado em API: para implantações autogerenciadas configuradas para usar a chave de API do Voyage AI, o MongoDB envia texto para os pontos de extremidade de API do Voyage AI para gerar embeddings. As incorporações são devolvidas ao MongoDB e armazenadas em seu cluster.
Arquitetura multilocatária: o serviço de embedding é compartilhado por vários usuários. Este multi-tenant model fornece:
Eficiência de custos por meio de infraestrutura compartilhada
Atualizações e melhorias automáticas do model
Alta disponibilidade e escalabilidade
Privacidade de dados
O texto enviado para o serviço de Incorporação Automática é usado apenas para gerar embeddings e não é armazenado ou usado para treinamento de model.
As incorporações são retornadas ao cluster MongoDB e armazenadas em seu próprio banco de dados.
Toda comunicação com o serviço de embedding Automática ocorre por conexões criptografadas.
Limites de taxa
O serviço de embedding é multilocatário. Portanto, o MongoDB impõe limites de taxa para garantir o uso leal em todos os clientes. Para aprender mais sobre os limites de taxa e como eles afetam as operações de embedding automatizada, consulte Limites de taxa.
Processamento de Query
Quando você executa uma query de pesquisa vetorial usando a Incorporação automatizada, o MongoDB lida automaticamente com a geração de embedding para seu texto de query:
Envio de Query Text: Você fornece uma string de texto no campo
querydo estágio$vectorSearchem vez de um vetor pré-gerado.Embedding Generation: o MongoDB envia seu texto de query para o serviço de Automated Embedding para gerar embeddings usando o mesmo model especificado no índice (ou um model compatível se você o substituir pela opção
model).Pesquisa Vetorial: as embeddings de query geradas são usadas para pesquisar as embeddings indexadas usando a função de similaridade configurada (cosine, dotProduct ou euclidean).
Resultados retornados: o MongoDB retorna documentos classificados por similaridade com sua query.
Limites da taxa de query
Cada query que usa o embedding automatizado conta para os seus limites de taxa de embedding automatizado porque requer uma chamada de API para gerar embeddings. Para saber mais sobre como gerenciar a taxa de transferência e os custos da query, consulte Limites de taxa.
Impacto nas operações
Sincronização inicial
Collections grandes podem levar um tempo significativo para concluir a sincronização inicial se você atingir os limites de taxa.
O MongoDB tenta novamente automaticamente solicitações de embedding com falha e implementa backoff exponencial.
Você pode monitorar o progresso da sincronização através do monitoramento de pesquisa.
Atualizações contínuas
As atualizações de documentos são processadas à medida que ocorrem, sujeitas a limites de taxa.
Se as atualizações excederem os limites de taxa, elas serão enfileiradas e processadas quando a capacidade ficar disponível.
Seu aplicativo continua funcionando normalmente; apenas a geração embedding pode ser adiada.
Consultas
Os limites da taxa de query afetam o número de pesquisas simultâneas que você pode realizar.
Se você exceder os limites de taxa de query, as consultas retornarão um erro indicando que o limite de taxa foi excedido.
Considere armazenar em cache os resultados de query usados com frequência ou atualizar para uma tier paga para maior taxa de transferência.
Coleção de embedding gerada
A incorporação automatizada usa um banco de dados de reserva separado para armazenar vector embeddings. Você pode localizar a coleção de incorporações gerada para um índice e recuperar as incorporações da coleção de incorporações gerada.
- Armazenamento de incorporações
O MongoDB armazena as incorporações geradas de forma assíncrona e as persiste em uma coleção de incorporações geradas internas. Esta coleção de incorporações gerada existe em um banco de dados interno dedicado denominado
__mdb_internal_searchno mesmo cluster. Cada índice de incorporação automática no cluster tem exatamente uma coleção de incorporações gerada correspondente dentro desse banco de dados. Para aprender mais, consulte Coleção de embeddings gerados.Aviso
O banco de dados
__mdb_internal_searché um namespace interno reservado criado e gerenciado pelo MongoDB. Não manipule este banco de dados ou suas coleções. Se você modificar esse namespace reservado, isso poderá resultar em falhas de índice e resultados de pesquisa inconsistentes.- Estrutura da embedding de coleção gerada
A coleção de embeddings gerada contém um document por document de coleção de origem. Cada **document** de **coleção** de **embedding** gerado tem o mesmo
_idque a origem, cópias dos campos de **filtro** da origem e o vetor de **embedding** gerado para cada **campo** de Embedding automatizada.Você pode visualizar os seguintes campos:
CampoTipoDescrição_idObjectId
Same
_idas the source document.<filter-field>Any
cópia do campo de filtro do document de origem.
_autoEmbedObjeto
Contém o vetor de embedding para cada campo de Embedding automatizada .
_autoEmbed.<fieldPath>Array de float ou vetores quantizados
Contém o vetor de embedding gerado para o campo Incorporação automatizada.
Encontre a coleção de embedding geradas
Aviso
O banco de dados __mdb_internal_search é um namespace interno reservado criado e gerenciado pelo MongoDB. Não manipule este banco de dados ou suas coleções. Se você modificar esse namespace reservado, isso poderá resultar em falhas de índice e resultados de pesquisa inconsistentes.
Obtenha o ID do índice.
Execute a seguinte query após substituir os seguintes placeholders:
<database_name>- Nome do banco de dados que contém o índice de embedding Automática.<collection_name>- Nome da coleção que contém o índice de embedding automático.<index_name>- Nome do índice de embedding Automática.
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 ]
Obtenha a coleção de incorporações gerada:
Execute a seguinte query após substituir <index_id> pelo ID do índice de embedding Automática retornado pelo comando na etapa anterior.
1 use __mdb_internal_search 2 db.getCollectionNames().filter(n => n.startsWith("<index_id>"))
[ '69f382ecd6fa583100184fe7-96dad03b0a735a19fd9f1a22f9694efc-1-0' ]
A saída é o nome da coleção de embedding gerada.
Verifique quantos document foram criados na coleção de embedding gerada.
Execute a seguinte query após substituir os seguintes placeholders:
<generated_embeddings_collection_name>- Nome da coleção de incorporações gerada.
1 use __mdb_internal_search 2 const mvColl = "<generated_embeddings_collection_name>" 3 db.getCollection(mvColl).countDocuments()
1 100
Verifique o tamanho do armazenamento da coleção de embeddings gerada
Você pode verificar o tamanho do armazenamento das coleções de embeddings geradas para entender o consumo de espaço em disco e índice a partir dos embeddings gerados. Isso é útil para planejar a capacidade, depurar crescimento inesperado e validar a limpeza após descartar ou redefinir um índice.
Importante
Antes de verificar o tamanho do armazenamento, localize o nome da coleção de incorporações gerada. Para aprender mais, consulte Localizar a Coleção de Embeddings Geradas.
Verifique o tamanho de armazenamento da coleção de embedding gerada.
Execute a seguinte query após substituir o <generated_embeddings_collection_name> pelo nome da coleção de embeddings gerada:
1 use __mdb_internal_search 2 const mvColl = "<generated_embeddings_collection_name>" 3 db.getCollection(mvColl).stats()
O comando collStats fornece métricas de armazenamento detalhadas para embeddings gerados coleções. Use essa abordagem quando precisar de acesso com scripts, agregação de cluster fragmentado ou monitoramento agendado.
Os seguintes campos do collStats fornecem informações de armazenamento:
Campo | Descrição |
|---|---|
| Número de document na coleção de embedding gerada. Existe um document para cada document de origem com incorporações geradas. |
| Tamanho lógico não compactado de todos os document, em bytes. |
| Tamanho em disco dos arquivos de dados da coleção após a compactação WiredTiger, em bytes. |
| Tamanho em disco de todos os índices do MongoDB na coleção de embeddings gerada, em bytes. |
| Soma de |
| Tamanho médio do document descompactado. Útil para validar o tamanho de embedding por document. |
Observação
storageSizeetotalIndexSizerefletem o uso real do disco.sizeé a visualização lógica descompactada e normalmente é maior.Essas métricas mostram o armazenamento apenas no cluster MongoDB . Elas não incluem disco usado pelo índice vetorial Lucene no host
mongot.
Execute os seguintes comandos no banco de dados do __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 }
Para um resumo formatado, execute:
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>"))
Saída de amostra:
{'count': 1250000, 'avg_obj_kb': 4.21, 'data_mb': 5142, 'storage_mb': 1830, 'indexes_mb': 42, 'total_mb': 1872}
Em coleções de origem fragmentadas, cada fragmento tem sua própria coleção de embeddings gerada no banco de dados do __mdb_internal_search. mongos não vê essas coleções, então você deve consultar o mongod de cada fragmento diretamente e somar os resultados.
O script a seguir se conecta a cada fragmento, consulta a query de embeddings gerada e retorna métricas por fragmento e totais:
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}
Para verificar o armazenamento de todos os índices de Automated embedding em um cluster, some collStats para cada collection no __mdb_internal_search. Isso é útil para revisões de capacidade e identificação de coleções de embeddings geradas órfãs.
Execute o seguinte no mongosh em um único conjunto de réplicas ou em cada fragmento para clusters fragmentados:
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 }
Observação
Em clusters fragmentados, execute este comando em cada fragmento e some os resultados.
Recuperar incorporações da coleção de incorporações geradas
Recuperar embeddings de um document.
Execute a seguinte query após substituir os seguintes placeholders:
<generated_embeddings_collection_name>- Nome da coleção de incorporações gerada.<document_id>-_iddo document na coleção de origem.<auto_embed_field>- Nome do campo indexado para embedding Automatizado.
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 ]
Recupere incorporações para vários documentos.
Execute a seguinte query após substituir os seguintes placeholders:
<generated_embeddings_collection_name>- Nome da coleção de incorporações gerada.<document_id>-_iddo document na coleção de origem.<auto_embed_field>- Nome do campo indexado para embedding Automatizado.<number_of_documents>- Número de documentos a retornar.
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 ]
Para recuperar embeddings da coleção de embeddings gerada, você pode usar o seguinte script Python. Para executar o script, instale o Driver do PyMongo.
Copie e cole o seguinte código no arquivo 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]}")
Substitua os seguintes placeholders no get_embedding.py arquivo:
Espaço reservado | Descrição |
|---|---|
| Seu nome de usuário para a implementação do MongoDB . |
| Sua senha para a implantação do MongoDB . |
| A string de conexão do cluster para a implantação do MongoDB. |
| Nome do banco de dados que contém a coleção de origem. |
| Nome da coleção de origem. |
| Nome do índice de embedding automatizada. |
|
|
| Nome do campo indexado para embedding Automática. |
| Número de document a retornar. |
Para transmitir embeddings da coleção de embeddings gerada, você pode usar o seguinte script Python.
Copie e cole o seguinte código no arquivo 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>"]
Substitua os seguintes placeholders no stream_embedding.py arquivo:
Espaço reservado | Descrição |
|---|---|
| Seu nome de usuário para a implementação do MongoDB . |
| Sua senha para a implantação do MongoDB . |
| A string de conexão do cluster para a implantação do MongoDB. |
| Nome do banco de dados que contém a coleção de origem. |
| Nome da coleção de origem. |
| Nome do índice de embedding automatizada. |
| Nome do campo indexado para embedding Automática. |
Solução de problemas
As seções a seguir fornecem orientações para solucionar problemas comuns com o Automated Embedding.
- Nenhuma coleção de embedding gerada corresponde ao ID do índice
- Seu índice ainda pode estar no estado Building ou Pending. A coleção de embedding gerada é criada de forma preguiçosa na primeira gravar. Verifique o status usando o
$listSearchIndexes. - document ausente para uma fonte
_id - O embedding para o documento especificado ainda não foi gerado ou o documento foi filtrado pela expressão de filtro do índice.
- Mais de uma coleção corresponde ao ID do índice
- A configuração do campo de incorporação automática foi atualizada. Embora uma nova coleção de incorporações gerada tenha sido criada, a antiga pode permanecer brevemente até a limpeza.