Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Use a base de dados vetorial integrada no Azure DocumentDB para ligar de forma fluida aplicações baseadas em IA com os seus dados armazenados no Azure DocumentDB. Essa integração pode incluir aplicativos que você criou usando incorporações do Azure OpenAI. A base de dados vetorial integrada nativamente permite-lhe armazenar, indexar e consultar de forma eficiente dados vetoriais de alta dimensão armazenados diretamente no Azure DocumentDB, juntamente com os dados originais a partir dos quais os dados vetoriais são criados. Ele elimina a necessidade de transferir seus dados para armazenamentos vetoriais alternativos e incorrer em custos extras.
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) e DiskANN. 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ção. Exemplos de APIs de incorporação são as incorporações do Azure OpenAI ou o Hugging Face no 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.
Na base de dados vetorial integrada do Azure DocumentDB, pode armazenar, indexar e consultar embeddings juntamente com os dados originais. Essa abordagem elimina o custo extra de replicar dados em um banco de dados vetorial puro separado. Além disso, esta arquitetura mantém os embeddings 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.
Casos de uso de banco de dados vetorial
As bases de dados vetoriais são utilizadas em muitas áreas da IA e análise de dados. Ajudam em tarefas como compreender linguagem natural, reconhecer imagens e vídeos, construir sistemas de recomendação e potenciar funcionalidades de pesquisa. Pode encontrá-los tanto em aplicações de IA analítica como de IA generativa.
Por exemplo, você pode usar um banco de dados vetorial para:
- Identifique imagens, documentos e músicas semelhantes com base em seus conteúdos, temas, sentimentos e estilos.
- Identifique produtos semelhantes com base em suas características, recursos e grupos de usuários.
- Recomendar conteúdos, produtos ou serviços com base nas preferências individuais.
- Recomende conteúdos, produtos ou serviços com base nas semelhanças dos grupos de usuários.
- Identifique as opções potenciais mais adequadas a partir de um grande conjunto de opções para atender a requisitos complexos.
- Identificar anomalias de dados ou atividades fraudulentas diferentes dos padrões predominantes ou normais.
- Implemente memória persistente para agentes de IA.
- Ativar a geração aumentada por recuperação (RAG).
Base de dados vetorial integrada vs. base de dados vetorial pura
Existem dois tipos comuns de implementações de bases de dados vetoriais: base de dados vetorial pura e base de dados vetorial integrada numa base de dados NoSQL ou relacional.
Uma base de dados vetorial pura armazena e gere eficientemente embeddings vetoriais juntamente com uma pequena quantidade de metadados. É separada da fonte de dados a partir da qual os embeddings são derivados.
Uma base de dados vetorial que se integra numa base de dados NoSQL ou relacional de alto desempenho oferece capacidades adicionais. O banco de dados vetorial integrado em um banco de dados NoSQL ou relacional pode armazenar, indexar e consultar incorporações ao lado dos dados originais correspondentes. Essa abordagem elimina o custo extra de replicar dados em um banco de dados vetorial puro separado. Além disso, manter os embeddings vetoriais e os dados originais juntos facilita melhor as operações multimodais dos dados e permite maior consistência, escala e desempenho dos dados.
Bancos de dados vetoriais de código aberto
Quando os desenvolvedores selecionam bancos de dados vetoriais, as opções de código aberto oferecem inúmeros benefícios. Código 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 vetoriais de código aberto é o forte apoio da comunidade de que desfrutam. As comunidades de utilizadores ativos contribuem frequentemente para o desenvolvimento destas bases de dados, prestam apoio e partilham boas práticas, promovendo a inovação.
Algumas pessoas optam por bases de dados vetoriais open-source porque são "gratuitas", ou seja, 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 vetorial. 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 manutenção, atualizações e escalabilidade. Assim, ao utilizar a camada gratuita de serviços de base de dados vetoriais geridos, pode obter poupanças de custos enquanto reduz a sobrecarga de gestão. Esta abordagem permite-lhe focar-se mais nas suas atividades principais do que na administração de bases de dados.
Selecione a melhor base de dados vetorial open-source
Escolher o melhor banco de dados vetorial de código aberto requer considerar 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. Bancos de dados com recursos eficientes de indexação e consulta geralmente oferecem um 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 uma ajuda valiosa. Por exemplo, o DocumentDB é uma popular base de dados vetorial open-source:
A opção mais popular pode não ser a melhor para si. Assim, você deve comparar diferentes opções com base em recursos, tipos de dados suportados e compatibilidade com ferramentas e estruturas existentes que você usa. Você também deve ter em mente os desafios dos bancos de dados vetoriais de código aberto.
Desafios dos bancos de dados vetoriais de código aberto
A maioria dos bancos de dados vetoriais de código aberto, incluindo os listados anteriormente, são bancos de dados vetoriais puros. Em outras palavras, eles são projetados para armazenar e gerenciar apenas incorporações vetoriais, juntamente com uma pequena quantidade de metadados. Como funcionam separadamente dos seus dados originais, precisa de mover dados entre diferentes serviços. Esta complexidade acrescenta custos extra, torna as coisas mais complexas e pode atrasar os seus sistemas de produção.
Eles também colocam os desafios que são típicos de bancos de dados de código aberto:
- Configuração: É necessário um conhecimento aprofundado para instalar, configurar e operar a base de dados, especialmente para implementações complexas. A otimização de recursos e configuração durante a expansão da operação requer monitoramento e ajustes rigorosos.
- Manutenção: Deve gerir as suas próprias atualizações, correções e manutenção. A experiência em aprendizagem automática não é suficiente; Deve também ter vasta experiência em administração de bases de dados.
- Suporte: O suporte oficial pode ser limitado em comparação com os serviços gerenciados, dependendo mais da assistência da comunidade.
Portanto, embora livres inicialmente, os bancos de dados vetoriais de código aberto incorrem em custos significativos ao serem ampliados. A expansão das operações requer mais hardware, pessoal de TI qualificado e gerenciamento avançado de infraestrutura, levando a maiores despesas em hardware, pessoal e custos operacionais. Dimensionar bancos de dados vetoriais de código aberto pode ser financeiramente exigente, apesar da falta de taxas de licenciamento.
Enfrentar os desafios dos bancos de dados vetoriais de código aberto
Uma base de dados vetorial totalmente gerida que se integra numa base de dados NoSQL ou relacional de alto desempenho evita o custo e a complexidade extra das bases de dados vetoriais open-source. Esse banco de dados armazena, indexa e realiza consultas sobre os embeddings ao lado dos dados originais correspondentes. Essa abordagem elimina o custo extra de replicar dados em um banco de dados vetorial puro separado. Além disso, manter os embeddings vetoriais e os dados originais juntos facilita melhor as operações multimodais de dados e permite maior consistência, escala e desempenho dos dados. Enquanto isso, o serviço totalmente gerenciado ajuda os desenvolvedores a evitar os problemas de configurar, manter e confiar na assistência da comunidade para um banco de dados vetorial de código aberto. Além disso, alguns serviços geridos de bases de dados vetoriais oferecem um nível gratuito vitalício.
Um exemplo é a base de dados vetorial integrada no Azure DocumentDB. Esta configuração permite aos programadores poupar dinheiro, tal como fariam com bases de dados vetoriais open-source. Mas, ao contrário das opções open-source, o fornecedor de serviços trata da manutenção, atualizações e escalabilidade por si. A atualização é rápida e fácil, mantendo um baixo custo total de propriedade (TCO) quando chega a altura de escalar as operações. Também pode usar este serviço para escalar convenientemente aplicações MongoDB que já estão em produção.
Executar pesquisa de semelhança vetorial
O Azure DocumentDB oferece capacidades robustas de pesquisa vetorial, permitindo-lhe realizar pesquisas de similaridade de alta velocidade em conjuntos de dados complexos. Para realizar pesquisa vetorial no Azure DocumentDB, primeiro precisa de criar um índice vetorial. Embora o Azure DocumentDB ofereça várias opções, aqui ficam algumas orientações gerais para o ajudar a começar com base no tamanho do seu 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 gráfico multicamadas. | DiskANN é um algoritmo de pesquisa de vizinho aproximado projetado para pesquisa vetorial eficiente em qualquer escala. |
| Principais compensações |
Prós: Tempos de construção mais rápidos, menor uso de memória. Contras: Menor desempenho de consulta (em termos de compromisso entre velocidade e precisão). |
Prós: Um melhor desempenho de consulta (em termos de compensação de recuperação de velocidade) pode ser criado em uma tabela vazia. Contras: Tempos de construção mais lentos, maior uso de memória. |
Prós: Eficiente em qualquer escala, alta recuperação, alto rendimento, baixa latência. |
| Contagem de vetores | Menos de 10.000 | Até 50.000 | Até 500.000+ |
| Nível recomendado para clusters | M10 ou M20 | M30 e superior | M30 e superior |
Podes usar índices DiskANN em níveis M30 e superiores. Para criar o índice DiskANN, defina o "kind" parâmetro para "vector-diskann" de acordo com este modelo.
{
"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 (de caracteres) | Nome exclusivo do índice. |
path_to_property |
cadeia (de caracteres) | 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 ter number[] para serem indexados e utilizados nos resultados da pesquisa vetorial. Um vetor usando outro tipo, como double[], impede que o documento seja indexado. Os documentos não indexados não são devolvidos no resultado de uma pesquisa vetorial. |
kind |
cadeia (de caracteres) | Tipo de índice vetorial a ser criado. As opções são vector-ivf, vector-hnswe vector-diskann. |
dimensions |
número inteiro | Número de dimensões para semelhança vetorial. O DiskANN suporta até 16.000 dimensões (com quantização do produto), com suporte futuro planejado para 40.000+. |
similarity |
cadeia (de caracteres) | 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 |
número inteiro | Número máximo de arestas por nodo no grafo. 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 |
número inteiro | 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 agregação $search no pipeline e consulte o operador cosmosSearch. 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 |
número inteiro | Especifica o tamanho da lista dinâmica de candidatos para pesquisa. O valor padrão é 40, com um intervalo configurável de 10 a 1000. Aumento do valor melhora o recall, mas pode reduzir a velocidade de pesquisa. |
k |
número inteiro | Define o número de resultados de pesquisa a serem retornados. O k valor deve ser menor ou igual a lSearch. |
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, incorporações do Azure OpenAI ou uma 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. Este exemplo inclui criar o índice vetorial para pesquisa por similaridade, adicionar documentos com propriedades vetoriais e geoespaciais, e indexar 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
}
}
]
})
Este comando cria um índice vetorial DiskANN no contentVector campo em exampleCollection, permitindo pesquisas de similaridade. Acrescenta ainda:
- Um índice no
is_opencampo, para que possas filtrar os resultados com base em se as empresas estão abertas. - Um índice geoespacial no
locationcampo para filtrar por proximidade geográfica.
Realizar 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 apresenta os documentos mais semelhantes a queryVector, limitados a um raio de 100 milhas e a empresas em atividade. Cada resultado inclui a pontuação de similaridade e os metadados, demonstrando como o DiskANN no Azure DocumentDB 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
Agora você pode executar pesquisas vetoriais com qualquer filtro de consulta suportado, como $lt, $lte, $eq, $neq, $gte, $gt$in, $nin, e $regex.
Para usar o pré-filtro, primeiro precisa de definir um índice padrão sobre a propriedade pela qual pretende filtrar, além do seu índice vetorial. 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 de o índice do filtro estar implementado, pode adicionar a "filter" cláusula diretamente à sua consulta de pesquisa vetorial. Este exemplo mostra como filtrar resultados onde 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 vetoriais pré-filtradas, considere ajustar seus parâmetros de índice vetorial. Para í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 os índices FIV, o ajuste de numLists ou de nProbes poderia levar a resultados mais satisfatórios. É crucial testar sua configuração específica com seus dados para garantir que os resultados atendam às suas necessidades. Esses parâmetros influenciam a estrutura do índice e o comportamento de pesquisa, e os valores ideais podem variar com base nas características dos dados e nos padrões de consulta.
Use ferramentas de orquestração de grandes modelos de linguagem (LLM)
Utilize como um banco de dados vetorial com Kernel Semântico
Use o Semantic Kernel para orquestrar a sua recuperação de informação a partir do Azure DocumentDB e do seu LLM. Para mais informações, consulte o repositório do GitHub.
Use como um banco de dados vetorial com LangChain
Use o LangChain para orquestrar a sua recuperação de informação do Azure DocumentDB e do seu LLM. Para mais informações, consulte integrações LangChain para Azure DocumentDB.
Use como cache semântico com LangChain
Use o LangChain e o Azure DocumentDB para orquestrar o cache semântico, usando respostas LLM previamente gravadas que podem poupar custos na API do LLM e reduzir a latência nas respostas. Para mais informações, consulte integração do LangChain com o Azure DocumentDB.
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.
- Com o DiskANN e a quantização do produto, você pode indexar vetores de até 16.000 dimensões.
- O uso de HNSW ou FIV com meia precisão permite a indexação de vetores de até 4.000 dimensões.
- Sem qualquer compressão, a dimensão máxima do vetor padrão para indexação é 2.000.
- A indexação aplica-se a apenas um vetor por caminho.
- Só podes criar um índice por caminho vetorial.
Resumo
Este guia mostra como criar um índice vetorial, adicionar documentos que tenham dados vetoriais, realizar uma pesquisa de similaridade e recuperar a definição do índice. Ao utilizar a nossa base de dados vetorial integrada, pode armazenar, indexar e consultar dados vetoriais de alta dimensão de forma eficiente diretamente no Azure DocumentDB. 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údo relacionado
- Solução de referência de varejo de padrão .NET RAG
- 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 do LLM Caching através do LangChain
- Python - Integração LlamaIndex
- Python - Integração de memória do kernel semântico