Repositório de vetores no Azure Cosmos DB para MongoDB vCore
Use o Banco de Dados Vetorial Integrado no Azure Cosmos DB para MongoDB (vCore) para conectar perfeitamente seus aplicativos baseados em IA com seus dados armazenados no Azure Cosmos DB. Essa integração pode incluir aplicativos que você criou usando incorporações do Azure OpenAI. O banco de dados vetorial integrado nativamente permite armazenar, indexar e consultar com eficiência dados vetoriais de alta dimensão armazenados diretamente no Azure Cosmos DB para MongoDB (vCore), juntamente com os dados originais a partir dos quais os dados vetoriais são criados. Ele elimina a necessidade de transferir seus dados para repositórios vetoriais alternativos e incorrer em custos adicionais.
O que é um repositório vetorial?
Um repositório vetorial ou banco de dados vetorial é um banco de dados projetado para armazenar e gerenciar incorporações vetoriais, que são representações matemáticas de dados em um espaço de alta dimensão. Neste espaço, cada dimensão corresponde a uma característica dos dados, e dezenas de milhares de dimensões podem ser usadas para representar dados sofisticados. A posição de um vetor neste espaço representa suas características. Palavras, frases ou documentos inteiros, imagens, áudio e outros tipos de dados podem ser vetorizados.
Como funciona uma loja vetorial?
Em um repositório vetorial, algoritmos de pesquisa vetorial são usados para indexar e consultar incorporações. Alguns algoritmos de pesquisa vetorial bem conhecidos incluem Hierarchical Navigable Small World (HNSW), Inverted File (IVF), DiskANN, etc. A pesquisa vetorial é um método que ajuda você a encontrar itens semelhantes com base em suas características de dados, em vez de correspondências exatas em um campo de propriedade. Esta técnica é útil em aplicações como procurar texto semelhante, encontrar imagens relacionadas, fazer recomendações ou até mesmo detetar anomalias. Ele é usado para consultar as incorporações vetoriais (listas de números) de seus dados que você criou usando um modelo de aprendizado de máquina usando uma API de incorporações. Exemplos de APIs de incorporação são Azure OpenAI Embeddings ou Hugging Face on Azure. A pesquisa vetorial mede a distância entre os vetores de dados e o vetor de consulta. Os vetores de dados mais próximos do vetor de consulta são os mais semelhantes semanticamente.
No Banco de Dados Vetorial Integrado no Azure Cosmos DB para MongoDB (vCore), as incorporações podem ser armazenadas, indexadas e consultadas junto com os dados originais. Essa abordagem elimina o custo extra de replicar dados em um banco de dados vetorial puro separado. Além disso, essa arquitetura mantém as incorporações vetoriais e os dados originais juntos, o que facilita melhor as operações de dados multimodais e permite maior consistência, escala e desempenho dos dados.
Executar pesquisa de semelhança vetorial
O Azure Cosmos DB para MongoDB (vCore) fornece recursos robustos de pesquisa vetorial, permitindo que você realize pesquisas de similaridade de alta velocidade em conjuntos de dados complexos. Para executar a pesquisa vetorial no Azure Cosmos DB para MongoDB, primeiro você precisa criar um índice vetorial. Atualmente, o Cosmos DB suporta três tipos de índices vetoriais:
- DiskANN (recomendado): Ideal para conjuntos de dados de grande escala, aproveitando SSDs para uso eficiente de memória enquanto mantém alta recuperação em pesquisas aproximadas de vizinhos mais próximos (ANN).
- HNSW: Adequado para conjuntos de dados de tamanho moderado que necessitam de alta recuperação, com uma estrutura baseada em gráficos que equilibra precisão e eficiência de recursos.
- FIV: Usa clustering para otimizar a velocidade de pesquisa em conjuntos de dados expansivos, concentrando as pesquisas dentro de clusters direcionados para acelerar o desempenho.
Os índices DiskANN estão disponíveis em camadas M40 e superiores. Para criar o índice DiskANN, defina o "kind"
parâmetro para "vector-diskann"
seguir o modelo abaixo:
{
"createIndexes": "<collection_name>",
"indexes": [
{
"name": "<index_name>",
"key": {
"<path_to_property>": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": <integer_value>,
"similarity": <string_value>,
"maxDegree" : <integer_value>,
"lBuild" : <integer_value>,
}
}
]
}
Campo | Tipo | Description |
---|---|---|
index_name |
string | Nome exclusivo do índice. |
path_to_property |
string | Caminho para a propriedade que contém o vetor. Esse caminho pode ser uma propriedade de nível superior ou um caminho de notação de ponto para a propriedade. Os vetores devem ser indexados number[] e usados nos resultados da pesquisa vetorial. O uso de outro tipo, como double[] , impede que o documento seja indexado. Documentos não indexados não serão retornados no resultado de uma pesquisa vetorial. |
kind |
string | Tipo de índice vetorial a ser criado. As opções são vector-ivf , vector-hnsw e vector-diskann . |
dimensions |
integer | Número de dimensões para semelhança vetorial. O DiskANN suporta até 2000 dimensões, com suporte futuro planejado para 40.000+. |
similarity |
string | Métrica de similaridade a ser usada com o índice. As opções possíveis são COS (distância cosseno), L2 (distância euclidiana) e IP (produto interno). |
maxDegree |
integer | Número máximo de arestas por nó no gráfico. Esse parâmetro varia de 20 a 2048 (o padrão é 32). Higher maxDegree é adequado para conjuntos de dados com alta dimensionalidade e/ou requisitos de alta precisão. |
lBuild |
integer | Define o número de vizinhos candidatos avaliados durante a construção do índice DiskANN. Este parâmetro, que varia de 10 a 500 (o padrão é 50), equilibra a precisão e a sobrecarga computacional: valores mais altos melhoram a qualidade e a precisão do índice, mas aumentam o tempo de construção |
Executar uma pesquisa vetorial com o DiskANN
Para executar uma pesquisa vetorial, use o estágio de pipeline de $search
agregação e consulte o cosmosSearch
operador. O DiskANN permite pesquisas de alto desempenho em conjuntos de dados massivos com filtragem opcional , como filtros geoespaciais ou baseados em texto.
{
"$search": {
"cosmosSearch": {
"path": "<path_to_property>",
"query": "<query_vector>",
"k": <num_results_to_return>,
"filter": {"$and": [
{ "<attribute_1>": { "$eq": <value> } },
{"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
]}
}
}
},
Campo | Tipo | Description |
---|---|---|
lSearch |
integer | Especifica o tamanho da lista dinâmica de candidatos para pesquisa. O valor padrão é 40 , com um intervalo configurável de 10 até 1000 . Aumentar o valor aumenta a recuperação, mas pode reduzir a velocidade de pesquisa. |
k |
integer | Define o número de resultados de pesquisa a serem retornados. O k valor deve ser menor ou igual a lSearch . |
Ativando o DiskANN em um novo cluster
Para habilitar o Índice de vetores DiskANN em um cluster do Azure Cosmos DB para MongoDB (vCore) recém-provisionado, siga estas etapas para executar um registro no nível de cluster por meio da CLI do Azure:
- Iniciar sessão na CLI do Azure
az login
- Recupere as configurações atuais dos sinalizadores de recursos no cluster. Isso garante que você mantenha todos os sinalizadores existentes ao adicionar o novo recurso.
az resource show --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version>
- Adicione o sinalizador
DiskANNIndex
à lista de recursos de visualização sem remover os existentes.
az resource patch --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version> --properties "{\"previewFeatures\": [\"GeoReplicas\", \"DiskANNIndex\"]}"
Exemplo de uso de um índice DiskANN com filtragem
Adicionar vetores ao seu banco de dados
Para usar a pesquisa vetorial com filtros geoespaciais, adicione documentos que incluam incorporações vetoriais e coordenadas de localização. Você pode criar as incorporações usando seu próprio modelo, Azure OpenAI Embeddings, ou outra API (como o Hugging Face no Azure).
from pymongo import MongoClient
client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]
documents = [
{"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
{"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
{"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
{"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]
collection.insert_many(documents)
Criar um índice vetorial DiskANN
O exemplo a seguir demonstra como configurar um índice vetorial DiskANN com recursos de filtragem. Isso inclui a criação do índice vetorial para pesquisa de similaridade, a adição de documentos com propriedades vetoriais e geoespaciais e a indexação de campos para filtragem adicional.
db.command({
"createIndexes": "testCollection",
"indexes": [
{
"name": "DiskANNVectorIndex",
"key": {
"contentVector": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": 3,
"similarity": "COS",
"maxDegree": 32,
"lBuild": 64
}
},
{
"name": "is_open",
"key": {
"is_open": 1
}
},
{
"name": "locationIndex",
"key": {
"location": 1
}
}
]
})
Este comando cria um índice vetorial DiskANN no contentVector
campo em exampleCollection
, permitindo pesquisas de similaridade. Acrescenta ainda:
- Um índice no campo, permitindo filtrar os
is_open
resultados com base na abertura ou não das empresas. - Um índice geoespacial no
location
campo para filtrar por proximidade geográfica.
Executar uma pesquisa vetorial
Para encontrar documentos com vetores semelhantes dentro de um raio geográfico específico, especifique a queryVector
pesquisa de semelhança e inclua um filtro geoespacial.
query_vector = [0.52, 0.28, 0.12]
pipeline = [
{
"$search": {
"cosmosSearch": {
"path": "contentVector",
"vector": query_vector,
"k": 5,
"filter": {
"$and": [
{"is_open": {"$eq": 1}},
{"location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
]
}
}
}
}
]
results = list(collection.aggregate(pipeline))
for result in results:
print(result)
Neste exemplo, a pesquisa de semelhança de vetores retorna os k
principais vetores mais próximos com base na métrica de semelhança especificada COS
, enquanto filtra os resultados para incluir apenas empresas abertas em um raio de 100 milhas.
[
{
similarityScore: 0.9745354109084544,
document: {
_id: ObjectId("645acb54413be5502badff94"),
name: 'Eugenia Lopez',
bio: 'CEO of AdventureWorks',
is_open: 1,
location: [-118.9865, 34.0145],
contentVector: [0.52, 0.20, 0.23]
}
},
{
similarityScore: 0.9006955671333992,
document: {
_id: ObjectId("645acb54413be5502badff97"),
name: 'Rory Nguyen',
bio: 'President of Our Planet initiative',
is_open: 1,
location: [-119.7302, 34.4005],
contentVector: [0.91, 0.76, 0.83]
}
}
]
Este resultado mostra os principais documentos semelhantes a queryVector
, restritos a um raio de 100 milhas e empresas abertas. Cada resultado inclui a pontuação de similaridade e metadados, demonstrando como o DiskANN no Cosmos DB para MongoDB suporta consultas vetoriais e geoespaciais combinadas para experiências de pesquisa enriquecidas e sensíveis à localização.
Obter definições de índice vetorial
Para recuperar sua definição de índice de vetor da coleção, use o listIndexes
comando:
db.exampleCollection.getIndexes();
Neste exemplo, vectorIndex
é retornado com todos os cosmosSearch
parâmetros que foram usados para criar o índice:
[
{ v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
{
v: 2,
key: { vectorContent: 'cosmosSearch' },
name: 'vectorSearchIndex',
cosmosSearch: {
kind: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
numLists: 3,
similarity: 'COS',
dimensions: 3
},
ns: 'test.exampleCollection'
}
]
Pesquisa vetorial filtrada (visualização)
Agora você pode executar pesquisas vetoriais com qualquer filtro de consulta suportado, como $lt
, $lte
, $eq
, $neq
, $gte
, $gt
$in
, $nin
, e $regex
. Habilite o recurso "pesquisa vetorial de filtragem" na guia "Recursos de visualização" da sua Assinatura do Azure. Saiba mais sobre as funcionalidades de pré-visualização aqui.
Primeiro, você precisará definir um índice para seu filtro, além de um índice vetorial. Por exemplo, você pode definir o índice de filtro em uma propriedade
db.runCommand({
"createIndexes": "<collection_name",
"indexes": [ {
"key": {
"<property_to_filter>": 1
},
"name": "<name_of_filter_index>"
}
]
});
Em seguida, você pode adicionar o "filter"
termo à sua pesquisa vetorial, conforme mostrado abaixo. Neste exemplo, o filtro está procurando documentos em que a "title"
propriedade não está na lista de ["not in this text", "or this text"]
.
db.exampleCollection.aggregate([
{
'$search': {
"cosmosSearch": {
"vector": "<query_vector>",
"path": <path_to_vector>,
"k": num_results,
"filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
},
"returnStoredSource": True }},
{'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);
Importante
Durante a visualização, a pesquisa vetorial filtrada pode exigir que você ajuste os parâmetros do índice vetorial para obter maior precisão. Por exemplo, aumentar m
, efConstruction
ou efSearch
ao usar HNSW, ou numLists
, ou nProbes
ao usar FIV, pode levar a melhores resultados. Você deve testar sua configuração antes de usar para garantir que os resultados sejam satisfatórios.
Usar ferramentas de orquestração LLM
Use como um banco de dados vetorial com Kernel Semântico
Use o Kernel Semântico para orquestrar sua recuperação de informações do Azure Cosmos DB para MongoDB vCore e seu LLM. Saiba mais aqui.
Use como um banco de dados vetorial com LangChain
Use o LangChain para orquestrar sua recuperação de informações do Azure Cosmos DB para MongoDB vCore e seu LLM. Saiba mais aqui.
Use como cache semântico com LangChain
Use LangChain e Azure Cosmos DB para MongoDB (vCore) para orquestrar o Cache Semântico, usando respostas LLM gravadas anteriormente que podem economizar custos de API LLM e reduzir a latência das respostas. Saiba mais aqui
Funcionalidades e limitações
- Métricas de distância suportadas: L2 (Euclidiano), produto interno e cosseno.
- Métodos de indexação suportados: IVFFLAT, HNSW e DiskANN (Preview)
- Indexação de vetores de até 2.000 dimensões de tamanho.
- A indexação aplica-se a apenas um vetor por caminho.
- Apenas um índice pode ser criado por caminho vetorial.
Resumo
Este guia demonstra como criar um índice vetorial, adicionar documentos com dados vetoriais, realizar uma pesquisa de semelhança e recuperar a definição de índice. Usando nosso banco de dados vetorial integrado, você pode armazenar, indexar e consultar dados vetoriais de alta dimensão de forma eficiente diretamente no Azure Cosmos DB para MongoDB vCore. Ele permite que você libere todo o potencial de seus dados por meio de incorporações vetoriais e permite que você crie aplicativos mais precisos, eficientes e poderosos.
Conteúdos relacionados
- Solução de referência de varejo .NET RAG Pattern
- Tutorial .NET - chatbot de receita
- Padrão RAG C# - Integre serviços OpenAI com o Cosmos
- Padrão Python RAG - Chatbot do produto Azure
- Python notebook tutorial - Integração de banco de dados vetorial através de LangChain
- Tutorial do notebook Python - Integração com LLM Caching através do LangChain
- Python - Integração LlamaIndex
- Python - Integração de memória do kernel semântico