Configurar pontuação de relevância do BM25

Neste artigo, saiba como configurar o algoritmo de pontuação de relevância BM25 usado pela IA do Azure Search para consultas de pesquisa de texto completo. Também é explicado como habilitar o BM25 em serviços de pesquisa mais antigos.

O BM25 é aplicável a:

  • Consultas que usam o parâmetro search para pesquisa de texto completo, em campos de texto com uma atribuição searchable.
  • A pontuação tem como escopo searchFields ou todos os campos searchable se searchFields for nulo.

O mecanismo de pesquisa usa o BM25 para calcular uma @searchScore para cada correspondência em uma consulta. Os documentos correspondentes são classificados por sua pontuação de pesquisa, com os melhores resultados retornados na resposta da consulta. É possível obter alguma variação de pontuação em resultados, ainda que da mesma consulta em execução no mesmo índice de pesquisa, mas geralmente essas variações são pequenas e não alteram a classificação geral dos resultados.

O BM25 tem padrões para ponderar a frequência do termo e o comprimento do documento. Você poderá personalizar essas propriedades se os padrões não forem adequados ao seu conteúdo. As alterações de configuração têm como escopo índices individuais, o que significa que você pode ajustar a pontuação de relevância com base nas características de cada índice.

Algoritmo de pontuação padrão

Dependendo da idade do serviço de pesquisa, a IA do Azure Search dá suporte a dois algoritmos de pontuação para uma consulta de pesquisa de texto completo:

  • Algoritmo Okapi BM25 (após 15 de julho de 2020)
  • Algoritmo de similaridade clássico (antes de 15 de julho de 2020)

A classificação do BM25 é o padrão, porque tende a produzir classificações de pesquisa que se alinham melhor às expectativas do usuário. Ela inclui parâmetros para ajustar os resultados com base em fatores como o tamanho do documento. Para os serviços de pesquisa criados após julho de 2020, o BM25 é o único algoritmo de pontuação. Se você tentar definir a "similaridade" como ClassicSimilarity em um novo serviço, um erro HTTP 400 será retornado porque não há suporte para esse algoritmo no serviço.

Para os serviços mais antigos, a similaridade clássica continua sendo o algoritmo padrão. Os serviços mais antigos podem atualizar para o BM25 por índice. Ao mudar do clássico para o BM25, você pode esperar algumas diferenças de como os resultados da pesquisa são ordenados.

Definir parâmetros do BM25

A classificação do BM25 fornece dois parâmetros para ajustar o cálculo da pontuação de relevância.

  1. Use uma solicitação Criar ou atualizar índice para definir parâmetros BM25:

    PUT [service-name].search.windows.net/indexes/[index-name]?api-version=2020-06-30&allowIndexDowntime=true
    {
        "similarity": {
            "@odata.type": "#Microsoft.Azure.Search.BM25Similarity",
            "b" : 0.75,
            "k1" : 1.2
        }
    }
    
  2. Se o índice for dinâmico, acrescente o parâmetro URI allowIndexDowntime=true na solicitação, mostrado no exemplo anterior.

    Como a IA do Azure Search não permite atualizações para um índice dinâmico, é necessário tornar o índice offline para que os parâmetros possam ser adicionados. As solicitações de indexação e de consulta falham quando o índice está offline. A duração da interrupção é o tempo necessário para atualizar o índice, geralmente, não mais do que alguns segundos. Quando a atualização for concluída, o índice retornará automaticamente.

  3. Defina "b" e "k1" para valores personalizados e envie a solicitação.

    Propriedade Type Descrição
    k1 number Controla a função de colocação em escala entre a frequência de termos de cada termo correspondente até a pontuação de relevância final de um par de consulta de documento. Os valores geralmente são 0,0 a 3,0, sendo 1,2 o padrão.

    Um valor de 0,0 representa um "modelo binário", em que a contribuição de um único termo correspondente é a mesma para todos os documentos correspondentes, independente de quantas vezes esse termo aparece no texto. Valores k1 maiores permitem que a pontuação continue a crescer à medida que mais instâncias do mesmo termo forem encontradas no documento.

    O uso de um valor k1 maior é importante nos casos em que vários termos são incluídos em uma consulta de pesquisa. Nesses casos, é aconselhável favorecer documentos que tenham mais termos de consulta correspondentes, em vez de documentos que correspondam a apenas um termo, diversas vezes. Por exemplo, ao consultar pelos termos "Apollo Spaceflight", talvez seja preferível diminuir a pontuação de um artigo sobre a Mitologia Grega que apresente o termo "Apollo" algumas vezes, sem mencionar "Spaceflight", em relação a outro artigo que menciona explicitamente tanto "Apollo" quanto "Spaceflight" inúmeras vezes.
    b number Controla como o comprimento de um documento afeta a pontuação de relevância. Os valores estão entre 0 e 1, sendo 0,75 o valor padrão.

    Um valor de 0,0 significa que o comprimento do documento não influencia a pontuação. Um valor de 1,0 significa que o impacto da frequência de termos na pontuação de relevância é normalizado pelo comprimento do documento.

    Normalizar a frequência do termo pelo comprimento do documento é útil nos casos em que você deseja penalizar documentos mais longos. Em alguns casos, documentos mais longos (como um romance completo) estão mais propensos a terem muitos termos irrelevantes, em comparação com documentos mais curtos.

Habilitar a pontuação do BM25 em serviços mais antigos

Se estiver executando um serviço Pesquisa criado no período de março de 2014 a 15 de julho de 2020, você poderá habilitar o BM25 definindo uma propriedade de "similaridade" nos novos índices. A propriedade só é exposta em novos índices, portanto, se desejar ter o BM25 em um índice existente, será necessário remover e recompilar o índice com uma propriedade de "similaridade" definida como Microsoft.Azure.Search.BM25Similarity.

Depois que houver um índice com uma propriedade "similarity", você poderá alternar entre BM25Similarity ou ClassicSimilarity.

Os links a seguir descrevem a propriedade Similaridade nos SDKs do Azure.

Biblioteca de clientes Propriedade Similaridade
.NET SearchIndex.Similarity
Java SearchIndex.setSimilarity
JavaScript SearchIndex.Similarity
Python Propriedade Similaridade em SearchIndex

Exemplo REST

Use também a API REST. O exemplo a seguir cria um novo índice com a propriedade "similaridade" definida como BM25:

PUT [service-name].search.windows.net/indexes/[index name]?api-version=2020-06-30
{
    "name": "indexName",
    "fields": [
        {
            "name": "id",
            "type": "Edm.String",
            "key": true
        },
        {
            "name": "name",
            "type": "Edm.String",
            "searchable": true,
            "analyzer": "en.lucene"
        },
        ...
    ],
    "similarity": {
        "@odata.type": "#Microsoft.Azure.Search.BM25Similarity"
    }
}

Confira também