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

Quantização vetorial

Nesta página

  • Sobre Quantização
  • Quantização escalar
  • Quantização binária
  • Requisitos
  • Como habilitar a quantização automática de vetores
  • Benefícios
  • Casos de uso
  • Procedimento
  • Como ingestão de vetores pré-quantizados
  • Casos de uso
  • Benefícios
  • Drivers suportados
  • Pré-requisitos
  • Procedimento
  • Avalie os resultados da sua query

Observação

O suporte do Atlas Vector Search para o seguinte está disponível como um recurso de visualização:

  • Ingestão de BSON BinData vector subtipo.int1

  • Quantização escalar automática.

  • Quantização binária automática.

O Atlas Vector Search oferece suporte à quantização automática de valores flutuantes duplos ou 32bits em suas incorporações vetoriais. Ele também pode consumir e indexar seus vetores quantizados escalares e binários de fornecedores de incorporação.

Quantização é o processo de reduzir vetores de fidelidade total em menos bits. Ela reduz a quantidade de memória principal necessária para armazenar cada vetor em um índice do Atlas Vector Search indexando os vetores de representação reduzida. Isso permite o armazenamento de mais vetores ou vetores com dimensões superiores. Portanto, a quantização reduz o consumo de recursos e melhora a velocidade. Recomendamos a quantização para aplicativos com um grande número de vetores, como mais de 10M.

A quantização escalar envolve primeiro identificar os valores mínimo e máximo para cada dimensão dos vetores indexados para estabelecer uma faixa de valores para uma dimensão. Em seguida, o intervalo é dividido em intervalos ou compartimentos de tamanhos iguais. Finalmente, cada valor de flutuação é mapeado para um compartimento para converter os valores de flutuação contínuos em inteiros discretos. No Atlas Vector Search, essa quantização reduz o custo de RAM da incorporação do vetor para um quarto (1/4) do custo da pré-quantização.

A quantização binária envolve assumir um ponto médio de 0 para cada dimensão, o que normalmente é apropriado para incorporações normalizadas para comprimento 1 como o do OpenAI.text-embedding-3-large Em seguida, cada valor no vetor é comparado ao ponto médio e recebe um valor binário de 1 se for maior que o ponto médio e um valor binário de 0 se for menor ou igual ao ponto médio. No Atlas Vector Search, essa quantização reduz o custo de RAM da incorporação do vetor para um vigésimo quarto (1/24) do custo pré-quantização. O motivo pelo qual não 1/32 é é porque a estrutura de dados que contém o gráfico Hierarchical Navigable Small Worlds em si, separada dos valores vetoriais, não é compactada.

Quando você executa uma query, o Atlas Vector Search converte o valor float no vetor de query em um vetor binário usando o mesmo ponto médio para comparação eficiente entre o vetor de query e vetores binários indexados. Em seguida, ele reclassifica reavaliando os candidatos identificados na comparação binária usando os valores flutuantes originais associados a esses resultados do índice binário para refinar ainda mais os resultados. Os vetores de fidelidade total são armazenados em sua própria estrutura de dados no disco e só são referenciados durante a reclassificação quando você configura a quantização binária ou quando executa a pesquisa exata em vetores quantizados binários ou escalares.

Dica

Veja também:

A tabela a seguir mostra os requisitos para Quantizar e Ingerir automaticamente vetores Quantizados:

Requerimento
Para int1 ingestão
Para int8 ingestão
Para Quantização escalar automática
Para Quantização Binária Automática

Exige configurações de definição de índice

No

No

Sim

Sim

Exige o binData formato BSON

Sim

Sim

No

No

Armazenamento no mongod

binData(int1)

binData(int8)

binData(float32)
array(float32)
binData(float32)
array(float32)

Método de similaridade suportado

euclidean

cosine
euclidean
dotProduct
cosine
euclidean
dotProduct
cosine
euclidean
dotProduct

Número de dimensões suportadas

Múltiplo de 8

1 a 4096

1 a 4096

Múltiplo de 8

Suporta pesquisa ENN

ENN em int1

ENN em int8

ENN em float32

ENN em float32

Você pode configurar o Atlas Vector Search para quantizar automaticamente os valores flutuantes duplos ou de 32bits em suas incorporações vetoriais para tipos de números menores, como int8 (scalar) e binary.

Para a maioria dos modelos de incorporação, recomendamos a quantização binária com repontuação. Se você quiser usar modelos de dimensão inferior que não sejam QAT, use a quantização escalar porque ela tem menos perda de representação e, portanto, incorre em menos perda de capacidade de representação.

O Atlas Vector Search oferece recursos nativos para quantização escalar, bem como quantização binária com repontuação. A quantização automática aumenta a escalabilidade e a economia de custos de seus aplicativos, reduzindo o armazenamento e os recursos computacionais para o processamento eficiente de seus vetores. A quantização automática reduz a RAM para mongot em 3.75x para escalar e em 24x para binário; os valores vetoriais diminuem em 4x e 32x, respectivamente, mas o gráfico Hierarchical Navigable Small Worlds em si não diminui. Isso melhora o desempenho, mesmo no maior volume e escala.

Recomendamos a quantização automática se você tiver um grande número de vetores de fidelidade total, normalmente mais de 10vetores M. Após a quantização, você indexa vetores de representação reduzida sem comprometer a precisão ao recuperar vetores.

Para quantidader automaticamente seus valores de double ou 32bits float:

1

Em um índice novo ou existente do Atlas Vector Search , especifique um dos seguintes tipos de quantização no fields.quantization campo para sua definição de índice:

  • scalar: para produzir vetores de bytes a partir de vetores de entrada de 32bits.

  • binary: para produzir vetores de bits a partir de vetores de entrada de 32bits.

Se você especificar a quantização automática em dados que não sejam uma array de valores doubles ou 32-bit float, o Atlas Vector Search ignorará silenciosamente esse vetor em vez de indexá-lo, e esses vetores serão ignorados.

2

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.

O Atlas Vector Search também suporta a ingestão e indexação de vetores quantizados escalares e binários de fornecedores de incorporação. Se você ainda não tiver vetores quantizados, poderá converter suas incorporações em vector float32int1 int8 vetores BSON BinData subtipo , ou.

Observação

O suporte do Atlas Vector Search para o seguinte está disponível como um recurso de visualização:

  • Ingestão do vector subtipo BSON BinData.int1

  • Quantização escalar automática.

  • Quantização binária automática.

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.

O vector formato BinData 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 int1 ou int8 vetores, reduzindo a memória necessária para criar o índice do Atlas Vector Search para sua coleção. Reduz a RAM para mongot em 3.75x para escalar e em 24x para binário; os valores vetoriais diminuem em 4x e 32x, respectivamente, mas o gráfico Hierarchical Navigable Small Worlds em si não diminui.

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 vetor de float32subtipo, int1 e é suportada int8 pelo 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 Python interativos, como o Colab.

  • Acesso a um modelo de incorporação que suporta saída de vetor de bytes.

    As saídas dos seguintes modelos de incorporação podem ser utilizadas para gerar binData vetores BSON com um driver MongoDB compatível:

    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

    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 inferiores 384 como.

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.

Dica

Trabalhe com uma versão executável deste tutorial como um bloco de anotações Python.

1

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 install --quiet --upgrade 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

Espaço reservado
Valor Válido

<COHERE-API-KEY>

Chave de API para Cohere.

import os
import cohere
# Specify your Cohere API key
os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>"
cohere_client = cohere.Client(os.environ["COHERE_API_KEY"])
# Generate embeddings using the embed-english-v3.0 model
generated_embeddings = cohere_client.embed(
texts=data,
model="embed-english-v3.0",
input_type="search_document",
embedding_types=["float", "int8", "ubinary"]
).embeddings
float32_embeddings = generated_embeddings.float
int8_embeddings = generated_embeddings.int8
int1_embeddings = generated_embeddings.ubinary
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, int8, and int1 embeddings
bson_float32_embeddings = []
bson_int8_embeddings = []
bson_int1_embeddings = []
for i, (f32_emb, int8_emb, int1_emb) in enumerate(zip(float32_embeddings, int8_embeddings, int1_embeddings)):
bson_float32_embeddings.append(generate_bson_vector(f32_emb, BinaryVectorDtype.FLOAT32))
bson_int8_embeddings.append(generate_bson_vector(int8_emb, BinaryVectorDtype.INT8))
bson_int1_embeddings.append(generate_bson_vector(int1_emb, BinaryVectorDtype.PACKED_BIT))
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

Espaço reservado
Valor Válido

<FIELD-NAME-FOR-FLOAT32-TYPE>

Nome do campo com valores float32.

<FIELD-NAME-FOR-INT8-TYPE>

Nome do campo com valores int8.

<FIELD-NAME-FOR-INT1-TYPE>

Nome do campo com valores int1.

# Specify the field names for the float32, int8, and int1 embeddings
float32_field = "<FIELD-NAME-FOR-FLOAT32-TYPE>"
int8_field = "<FIELD-NAME-FOR-INT8-TYPE>"
int1_field = "<FIELD-NAME-FOR-INT1-TYPE>"
# Define function to create documents with BSON vector embeddings
def create_docs_with_bson_vector_embeddings(bson_float32_embeddings, bson_int8_embeddings, bson_int1_embeddings, data):
docs = []
for i, (bson_f32_emb, bson_int8_emb, bson_int1_emb, text) in enumerate(zip(bson_float32_embeddings, bson_int8_embeddings, bson_int1_embeddings, data)):
doc = {
"_id": i,
"data": text,
float32_field: bson_f32_emb,
int8_field: bson_int8_emb,
int1_field: bson_int1_emb
}
docs.append(doc)
return docs
# Create the documents
documents = create_docs_with_bson_vector_embeddings(bson_float32_embeddings, bson_int8_embeddings, bson_int1_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.

    Espaço reservado
    Valor Válido

    <ATLAS-CONNECTION-STRING>

    Connection string do Atlas. Para saber mais, consulte Conectar via drivers.

    Exemplo

    import pymongo
    mongo_client = pymongo.MongoClient("<ATLAS-CONNECTION-STRING>")
  2. Carregue os dados em seu cluster do Atlas.

    Espaço reservado
    Valor Válido

    <DB-NAME>

    Nome do banco de dados.

    <COLLECTION-NAME>

    Nome da collection no banco de banco de dados especificado .

    Exemplo

    # Insert documents into a new database and collection
    db = mongo_client["<DB-NAME>"]
    collection_name = "<COLLECTION-NAME>"
    db.create_collection(collection_name)
    collection = db[collection_name]
    collection.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

Espaço reservado
Valor Válido

<INDEX-NAME>

Nome do índice de tipo vector.

from pymongo.operations import SearchIndexModel
import time
# Define and create the vector search index
index_name = "<INDEX-NAME>"
search_index_model = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"path": float32_field,
"similarity": "dotProduct",
"numDimensions": 1024
},
{
"type": "vector",
"path": int8_field,
"similarity": "dotProduct",
"numDimensions": 1024
},
{
"type": "vector",
"path": int1_field,
"similarity": "euclidean",
"numDimensions": 1024
}
]
},
name=index_name,
type="vectorSearch"
)
result = collection.create_search_index(model=search_index_model)
print("New search index named " + result + " is building.")
# Wait for initial sync to complete
print("Polling to check if the index is ready. This may take up to a minute.")
predicate=None
if predicate is None:
predicate = lambda index: index.get("queryable") is True
while True:
indices = list(collection.list_search_indexes(index_name))
if len(indices) and predicate(indices[0]):
break
time.sleep(5)
print(result + " is ready for querying.")
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

Espaço reservado
Valor Válido

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

# Define a function to run a vector search query
def run_vector_search(query_text, collection, path):
query_text_embeddings = cohere_client.embed(
texts=[query_text],
model="embed-english-v3.0",
input_type="search_query",
embedding_types=["float", "int8", "ubinary"]
).embeddings
if path == float32_field:
query_vector = query_text_embeddings.float[0]
vector_dtype = BinaryVectorDtype.FLOAT32
elif path == int8_field:
query_vector = query_text_embeddings.int8[0]
vector_dtype = BinaryVectorDtype.INT8
elif path == int1_field:
query_vector = query_text_embeddings.ubinary[0]
vector_dtype = BinaryVectorDtype.PACKED_BIT
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>, # for example, 5
'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 2
}
},
{
'$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
# Run the vector search query on the float32, int8, and int1 embeddings
query_text = "tell me a science fact"
float32_results = run_vector_search(query_text, collection, float32_field)
int8_results = run_vector_search(query_text, collection, int8_field)
int1_results = run_vector_search(query_text, collection, int1_field)
print("results from float32 embeddings")
pprint(list(float32_results))
print("--------------------------------------------------------------------------")
print("results from int8 embeddings")
pprint(list(int8_results))
print("--------------------------------------------------------------------------")
print("results from int1 embeddings")
pprint(list(int1_results))
results from float32 embeddings
[{'data': 'Mount Everest is the highest peak on Earth at 8,848m.',
'score': 0.6578356027603149},
{'data': 'The Great Wall of China is visible from space.',
'score': 0.6420407891273499}]
--------------------------------------------------------------------------
results from int8 embeddings
[{'data': 'Mount Everest is the highest peak on Earth at 8,848m.',
'score': 0.5149182081222534},
{'data': 'The Great Wall of China is visible from space.',
'score': 0.5136760473251343}]
--------------------------------------------------------------------------
results from int1 embeddings
[{'data': 'Mount Everest is the highest peak on Earth at 8,848m.',
'score': 0.62109375},
{'data': 'The Great Wall of China is visible from space.',
'score': 0.61328125}]

Dica

Trabalhe com uma versão executável deste tutorial como um bloco de anotações Python.

1

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 install --quiet --upgrade pymongo cohere
2

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.

import os
import pymongo
import cohere
from bson.binary import Binary, BinaryVectorDtype
# Specify your Cohere API key
os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>"
cohere_client = cohere.Client(os.environ["COHERE_API_KEY"])
# Define function to generate embeddings using the embed-english-v3.0 model
def get_embedding(text):
response = cohere_client.embed(
texts=[text],
model='embed-english-v3.0',
input_type='search_document',
embedding_types=["float"]
)
embedding = response.embeddings.float[0]
return embedding
# Define function to convert embeddings to BSON-compatible format
def generate_bson_vector(vector, vector_dtype):
return Binary.from_vector(vector, vector_dtype)
import os
import pymongo
import cohere
from bson.binary import Binary, BinaryVectorDtype
# Specify your Cohere API key
os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>"
cohere_client = cohere.Client(os.environ["COHERE_API_KEY"])
# Define function to generate embeddings using the embed-english-v3.0 model
def get_embedding(text):
response = cohere_client.embed(
texts=[text],
model='embed-english-v3.0',
input_type='search_document',
embedding_types=["int8"]
)
embedding = response.embeddings.int8[0]
return embedding
# Define function to convert embeddings to BSON-compatible format
def generate_bson_vector(vector, vector_dtype):
return Binary.from_vector(vector, vector_dtype)
import os
import pymongo
import cohere
from bson.binary import Binary, BinaryVectorDtype
# Specify your Cohere API key
os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>"
cohere_client = cohere.Client(os.environ["COHERE_API_KEY"])
# Define function to generate embeddings using the embed-english-v3.0 model
def get_embedding(text):
response = cohere_client.embed(
texts=[text],
model='embed-english-v3.0',
input_type='search_document',
embedding_types=["ubinary"]
)
embedding = response.embeddings.ubinary[0]
return embedding
# Define function to convert embeddings to BSON-compatible format
def generate_bson_vector(vector, vector_dtype):
return Binary.from_vector(vector, vector_dtype)
3

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
2mongo_client = pymongo.MongoClient("<ATLAS-CONNECTION-STRING>")
3db = mongo_client["sample_airbnb"]
4collection = db["listingsAndReviews"]
5
6# Filter to exclude null or empty summary fields
7filter = { "summary": {"$nin": [None, ""]} }
8
9# Get a subset of documents in the collection
10documents = collection.find(filter).limit(50)
11
12# Initialize the count of updated documents
13updated_doc_count = 0
4
  1. 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.

  2. Converta as incorporações em vetores BSON (como mostrado na linha 7 no exemplo a seguir).

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

for doc in documents:
# Generate embeddings based on the summary
summary = doc["summary"]
embedding = get_embedding(summary) # Get float32 embedding
# Convert the float32 embedding to BSON format
bson_float32 = generate_bson_vector(embedding, BinaryVectorDtype.FLOAT32)
# Update the document with the BSON embedding
collection.update_one(
{"_id": doc["_id"]},
{"$set": {"embedding": bson_float32}}
)
updated_doc_count += 1
print(f"Updated {updated_doc_count} documents with BSON embeddings.")
for doc in documents:
# Generate embeddings based on the summary
summary = doc["summary"]
embedding = get_embedding(summary) # Get int8 embedding
# Convert the int8 embedding to BSON format
bson_int8 = generate_bson_vector(embedding, BinaryVectorDtype.INT8)
# Update the document with the BSON embedding
collection.update_one(
{"_id": doc["_id"]},
{"$set": {"embedding": bson_int8}}
)
updated_doc_count += 1
print(f"Updated {updated_doc_count} documents with BSON embeddings.")
for doc in documents:
# Generate embeddings based on the summary
summary = doc["summary"]
embedding = get_embedding(summary) # Get int1 embedding
# Convert the int1 embedding to BSON format
bson_int1 = generate_bson_vector(embedding, BinaryVectorDtype.PACKED_BIT)
# Update the document with the BSON embedding
collection.update_one(
{"_id": doc["_id"]},
{"$set": {"embedding": bson_int1}}
)
updated_doc_count += 1
print(f"Updated {updated_doc_count} documents with BSON embeddings.")
5

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.

1from pymongo.operations import SearchIndexModel
2import time
3
4# Define and create the vector search index
5index_name = "<INDEX-NAME>"
6search_index_model = SearchIndexModel(
7 definition={
8 "fields": [
9 {
10 "type": "vector",
11 "path": "embedding",
12 "similarity": "euclidean",
13 "numDimensions": 1024
14 }
15 ]
16 },
17 name=index_name,
18 type="vectorSearch"
19)
20result = collection.create_search_index(model=search_index_model)
21print("New search index named " + result + " is building.")
22
23# Wait for initial sync to complete
24print("Polling to check if the index is ready. This may take up to a minute.")
25predicate=None
26if predicate is None:
27 predicate = lambda index: index.get("queryable") is True
28while True:
29 indices = list(collection.list_search_indexes(index_name))
30 if len(indices) and predicate(indices[0]):
31 break
32 time.sleep(5)
33print(result + " is ready for querying.")

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.

6

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

<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_embedding = get_embedding(query_text)
bson_query_vector = generate_bson_vector(query_embedding, BinaryVectorDtype.FLOAT32)
pipeline = [
{
'$vectorSearch': {
'index': index_name,
'path': path,
'queryVector': bson_query_vector,
'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, # for example, 20
'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 5
}
},
{
'$project': {
'_id': 0,
'name': 1,
'summary': 1,
'score': { '$meta': 'vectorSearchScore' }
}
}
]
return collection.aggregate(pipeline)
def run_vector_search(query_text, collection, path):
query_embedding = get_embedding(query_text)
bson_query_vector = generate_bson_vector(query_embedding, BinaryVectorDtype.INT8)
pipeline = [
{
'$vectorSearch': {
'index': index_name,
'path': path,
'queryVector': bson_query_vector,
'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, # for example, 20
'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 5
}
},
{
'$project': {
'_id': 0,
'name': 1,
'summary': 1,
'score': { '$meta': 'vectorSearchScore' }
}
}
]
return collection.aggregate(pipeline)
def run_vector_search(query_text, collection, path):
query_embedding = get_embedding(query_text)
bson_query_vector = generate_bson_vector(query_embedding, BinaryVectorDtype.PACKED_BIT)
pipeline = [
{
'$vectorSearch': {
'index': index_name,
'path': path,
'queryVector': bson_query_vector,
'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, # for example, 20
'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 5
}
},
{
'$project': {
'_id': 0,
'name': 1,
'summary': 1,
'score': { '$meta': 'vectorSearchScore' }
}
}
]
return collection.aggregate(pipeline)
7

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

from pprint import pprint
query_text = "ocean view"
query_results = run_vector_search(query_text, collection, "embedding")
print("query results:")
pprint(list(query_results))
query results:
[{'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 dependendo do tipo de dados vetoriais especificado nas etapas anteriores.

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.

Você pode medir a precisão de sua query do Atlas Vector Search avaliando a proximidade dos resultados de uma pesquisa de ANN com os resultados de uma pesquisa de ENN em relação aos seus vetores quantizados. Ou seja, você pode comparar os resultados da pesquisa ANN com os resultados da pesquisa ENN para os mesmos critérios de consulta e medir com que frequência os resultados da pesquisa ANN incluem os vizinhos mais próximos nos resultados da pesquisa ENN.

Para uma demonstração da avaliação dos resultados da query, consulte Como medir a precisão dos resultados da query.

Voltar

Crie e execute consultas