Partilhar via


Vetores de índice e consulta no Azure Cosmos DB para NoSQL no .NET

Este artigo orienta você pelo processo de como criar dados vetoriais, indexar os dados e, em seguida, consultar os dados em um contêiner.

Antes de usar a indexação vetorial e a pesquisa, você deve primeiro habilitar a pesquisa vetorial no Azure Cosmos DB para NoSQL. Depois de configurar o contêiner do Azure Cosmos DB para pesquisa vetorial, você cria uma política de incorporação de vetor. Em seguida, você adiciona índices de vetor à política de indexação de contêiner. Em seguida, você cria um contêiner com índices vetoriais e uma política de incorporação de vetor. Finalmente, você executa uma pesquisa vetorial nos dados armazenados.

Pré-requisitos

Ativar a funcionalidade

Para habilitar a pesquisa vetorial para o Azure Cosmos DB para NoSQL, siga estas etapas:

  1. Vá para sua página de recursos do Azure Cosmos DB para NoSQL.
  2. No painel esquerdo, em Configurações, selecione Recursos.
  3. Selecione Pesquisa vetorial no Azure Cosmos DB para NoSQL.
  4. Leia a descrição do recurso para confirmar que deseja ativá-lo.
  5. Selecione Habilitar para ativar a pesquisa vetorial no Azure Cosmos DB para NoSQL.

Gorjeta

Como alternativa, use a CLI do Azure para atualizar os recursos da sua conta para dar suporte ao Azure Cosmos DB para pesquisa vetorial NoSQL.

az cosmosdb update \
     --resource-group <resource-group-name> \
     --name <account-name> \
     --capabilities EnableNoSQLVectorSearch

O pedido de registo é aprovado automaticamente, mas pode demorar 15 minutos a entrar em vigor.

As etapas a seguir pressupõem que você saiba como configurar uma conta do Azure Cosmos DB para NoSQL e criar um banco de dados. O recurso de pesquisa vetorial atualmente não é suportado nos contêineres existentes. Você precisa criar um novo contêiner. Ao criar o contêiner, você especifica a política de incorporação de vetores no nível do contêiner e a política de indexação de vetores.

Vamos dar um exemplo de como criar um banco de dados para uma livraria baseada na internet. Você deseja armazenar informações de título, autor, ISBN e descrição de cada livro. Você também precisa definir as duas propriedades a seguir para conter incorporações vetoriais:

  • A contentVector propriedade contém incorporações de texto que são geradas a partir do conteúdo de texto do livro. Por exemplo, você concatena as propriedades title, author, isbn e description antes de criar a incorporação.
  • A coverImageVector propriedade é gerada a partir de imagens da capa do livro.

Para realizar uma pesquisa vetorial, você:

  1. Crie e armazene incorporações vetoriais para os campos nos quais você deseja executar a pesquisa vetorial.
  2. Especifique os caminhos de incorporação de vetor na política de incorporação de vetores.
  3. Inclua quaisquer índices de vetor desejados na política de indexação para o contêiner.

Para as seções subsequentes deste artigo, considere a seguinte estrutura para os itens armazenados em seu contêiner:

{
"title": "book-title", 
"author": "book-author", 
"isbn": "book-isbn", 
"description": "book-description", 
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1], 
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78] 
} 

Criar uma política de incorporação vetorial para seu contêiner

Agora você precisa definir uma política de vetor de contêiner. Esta política fornece informações que são usadas para informar o mecanismo de consulta do Azure Cosmos DB sobre como lidar com propriedades de vetor nas funções do VectorDistance sistema. Essa política também fornece informações necessárias para a política de indexação vetorial, se você optar por especificar uma.

As seguintes informações estão incluídas na política de vetor de contêiner:

Parâmetro Descrição
path O caminho da propriedade que contém vetores.
datatype O tipo dos elementos do vetor. (O padrão é Float32.)
dimensions O comprimento de cada vetor no caminho. (O padrão é 1536.)
distanceFunction A métrica usada para calcular a distância/similaridade. (O padrão é Cosine.)

Para o exemplo com detalhes do livro, a política de vetor poderá assemelhar-se ao exemplo a seguir:

  Database db = await client.CreateDatabaseIfNotExistsAsync("vector-benchmarking");
  List<Embedding> embeddings = new List<Embedding>()
  {
      new Embedding()
      {
          Path = "/coverImageVector",
          DataType = VectorDataType.Float32,
          DistanceFunction = DistanceFunction.Cosine,
          Dimensions = 8,
      },
      new Embedding()
      {
          Path = "/contentVector",
          DataType = VectorDataType.Float32,
          DistanceFunction = DistanceFunction.Cosine,
          Dimensions = 10,
      }
  };

Criar um índice vetorial na política de indexação

Depois de decidir sobre os caminhos de incorporação de vetor, você deve adicionar índices de vetor à política de indexação. Atualmente, o recurso de pesquisa vetorial do Azure Cosmos DB para NoSQL é suportado apenas em novos contêineres. Ao criar o contêiner, você aplica a política de vetor. Não é possível modificar a política posteriormente. A política de indexação se parece com o exemplo a seguir:

    Collection<Embedding> collection = new Collection<Embedding>(embeddings);
    ContainerProperties properties = new ContainerProperties(id: "vector-container", partitionKeyPath: "/id")
    {   
        VectorEmbeddingPolicy = new(collection),
        IndexingPolicy = new IndexingPolicy()
        {
            VectorIndexes = new()
            {
                new VectorIndexPath()
                {
                    Path = "/vector",
                    Type = VectorIndexType.QuantizedFlat,
                }
            }
        },
    };
    properties.IndexingPolicy.IncludedPaths.Add(new IncludedPath { Path = "/*" });    
    properties.IndexingPolicy.ExcludedPaths.Add(new ExcludedPath { Path = "/vector/*" });

Importante

O caminho do vetor é adicionado à excludedPaths seção da política de indexação para garantir um desempenho otimizado para inserção. Não adicionar o caminho do vetor a excludedPaths resulta numa maior carga de unidade de solicitação e latência para inserções vetoriais.

Executar uma consulta de pesquisa de semelhança vetorial

Depois de criar um contêiner com a política de vetor desejada e inserir dados vetoriais no contêiner, use a função de sistema VectorDistance em uma consulta para conduzir uma pesquisa vetorial.

Suponha que você queira pesquisar livros sobre receitas de alimentos olhando para a descrição. Primeiro, você precisa obter os embeddings para o texto da sua pesquisa. Nesse caso, convém gerar incorporações para o texto food recipeda consulta. Depois de obter o embedding da sua consulta de pesquisa, pode usá-lo na função VectorDistance na consulta vetorial para obter todos os itens que são semelhantes à sua consulta.

SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])   

Esta consulta recupera os títulos dos livros, juntamente com pontuações de semelhança em relação à sua consulta. Aqui está um exemplo no .NET:

  float[] embedding = {1f,2f,3f,4f,5f,6f,7f,8f,9f,10f};
  var queryDef = new QueryDefinition(
      query: $"SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)"
      ).WithParameter("@embedding", embedding);
  using FeedIterator<Object> feed = container.GetItemQueryIterator<Object>(
      queryDefinition: queryDef
  );
  while (feed.HasMoreResults) 
  {
      FeedResponse<Object> response = await feed.ReadNextAsync();
      foreach ( Object item in response)
      {
          Console.WriteLine($"Found item:\t{item}");
      }
  }