Compartilhar via


Criar uma consulta vetorial no Azure AI Search

Se você tiver um índice de vetor no Azure AI Search, este artigo explicará como:

Este artigo usa REST para ilustração. Depois de entender o fluxo de trabalho básico, continue com os exemplos de código do SDK do Azure no repositório azure-search-vector-samples , que fornece soluções de ponta a ponta que incluem consultas de vetor.

Você também pode usar o Gerenciador de Pesquisa no portal do Azure.

Pré-requisitos

Converter uma entrada de cadeia de caracteres de consulta em um vetor

Para consultar um campo vetorial, a consulta em si deve ser um vetor.

Uma abordagem para converter a cadeia de caracteres de consulta de texto de um usuário em sua representação de vetor é chamar uma biblioteca de inserção ou API no código do aplicativo. Como prática recomendada, sempre use os mesmos modelos de inserção usados para gerar inserções nos documentos de origem. Você pode encontrar exemplos de código mostrando como gerar inserções no repositório azure-search-vector-samples .

Uma segunda abordagem é usar a vetorização integrada, agora em disponibilidade geral, para que o Azure AI Search manipule suas entradas e saídas de vetorização de consulta.

Aqui está um exemplo de API REST de uma cadeia de caracteres de consulta enviada a uma implantação de um modelo de inserção do OpenAI do Azure

POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "input": "what azure services support generative AI'"
}

A resposta esperada é 202 para uma chamada bem-sucedida para o modelo implantado.

O embedding campo no corpo da resposta é a representação de vetor da cadeia de caracteres inputde consulta. Para fins de teste, você copiaria o valor da embedding matriz em vectorQueries.vector uma solicitação de consulta, usando a sintaxe mostrada nas próximas seções.

A resposta real a essa chamada POST para o modelo implantado inclui 1.536 inserções. Para legibilidade, este exemplo mostra apenas os primeiros vetores.

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "index": 0,
            "embedding": [
                -0.009171937,
                0.018715322,
                ...
                -0.0016804502
            ]
        }
    ],
    "model": "ada",
    "usage": {
        "prompt_tokens": 7,
        "total_tokens": 7
    }
}

Nessa abordagem, o código do aplicativo é responsável por se conectar a um modelo, gerar inserções e lidar com a resposta.

Solicitação de consulta vetorial

Esta seção mostra a estrutura básica de uma consulta vetorial. Você pode usar o portal do Azure, as APIs REST ou os SDKs do Azure para formular uma consulta de vetor.

Se você estiver migrando de 2023-07-01-Preview, haverá alterações significativas. Para obter mais informações, consulte Atualizar para a API REST mais recente.

2024-07-01 é a versão estável da API REST do Search POST. Esta versão dá suporte a:

  • vectorQueries é o constructo da busca em vetores.
  • vectorQueries.kinddefinido como vector para uma matriz de vetores ou text se a entrada for uma cadeia de caracteres e se você tiver um vetorizador.
  • vectorQueries.vector é a consulta (uma representação de vetor de texto ou uma imagem).
  • vectorQueries.exhaustive (opcional) invoca o KNN exaustivo no momento da consulta, mesmo que o campo seja indexado para HNSW.
  • vectorQueries.fields (opcional) direciona campos específicos para execução de consulta (até 10 por consulta).
  • vectorQueries.weight (opcional) especifica o peso relativo de cada consulta de vetor incluída nas operações de pesquisa. Para obter mais informações, consulte a ponderação do vetor.
  • vectorQueries.k é o número de correspondências a serem retornadas.

No exemplo a seguir, o vetor é uma representação dessa cadeia de caracteres: "what Azure services support full text search". A consulta tem como destino o contentVector campo e retorna k resultados. O vetor real tem 1.536 inserções, que são cortadas neste exemplo para legibilidade.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "weight": 0.5,
            "k": 5
        }
    ]
}

Resposta da consulta vetorial

Na Pesquisa de IA do Azure, as respostas de consulta consistem em todos os campos retrievable por padrão. No entanto, é comum limitar os resultados da pesquisa a um subconjunto de campos retrievable listando-os em uma instrução select.

Em uma consulta de vetor, considere cuidadosamente se você precisa vetor de campos em uma resposta. Os campos de vetor não são legíveis por humanos, portanto, se você estiver enviando uma resposta por push para uma página da Web, deverá escolher campos não vetoriais que representem o resultado. Por exemplo, se a consulta for executada em contentVector, você poderá retornar content.

Se você quiser campos de vetor no resultado, aqui está um exemplo da estrutura de resposta. contentVector é uma matriz de cadeia de caracteres de inserções, que são cortadas neste exemplo para legibilidade. A pontuação de pesquisa indica relevância. Outros campos não vetoriais são incluídos para contexto.

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.80025613,
            "title": "Azure Search",
            "category": "AI + Machine Learning",
            "contentVector": [
                -0.0018343845,
                0.017952163,
                0.0025753193,
                ...
            ]
        },
        {
            "@search.score": 0.78856903,
            "title": "Azure Application Insights",
            "category": "Management + Governance",
            "contentVector": [
                -0.016821077,
                0.0037742127,
                0.016136652,
                ...
            ]
        },
        {
            "@search.score": 0.78650564,
            "title": "Azure Media Services",
            "category": "Media",
            "contentVector": [
                -0.025449317,
                0.0038463024,
                -0.02488436,
                ...
            ]
        }
    ]
}

Pontos principais:

  • k determina quantos resultados vizinhos mais próximos são retornados, neste caso, três. Consultas vetoriais sempre retornam k resultados, supondo que pelo menos k documentos existam, mesmo que alguns documentos tenham pouca similaridade. Isso ocorre porque o algoritmo localiza os k vizinhos mais próximos do vetor de consulta.

  • O algoritmo de pesquisa de vetor determina o @search.score.

  • Os campos nos resultados da pesquisa são todos campos retrievable ou campos em uma cláusula select. Durante a execução da consulta vetor, a correspondência é feita apenas em dados de vetor. No entanto, uma resposta pode incluir qualquer campo retrievable em um índice. Como não há nenhuma facilidade para decodificar um resultado de campo de vetor, a inclusão de campos de texto não vetor é útil para seus valores legíveis por humanos.

Vários campos vetoriais

Você pode definir a vectorQueries.fields propriedade como vários campos de vetor. A consulta de vetor é executada em cada campo de vetor que você fornece na lista fields. Você pode especificar até 10 campos.

Ao consultar vários campos de vetor, verifique se cada um contém inserções do mesmo modelo de inserção. A consulta também deve ser gerada do mesmo modelo de inserção.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector, titleVector",
            "k": 5
        }
    ]
}

Várias consultas vetoriais

A busca em vetores de várias consultas envia várias consultas em vários campos de vetor no índice de pesquisa. Esse tipo de consulta é comumente usado com modelos como CLIP para pesquisa multimodal, em que o mesmo modelo pode vetorizar texto e imagens.

O exemplo de consulta a seguir procura similaridade tanto em myImageVector quanto em myTextVector, mas envia duas respectivas incorporações de consulta, cada uma executando em paralelo. O resultado dessa consulta é pontuado usando a RRF(fusão de classificação recíproca).

  • vectorQueries fornece uma matriz de consultas vetoriais.
  • vector contém os vetores de imagem e os vetores de texto no índice de pesquisa. Cada instância é uma consulta separada.
  • fields especifica qual campo vetorial será direcionado.
  • k é o número de correspondências do vizinho mais próximo a serem incluídas nos resultados.
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "myimagevector",
            "k": 5
        },
        {
            "kind": "vector"
            "vector": [
                -0.002222222,
                0.018708462,
                -0.013770515,
            . . .
            ],
            "fields": "mytextvector",
            "k": 5
        }
    ]
}

Os índices de pesquisa não podem armazenar imagens. Supondo que seu índice inclua um campo para o arquivo de imagem, os resultados da pesquisa incluiriam uma combinação de texto e imagens.

Consultar com vetorização integrada

Esta seção mostra uma consulta de vetor que invoca a vetorização integrada para converter uma consulta de texto ou imagem em um vetor. Recomendamos a API REST 01/07/2024 estável, o Gerenciador de Pesquisa ou pacotes mais recentes do SDK do Azure para esse recurso.

Um pré-requisito é um índice de pesquisa que tem um vetorizador configurado e atribuído a um campo vetorial. O vetorizador fornece informações de conexão para um modelo de inserção usado no momento da consulta.

O Gerenciador de Pesquisa dá suporte à vetorização integrada no momento da consulta. Se o índice contiver campos de vetor e tiver um vetor, você poderá usar a conversão de texto para vetor interna.

  1. Entre no portal do Azure e localize seu serviço de pesquisa.

  2. No menu à esquerda, selecione Gerenciamento de Pesquisa>Índices e, em seguida, selecione seu índice.

  3. Selecione a guia Perfis de Vetor para confirmar se você tem um vetorizador.

    Captura de tela de uma configuração de vetorizador em um índice de pesquisa.

  4. Selecione a guia Gerenciador de Pesquisa . Usando o modo de exibição de consulta padrão, você pode inserir uma cadeia de caracteres de texto na barra de pesquisa. O vetor interno converte sua cadeia de caracteres em um vetor, executa a pesquisa e retorna resultados.

    Como alternativa, você pode selecionar Exibir>Exibição JSON para exibir ou modificar a consulta. Se os vetores estiverem presentes, o Gerenciador de Pesquisa configurará uma consulta vetorial automaticamente. Você pode usar a exibição JSON para selecionar campos para uso na pesquisa e resposta, adicionar filtros e construir consultas mais avançadas, como consultas híbridas. Para ver um exemplo JSON, selecione a guia API REST nesta seção.

Número de resultados classificados em uma resposta de consulta vetorial

Uma consulta vetorial especifica o parâmetro k, que determina quantas correspondências são retornadas nos resultados. O mecanismo de pesquisa sempre retorna o número k de correspondências. Se k for maior que o número de documentos no índice, o número de documentos determinará o limite superior do que pode ser retornado.

Se você estiver familiarizado com a pesquisa de texto completo, você saberá esperar zero resultados se o índice não contiver um termo ou frase. No entanto, na pesquisa de vetor, a operação de pesquisa identifica vizinhos mais próximos e sempre retorna k resultados, mesmo que os vizinhos mais próximos não sejam semelhantes. É possível obter resultados para consultas sem sentido ou fora do tópico, especialmente se você não estiver usando prompts para definir limites. Os resultados menos relevantes têm uma pontuação de similaridade pior, mas ainda são os vetores "mais próximos" se não houver nada mais próximo. Portanto, uma resposta sem resultados significativos ainda pode retornar k resultados, mas a pontuação de similaridade de cada resultado seria baixa.

Uma abordagem híbrida que inclui a pesquisa de texto completo pode atenuar esse problema. Outra solução é definir um limite mínimo na pontuação de pesquisa, mas somente se a consulta for uma consulta de vetor único pura. As consultas híbridas não são propícias a limites mínimos porque os intervalos de RRF são muito menores e mais voláteis.

Os parâmetros de consulta que afetam a contagem de resultados incluem:

  • "k": n resultados para consultas somente de vetor.
  • "top": n resultados de consultas híbridas que incluem um search parâmetro.

k e top são opcionais. Quando não especificado, o número padrão de resultados em uma resposta é 50. Você pode definir top e skip para navegar por mais resultados ou alterar o padrão.

Algoritmos de classificação usados em uma consulta de vetor

A classificação dos resultados é computada por:

  • A métrica de similaridade.
  • RRF se houver vários conjuntos de resultados da pesquisa.

Métrica de similaridade

A métrica de similaridade especificada na seção vectorSearch de índice para uma consulta vetorial somente. Os valores válidos são cosine, euclidean e dotProduct.

Os modelos de inserção do OpenAI do Azure usam a similaridade de cosseno. Portanto, se você estiver usando os modelos de inserção do OpenAI do Azure, cosine será a métrica recomendada. Outras métricas de classificação com suporte incluem euclidean e dotProduct.

RRF

Vários conjuntos são criados se a consulta destina-se a vários campos de vetor, executa várias consultas vetoriais em paralelo ou é um híbrido de vetor e pesquisa de texto completo, com ou sem classificação semântica.

Durante a execução da consulta, uma consulta vetor só pode ser direcionada a um índice de vetor interno. Para vários campos de vetor e várias consultas de vetor, o mecanismo de pesquisa gera várias consultas direcionadas aos respectivos índices vetoriais de cada campo. A saída é um conjunto de resultados classificados para cada consulta, que são fundidos usando RRF. Para obter mais informações, consulte Pontuação de relevância usando a fusão de classificação recíproca.

Ponderação de vetor

Adicione um parâmetro de consulta weight para especificar o peso relativo de cada consulta em vetores incluída nas operações de pesquisa. Esse valor é usado ao combinar os resultados de várias listas de classificação produzidas por duas ou mais consultas vetoriais na mesma solicitação ou na parte vetorial de uma consulta híbrida.

O padrão é 1,0 e o valor deve ser um número positivo maior que zero.

Os pesos são usados ao calcular as pontuações RRF de cada documento. O cálculo é um multiplicador do valor weight em relação à pontuação do ranking do documento dentro de seu respectivo conjunto de resultados.

O exemplo a seguir é uma consulta híbrida com duas cadeias de caracteres de consulta de vetor e uma cadeia de caracteres de texto. Os pesos são atribuídos às consultas de vetor. A primeira consulta é 0,5 ou metade do peso, reduzindo a importância dela na solicitação. A segunda consulta vetorial é duas vezes mais importante.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-07-01

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_first_vector_field", 
          "k": 10, 
          "weight": 0.5 
        },
        { 
          "kind": "vector", 
          "vector": [4.0, 5.0, 6.0], 
          "fields": "my_second_vector_field", 
          "k": 10, 
          "weight": 2.0
        } 
      ], 
      "search": "hello world" 
    } 

A ponderação vetorial se aplica somente a vetores. A consulta de texto neste exemplo "hello world"tem um peso neutro implícito de 1,0. No entanto, em uma consulta híbrida, você pode aumentar ou diminuir a importância dos campos de texto definindo o parâmetro maxTextRecallSize.

Definir limites para excluir resultados de baixa pontuação (versão prévia)

Como a pesquisa de vizinho mais próxima sempre retorna os vizinhos k solicitados, é possível obter correspondências de baixa pontuação como parte de atender ao requisito de número k nos resultados da pesquisa. Para excluir os resultados da pesquisa de baixa pontuação, você pode adicionar um threshold parâmetro de consulta que filtra os resultados com base em uma pontuação mínima. A filtragem ocorre antes de unir os resultados de conjuntos de recall diferentes.

Esse parâmetro está em versão prévia. Recomendamos a versão da API REST 2024-05-01-preview .

Neste exemplo, todas as correspondências que pontuam abaixo de 0,8 são excluídas dos resultados da pesquisa de vetor, mesmo que o número de resultados fique abaixo k.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-preview 
    Content-Type: application/json 
    api-key: [admin key] 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my-cosine-field", 
          "threshold": { 
            "kind": "vectorSimilarity", 
            "value": 0.8 
          } 
        }
      ]
    }

Próximas etapas

Como próxima etapa, examine exemplos de código de consulta vetor em Python, C# ou JavaScript.