Como criar incorporações vetoriais
Nesta página
As incorporações vetoriais representam seus dados como pontos no espaço multidimensional. Essas incorporações capturam relacionamentos significativos em seus dados e habilitam tarefas como pesquisa e recuperação semântica. Você pode armazenar incorporações vetoriais junto com seus outros dados no Atlas e utilizar o Atlas Vector Search para consultar seus dados vetorizados.
Para realizar uma pesquisa vetorial em suas incorporações, faça o seguinte:
Escolha um método para criar incorporações vetoriais.
Crie incorporações vetoriais a partir dos seus dados e armazene-as no Atlas.
Crie uma incorporação de vetor que represente sua consulta de pesquisa e execute a consulta.
O Atlas Vector Search retorna documentos cujas incorporações vetoriais estão mais próximas da incorporação que representa sua query. Isso indica que eles são semelhantes em significado.
Escolha um método para criar incorporações
Para criar incorporações vetoriais, é necessário usar um modelo de incorporação. Para conectar a um modelo de incorporação e criar embeddings para o Atlas Vector Search, utilize um dos seguintes métodos:
Método | Descrição | Tutoriais |
---|---|---|
Carregar um modelo open-source | Se você não tiver chaves ou créditos deAPI com um serviço de incorporação, use um modelo de incorporação de código aberto carregando-o localmente a partir do seu aplicativo. | |
Ligue para um serviço de incorporação | A maioria dos fornecedores de IA oferece APIspara seus modelos de incorporação proprietários que você pode usar para criar incorporações vetoriais. | |
Usar uma integração | Você pode integrar o Atlas Vector Search com estruturas de código aberto como LangChain e LlamaIndex, serviços como Amazon Leite e muito mais. Essas integrações incluem bibliotecas e ferramentas internas para ajudá-lo a se conectar rapidamente a modelos de incorporação de código aberto e proprietários e a gerar incorporações vetoriais para o Atlas Vector Search. |
Criar e armazenar incorporações a partir de dados
O procedimento a seguir mostra como criar incorporações vetoriais e armazená-las no Atlas usando um modelo de incorporação proprietário ou de código aberto.
➤ Use o menu suspenso Selecione sua linguagem para definir o idioma dos exemplos nesta página.
Pré-requisitos
Para executar esses exemplos, você deve ter o seguinte:
Um Atlas cluster executando o MongoDB versão 6.0.11, 7.0.2 ou posterior. Garanta que seu endereço IP esteja incluído na lista de acessodo seu projeto Atlas.
Um editor de terminal e código para executar seu projeto Node.js.
npm e Node.js instalado.
Um Atlas cluster executando o MongoDB versão 6.0.11, 7.0.2 ou posterior. Garanta que seu endereço IP esteja incluído na lista de acessodo seu projeto Atlas.
Um ambiente para executar blocos de anotações interativos do Python, como o CoLab.
Procedimento
Conclua as etapas a seguir para criar incorporações vetoriais a partir de dados personalizados e armazená-los em uma coleção no Atlas. Você também pode modificar o seguinte código para gerar incorporações a partir de seus próprios dados de qualquer tipo.
Observação
Se você quiser criar incorporações para uma coleta existente, deverá adicionar um novo campo que contenha a incorporação e atualizar cada documento na coleta.
Atualize seu package.json
arquivo .
Configure seu projeto para usar módulos ES adicionando "type": "module"
ao seu package.json
arquivo e salvando-o.
{ "type": "module", // other fields... }
Crie incorporações vetoriais e armazene-as no Atlas.
Crie um arquivo denominado
create-embeddings.js
e cole o seguinte código. Este código faz o seguinte:Cria e exporta uma função assíncrona denominada
getEmbedding
para gerar uma incorporação para uma determinada entrada. Esta função também especifica:A
feature-extraction
tarefa de Transformers.js do Abraçando Face biblioteca. Para saber mais, consulte Tarefas.O nomic-embed-text-v1 modelo de incorporação.
Gera incorporações a partir dos dados de texto de exemplo e as ingere na coleção
sample_db.embeddings
no Atlas usando o Driver MongoDB Node.js.
create-embeddings.jsimport { MongoClient } from 'mongodb'; import { pipeline } from '@xenova/transformers'; // Function to generate embeddings for a given data source export async function getEmbedding(data) { const embedder = await pipeline( 'feature-extraction', 'Xenova/nomic-embed-text-v1'); const response = await embedder(data, { pooling: 'mean', normalize: true }); return Array.from(response.data); } // Data to embed const data = [ "Titanic: The story of the 1912 sinking of the largest luxury liner ever built", "The Lion King: Lion cub and future king Simba searches for his identity", "Avatar: A marine is dispatched to the moon Pandora on a unique mission" ] async function run() { // Connect to your Atlas cluster const uri = "<connectionString>"; const client = new MongoClient(uri); try { await client.connect(); const db = client.db("sample_db"); const collection = db.collection("embeddings"); // Ingest data and embeddings into Atlas await Promise.all(data.map(async text => { const embedding = await getEmbedding(text); // Check if the document already exists before inserting const existingDoc = await collection.findOne({ text: text }); if (!existingDoc) { await collection.insertOne({ text: text, embedding: embedding }); console.log(embedding); } })); } catch (err) { console.log(err.stack); } finally { await client.close(); } } run().catch(console.dir); Substitua
<connectionString>
pela connection string SRVdo Atlas cluster.Observação
Sua string de conexão deve usar o seguinte formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net Salve o arquivo e execute o seguinte comando:
node create-embeddings.js [ -0.04323853924870491, -0.008460805751383305, 0.012494648806750774, -0.013014335185289383, ... ] [ -0.017400473356246948, 0.04922063276171684, -0.002836339408531785, -0.030395228415727615, ... ] [ -0.016950927674770355, 0.013881809078156948, -0.022074559703469276, -0.02838018536567688, ... ] Observação
O número de dimensões na saída foi truncado para legibilidade.
Você também pode visualizar suas incorporações vetoriais na UI do Atlas navegando até a coleção
sample_db.embeddings
em seu cluster.
Atualize seu package.json
arquivo .
Configure seu projeto para usar módulos ES adicionando "type": "module"
ao seu package.json
arquivo e salvando-o.
{ "type": "module", // other fields... }
Crie incorporações vetoriais e armazene-as no Atlas.
Crie um arquivo denominado
create-embeddings.js
e cole o seguinte código. Este código faz o seguinte:Cria e exporta uma função assíncrona denominada
getEmbedding
que utiliza o modelotext-embedding-3-small
do OpenAI para gerar uma incorporação para uma determinada entrada.Gera incorporações a partir dos dados de texto de exemplo e as ingere na coleção
sample_db.embeddings
no Atlas usando o Driver MongoDB Node.js.
create-embeddings.jsimport { MongoClient } from 'mongodb'; import OpenAI from 'openai'; // Setup OpenAI configuration const openai = new OpenAI({ apiKey: "<apiKey>", }); // Function to get the embeddings using the OpenAI API export async function getEmbedding(text) { const response = await openai.embeddings.create({ model: "text-embedding-3-small", input: text, encoding_format: "float", }); return response.data[0].embedding; } // Data to embed const data = [ "Titanic: The story of the 1912 sinking of the largest luxury liner ever built", "The Lion King: Lion cub and future king Simba searches for his identity", "Avatar: A marine is dispatched to the moon Pandora on a unique mission" ] async function run() { // Connect to your Atlas cluster const uri = "<connectionString>"; const client = new MongoClient(uri); try { await client.connect(); const db = client.db("sample_db"); const collection = db.collection("embeddings"); // Ingest data and embeddings into Atlas await Promise.all(data.map(async text => { // Check if the document already exists const embedding = await getEmbedding(text); const existingDoc = await collection.findOne({ text: text }); if (!existingDoc) { await collection.insertOne({ text: text, embedding: embedding }); console.log(embedding); } })); } catch (err) { console.log(err.stack); } finally { await client.close(); } } run().catch(console.dir); Substitua os seguintes valores de espaço reservado:
<apiKey>
com sua chave API OpenAI.<connectionString>
com a connection string SRVdo seu Atlas cluster.
Observação
Sua string de conexão deve usar o seguinte formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net Salve o arquivo e execute o seguinte comando:
node create-embeddings.js [ 0.031927742, -0.014192767, -0.021851597, 0.045498233, -0.0077904654, ... ] [ -0.01664538, 0.013198251, 0.048684783, 0.014485021, -0.018121032, ... ] [ 0.030449908, 0.046782598, 0.02126599, 0.025799986, -0.015830345, ... ] Observação
O número de dimensões na saída foi truncado para legibilidade.
Você também pode visualizar suas incorporações vetoriais na UI do Atlas navegando até a coleção
sample_db.embeddings
em seu cluster.
Crie uma função para gerar incorporações vetoriais.
Cole e execute o seguinte código em seu bloco de anotações para criar uma função que gere incorporações vetoriais usando um modelo de incorporação de código aberto da Nomic AI. Este código faz o seguinte:
Carrega o nomic-embed-text-v1 modelo de incorporação.
Cria uma função denominada
get_embedding
que utiliza o modelo para gerar uma incorporação para uma determinada entrada de texto.Gera uma única incorporação para a string
foo
.
from nomic import embed from sentence_transformers import SentenceTransformer # Load the embedding model (https://huggingface.co/nomic-ai/nomic-embed-text-v1") model = SentenceTransformer("nomic-ai/nomic-embed-text-v1", trust_remote_code=True) # Define a function to generate embeddings def get_embedding(data): """Generates vector embeddings for the given data.""" embedding = model.encode(data) return embedding.tolist() # Generate an embedding get_embedding("foo")
[-0.029808253049850464, 0.03841473162174225, -0.02561120130121708, -0.06707508116960526, 0.03867151960730553, ... ]
Crie incorporações e armazene-as no Atlas.
Cole e execute o código a seguir em seu bloco de anotações para conectar-se ao cluster do Atlas, gerar incorporações a partir de dados personalizados e inseri-las na sample_db.embeddings
coleção usando o MongoDB PyMongo Driver. Substitua <connection-string>
pela connection string SRVdo seu Atlas cluster.
Observação
Sua string de conexão deve usar o seguinte formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
import pymongo # Connect to your Atlas cluster mongo_client = pymongo.MongoClient("<connection-string>") db = mongo_client["sample_db"] collection = db["embeddings"] # Sample data data = [ "Titanic: The story of the 1912 sinking of the largest luxury liner ever built", "The Lion King: Lion cub and future king Simba searches for his identity", "Avatar: A marine is dispatched to the moon Pandora on a unique mission" ] # Ingest data into Atlas for text in data: embedding = get_embedding(text) collection.insert_one({ "text": text, "embedding": embedding })
Depois de executar o código de amostra, você pode visualizar suas incorporações vetoriais na Atlas navegando até a collection sample_db.embeddings
no seu cluster.
Crie uma função para gerar incorporações vetoriais.
Cole e execute o seguinte código em seu bloco de anotações para criar uma função que gera incorporações vetoriais usando um modelo de incorporação proprietário da OpenAI. Substitua <api-key>
pela sua chave de API OpenAI. Este código faz o seguinte:
Especifica o modelo de incorporação do
text-embedding-3-small
.Cria uma função denominada
get_embedding
que chama a API do modelo para gerar uma incorporação para uma determinada entrada de texto.Gera uma única incorporação para a string
foo
.
import os from openai import OpenAI # Specify your OpenAI API key and embedding model os.environ["OPENAI_API_KEY"] = "<api-key>" model = "text-embedding-3-small" openai_client = OpenAI() # Define a function to generate embeddings def get_embedding(text): """Generates vector embeddings for the given text.""" embedding = openai_client.embeddings.create(input = [text], model=model).data[0].embedding return embedding # Generate an embedding get_embedding("foo")
[-0.005843308754265308, -0.013111298903822899, -0.014585349708795547, 0.03580040484666824, 0.02671629749238491, ... ]
Dica
Veja também:
Para obter detalhes da API e uma lista de modelos disponíveis, consulte a documentação do OpenAI.
Crie incorporações e armazene-as no Atlas.
Cole e execute o código a seguir em seu bloco de anotações para conectar-se ao cluster do Atlas, gerar incorporações a partir de dados personalizados e inseri-las na sample_db.embeddings
coleção usando o MongoDB PyMongo Driver. Substitua <connection-string>
pela connection string SRVdo seu Atlas cluster.
Observação
Sua string de conexão deve usar o seguinte formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
import pymongo # Connect to your Atlas cluster mongo_client = pymongo.MongoClient("<connection-string>") db = mongo_client["sample_db"] collection = db["embeddings"] # Sample data data = [ "Titanic: The story of the 1912 sinking of the largest luxury liner ever built", "The Lion King: Lion cub and future king Simba searches for his identity", "Avatar: A marine is dispatched to the moon Pandora on a unique mission" ] # Ingest data into Atlas for text in data: embedding = get_embedding(text) collection.insert_one({ "text": text, "embedding": embedding })
Depois de executar o código de amostra, você pode visualizar suas incorporações vetoriais na Atlas navegando até a collection sample_db.embeddings
no seu cluster.
Criar incorporações para queries
O procedimento seguinte mostra como criar uma incorporação para consultas do Atlas Vector Search utilizando um modelo de incorporação de código aberto ou proprietário.
Procedimento
Depois de criar as incorporações a partir dos dados de amostra, conclua as etapas a seguir para criar um índice do Atlas Vector Search nos seus dados e incorporações para queries do Vector Search.
Crie o índice do Atlas Vector Search.
Para habilitar consultas de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.
Conclua as etapas a seguir para criar um índice na collection sample_db.embeddings
que especifique o campo embedding
como o tipo de vetor , as dimensões vetoriais 768
e a medida de similaridade como euclidean
.
Crie um arquivo denominado
create-index.js
e cole o seguinte código.create-index.jsimport { MongoClient } from 'mongodb'; // connect to your Atlas deployment const uri = "<connectionString>"; const client = new MongoClient(uri); async function run() { try { const database = client.db("sample_db"); const collection = database.collection("embeddings"); // define your Atlas Vector Search index const index = { name: "vector_index", type: "vectorSearch", definition: { "fields": [ { "type": "vector", "numDimensions": 768, "path": "embedding", "similarity": "euclidean" } ] } } // run the helper method const result = await collection.createSearchIndex(index); console.log(result); } finally { await client.close(); } } run().catch(console.dir); Substitua
<connectionString>
pela connection string SRVdo Atlas cluster.Salve o arquivo e execute o seguinte comando:
node create-index.js
Para saber mais, consulte Criar um Índice do Atlas Vector Search.
Crie incorporações para consultas de pesquisa vetorial e execute uma consulta.
Crie um arquivo denominado
vector-query.js
e cole o seguinte código.Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para o pipeline de agregação.
Por exemplo, o seguinte código faz o seguinte:
Cria uma incorporação para a string
ocean tragedy
chamando a função de incorporação definida no exemplo anterior.Passa a incorporação no campo
queryVector
em seu aggregation pipeline.Executa a query de pesquisa vetorial. Ele retorna documentos semanticamente semelhantes em ordem de relevância e sua pontuação de pesquisa vetorial.
vector-query.jsimport { MongoClient } from 'mongodb'; import { getEmbedding } from './create-embeddings.js'; // MongoDB connection URI and options const uri = "<connectionString>"; const client = new MongoClient(uri); async function run() { try { // Connect to the MongoDB client await client.connect(); // Specify the database and collection const database = client.db("sample_db"); const collection = database.collection("embeddings"); // Generate embedding for the search query const queryEmbedding = await getEmbedding("ocean tragedy"); // Define the sample vector search pipeline const pipeline = [ { $vectorSearch: { index: "vector_index", queryVector: queryEmbedding, path: "embedding", exact: true, limit: 5 } }, { $project: { _id: 0, text: 1, score: { $meta: "vectorSearchScore" } } } ]; // run pipeline const result = collection.aggregate(pipeline); // print results for await (const doc of result) { console.dir(JSON.stringify(doc)); } } finally { await client.close(); } } run().catch(console.dir); Substitua
<connectionString>
pela connection string SRVdo Atlas cluster.Salve o arquivo e execute o seguinte comando:
node vector-query.js '{"text":"Titanic: The story of the 1912 sinking of the largest luxury liner ever built","score":0.5103757977485657}' '{"text":"Avatar: A marine is dispatched to the moon Pandora on a unique mission","score":0.4616812467575073}' '{"text":"The Lion King: Lion cub and future king Simba searches for his identity","score":0.4115804433822632}'
Crie o índice do Atlas Vector Search.
Para habilitar consultas de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.
Conclua as etapas a seguir para criar um índice na collection sample_db.embeddings
que especifique o campo embedding
como o tipo de vetor , as dimensões vetoriais 1536
e a medida de similaridade como euclidean
.
Crie um arquivo denominado
create-index.js
e cole o seguinte código.create-index.jsimport { MongoClient } from 'mongodb'; // connect to your Atlas deployment const uri = "<connectionString>"; const client = new MongoClient(uri); async function run() { try { const database = client.db("sample_db"); const collection = database.collection("embeddings"); // define your Atlas Vector Search index const index = { name: "vector_index", type: "vectorSearch", definition: { "fields": [ { "type": "vector", "numDimensions": 1536, "path": "embedding", "similarity": "euclidean" } ] } } // run the helper method const result = await collection.createSearchIndex(index); console.log(result); } finally { await client.close(); } } run().catch(console.dir); Substitua
<connectionString>
pela connection string SRVdo Atlas cluster.Salve o arquivo e execute o seguinte comando:
node create-index.js
Para saber mais, consulte Criar um Índice do Atlas Vector Search.
Crie incorporações para consultas de pesquisa vetorial e execute uma consulta.
Crie um arquivo denominado
vector-query.js
e cole o seguinte código.Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para o pipeline de agregação.
Por exemplo, o seguinte código faz o seguinte:
Cria uma incorporação para a string
ocean tragedy
chamando a função de incorporação definida no exemplo anterior.Passa a incorporação no campo
queryVector
em seu aggregation pipeline.Executa a query de pesquisa vetorial. Ele retorna documentos semanticamente semelhantes em ordem de relevância e sua pontuação de pesquisa vetorial.
vector-query.jsimport { MongoClient } from 'mongodb'; import { getEmbedding } from './create-embeddings.js'; // MongoDB connection URI and options const uri = "<connectionString>"; const client = new MongoClient(uri); async function run() { try { // Connect to the MongoDB client await client.connect(); // Specify the database and collection const database = client.db("sample_db"); const collection = database.collection("embeddings"); // Generate embedding for the search query const queryEmbedding = await getEmbedding("ocean tragedy"); // Define the sample vector search pipeline const pipeline = [ { $vectorSearch: { index: "vector_index", queryVector: queryEmbedding, path: "embedding", exact: true, limit: 5 } }, { $project: { _id: 0, text: 1, score: { $meta: "vectorSearchScore" } } } ]; // run pipeline const result = collection.aggregate(pipeline); // print results for await (const doc of result) { console.dir(JSON.stringify(doc)); } } finally { await client.close(); } } run().catch(console.dir); Substitua
<connectionString>
pela connection string SRVdo Atlas cluster.Salve o arquivo e execute o seguinte comando:
node vector-query.js '{"text":"Titanic: The story of the 1912 sinking of the largest luxury liner ever built","score":0.4551968574523926}' '{"text":"Avatar: A marine is dispatched to the moon Pandora on a unique mission","score":0.4050074517726898}' '{"text":"The Lion King: Lion cub and future king Simba searches for his identity","score":0.3594386577606201}'
Crie o índice do Atlas Vector Search.
Para habilitar consultas de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.
Execute o seguinte código para criar um índice na coleção sample_db.embeddings
que especifica o campo embedding
como o tipo de vetor , 768
dimensões de vetor e a medida de similaridade como euclidean
.
from pymongo.operations import SearchIndexModel # Create your index model, then create the search index search_index_model = SearchIndexModel( definition = { "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 768, "similarity": "euclidean" } ] }, name="vector_index", type="vectorSearch", ) collection.create_search_index(model=search_index_model)
Para saber mais, consulte Criar um Índice do Atlas Vector Search.
Crie incorporações para consultas de pesquisa vetorial e execute uma consulta.
Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para o pipeline de agregação.
Por exemplo, o seguinte código faz o seguinte:
Cria uma incorporação para a string
ocean tragedy
chamando a função de incorporação definida no exemplo anterior.Passa a incorporação no campo
queryVector
em seu aggregation pipeline.Executa a query de pesquisa vetorial. Ele retorna documentos semanticamente semelhantes em ordem de relevância e sua pontuação de pesquisa vetorial.
# Generate embedding for the search query query_embedding = get_embedding("ocean tragedy") # Sample vector search pipeline pipeline = [ { "$vectorSearch": { "index": "vector_index", "queryVector": query_embedding, "path": "embedding", "exact": true, "limit": 5 } }, { "$project": { "_id": 0, "text": 1, "score": { "$meta": "vectorSearchScore" } } } ] # Execute the search results = collection.aggregate(pipeline) # Print results for i in results: print(i)
{'text': 'Titanic: The story of the 1912 sinking of the largest luxury liner ever built','score': 0.5103757977485657} {'text': 'Avatar: A marine is dispatched to the moon Pandora on a unique mission','score': 0.4616812467575073} {'text': 'The Lion King: Lion cub and future king Simba searches for his identity','score': 0.4115804433822632}
Crie o índice do Atlas Vector Search.
Para habilitar consultas de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.
Execute o seguinte código para criar um índice na coleção sample_db.embeddings
que especifica o campo embedding
como o tipo de vetor , 1536
dimensões de vetor e a medida de similaridade como euclidean
.
from pymongo.operations import SearchIndexModel # Create your index model, then create the search index search_index_model = SearchIndexModel( definition = { "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1536, "similarity": "euclidean" } ] }, name="vector_index", type="vectorSearch", ) collection.create_search_index(model=search_index_model)
Para saber mais, consulte Criar um Índice do Atlas Vector Search.
Crie incorporações para consultas de pesquisa vetorial e execute uma consulta.
Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para o pipeline de agregação.
Por exemplo, o seguinte código faz o seguinte:
Cria uma incorporação para a string
ocean tragedy
chamando a função de incorporação definida no exemplo anterior.Passa a incorporação no campo
queryVector
em seu aggregation pipeline.Executa a query de pesquisa vetorial. Ele retorna documentos semanticamente semelhantes em ordem de relevância e sua pontuação de pesquisa vetorial.
# Generate embedding for the search query query_embedding = get_embedding("ocean tragedy") # Sample vector search pipeline pipeline = [ { "$vectorSearch": { "index": "vector_index", "queryVector": query_embedding, "path": "embedding", "exact": true, "limit": 5 } }, { "$project": { "_id": 0, "text": 1, "score": { "$meta": "vectorSearchScore" } } } ] # Execute the search results = collection.aggregate(pipeline) # Print results for i in results: print(i)
{'text': 'Titanic: The story of the 1912 sinking of the largest luxury liner ever built','score': 0.4551968574523926} {'text': 'Avatar: A marine is dispatched to the moon Pandora on a unique mission','score': 0.4050074517726898} {'text': 'The Lion King: Lion cub and future king Simba searches for his identity','score': 0.3594386577606201}
Dica
Você também pode criar incorporações chamando o ponto de extremidade da API diretamente. Para saber mais, consulte Referência da API OpenAI.
Para saber mais sobre como executar queries de pesquisa vetorial, consulte Executar queries de pesquisa vetorial.