Como ingestão de vetores quantizados
Você pode converter suas incorporações em BSON BinData vector
subtipo float32
ou vector
subtipo int8
vetores.
Casos de uso
Recomendamos o binData
vector
subtipo BSON para os seguintes casos de uso:
Você precisa indexar a saída do vetor quantizado dos modelos de incorporação.
Você tem um grande número de vetores flutuantes, mas deseja reduzir o armazenamento e o volume do WiredTiger (como uso de disco e memória) no
mongod
.
Benefícios
O formato BinData vector
requer cerca de três vezes menos espaço em disco no seu cluster em comparação com arrays de elementos. Ele permite indexar seus vetores com tipos alternativos, como vetores int8
, reduzindo a memória necessária para criar o índice do Atlas Vector Search para sua coleção.
Se você ainda não tiver vetores binData
, poderá converter suas inserções para esse formato usando qualquer driver compatível antes de gravar seus dados em uma coleção. Esta página mostra as etapas para converter seus embeddings no subtipo BinData vector
.
Drivers suportados
BSON BinData vector
a conversão de vetores de subtipo float32
e int8
é compatível com o PyMongo Driver v4.10 ou posterior.
Pré-requisitos
Para converter seus incorporações para o subtipo BSON BinData vector
, você precisa do seguinte:
Um cluster do Atlas executando o MongoDB versão 6.0.11, 7.0.2, ou posterior.
Certifique-se de que seu endereço IP esteja incluído na lista de acessodo seu projeto Atlas.
Um ambiente para executar notebooks interativos em Python, como o Colab.
Acesso a um modelo de incorporação que suporta saída de vetor de bytes.
Os seguintes provedores de modelos de incorporação são compatíveis com vetores
int8
binData
:Provedor de modelo de incorporaçãoModelo de incorporaçãoembed-english-v3.0
nomic-embed-text-v1.5
jina-embeddings-v2-base-en
mxbai-embed-large-v1
Você pode usar qualquer um desses fornecedores de modelos de incorporação para gerar vetores
binData
. A quantização escalar preserva a recuperação para esses modelos porque esses modelos são todos treinamentos para reconhecer a quantização. Portanto, a degradação da recuperação para incorporações quantizadas escalares produzidas por esses modelos é mínima, mesmo em dimensões mais inferiores, como 384.
Procedimento
Os exemplos neste procedimento usam dados novos ou dados existentes e o embed-english-v3.0
modelo do Cohere. O exemplo para novos dados utiliza strings de texto de exemplo, que você pode substituir por seus próprios dados. O exemplo de dados existentes usa um subconjunto de documentos sem nenhuma incorporação da listingsAndReviews
coleção no sample_airbnb
banco de banco de dados , que você pode substituir por seu próprio banco de dados de dados e coleção (com ou sem incorporações). Selecione a aba com base no fato de você desejar criar binData
vetores para novos dados ou para dados que você já tem no seu Atlas cluster.
Crie um bloco de anotações Python interativo salvando um arquivo com a extensão .ipynb
e, em seguida, execute as seguintes etapas no bloco de anotações. Para tentar o exemplo, substitua os espaços reservados por valores válidos.
Instale as bibliotecas necessárias.
Execute o comando a seguir para instalar o driver do PyMongo. Se necessário, você também pode instalar bibliotecas do fornecedor do modelo de incorporação. Esta operação pode levar alguns minutos para ser concluída.
pip install pymongo
Você deve instalar o driver PyMongo v4.10 ou posterior.
Exemplo
Instale o PyMongo e o Cohere
pip --quiet install pymongo cohere
Carregue os dados para os quais você deseja gerar vetores BSON no seu notebook.
Exemplo
Dados de amostra para importar
data = [ "The Great Wall of China is visible from space.", "The Eiffel Tower was completed in Paris in 1889.", "Mount Everest is the highest peak on Earth at 8,848m.", "Shakespeare wrote 37 plays and 154 sonnets during his lifetime.", "The Mona Lisa was painted by Leonardo da Vinci.", ]
(Condicional) Gere incorporações a partir de seus dados.
Esta etapa é necessária se você ainda não gerou incorporações de seus dados. Se você já gerou incorporações, pule esta etapa. Para saber mais sobre como gerar incorporações de seus dados, consulte Como criar incorporações vetoriais.
Exemplo
Gerar incorporações a partir de dados de amostra usando o Cohere
Espaço reservado | Valor Válido |
---|---|
<COHERE-API-KEY> | Chave de API para Cohere. |
import cohere api_key = "<COHERE-API-KEY>" co = cohere.Client(api_key) generated_embeddings = co.embed( texts=data, model="embed-english-v3.0", input_type="search_document", embedding_types=["float", "int8"] ).embeddings float32_embeddings = generated_embeddings.float int8_embeddings = generated_embeddings.int8
Gere os vetores BSON a partir de suas incorporações.
Você pode usar o driver PyMongo para converter sua incorporação de vetores nativos em vetores BSON .
Exemplo
Defina e execute uma função para gerar vetores BSON
from bson.binary import Binary, BinaryVectorDtype def generate_bson_vector(vector, vector_dtype): return Binary.from_vector(vector, vector_dtype) # For all vectors in your collection, generate BSON vectors of float32 and int8 embeddings bson_float32_embeddings = [] bson_int8_embeddings = [] for i, (f32_emb, int8_emb) in enumerate(zip(float32_embeddings, int8_embeddings)): bson_float32_embeddings.append(generate_bson_vector(f32_emb, BinaryVectorDtype.FLOAT32)) bson_int8_embeddings.append(generate_bson_vector(int8_emb, BinaryVectorDtype.INT8))
Crie documentos com incorporações vetoriais <span tabindex=\"\" class=\" \">BSON .<a class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \">
Se você já tem as incorporações vetoriais BSON dentro dos documentos em sua coleção, pule esta etapa.
Exemplo
Crie documentos a partir dos dados de amostra
Espaço reservado | Valor Válido |
---|---|
<FIELD-NAME-FOR-INT8-TYPE> | Nome do campo com valores int8 . |
<FIELD-NAME-FOR-FLOAT32-TYPE> | Nome do campo com valores float32 . |
def create_docs_with_bson_vector_embeddings(bson_float32_embeddings, bson_int8_embeddings, data): docs = [] for i, (bson_f32_emb, bson_int8_emb, text) in enumerate(zip(bson_float32_embeddings, bson_int8_embeddings, data)): doc = { "_id":i, "data": text, "<FIELD-NAME-FOR-INT8-TYPE>":bson_int8_emb, "<FIELD-NAME-FOR-FLOAT32-TYPE>":bson_f32_emb, } docs.append(doc) return docs documents = create_docs_with_bson_vector_embeddings(bson_float32_embeddings, bson_int8_embeddings, data)
Carregue seus dados em seu cluster do Atlas.
Você pode carregar seus dados da interface do Atlas e programaticamente. Para saber como carregar seus dados da interface do usuário do Atlas, consulte Inserir seus dados. As etapas a seguir e os exemplos associados demonstram como carregar seus dados de forma programática usando o driver PyMongo .
Conecte-se ao seu cluster do Atlas.
Espaço reservadoValor Válido<ATLAS-CONNECTION-STRING>
Connection string do Atlas. Para saber mais, consulte Conectar via drivers.Exemplo
import pymongo MONGO_URI = "<ATLAS-CONNECTION-STRING>" def get_mongo_client(mongo_uri): # establish the connection client = pymongo.MongoClient(mongo_uri) if not MONGO_URI: print("MONGO_URI not set in environment variables") Carregue os dados em seu cluster do Atlas.
Espaço reservadoValor Válido<DB-NAME>
Nome do banco de dados.<COLLECTION-NAME>
Nome da collection no banco de banco de dados especificado .Exemplo
client = pymongo.MongoClient(MONGO_URI) db = client["<DB-NAME>"] db.create_collection("<COLLECTION-NAME>") col = db["<COLLECTION-NAME>"] col.insert_many(documents)
Crie o índice do Atlas Vector Search na coleção.
Você pode criar índices do Atlas Vector Search usando a IU do Atlas, a CLI do Atlas, a Administration API do Atlas e os drivers do MongoDB. Para saber mais, consulte Como indexar campos do Vector Search.
Exemplo
Crie um índice para a coleção de amostras
Espaço reservado | Valor Válido |
---|---|
<FIELD-NAME-FOR-INT8-TYPE> | Nome do campo com valores int8 . |
<FIELD-NAME-FOR-FLOAT32-TYPE> | Nome do campo com valores float32 . |
import time from pymongo.operations import SearchIndexModel vector_search_index_definition = { "fields":[ { "type": "vector", "path": "<FIELD-NAME-FOR-FLOAT32-TYPE>", "similarity": "dotProduct", "numDimensions": 1024, }, { "type": "vector", "path": "<FIELD-NAME-FOR-INT8-TYPE>", "similarity": "dotProduct", "numDimensions": 1024, } ] } search_index_model = SearchIndexModel(definition=vector_search_index_definition, name="<INDEX-NAME>", type="vectorSearch") col.create_search_index(model=search_index_model)
Defina uma função para executar as queries do Atlas Vector Search.
A função para executar queries do Atlas Vector Search deve executar as seguintes ações:
Converta o texto da query em um vetor BSON.
Defina o pipeline para a query do Atlas Vector Search.
Exemplo
Espaço reservado | Valor Válido |
---|---|
<FIELD-NAME-FOR-FLOAT32-TYPE> | Nome do campo com valores float32 . |
<INDEX-NAME> | Nome do índice de tipo vector . |
<NUMBER-OF-CANDIDATES-TO-CONSIDER> | Número de vizinhos mais próximos a serem utilizados durante a pesquisa. |
<NUMBER-OF-DOCUMENTS-TO-RETURN> | Número de documentos a retornar nos resultados. |
def run_vector_search(query_text, collection, path): query_text_embeddings = co.embed( texts=[query_text], model="embed-english-v3.0", input_type="search_query", embedding_types=["float", "int8"] ).embeddings if path == "<FIELD-NAME-FOR-FLOAT32-TYPE>": query_vector = query_text_embeddings.float[0] vector_dtype = BinaryVectorDtype.FLOAT32 else: query_vector = query_text_embeddings.int8[0] vector_dtype = BinaryVectorDtype.INT8 bson_query_vector = generate_bson_vector(query_vector, vector_dtype) pipeline = [ { '$vectorSearch': { 'index': '<INDEX-NAME>', 'path': path, 'queryVector': bson_query_vector, 'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, 'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> } }, { '$project': { '_id': 0, 'data': 1, 'score': { '$meta': 'vectorSearchScore' } } } ] return collection.aggregate(pipeline)
Execute a query do Atlas Vector Search.
Você pode executar queries do Atlas Vector Search de forma programática. Para saber mais, consulte Executar queries de pesquisa vetorial.
Exemplo
from pprint import pprint query_text = "tell me a science fact" float32_results = run_vector_search(query_text, col, "<FIELD-NAME-FOR-FLOAT32-TYPE>") int8_results = run_vector_search(query_text, col, "<FIELD-NAME-FOR-INT8-TYPE>") print("results from float32 embeddings") pprint(list(float32_results)) print("--------------------------------------------------------------------------") print("results from int8 embeddings") pprint(list(int8_results))
results from float32 embeddings [{'data': 'Mount Everest is the highest peak on Earth at 8,848m.', 'score': 0.4222325384616852}, {'data': 'The Great Wall of China is visible from space.', 'score': 0.4112812876701355}, {'data': 'The Mona Lisa was painted by Leonardo da Vinci.', 'score': 0.3871753513813019}, {'data': 'The Eiffel Tower was completed in Paris in 1889.', 'score': 0.38428616523742676}, {'data': 'Shakespeare wrote 37 plays and 154 sonnets during his lifetime.', 'score': 0.37546128034591675}] -------------------------------------------------------------------------- results from int8 embeddings [{'data': 'Mount Everest is the highest peak on Earth at 8,848m.', 'score': 4.619598996669083e-07}, {'data': 'The Great Wall of China is visible from space.', 'score': 4.5106872903488693e-07}, {'data': 'The Mona Lisa was painted by Leonardo da Vinci.', 'score': 4.0036800896814384e-07}, {'data': 'The Eiffel Tower was completed in Paris in 1889.', 'score': 3.9345573554783186e-07}, {'data': 'Shakespeare wrote 37 plays and 154 sonnets during his lifetime.', 'score': 3.797164538354991e-07}]
Instale as bibliotecas necessárias.
Execute o comando a seguir para instalar o driver do PyMongo. Se necessário, você também pode instalar bibliotecas do fornecedor do modelo de incorporação. Esta operação pode levar alguns minutos para ser concluída.
pip install pymongo
Você deve instalar o driver PyMongo v4.10 ou posterior.
Exemplo
Instale o PyMongo e o Cohere
pip --quiet install pymongo cohere
Defina as funções para gerar incorporações vetoriais e converter incorporações em formato compatível com BSON.
Você deve definir funções que executam o seguinte usando um modelo de incorporação:
Gere incorporações a partir dos seus dados existentes se os dados existentes não tiverem nenhuma incorporação.
Converta as incorporações em vetores BSON.
Exemplo
Função para Gerar e Converter Incorporações
Espaço reservado | Valor Válido |
---|---|
<COHERE-API-KEY> | Chave de API para Cohere. |
1 import os 2 import pymongo 3 import cohere 4 from bson.binary import Binary, BinaryVectorDtype 5 6 # Specify your OpenAI API key and embedding model 7 os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>" 8 cohere_client = cohere.Client(os.environ["COHERE_API_KEY"]) 9 10 # Function to generate embeddings using Cohere 11 def get_embedding(text): 12 response = cohere_client.embed( 13 texts=[text], 14 model='embed-english-v3.0', 15 input_type='search_document' 16 ) 17 embedding = response.embeddings[0] 18 return embedding 19 20 # Function to convert embeddings to BSON-compatible format 21 def generate_bson_vector(vector, vector_dtype): 22 return Binary.from_vector(vector, vector_dtype)
Conecte-se ao Atlas cluster e recupere dados existentes.
Você deve fornecer o seguinte:
String de conexão para conectar ao seu Atlas cluster que contém o banco de dados de dados e a coleção para a qual você deseja gerar incorporações.
Nome do banco de banco de dados que contém a collection para a qual você deseja gerar embeddings.
Nome da collection para a qual você deseja gerar incorporações.
Exemplo
Conecte-se ao Atlas Cluster para acessar dados
Espaço reservado | Valor Válido |
---|---|
<ATLAS-CONNECTION-STRING> | Connection string do Atlas. Para saber mais, consulte Conectar via drivers. |
1 # Connect to your Atlas cluster 2 mongo_client = pymongo.MongoClient("<ATLAS-CONNECTION-STRING>") 3 db = mongo_client["sample_airbnb"] 4 collection = db["listingsAndReviews"] 5 6 # Filter to exclude null or empty summary fields 7 filter = { "summary": {"$nin": [None, ""]} } 8 9 # Get a subset of documents in the collection 10 documents = collection.find(filter).limit(50) 11 12 # Initialize the count of updated documents 13 updated_doc_count = 0
Gere, converta e carregue incorporações em sua coleção.
Gere incorporações a partir dos seus dados usando qualquer modelo de incorporação se seus dados ainda não tiverem incorporações. Para saber mais sobre como gerar incorporações a partir dos seus dados, consulte Como criar incorporações vetoriais.
Converta as incorporações em vetores BSON (como mostrado na linha 7 no exemplo a seguir).
Carregue as incorporações na sua coleção no Atlas cluster.
Essa operação pode levar alguns minutos para ser concluída.
Exemplo
Gerar, Converter e Carregar Incorporações na Coleção
1 for doc in documents: 2 # Generate embeddings based on the summary 3 summary = doc["summary"] 4 embedding = get_embedding(summary) # Get float32 embedding 5 6 # Convert the float32 embedding to BSON format 7 bson_float32 = generate_bson_vector(embedding, BinaryVectorDtype.FLOAT32) 8 9 # Update the document with the BSON embedding 10 collection.update_one( 11 {"_id": doc["_id"]}, 12 {"$set": {"embedding": bson_float32}} 13 ) 14 updated_doc_count += 1 15 16 print(f"Updated {updated_doc_count} documents with BSON embeddings.")
Crie o índice do Atlas Vector Search na coleção.
Você pode criar índices do Atlas Vector Search usando a UI do Atlas , Atlas CLI, API de administração do Atlas e drivers do MongoDB na linguagem de sua preferência. Para saber mais, consulte Como indexar campos do Vector Search.
Exemplo
Criar Índice para a Coleção
Espaço reservado | Valor Válido |
---|---|
<INDEX-NAME> | Nome do índice de tipo vector . |
1 from pymongo.operations import SearchIndexModel 2 3 vector_search_index_definition = { 4 "fields":[ 5 { 6 "type": "vector", 7 "path": "embedding", 8 "similarity": "dotProduct", 9 "numDimensions": 1024, 10 } 11 ] 12 } 13 14 search_index_model = SearchIndexModel(definition=vector_search_index_definition, name="<INDEX-NAME>", type="vectorSearch") 15 16 collection.create_search_index(model=search_index_model)
O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.
Defina uma função para executar as queries do Atlas Vector Search.
A função para executar queries do Atlas Vector Search deve executar as seguintes ações:
Gere incorporações para o texto da query.
Converta o texto da query em um vetor BSON.
Defina o pipeline para a query do Atlas Vector Search.
Exemplo
Função para executar query do Atlas Vector Search
Espaço reservado | Valor Válido |
---|---|
<INDEX-NAME> | Nome do índice de tipo vector . |
<NUMBER-OF-CANDIDATES-TO-CONSIDER> | Número de vizinhos mais próximos a serem utilizados durante a pesquisa. |
<NUMBER-OF-DOCUMENTS-TO-RETURN> | Número de documentos a retornar nos resultados. |
1 def run_vector_search(query_text, collection, path): 2 query_embedding = get_embedding("query_text") 3 bson_query_vector = generate_bson_vector(query_embedding, BinaryVectorDtype.FLOAT32) 4 5 pipeline = [ 6 { 7 '$vectorSearch': { 8 'index': '<INDEX-NAME>', 9 'path': path, 10 'queryVector': bson_query_vector, 11 'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, # for example, 20 12 'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 5 13 } 14 }, 15 { 16 '$project': { 17 '_id': 0, 18 'name': 1, 19 'summary': 1, 20 'score': { '$meta': 'vectorSearchScore' } 21 } 22 } 23 ] 24 25 return collection.aggregate(pipeline)
Execute a query do Atlas Vector Search.
Você pode executar queries do Atlas Vector Search de forma programática. Para saber mais, consulte Executar queries de pesquisa vetorial.
Exemplo
Executar uma query de amostra do Atlas Vector Search
1 from pprint import pprint 2 3 query_text = "ocean view" 4 float32_results = run_vector_search(query_text, collection, "embedding") 5 6 print("results from float32 embeddings") 7 pprint(list(float32_results))
results from float32 embeddings [{'name': 'Your spot in Copacabana', 'score': 0.5468248128890991, 'summary': 'Having a large airy living room. The apartment is well divided. ' 'Fully furnished and cozy. The building has a 24h doorman and ' 'camera services in the corridors. It is very well located, close ' 'to the beach, restaurants, pubs and several shops and ' 'supermarkets. And it offers a good mobility being close to the ' 'subway.'}, {'name': 'Twin Bed room+MTR Mongkok shopping&My', 'score': 0.527062714099884, 'summary': 'Dining shopping conveniently located Mongkok subway E1, airport ' 'shuttle bus stops A21. Three live two beds, separate WC, 24-hour ' 'hot water. Free WIFI.'}, {'name': 'Quarto inteiro na Tijuca', 'score': 0.5222363471984863, 'summary': 'O quarto disponível tem uma cama de solteiro, sofá e computador ' 'tipo desktop para acomodação.'}, {'name': 'Makaha Valley Paradise with OceanView', 'score': 0.5175154805183411, 'summary': 'A beautiful and comfortable 1 Bedroom Air Conditioned Condo in ' 'Makaha Valley - stunning Ocean & Mountain views All the ' 'amenities of home, suited for longer stays. Full kitchen & large ' "bathroom. Several gas BBQ's for all guests to use & a large " 'heated pool surrounded by reclining chairs to sunbathe. The ' 'Ocean you see in the pictures is not even a mile away, known as ' 'the famous Makaha Surfing Beach. Golfing, hiking,snorkeling ' 'paddle boarding, surfing are all just minutes from the front ' 'door.'}, {'name': 'Cozy double bed room 東涌鄉村雅緻雙人房', 'score': 0.5149975419044495, 'summary': 'A comfortable double bed room at G/F. Independent entrance. High ' 'privacy. The room size is around 100 sq.ft. with a 48"x72" ' 'double bed. The village house is close to the Hong Kong Airport, ' 'AsiaWorld-Expo, HongKong-Zhuhai-Macau Bridge, Disneyland, ' 'Citygate outlets, 360 Cable car, shopping centre, main tourist ' 'attractions......'}]
Seus resultados podem variar porque você selecionou aleatoriamente 50
documentos do namespace sample_airbnb.listingsAndReviews
na etapa 3. Os documentos selecionados e as incorporações geradas podem ser diferentes em seu ambiente.
Para obter uma demonstração avançada desse procedimento em dados de amostra usando o modelo de incorporação embed-english-v3.0
do Cohere, consulte este notebook.