Você pode configurar o MongoDB Vector Search para gerar e gerenciar automaticamente incorporações vetoriais 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 modelos de incorporação do Voyage AI, simplificando a indexação, a atualização e a query com vetores.
Quando você ativa a Incorporação automatizada, o MongoDB Vector Search gera automaticamente incorporações usando o modelo de incorporação especificado no momento do índice para o campo de texto especificado em sua coleção e no momento da query para sua cadeia de texto em sua query em relação ao campo indexado para incorporações automatizadas.
Sincronização inicial
Quando você cria um índice do MongoDB Vector Search para incorporação automatizada, o MongoDB executa uma sincronização inicial para gerar incorporações para todos os documentos existentes em sua coleção:
Digitaliza documentos.
A Vector Search do MongoDB verifica todos os documentos na collection que contêm o campo de texto indexado.
Gera incorporações.
Para cada documento, o MongoDB Vector Search envia o texto do campo indexado para o modelo de incorporação Voyage AI para gerar incorporações vetoriais.
Armazena incorporações.
O MongoDB Vector Search armazena as incorporações geradas em uma coleção de sistema interno separado (
__mdb_internal_search) no mesmo cluster para manter as incorporações isoladas dos dados do aplicação , mantendo a localidade dos dados.Constrói í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 documentos em lotes e usa uma camada especial de processamento de inferência Flex para otimizar a taxa de transferência.
Observação
A duração da sincronização inicial depende do número de documentos, 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 Vector Search mantém as incorporações sincronizadas automaticamente com seus dados à medida que eles são alterados.
Inserções de documentos
Quando você insere um novo documento com o campo de texto indexado, o MongoDB Vector Search automaticamente:
Detecta o novo documento por meio de fluxos de alteração.
Gera incorporações para o campo de texto utilizando o modelo configurado.
Armazena as incorporações na coleção do sistema.
Atualiza o índice do MongoDB Vector Search para incluir as novas incorporações.
Document Updates
Quando você atualiza um documento e o campo de texto indexado é alterado, o MongoDB Vector Search automaticamente:
Detecta a alteração de campo por meio de change streams.
Gera novas incorporações para o texto atualizado.
Substitui as antigas incorporações na collection do sistema.
Atualiza o índice do MongoDB Vector Search com as novas incorporações.
Observação
A Vector Search do MongoDB não aciona a reconstrução de incorporação para atualizações de campos que não estejam indexados para Incorporação Automática.
Exclusões de documentos
Quando você exclui um documento, o MongoDB Vector Search remove automaticamente as incorporações correspondentes da coleção do sistema e atualiza o índice.
Hospedagem de modelos e multilocação
A incorporação automatizada usa os modelos de incorporação da Voyage AI, que são hospedados e gerenciados pelo MongoDB em um ambiente de vários inquilinos:
Infraestrutura de modelo
Serviço hospedado: todos os modelos de incorporação são hospedados e mantidos pelo MongoDB. A plataforma de inferência do modelo é executada na infraestrutura do MongoDB na nuvem do Google Cloud em uma região dos EUA. Você não precisa distribuir, configurar ou gerenciar nenhuma infraestrutura de modelo.
Acesso baseado em API: para sistemas autogerenciados configurados para usar a chave de API do Voyage AI, o MongoDB envia texto para os endpoints de API do Voyage AI para gerar incorporações. As incorporações são devolvidas ao MongoDB e armazenadas em seu cluster.
Arquitetura multilocatária: o serviço de incorporação é compartilhado por vários usuários. Este modelo multilocatário fornece:
Eficiência de custos por meio de infraestrutura compartilhada
Atualizações e melhorias automáticas do modelo
Alta disponibilidade e escalabilidade
Dados privados
O texto enviado para o serviço de Incorporação Automática é usado apenas para gerar incorporações e não é armazenado ou usado para treinamento de modelos.
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 Incorporação Automática ocorre por conexões criptografadas.
Limites de taxa
O serviço de incorporação é multilocatário. Portanto, o MongoDB impõe limites de taxa para garantir o uso leal em todos os clientes. Para saber mais sobre os limites de taxa e como eles afetam as operações de incorporação 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 incorporação para seu texto de query:
Envio de Texto de Query: Você fornece uma string de texto no
querycampo do estágio em vez de um vetor$vectorSearchpré-gerado.Geração de incorporação: o MongoDB envia seu texto de query para o serviço de Incorporação automatizada para gerar incorporações usando o mesmo modelo especificado no índice (ou um modelo compatível se você o substituir pela
modelopção).Vector Search: 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 a Incorporação automatizada conta para os seus limites de taxa de Incorporação automatizada porque requer uma chamada de API para gerar incorporações. 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 incorporação com falha e implementa backoff exponencial.
Você pode monitorar o progresso da sincronização por meio do monitoramento do Atlas Search .
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 aplicação continua funcionando normalmente; apenas a geração incorporada 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 consulta usados com frequência ou atualizar para uma camada paga para maior taxa de transferência.
Coleção de incorporações gerada
A incorporação automatizada usa um banco de dados de reserva separado para armazenar incorporações vetoriais. 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 saber mais, consulte Coleção de incorporações 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.- Estrutura da collection de incorporações gerada
A coleção de incorporações gerada contém um documento por documento de coleção de origem. Cada documento de collection de incorporação gerado tem o mesmo
_idque a origem, cópias dos campos de filtro da origem e o vetor de incorporação gerado para cada campo de Incorporação automatizada.Você pode visualizar os seguintes campos:
CampoTipoDescrição_idObjectId
O mesmo
_iddo documento de origem.<filter-field>Any
cópia do campo de filtro do documento de origem.
_autoEmbedObjeto
Contém o vetor de incorporação para cada campo de Incorporação automatizada .
_autoEmbed.<fieldPath>Array de vetores flutuantes ou quantizados
Contém o vetor de incorporação gerado para o campo Incorporação automatizada.
Encontre a collection de incorporações 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 Incorporação Automática.<collection_name>- Nome da collection que contém o índice de Incorporação Automática.<index_name>- Nome do índice de Incorporação 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 Incorporação 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 incorporações gerada.
Verifique quantos documentos foram criados na coleção de incorporações gerada.
Execute a seguinte query após substituir os seguintes placeholders:
<generated_embeddings_collection_name>- Nome da collection 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 collection de incorporações gerada
Você pode verificar o tamanho do armazenamento das collections de incorporações geradas para entender o consumo de espaço em disco e índice a partir das incorporações geradas. 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 collection de incorporações gerada. Para saber mais, consulte Localizar a Coleção de Incorporações Geradas.
Conecte-se ao Atlas e navegue Data Explorer até.
Se ainda não estiver exibido, selecione sua organização desejada no Menu Organizations na barra de navegação.
Se ainda não estiver exibido, selecione o projeto desejado no menu Projects na barra de navegação.
Na barra lateral, clique em Data Explorer na seção Database.
Na página Data Explorer, o banco de dados __mdb_internal_search é exibido junto com seus outros bancos de dados. Esta visualização do banco de dados mostra:
Storage size - Espaço total em disco usado pelo banco de dados.
Data size - Tamanho total de todos os documentos no banco de dados.
Collections - Número de collections no banco de dados.
Indexes - Número de índices no banco de dados.
Classifique por Storage size para ver a quantidade de espaço em disco do cluster usada pela Incorporação Automática.
Veja métricas de collections individuais.
Clique em __mdb_internal_search para ver cada coleção de incorporações gerada com:
Storage size - Espaço total em disco usado pela collection.
Data size - Tamanho total de todos os documentos na collection.
Documents - Número de documentos na coleção.
Avg. document size - Tamanho médio de um documento na collection.
Indexes - Número de índices na coleção.
Total index size - Tamanho total de todos os índices na collection.
Observação
A coleção auto_embedding_leases é usada para eleição de líder e normalmente usa apenas kilobytes de armazenamento.
Verifique o tamanho de armazenamento da collection de incorporações 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 collections de incorporações geradas. 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 documentos na coleção de incorporações gerada. Existe um documento para cada documento de origem com incorporações geradas. |
| Tamanho lógico não compactado de todos os documentos, em bytes. |
| Tamanho em disco dos arquivos de dados da collection após a compressão WiredTiger, em bytes. |
| Tamanho em disco de todos os índices do MongoDB na collection de embeddings gerada, em bytes. |
| Soma de |
| Tamanho médio do documento descompactado. Útil para validar o tamanho de incorporação por documento. |
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 shard tem sua própria coleção de incorporações 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 shard, consulta a collection de incorporações gerada e retorna métricas por shard 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 Incorporação Automatizada em um cluster, some collStats para cada collection no __mdb_internal_search. Isso é útil para revisões de capacidade e identificação de collections de incorporações geradas órfãs.
Execute o seguinte no mongosh em um único conjunto de réplicas ou em cada shard 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 shard e some os resultados.
Recuperar incorporações da coleção de incorporações geradas
Conecte-se ao Atlas.
Vá para a página Data Explorer do seu projeto.
Se ainda não estiver exibido, selecione sua organização desejada no Menu Organizations na barra de navegação.
Se ainda não estiver exibido, selecione o projeto desejado no menu Projects na barra de navegação.
Na barra lateral, clique em Data Explorer abaixo do cabeçalho Database.
A página Data Explorer é exibida.
Recuperar incorporações de um documento.
Execute a seguinte query após substituir os seguintes placeholders:
<generated_embeddings_collection_name>- Nome da collection de incorporações gerada.<document_id>-_iddo documento na coleção de origem.<auto_embed_field>- Nome do campo indexado para Incorporação Automática.
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 collection de incorporações gerada.<document_id>-_iddo documento na coleção de origem.<auto_embed_field>- Nome do campo indexado para Incorporação Automática.<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 implementação do MongoDB . |
| Nome do banco de dados que contém a collection de origem. |
| Nome da coleção de origem. |
| Nome do índice de Incorporação Automatizada. |
|
|
| Nome do campo indexado para Incorporação Automática. |
| Número de documentos 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 implementação do MongoDB . |
| Nome do banco de dados que contém a collection de origem. |
| Nome da coleção de origem. |
| Nome do índice de Incorporação Automatizada. |
| Nome do campo indexado para Incorporação Automática. |
Solução de problemas
As seções a seguir fornecem orientações para solucionar problemas comuns com a incorporação automatizada.
- Nenhuma coleção de incorporações gerada corresponde ao ID do índice
- Seu índice ainda pode estar em :guialbel'Building' ou Pending estado. A coleção de incorporações gerada é criada preguiçosamente na primeira escrita. Verifique o status usando o
$listSearchIndexes. - Documento ausente para uma fonte
_id - A incorporação para o documento especificado ainda não foi gerada ou o documento foi filtrado pela expressão de filtro do índice.
- Mais de uma collection corresponde ao ID do índice
- A configuração do campo de incorporação automática foi atualizada. Embora uma nova collection de incorporações gerada tenha sido criada, a antiga pode permanecer brevemente até a limpeza.