Partilhar via


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.

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-hnswe 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:

  1. Iniciar sessão na CLI do Azure
az login
  1. 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>
  1. 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.

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

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory/azure_cosmosdb

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.

Próximo passo