Configure seus dados para armazenamento e ingestão eficientes de vetores no Atlas
Você pode converter suas incorporações em BSON BinData vector
subtipo float32
ou vector
subtipo int8
vetores. Recomendamos o subtipo BSON binData
vector
para os seguintes casos de uso:
Você precisa indexar vetores quantizados de modelos de incorporação.
Você tem um grande número de vetores float, mas deseja reduzir o armazenamento e a implantação do WiredTiger (como o uso de disco e memória) em
mongod
.
O formato BinData vector
requer cerca de três vezes menos espaço em disco no seu cluster em comparação com as arrays de elementos. Ele permite a você indexar seus vetores com tipos alternativos como int8
e int1
vetores, reduzindo a memória necessária para construir o índice do Atlas Vector Search para sua coleção.
Se você ainda não tiver binData
vetores, você pode converter suas incorporações para este formato utilizando qualquer driver suportado antes de gravar seus dados em uma coleção. Esta página orienta você pelas etapas para converter suas incorporações para o subtipo BinData vector
.
Drivers suportados
BSON BinData vector
o subtipo float32
e a conversão de vetor int8
são suportados pelo PyMongo Driver v4.10 ou posterior.
Pré-requisitos
Para converter suas incorporações para o subtipo BSON BinData vector
, você precisa do 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 nalista de acesso do seu projeto Atlas .
Um ambiente para executar blocos de anotações interativos do Python, como o CoLab.
Acesso a um modelo de incorporação que suporta saída de vetor de bytes.
Os seguintes fornecedores de modelos de incorporação oferecem suporte aos vetores
int8
eint1
binData
:Incorporando fornecedor de modeloModelo 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
.
Procedimento
Crie um bloco de anotações Python interativo salvando um arquivo com a .ipynb
extensão e, em seguida, execute as seguintes etapas no bloco de anotações. Os exemplos neste procedimento usam dados de amostra e o Cohere's embed-english-v3.0
Modelo . Para tentar o exemplo, substitua os valores mostrados entre chaves ({ }
) por valores válidos.
Instale as bibliotecas necessárias.
Execute o comando a seguir para instalar o driver do PyMongo.
pip install pymongo
Você deve instalar o PyMongo v4.10 ou driver posterior.
Exemplo
Instalar PyMongo e Coere
pip --quiet install pymongo cohere
Carregue os dados para os quais você deseja gerar vetores BSON em seu bloco de anotações.
Exemplo
Dados de amostra a serem importados
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 dos seus dados.
Esta etapa é necessária se você ainda não tiver gerado incorporações a partir dos seus dados. Se você já gerou incorporações, pule esta etapa. Para saber mais sobre como gerar incorporações a partir dos seus dados, consulte Como criar incorporações vetoriais.
Exemplo
Gerar incorporações a partir de dados de amostra usando Coere
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 vetor nativo em vetores BSON .
Exemplo
Definir e executar 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 as incorporações vetoriais BSON .
Se você já tiver as incorporações do vetor BSON dentro dos documentos em sua coleção, pule esta etapa.
Exemplo
Criar documentos a partir dos dados de amostra
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 a partir da UI do Atlas e programaticamente. Para saber como carregar seus dados a partir da UI do Atlas , consulte Inserir seus dados. As etapas a seguir e exemplos associados demonstram como carregar seus dados programaticamente usando o driver PyMongo .
Conecte-se ao seu cluster do Atlas.
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 Atlas .
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 UI do Atlas , o Atlas CLI, a API de administração do Atlas e os drivers do MongoDB . Para saber mais, consulte Como indexar campos do Vector Search.
Exemplo
Criar Índice para a Coleção de Amostras
import time from pymongo.operations import SearchIndexModel vector_search_index_definition = { "fields":[ { "type": "vector", "path": "{FIELD-NAME-FOR-FLOAT32-TYPE}", "similarity": "euclidean", "numDimensions": 1024, }, { "type": "vector", "path": "{FIELD-NAME-FOR-INT8-TYPE}", "similarity": "euclidean", "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
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 programaticamente. Para saber mais, consulte Executar queries de Vector Search .
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}]
Para obter uma demonstração avançada desse procedimento em dados de exemplo usando o embed-english-v3.0
modelo de incorporação do Cohere, consulte este bloco de anotações.