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
Um índice de pesquisa contendo
searchable
campos vetoriais e não vetoriais. Recomendamos o assistente Importar e vetorizar dados para criar um índice rapidamente. Caso contrário, consulte Criar um índice e Adicionar campos vetoriais a um índice de pesquisa.(Opcional) Se você quiser o classificador semântico, seu serviço de pesquisa deve ser nível Básico ou superior, com o classificador semântico habilitado.
(Opcional) Se desejar a conversão interna de texto em vetor de uma cadeia de caracteres de consulta, crie e atribua um vetorizador a campos vetoriais no índice de pesquisa.
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
No Search Explorer, verifique se a versão da API é 2024-07-01 ou uma versão mais recente da API de visualização.
Em Exibir, selecione Visualização JSON para poder colar em uma consulta vetorial.
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 emvectorQueries.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 } ] }
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". Definakind
como "vetor" para indicar o tipo de consulta. Opcionalmente, definaexhaustive
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 usarpostFilter
o , 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
}
Pesquisa híbrida semântica
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.
Sempre que utilizar a classificação semântica com vetores, certifique-se de que k
está definido como 50. O classificador semântico usa até 50 correspondências como entrada. Especificar menos de 50 priva os modelos de classificação semântica das entradas necessárias.
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, seguido por um pós-filtro aplicado às 50 correspondências, seus resultados serão reduzidos pelo número de documentos que atendem aos critérios de filtro. Isso deixa você com menos de 50 documentos para passar para o classificador semântico. Tenha isso em mente se estiver usando a classificação semântica. O classificador semântico funciona melhor se tiver 50 documentos como entrada.
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.
Use Pesquisar - POST ou Pesquisar - GET em 2024-05-01-preview para especificar esses parâmetros.
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 omaxTextRecallSize
.
Reduza
maxTextRecallSize
se a pesquisa de semelhança vetorial estiver geralmente superando o lado do texto da consulta híbrida.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 definirtop
,skip
enext
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": "Swirling Currents 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": "Swirling Currents 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.