Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Use o banco de dados de vetor integrado no Azure DocumentDB para conectar perfeitamente aplicativos baseados em IA com seus dados armazenados no Azure DocumentDB. Essa integração pode incluir aplicativos criados usando inserções OpenAI do Azure. O banco de dados de vetor integrado nativamente permite que você armazene, indexe e consulte com eficiência dados de vetor de alta dimensão armazenados diretamente no Azure DocumentDB, juntamente com os dados originais dos quais os dados de vetor são criados. Elimina a necessidade de transferir seus dados para repositórios de vetores alternativos e incorrer em custos extras.
O que é um repositório de vetores?
Um repositório de vetores ou um banco de dados vetor é um banco de dados projetado para armazenar e gerenciar inserções de vetor, que são representações matemáticas de dados em um espaço de alta dimensão. Nesse espaço, cada dimensão corresponde a um recurso dos dados e dezenas de milhares de dimensões podem ser usadas para representar dados sofisticados. A posição de um vetor nesse espaço representa as características dele. Palavras, frases ou documentos inteiros e imagens, áudio e outros tipos de dados podem ser vetorizados.
Como funciona um repositório de vetores?
Em um repositório de vetores, algoritmos de busca em vetores são usados para indexar e consultar inserções. Alguns algoritmos de pesquisa de vetor bem conhecidos incluem Hierarchical Navigable Small World (HNSW), Inverted File (IVF) e DiskANN. A pesquisa vetorial é um método que ajuda a localizar itens semelhantes com base em suas características de dados, em vez de correspondências exatas em um campo de propriedade. Essa técnica é útil em usos como pesquisa de texto semelhante, localização de imagens relacionadas, recomendações ou até mesmo detecção de anomalias. Ele é usado para consultar as inserções de vetor (listas de números) dos dados que você criou usando um modelo de machine learning usando uma API de inserções. Exemplos de APIs de inserções são as Inserções do OpenAI do Azure ou o Hugging Face no Azure. A busca em vetores 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 de vetor integrado no Azure DocumentDB, você pode armazenar, indexar e consultar inserções junto com os dados originais. Essa abordagem elimina o custo extra de replicação de dados em um banco de dados vetoriais puro separado. Além disso, essa arquitetura mantém as inserções de vetor e os dados originais juntos, o que facilita melhor as operações de dados multimodal e permite maior consistência de dados, escala e desempenho.
Casos de uso do banco de dados vetor
Bancos de dados vetoriais são usados em muitas áreas de IA e análise de dados. Eles ajudam com tarefas como entender a linguagem natural, reconhecer imagens e vídeos, criar sistemas de recomendação e alimentar recursos de pesquisa. Você pode encontrá-los em aplicativos analíticos de IA e de IA generativos.
Por exemplo, você pode usar um banco de dados vetorial para:
- Identificar imagens, documentos e músicas semelhantes com base no seus conteúdos, temas, sentimentos e estilos.
- Identificar produtos semelhantes com base em suas características, recursos e grupos de usuários.
- Recomende conteúdo, produtos ou serviços com base nas preferências dos indivíduos.
- Recomenda conteúdo, produtos ou serviços com base nas semelhanças dos grupos de usuários.
- Identifique as opções potenciais de melhor adequação de um grande pool de opções para satisfazer requisitos complexos.
- Identificar anomalias de dados ou atividades fraudulentas que sejam diferentes dos padrões predominantes ou normais.
- Implementar memória persistente para agentes de IA.
- Habilitar a geração aumentada por recuperação (RAG).
Banco de dados vetor integrado versus banco de dados de vetor puro
Existem dois tipos comuns de implementações de banco de dados vetor: banco de dados vetor puro e banco de dados vetor integrado em um banco de dados noSQL ou relacional.
Um banco de dados de vetor puro armazena e gerencia inserções de vetor com eficiência, juntamente com uma pequena quantidade de metadados. Ele é separado da fonte de dados da qual as inserções são derivadas.
Um banco de dados vetor que se integra a um banco de dados relacional ou NoSQL de alto desempenho fornece recursos extras. O banco de dados vetor integrado em um banco de dados noSQL ou relacional pode armazenar, indexar e consultar inserções junto com os dados originais correspondentes. Essa abordagem elimina o custo extra de replicação de dados em um banco de dados vetoriais puro separado. Além disso, manter as inserções de vetor e os dados originais juntos facilita melhor as operações de dados multimodal e permite maior consistência de dados, escala e desempenho.
Bancos de dados de vetores de código aberto
Quando os desenvolvedores selecionam bancos de dados de vetores, as opções de código aberto fornecem vários benefícios. O código-fonte aberto significa que o código-fonte do software está disponível livremente, permitindo que os usuários personalizem o banco de dados de acordo com suas necessidades específicas. Essa flexibilidade é benéfica para organizações que estão sujeitas a requisitos regulatórios exclusivos para dados, como empresas do setor de serviços financeiros.
Outra vantagem dos bancos de dados de vetores de código aberto é o forte suporte da comunidade que eles desfrutam. As comunidades de usuários ativos geralmente contribuem para o desenvolvimento desses bancos de dados, fornecem suporte e compartilham melhores práticas, promovendo a inovação.
Alguns indivíduos optam por bancos de dados de vetor de software livre porque são "gratuitos", o que significa que não há custo para adquirir ou usar o software. Uma alternativa é usar as camadas gratuitas oferecidas pelos serviços gerenciados de banco de dados de vetores. Esses serviços gerenciados fornecem não apenas acesso gratuito até um determinado limite de uso, mas também simplificam a carga operacional ao lidar com a manutenção, as atualizações e a escalabilidade. Portanto, usando a camada gratuita de serviços de banco de dados de vetor gerenciado, você pode obter economia de custos, reduzindo a sobrecarga de gerenciamento. Essa abordagem permite que você se concentre mais nas atividades principais do que na administração do banco de dados.
Selecione o melhor banco de dados de vetor de software livre
Escolher o melhor banco de dados de vetores de código aberto requer a consideração de vários fatores. O desempenho e a escalabilidade do banco de dados são cruciais, pois afetam se o banco de dados pode lidar com seus requisitos específicos de carga de trabalho. Os bancos de dados com recursos eficientes de indexação e consulta geralmente oferecem desempenho ideal. Outro fator é o suporte da comunidade e a documentação disponível para o banco de dados. Uma comunidade robusta e uma ampla documentação podem fornecer assistência valiosa. Por exemplo, o DocumentDB é um banco de dados de vetor de software livre popular:
A opção mais popular pode não ser a melhor opção para você. Portanto, você deve comparar diferentes opções com base em recursos, tipos de dados compatíveis e compatibilidade com as ferramentas e estruturas existentes que você usa. Você também deve ter em mente os desafios dos bancos de dados de vetor de software livre.
Desafios de bancos de dados de vetores de código aberto
A maioria dos bancos de dados de vetor de software livre, incluindo os listados anteriormente, são bancos de dados de vetor puros. Em outras palavras, eles são projetados apenas para armazenar e gerenciar inserções de vetor, juntamente com uma pequena quantidade de metadados. Como eles funcionam separadamente dos dados originais, você precisa mover dados entre serviços diferentes. Essa complexidade adiciona custo extra, torna as coisas mais complexas e pode desacelerar seus sistemas de produção.
Eles também representam os desafios típicos dos bancos de dados de código aberto:
- Configuração: você precisa de conhecimento aprofundado para instalar, configurar e operar o banco de dados, especialmente para implantações complexas. Otimizar recursos e configuração ao escalar verticalmente a operação requer monitoramento e ajustes rigorosos.
- Manutenção: você deve gerenciar suas próprias atualizações, patches e manutenção. A experiência de machine learning não é suficiente; você também deve ter ampla experiência em administração de banco de dados.
- Suporte: o suporte oficial pode ser limitado em comparação aos serviços gerenciados, contando mais com a assistência da comunidade.
Portanto, embora inicialmente gratuitos, os bancos de dados de vetores de código aberto incorrem em custos significativos ao serem escalados verticalmente. A expansão das operações exige mais hardware, equipe de TI qualificada e gerenciamento avançado da infraestrutura, o que leva a despesas mais altas com hardware, pessoal e custos operacionais. A colocação em escala de bancos de dados de vetores de código aberto pode ser financeiramente exigente, apesar da ausência de taxas de licenciamento.
Abordando os desafios dos bancos de dados de vetor de código aberto
Um banco de dados de vetor totalmente gerenciado que se integra a um banco de dados noSQL ou relacional de alto desempenho evita o custo extra e a complexidade dos bancos de dados de vetor de software livre. Esse banco de dados armazena, indexa e consulta inserções junto com os dados originais correspondentes. Essa abordagem elimina o custo extra de replicação de dados em um banco de dados vetoriais puro separado. Além disso, manter as inserções de vetor e os dados originais juntos facilita melhor as operações de dados multimodal e permite maior consistência de dados, escala e desempenho. Enquanto isso, o serviço totalmente gerenciado ajuda os desenvolvedores a evitar problemas ao configurar, manter e confiar na assistência da comunidade para um banco de dados de vetores de código aberto. Além disso, alguns serviços de banco de dados de vetor gerenciado oferecem uma camada gratuita vitalícia.
Um exemplo é o banco de dados de vetor integrado no Azure DocumentDB. Essa configuração permite que os desenvolvedores economizem dinheiro como fariam com bancos de dados de vetor de software livre. Mas, ao contrário das opções de software livre, o provedor de serviços cuida da manutenção, das atualizações e do dimensionamento para você. A atualização é rápida e fácil, com um baixo custo total de propriedade (TCO), quando é hora de expandir as operações. Você também pode usar esse serviço para dimensionar convenientemente os aplicativos do MongoDB que já estão em produção.
Executar pesquisa de similaridade de vetor
O Azure DocumentDB fornece recursos robustos de pesquisa de vetor, permitindo que você execute pesquisas de similaridade de alta velocidade em conjuntos de dados complexos. Para executar a pesquisa de vetor no Azure DocumentDB, primeiro você precisa criar um índice de vetor. Embora o Azure DocumentDB ofereça várias opções, aqui estão algumas diretrizes gerais para ajudá-lo a começar com base no tamanho do conjunto de dados:
| FIV | HNSW | DiskANN (recomendado) | |
|---|---|---|---|
| Descrição | Um índice IVFFlat divide vetores em listas e, em seguida, pesquisa um subconjunto mais próximo do vetor de consulta. | Um índice HNSW cria um grafo de várias camadas. | DiskANN é um algoritmo de pesquisa vizinho mais próximo aproximado projetado para uma pesquisa de vetor eficiente em qualquer escala. |
| Principais compensações |
Profissionais: Tempos de build mais rápidos, menor uso de memória. Contras: menor desempenho de consulta (em termos de troca de recuperação de velocidade). |
Prós: é possível obter um melhor desempenho de consulta (em termos de equilíbrio entre velocidade e recuperação) em uma tabela vazia. Contras: Tempos de build mais lentos, maior uso de memória. |
Prós: Eficiente em qualquer escala, alto recall, alta capacidade de transferência, baixa latência. |
| Contagem de vetores | Menos de 10.000 | Até 50.000 | Até 500.000+ |
| Nível recomendado de cluster | M10 ou M20 | M30 e acima | M30 e acima |
Você pode usar índices DiskANN em M30 e camadas mais altas. Para criar o índice DiskANN, defina o parâmetro "kind" como "vector-diskann" seguindo 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 |
cadeia | Nome exclusivo do índice. |
path_to_property |
cadeia | 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 precisam ser um number[] para serem indexados e utilizados em buscas de vetores. Um vetor que usa outro tipo, como double[], impede que o documento seja indexado. Documentos não indexados não são retornados no resultado de uma pesquisa de vetor. |
kind |
cadeia | Tipo de índice de vetor a ser criado. As opções são vector-ivf, vector-hnsw e vector-diskann. |
dimensions |
inteiro | Número de dimensões para similaridade de vetor. O DiskANN dá suporte a até 16.000 dimensões (com quantização de produto), com suporte futuro planejado para mais de 40.000. |
similarity |
cadeia | Métrica de similaridade a ser usada com o índice. As opções possíveis são COS (distância do cosseno), L2 (distância euclidiana) e IP (produto interno). |
maxDegree |
inteiro | Número máximo de bordas por nó no grafo. Esse parâmetro varia de 20 a 2048 (o padrão é 32).
maxDegree superior é adequado para conjuntos de dados com requisitos de alta dimensionalidade e/ou alta precisão. |
lBuild |
inteiro | Define o número de vizinhos candidatos avaliados durante a construção do índice DiskANN. Esse 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 build |
Fazer uma busca em vetores com DiskANN
Para realizar uma busca em vetores, utilize a etapa de agregação do pipeline $search e consulte com o operador cosmosSearch. O DiskANN permite pesquisas de alto desempenho em conjuntos de dados maciços 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 |
inteiro | Especifica o tamanho da lista de candidatos dinâmicos para a busca. O valor padrão é 40, com um intervalo configurável de 10 a 1000. Aumentar o valor aprimora o recall, mas pode reduzir a velocidade de pesquisa. |
k |
inteiro | Define o número de resultados de pesquisa a ser retornado. O valor k deve ser menor ou igual a lSearch. |
Exemplo usando um índice DiskANN com filtragem
Adicionando vetores ao banco de dados
Para usar a busca em vetores com filtros geoespaciais, adicione documentos que incluam inserções de vetor e coordenadas de localização. Você pode criar as inserções usando seu próprio modelo, inserções do Azure OpenAI ou uma API como Abraçando o Rosto 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 de vetor DiskANN
O exemplo a seguir demonstra como configurar um índice de vetor DiskANN com recursos de filtragem. Este exemplo inclui a criação do índice de vetor para pesquisa de similaridade, a adição de documentos com propriedades vetoriais e geoespaciais e a indexação de campos para mais filtragem.
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
}
}
]
})
Esse comando cria um índice de vetor DiskANN no campo contentVector em exampleCollection, permitindo pesquisas de similaridade. Ele também adiciona:
- Um índice no
is_opencampo, para que você possa filtrar os resultados com base em se as empresas estão abertas. - Um índice geoespacial no campo
locationa ser filtrado por proximidade geográfica.
Faça uma pesquisa vetorial
Para localizar documentos com vetores semelhantes em um raio geográfico específico, especifique o queryVector como pesquisa de similaridade 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 similaridade de vetor retorna os k principais vetores mais próximos com base na métrica de similaridade COS especificada, enquanto filtra os resultados para incluir apenas negócios abertos em um raio de 160 km.
[
{
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; restrito a um raio de 160 km e negócios abertos. Cada resultado inclui a pontuação de similaridade e os metadados, demonstrando como o DiskANN no Azure DocumentDB dá suporte a consultas vetoriais e geoespaciais combinadas para experiências de pesquisa enriquecidas e sensíveis à localização.
Obter definições de índice de vetor
Para recuperar sua definição de índice vetorial da coleção, use o comando listIndexes:
db.exampleCollection.getIndexes();
Nesse exemplo, vectorIndex é retornado com todos os parâmetros cosmosSearch que foram utilizados 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 de vetor filtrado
Agora é possível executar buscas em vetores com qualquer filtro de consulta com suporte, como $lt, $lte, $eq, $neq, $gte, $gt, $in, $nin e $regex.
Para usar o pré-filtragem, primeiro você precisa definir um índice padrão na propriedade pela qual deseja filtrar, além do índice de vetor. Aqui está um exemplo de criação de um índice de filtro:
db.runCommand({
"createIndexes": "<collection_name>",
"indexes": [ {
"key": {
"<property_to_filter>": 1
},
"name": "<name_of_filter_index>"
}
]
});
Depois que o índice de filtro estiver em vigor, você poderá adicionar a "filter" cláusula diretamente à consulta de pesquisa de vetor. Este exemplo mostra como filtrar resultados em que o "title" valor da propriedade não está presente na lista fornecida:
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
Para otimizar o desempenho e a precisão de suas pesquisas de vetor pré-filtradas, considere ajustar os parâmetros de índice de vetor. Para os índices DiskANN, aumentar maxDegree ou lBuild pode produzir melhores resultados. Para índices HNSW , experimentar valores mais altos para m, efConstructionou efSearch pode melhorar o desempenho. Da mesma forma, para índices IVF, ajustar numLists ou nProbes pode levar a resultados mais satisfatórios. É crucial testar sua configuração específica com seus dados para garantir que os resultados atendam aos seus requisitos. Esses parâmetros influenciam a estrutura de índice e o comportamento de pesquisa e os valores ideais podem variar de acordo com suas características de dados e padrões de consulta.
Utilizar ferramentas de orquestração de modelos de linguagem extensos (LLM)
Usar como um banco de dados de vetor com Kernel Semântico
Utilize o Kernel Semântico para orquestrar a recuperação de informações do Azure DocumentDB e do LLM. Para obter mais informações, consulte o repositório GitHub.
Usar como um banco de dados de vetores com LangChain
Use LangChain para orquestrar a extração de informações do Azure DocumentDB e do LLM. Para obter mais informações, consulte as integrações do LangChain para o Azure DocumentDB.
Usar como um cache semântico com LangChain
Use o LangChain e o Azure DocumentDB para orquestrar o armazenamento em cache semântico, utilizando respostas de LLM gravadas anteriormente que podem economizar custos da API de LLM e reduzir a latência nas respostas. Para obter mais informações, consulte a integração do LangChain ao Azure DocumentDB.
Recursos e limitações
- Métricas de distância suportadas: L2 (Euclidiano), produto interno e cosseno.
- Métodos de indexação com suporte: IVFFLAT, HNSW e DiskANN.
- Com DiskANN e quantização de produto, você pode indexar vetores até 16.000 dimensões.
- O uso de HNSW ou FIV com meia precisão permite indexação de vetores de até 4.000 dimensões.
- Sem compactação, a dimensão de vetor máximo padrão para indexação é de 2.000.
- A indexação se aplica a apenas um vetor por caminho.
- Você pode criar apenas um índice por caminho de vetor.
Resumo
Este guia mostra como criar um índice de vetor, adicionar documentos que tenham dados de vetor, executar uma pesquisa de similaridade e recuperar a definição de índice. Usando nosso banco de dados vetor integrado, você pode armazenar, indexar e consultar dados de vetor de alta dimensão com eficiência diretamente no Azure DocumentDB. Ele permite que você aproveite todo o potencial dos seus dados por meio de inserções de vetores e capacita você a criar aplicativos mais precisos, eficientes e sofisticados.
Conteúdo relacionado
- Solução de referência de padrão RAG .NET para varejo
- Padrão RAG em C# – Integrar o OpenAI Services ao Cosmos
- Padrão de RAG do Python – Chatbot de produto do Azure
- Tutorial do notebook Python – Integração com o banco de dados vetorial por meio do LangChain
- Tutorial do notebook Python – Integração com o LLM Caching por meio do LangChain
- Python - Integração com o LlamaIndex
- Python – Integração com a memória do Kernel semântico