Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/

Configure seus dados para armazenamento e ingestão vetoriais eficientes no Atlas

Você pode converter suas incorporações para BSON BinData vector de vetores de subtipo float32 ou vector subtipo int8. Recomendamos o subtipo BSON binData vector para os seguintes casos de uso:

  • Você precisa indexar a saída vetorial quantizada a partir de modelos incorporados.

  • 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.

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 vetores int8 , reduzindo a memória necessária para construir 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.

BSON BinData vector a conversão de vetores de subtipo float32 e int8 é compatível com o PyMongo Driver v4.10 ou posterior.

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 fornecedores de modelos de incorporação oferecem suporte a vetores int8 binData :

    Provedor de modelo de incorporação
    Modelo de incorporação
    embed-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.

Crie um notebook Python interativo salvando um arquivo com a extensão .ipynb e execute as etapas a seguir no notebook. Os exemplos desse procedimento usam dados de amostra e o modelo Cohere embed-english-v3.0. Para testar o exemplo, substitua os valores mostrados entre chaves ({ }) por valores válidos.

1

Execute o seguinte comando para instalar o driver PyMongo.

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
2

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.",
]
3

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

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
4

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))
5

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

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)
6

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 .

  1. 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")
  2. Carregue os dados em seu cluster do Atlas.

    Exemplo

    client = pymongo.MongoClient(MONGO_URI)
    db = client["{DB-NAME}"]
    db.create_collection("{COLLECTION-NAME}")
    col = db["{COLLECTION-NAME}"]
    col.insert_many(documents)
7

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

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)
8

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)
9

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}]

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.

Voltar

Como criar incorporações de vetor