Partilhar via


Criar uma consulta híbrida no Azure AI Search

A pesquisa híbrida combina texto (palavra-chave) e consultas vetoriais em uma única solicitação de pesquisa. Todas as subconsultas na solicitação são executadas em paralelo. Os resultados são mesclados e reordenados por novas pontuações de pesquisa, usando Reciprocal Rank Fusion (RRF) para retornar um conjunto de resultados unificado. Em muitos casos, por testes de benchmark, consultas híbridas com classificação semântica retornam os resultados mais relevantes.

Neste artigo, saiba como:

  • Configurar um pedido básico
  • Formule consultas híbridas com mais parâmetros e filtros
  • Melhorar a relevância usando classificação semântica ou pesos vetoriais
  • Otimize comportamentos de consulta controlando entradas de texto e vetores

Nota

Uma novidade no 2024-09-01-preview é a capacidade de direcionar filtros apenas para as subconsultas vetoriais em uma solicitação híbrida. Isso lhe dá mais precisão sobre como os filtros são aplicados. Para obter mais informações, consulte Segmentar filtros para subconsultas vetoriais neste artigo.

Pré-requisitos

Escolha uma API ou ferramenta

  • O Gerenciador de Pesquisa no portal do Azure (dá suporte à sintaxe de pesquisa de API estável e de visualização) tem um modo de exibição JSON que permite colar em uma solicitação híbrida.

  • 2024-07-01 versão estável ou uma versão recente da API de visualização se você estiver usando recursos de visualização como maxTextRecallSize e countAndFacetMode(preview).

    Para facilitar a leitura, usamos exemplos REST para explicar como as APIs funcionam. Você pode usar um cliente REST como o Visual Studio Code com a extensão REST para criar consultas híbridas. Para obter mais informações, consulte Guia de início rápido: pesquisa vetorial usando APIs REST.

  • Pacotes estáveis ou beta mais recentes dos SDKs do Azure (consulte os logs de alterações para obter suporte a recursos do SDK).

Configurar uma consulta híbrida no Search Explorer

  1. No Search Explorer, verifique se a versão da API é 2024-07-01 ou uma versão mais recente da API de visualização.

  2. Em Exibir, selecione Visualização JSON para poder colar em uma consulta vetorial.

  3. Substitua o modelo de consulta padrão por uma consulta híbrida, como o exemplo "Executar uma consulta híbrida" começando na linha 539 no início rápido do vetor. Por uma questão de brevidade, o vetor é truncado neste artigo.

    Uma consulta híbrida tem uma consulta de texto especificada em search, e uma consulta vetorial especificada em vectorQueries.vector.

    A consulta de texto e a consulta vetorial podem ser equivalentes ou divergentes, mas é comum que compartilhem a mesma intenção.

    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelId, HotelName, Category, Tags, Description",
        "top": 7,
        "vectorQueries": [
            {
                "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], 
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    
  4. Selecione Pesquisar.

Gorjeta

Os resultados da pesquisa são mais fáceis de ler se você ocultar os vetores. Em Opções de Consulta, ative Ocultar valores vetoriais nos resultados da pesquisa.

Solicitação de consulta híbrida (API REST)

Uma consulta híbrida combina pesquisa de texto e pesquisa vetorial, onde o search parâmetro usa uma cadeia de caracteres de consulta e vectorQueries.vector leva a consulta vetorial. O motor de busca executa texto completo e consultas vetoriais em paralelo. A união de todas as correspondências é avaliada quanto à relevância usando Reciprocal Rank Fusion (RRF) e um único conjunto de resultados é retornado na resposta.

Os resultados são retornados em texto sem formatação, incluindo vetores em campos marcados como retrievable. Como os vetores numéricos não são úteis nos resultados da pesquisa, escolha outros campos no índice como proxy para a correspondência vetorial. Por exemplo, se um índice tiver campos "descriptionVector" e "descriptionText", a consulta pode corresponder em "descriptionVector", mas o resultado da pesquisa pode mostrar "descriptionText". Use o select parâmetro para especificar apenas campos legíveis por humanos nos resultados.

O exemplo a seguir mostra uma configuração de consulta híbrida.

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}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "k": 10
        },
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "top": 10
}

Pontos principais:

  • A cadeia de caracteres de consulta vetorial é especificada por meio da vectorQueries.vector propriedade. A consulta é executada no campo "DescriptionVector". Defina kind como "vetor" para indicar o tipo de consulta. Opcionalmente, defina exhaustive como true para consultar o conteúdo completo do campo vetorial.

  • A pesquisa por palavra-chave é especificada através da search propriedade. Ele é executado em paralelo com a consulta vetorial.

  • k determina quantas correspondências de vizinhos mais próximos são retornadas da consulta vetorial e fornecidas ao classificador RRF.

  • top Determina quantas correspondências são retornadas no all-up de resposta. Neste exemplo, a resposta inclui 10 resultados, supondo que haja pelo menos 10 correspondências nos resultados mesclados.

Pesquisa híbrida com filtro

Este exemplo adiciona um filtro, que é aplicado aos filterable campos não vetoriais do índice de pesquisa.

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}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "vectorFilterMode": "postFilter",
    "filter": "ParkingIncluded",
    "top": "10"
}

Pontos principais:

  • Os filtros são aplicados ao conteúdo dos campos filtráveis. Neste exemplo, o campo ParkingIncluded é um booleano e está marcado como filterable no esquema de índice.

  • Em consultas híbridas, os filtros podem ser aplicados antes da execução da consulta para reduzir a superfície da consulta ou após a execução da consulta para cortar os resultados. "preFilter" é a predefinição. Para usar postFiltero , defina o modo de processamento do filtro conforme mostrado neste exemplo.

  • Quando você postfiltra os resultados da consulta, o número de resultados pode ser menor do que top-n.

Pesquisa híbrida com filtros direcionados a subconsultas vetoriais (visualização)

Usando 2024-09-01-preview, você pode substituir um filtro global na solicitação de pesquisa aplicando um filtro secundário direcionado apenas às subconsultas vetoriais em uma solicitação híbrida.

Esse recurso fornece controle refinado, garantindo que os filtros influenciem apenas os resultados da pesquisa vetorial, deixando os resultados da pesquisa baseados em palavras-chave não afetados.

O filtro de destino substitui totalmente o filtro global, incluindo quaisquer filtros usados para filtragem de segurança ou pesquisa geoespacial. Nos casos em que são necessários filtros globais, como filtragem de segurança, você deve incluir explicitamente esses filtros no filtro de nível superior e em cada filtro de nível vetorial para garantir que a segurança e outras restrições sejam aplicadas de forma consistente.

Para aplicar filtros vetoriais direcionados:

  • Use a API REST de Pesquisa de Documentos de visualização mais recente ou um pacote beta do SDK do Azure que forneça o recurso.

  • Modifique uma solicitação de consulta, adicionando um novo vectorQueries.filterOverride conjunto de parâmetros a uma expressão de filtro OData.

Aqui está um exemplo de consulta híbrida que adiciona uma substituição de filtro. O filtro global "Rating gt 3" é substituído em tempo de execução pelo filterOvrride.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview

{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "filterOverride": "Address/City eq 'Seattle'",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City, Rating",
    "filter": "Rating gt 3"
    "debug": "vector",
    "top": 10
}

Supondo que você habilitou o classificador semântico e sua definição de índice inclui uma configuração semântica, você pode formular uma consulta que inclua pesquisa vetorial e pesquisa por palavra-chave, com classificação semântica sobre o conjunto de resultados mesclados. Opcionalmente, você pode adicionar legendas e respostas.

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}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "top": "50"
}

Pontos principais:

  • O classificador semântico aceita até 50 resultados da resposta mesclada.

  • "queryType" e "semanticConfiguration" são obrigatórios.

  • "legendas" e "respostas" são opcionais. Os valores são extraídos do texto literal nos resultados. Uma resposta só é devolvida se os resultados incluírem conteúdo com as características de uma resposta à consulta.

Pesquisa híbrida semântica com filtro

Aqui está a última consulta na coleção. É a mesma consulta híbrida semântica do exemplo anterior, mas com um filtro.

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}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "filter": "ParkingIsIncluded'",
    "vectorFilterMode": "postFilter",
    "top": "50"
}

Pontos principais:

  • O modo de filtro pode afetar o número de resultados disponíveis para o reclassificador semântico. Como prática recomendada, é inteligente dar ao classificador semântico o número máximo de documentos (50). Se os pré-filtros ou pós-filtros forem muito seletivos, você pode estar subestimando o classificador semântico, dando-lhe menos de 50 documentos para trabalhar.

  • A pré-filtragem é aplicada antes da execução da consulta. Se o pré-filtro reduzir a área de pesquisa para 100 documentos, a consulta vetorial será executada sobre o campo "DescriptionVector" para esses 100 documentos, retornando as melhores correspondências k=50. Esses 50 documentos correspondentes passam para o RRF para resultados mesclados e, em seguida, para o ranker semântico.

  • Postfilter é aplicado após a execução da consulta. Se k=50 retornar 50 correspondências no lado da consulta vetorial, o pós-filtro será aplicado às 50 correspondências, reduzindo os resultados que atendem aos critérios de filtro, deixando você com menos de 50 documentos para passar para o classificador semântico.

Definir maxTextRecallSize e countAndFacetMode (visualização)

Esta seção explica como ajustar as entradas para uma consulta híbrida controlando a quantidade de resultados classificados como BM25 que fluem para o modelo de classificação híbrido. O controle sobre a entrada classificada no BM25 oferece mais opções de ajuste de relevância em cenários híbridos.

Recomendamos visualizar a versão da API REST 2024-05-01-preview.

Gorjeta

Outra opção a considerar é uma técnica suplementar ou de substituição, é a ponderação vetorial, que aumenta a importância das consultas vetoriais na solicitação.

  1. Use Pesquisar - POST ou Pesquisar - GET em 2024-05-01-preview para especificar esses parâmetros.

  2. Adicione um hybridSearch objeto de parâmetro de consulta para definir o número máximo de documentos recuperados por meio dos resultados classificados como BM25 de uma consulta híbrida. Tem duas propriedades:

    • maxTextRecallSize especifica o número de resultados classificados como BM25 a serem fornecidos ao classificador Reciprocal Rank Fusion (RRF) usado em consultas híbridas. O padrão é 1.000. O máximo é de 10.000.

    • countAndFacetMode relata as contagens para os resultados classificados como BM25 (e para facetas, se você as estiver usando). O padrão é todos os documentos que correspondem à consulta. Opcionalmente, você pode definir o escopo "count" para o maxTextRecallSize.

  3. Reduza maxTextRecallSize se a pesquisa de semelhança vetorial estiver geralmente superando o lado do texto da consulta híbrida.

  4. Aumente maxTextRecallSize se você tiver um índice grande e o padrão não for capturar um número suficiente de resultados. Com um conjunto de resultados maior classificado como BM25, você também pode definir top, skipe next recuperar partes desses resultados.

Os exemplos REST a seguir mostram dois casos de uso para a configuração maxTextRecallSize.

O primeiro exemplo reduz maxTextRecallSize para 100, limitando o lado do texto da consulta híbrida a apenas 100 documentos. Também define countAndFacetMode para incluir apenas os resultados de maxTextRecallSize.

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

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world", 
      "hybridSearch": { 
        "maxTextRecallSize": 100, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

O segundo exemplo aumenta maxTextRecallSize para 5.000. Ele também usa top, skip e next para extrair resultados de grandes conjuntos de resultados. Nesse caso, a solicitação obtém resultados classificados como BM25 a partir da posição 1.500 a 2.000 como a contribuição da consulta de texto para o conjunto de resultados composto do RRF.

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

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world",
      "top": 500,
      "skip": 1500,
      "next": 500,
      "hybridSearch": { 
        "maxTextRecallSize": 5000, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

Configurar uma resposta de consulta

Ao configurar a consulta híbrida, pense na estrutura de resposta. A resposta é um conjunto de linhas achatado. Os parâmetros na consulta determinam quais campos estão em cada linha e quantas linhas estão na resposta. O motor de busca classifica os documentos correspondentes e devolve os resultados mais relevantes.

Campos numa resposta

Os resultados da pesquisa são compostos por campos do seu índice de retrievable pesquisa. O resultado é o seguinte:

  • Todos os retrievable campos (um padrão da API REST).
  • Campos explicitamente listados em um parâmetro "select" na consulta.

Os exemplos neste artigo usaram uma instrução "select" para especificar campos de texto (não vetoriais) na resposta.

Nota

Os vetores não são submetidos a engenharia reversa em texto legível por humanos, portanto, evite devolvê-los na resposta. Em vez disso, escolha campos não vetoriais que sejam representativos do documento de pesquisa. Por exemplo, se a consulta tiver como alvo um campo "DescriptionVector", retorne um campo de texto equivalente se você tiver um ("Description") na resposta.

Número de resultados

Uma consulta pode corresponder a qualquer número de documentos, tantos quantos todos eles se os critérios de pesquisa forem fracos (por exemplo, "search=*" para uma consulta nula). Como raramente é prático retornar resultados ilimitados, você deve especificar um máximo para a resposta geral:

  • "top": n Resultados para consultas somente palavras-chave (sem vetor)
  • "k": n Resultados para consultas somente vetoriais
  • "top": n resultados para consultas híbridas (com ou sem semântica) que incluem um parâmetro de "pesquisa"

Tanto "k" como "top" são opcionais. Não especificado, o número padrão de resultados em uma resposta é 50. Você pode definir "top" e "skip" para a página através de mais resultados ou alterar o padrão.

Nota

Se você estiver usando a pesquisa híbrida na API 2024-05-01-preview, poderá controlar o número de resultados da consulta de palavra-chave usando maxTextRecallSize. Combine isso com uma configuração para "k" para controlar a representação de cada subsistema de pesquisa (palavra-chave e vetor).

Resultados do ranker semântico

Nota

O classificador semântico pode levar até 50 resultados.

Se você estiver usando o classificador semântico na API 2024-05-01-preview, é uma prática recomendada definir "k" e "maxTextRecallSize" para somar pelo menos 50 no total. Você pode então restringir os resultados retornados ao usuário com o parâmetro "top".

Se você estiver usando o classificador semântico em APIs anteriores, faça o seguinte:

  • se estiver fazendo pesquisa somente por palavra-chave (sem vetor) defina "top" como 50
  • Se estiver fazendo pesquisa híbrida, defina "K" como 50, para garantir que o classificador semântico obtenha pelo menos 50 resultados.

Classificação

Vários conjuntos são criados para consultas híbridas, com ou sem a reclassificação semântica opcional. A classificação dos resultados é calculada pelo Reciprocal Rank Fusion (RRF).

Nesta seção, compare as respostas entre a pesquisa de vetor único e a pesquisa híbrida simples para obter o resultado principal. Os diferentes algoritmos de classificação, a métrica de semelhança do HNSW e o RRF neste caso, produzem pontuações que têm magnitudes diferentes. Este comportamento é a predefinição. As pontuações do RRF podem parecer bastante baixas, mesmo com uma alta semelhança. Pontuações mais baixas são uma característica do algoritmo RRF. Em uma consulta híbrida com RRF, mais da recíproca dos documentos classificados são incluídos nos resultados, dada a pontuação relativamente menor dos documentos classificados por RRF, em oposição à pesquisa vetorial pura.

Pesquisa de vetor único: @search.score para resultados ordenados por semelhança de cosseno (função de distância de semelhança vetorial padrão).

{
    "@search.score": 0.8399121,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Pesquisa híbrida: @search.score para resultados híbridos classificados usando Reciprocal Rank Fusion.

{
    "@search.score": 0.032786883413791656,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Próximos passos

Como próxima etapa, recomendamos revisar o código de demonstração para Python, C# ou JavaScript.