Adicionar perfis de pontuação para aumentar as pontuações de pesquisa
Os perfis de pontuação permitem aumentar a classificação de documentos correspondentes com base em critérios específicos. Neste artigo, você vai aprender a especificar e atribuir um perfil de pontuação que aumenta a pontuação de busca com base nos parâmetros que você definir.
Você pode usar perfis de pontuação para busca por palavras-chave, busca em vetores e busca híbrida. É importante notar que os perfis de pontuação se aplicam apenas a campos não vetoriais. Portanto, seu índice só deve conter campos de texto ou numéricos que possam ser usados em um perfil de pontuação. O suporte a perfis de pontuação para busca em vetores e híbrida estará disponível nas APIs REST 2024-05-01-preview e 2024-07-01, além dos pacotes de SDK do Azure voltados para essas versões.
Principais pontos sobre perfis de pontuação
Os parâmetros de perfil de pontuação incluem:
Campos ponderados, onde uma correspondência é encontrada em um campo de cadeia de caracteres específico. Por exemplo, talvez você queira que as correspondências encontradas em um campo "resumo" sejam mais relevantes do que a mesma correspondência encontrada no campo "conteúdo".
Funções para dados numéricos, como datas, intervalos e coordenadas geográficas. Há também uma função Marcações que opera em um campo, fornecendo uma coleção arbitrária de cadeias de caracteres. Você pode optar por abordagem em vez de campos ponderados se quiser aumentar uma pontuação com base na presença de uma correspondência em um campo de marcações.
Você pode criar vários perfis e modificar a lógica de consulta para escolher qual deles será usado.
É possível ter até 100 perfis de pontuação em um índice (consulte Limites de serviço), mas você poderá especificar apenas um perfil no momento em qualquer consulta.
Você pode usar o classificador semântico com perfis de pontuação. Quando vários recursos de classificação ou relevância estão em jogo, a classificação semântica é a última etapa. Como a pontuação de pesquisa funciona fornece uma ilustração.
Observação
Não está familiarizado com os conceitos de relevância? Para mais informações, acesse Relevância e pontuação na Pesquisa de IA do Azure. Você também pode assistir o trecho de um vídeo no YouTube sobre perfis de pontuação em resultados classificados por BM25.
Definição do perfil de pontuação
Um perfil de pontuação é nomeado objeto definido em um esquema de índice. Um perfil de pontuação pode ser composto por campos ponderados, funções e parâmetros.
A definição a seguir mostra um perfil simples nomeado “geo”. Esse exemplo aumenta os itens que têm o termo de pesquisa no campo hotelName. Ele também usa a função distance
para favorecer resultados que estão em um raio de dez quilômetros do local atual. Se alguém pesquisar o termo "pousada" e "pousada" fizer parte do nome do hotel, os documentos que incluírem hotéis com "pousada" em um raio de 10 KM da localização atual serão exibidos nas posições mais altas nos resultados da pesquisa.
"scoringProfiles": [
{
"name":"geo",
"text": {
"weights": {
"hotelName": 5
}
},
"functions": [
{
"type": "distance",
"boost": 5,
"fieldName": "location",
"interpolation": "logarithmic",
"distance": {
"referencePointParameter": "currentLocation",
"boostingDistance": 10
}
}
]
}
]
Para usar esse perfil de pontuação, a consulta é formulada para especificar o parâmetro scoringProfile na solicitação. Se você estiver usando a API REST, as consultas serão especificadas por meio de solicitações GET e POST. No exemplo a seguir, “currentLocation” tem um delimitador de um único traço (-
). Ele é seguido por coordenadas de longitude e latitude, em que longitude é um valor negativo.
GET /indexes/hotels/docs?search+inn&scoringProfile=geo&scoringParameter=currentLocation--122.123,44.77233&api-version=2024-07-01
Observe as diferenças de sintaxe ao usar POST. Em POST, "scoringParameters" é plural e é uma matriz.
POST /indexes/hotels/docs&api-version=2024-07-01
{
"search": "inn",
"scoringProfile": "geo",
"scoringParameters": ["currentLocation--122.123,44.77233"]
}
Essa consulta pesquisa o termo “pousada” e passa o local atual. Observe que essa consulta inclui outros parâmetros, como scoringParameter. Os parâmetros de consulta, incluindo "scoringParameter", são descritos em Documentos de Pesquisa (API REST).
Confira o Exemplo estendido para busca em vetores e híbrida e o Exemplo estendido para busca por palavras-chave para mais cenários.
Como funciona a pontuação de busca na Pesquisa de IA do Azure
Os perfis de pontuação complementam o algoritmo de pontuação padrão, aumentando as pontuações das correspondências que atendem aos critérios do perfil. As funções de pontuação se aplicam a:
- Pesquisa de texto (palavra-chave)
- Consultas puras de vetor
- Consultas híbridas, com subconsultas de texto e vetor executadas em paralelo
Para consultas de texto autônomas, os perfis de pontuação identificam o máximo de 1.000 correspondências em uma pesquisa classificada por BM25 e os 50 melhores são retornados nos resultados.
Para vetores puros, a consulta é apenas de vetor. No entanto, se os documentos k correspondentes incluírem campos alfanuméricos que um perfil de pontuação pode processar, um perfil de pontuação será aplicado. O perfil de pontuação revisa o conjunto de resultados aumentando os documentos que correspondem aos critérios no perfil.
Para consultas de texto em uma consulta híbrida, os perfis de pontuação identificam o máximo de 1.000 correspondências em uma pesquisa classificada por BM25. No entanto, uma vez que esses 1.000 resultados são identificados, eles são restaurados à sua ordem original de BM25 para que possam ser reclassificados juntamente com os resultados de vetores na ordenação final da Função de Classificação Recíproca (RRF), onde o perfil de pontuação (identificado como “ajuste de realce de documento final” na ilustração) é aplicado aos resultados mesclados, juntamente com a ponderação de vetores e a classificação semântica como última etapa.
Adicionar um perfil de pontuação a um índice de pesquisa
Comece com uma definição de índice. Você pode adicionar e atualizar perfis de pontuação em um índice existente sem precisar recompilar ele. Use uma solicitação Criar ou Atualizar Índice para publicar a revisão.
Cole no modelo fornecido neste artigo.
Forneça um nome que siga as convenções de nomenclatura.
Especifique os critérios de aumento. Um único perfil pode conter campos ponderados de texto, funções ou ambos.
Você deve trabalhar iterativamente, usando um conjunto de dados que ajudará você a comprovar ou reprovar a eficácia de um determinado perfil.
Os perfis de pontuação podem ser definidos no portal do Azure, conforme mostrado na captura de tela a seguir, ou programaticamente por meio de APIs REST ou em SDKs do Azure, como a classe ScoringProfile no SDK do Azure para .NET.
Como usar campos ponderados de texto
Use campos ponderados de texto quando o contexto do campo for importante e as consultas incluírem campos de cadeia de caracteres searchable
. Por exemplo, se uma consulta incluir o termo "aeroporto", você pode desejar que "aeroporto" no campo Descrição tenha mais peso do que no HotelName.
Os campos ponderados são pares nome-valor compostos por um campo searchable
e um número positivo que é usado como multiplicador. Se a pontuação de campo original de HotelName for 3, a pontuação aumentada desse campo se tornará 6, contribuindo para uma pontuação geral mais alta para próprio documento pai.
"scoringProfiles": [
{
"name": "boostSearchTerms",
"text": {
"weights": {
"HotelName": 2,
"Description": 5
}
}
}
]
Usar funções
Use funções quando pesos relativos simples forem insuficientes ou não se aplicarem, como no caso da distância e da atualidade, que são cálculos sobre dados numéricos. Você pode especificar várias funções por perfil de pontuação. Para obter mais informações sobre os tipos de dados EDM usados na IA do Azure Search, consulte tipos de dados com suporte.
Função | Descrição | Casos de uso |
---|---|---|
distance | Aumenta a pontuação de acordo com a proximidade ou localização geográfica. Essa função só pode ser usada com campos Edm.GeographyPoint . |
Use para cenários de "encontrar perto de mim". |
"freshness" | Aumenta a pontuação com base em valores em um campo de data/hora (Edm.DateTimeOffset ). Defina o atributoboostingDuration para especificar um valor que representa um período de tempo sobre o qual o aumento acontece. |
Use quando quiser aumentar a pontuação com base em datas mais recentes ou mais antigas. Também use para classificar itens como eventos de calendário com datas futuras, de forma que os itens mais próximos do presente sejam classificados acima daqueles mais distantes no futuro. Uma extremidade do intervalo é fixada na hora atual. Para aumentar a pontuação de um intervalo de tempo no passado, use um boostingDuration positivo. Para aumentar um intervalo de tempo no futuro, use um boostingDuration negativo. |
"magnitude" | Altere as classificações com base no intervalo de valores para um campo numérico. O valor deve ser um inteiro ou um número de ponto flutuante. Para classificações por estrelas de 1 a 4, isso seria 1. Para mais acima de 50% de margens, isso seria 50. Essa função só pode ser usada com campos Edm.Double e Edm.Int . Para a função magnitude, é possível inverter o intervalo, do maior para o menor, se você quiser o padrão inverso (por exemplo, para dar mais destaque aos itens com preços mais baixos, do que aos itens com preços mais altos). Com um intervalo de preços de $100 a $1, você definiria boostingRangeStart como 100 e boostingRangeEnd como 1 para aumentar os itens com preço inferior. |
Use quando quiser aumentar a pontuação com base em margem de lucro, classificações, número de clickthrough, número de downloads, preço mais alto, preço mais baixo ou número de downloads. Quando dois itens forem relevantes, o item com a classificação mais alta será exibido primeiro. |
marcação | Aumenta a pontuação com base em marcações comuns a ambos os documentos de pesquisa e as cadeias de caracteres de consulta. As marcas são fornecidas em um tagsParameter . Esta função só pode ser usada com campos de pesquisa do tipo Edm.String e Collection(Edm.String) . |
Use quando você tiver campos de marcações. Se determinada marca na lista for uma lista delimitada por vírgulas, você poderá usar um normalizador de texto no campo para remover as vírgulas no momento da consulta (mapear o caractere de vírgula para um espaço). Essa abordagem "nivelará" a lista para que todos os termos sejam uma única cadeia de caracteres longa de termos delimitados por vírgula. |
Regras para usar funções
- As funções só podem ser aplicadas a campos que são atribuídos como
filterable
. - O tipo de função (“freshness”, “magnitude”, “distance”, “tag”) deve estar em minúsculas.
- As funções não podem incluir valores nulos ou vazios.
- As funções só podem ter um único campo por definição de função. Para usar a função "magnitude" duas vezes no mesmo perfil, forneça duas definições de magnitude, uma para cada campo.
Modelo
Esta seção mostra a sintaxe e o modelo para perfis de pontuação. Para uma descrição das propriedades, confira a Referência de API REST.
"scoringProfiles": [
{
"name": "name of scoring profile",
"text": (optional, only applies to searchable fields) {
"weights": {
"searchable_field_name": relative_weight_value (positive #'s),
...
}
},
"functions": (optional) [
{
"type": "magnitude | freshness | distance | tag",
"boost": # (positive number used as multiplier for raw score != 1),
"fieldName": "(...)",
"interpolation": "constant | linear (default) | quadratic | logarithmic",
"magnitude": {
"boostingRangeStart": #,
"boostingRangeEnd": #,
"constantBoostBeyondRange": true | false (default)
}
// ( - or -)
"freshness": {
"boostingDuration": "..." (value representing timespan over which boosting occurs)
}
// ( - or -)
"distance": {
"referencePointParameter": "...", (parameter to be passed in queries to use as reference location)
"boostingDistance": # (the distance in kilometers from the reference location where the boosting range ends)
}
// ( - or -)
"tag": {
"tagsParameter": "..."(parameter to be passed in queries to specify a list of tags to compare against target field)
}
}
],
"functionAggregation": (optional, applies only when functions are specified) "sum (default) | average | minimum | maximum | firstMatching"
}
],
"defaultScoringProfile": (optional) "...",
Set interpolations
As interpolações definem a forma da inclinação usada para pontuação. Como a pontuação é decrescente, a inclinação está sempre diminuindo, mas é a interpolação que determina a curva da inclinação descendente. As seguintes interpolações podem ser usadas:
Interpolação | Descrição |
---|---|
linear |
Para itens que estão dentro da faixa máxima e mínima, o aumento é aplicado em uma quantidade que diminui constantemente. Linear é a interpolação padrão para um perfil de pontuação. |
constant |
Para itens que estão dentro do intervalo inicial e final, um aumento constante é aplicado aos resultados de classificação. |
quadratic |
Em comparação com uma interpolação linear que tem um aumento constantemente decrescente, a quadrática inicialmente diminui em um ritmo menor e, em seguida, à medida que se aproxima do intervalo final, diminui em um intervalo muito maior. Essa opção de interpolação não é permitida em funções de pontuação de marca. |
logarithmic |
Em comparação com uma interpolação linear que tem um aumento constantemente decrescente, a logarítmica inicialmente diminui em um ritmo maior e, em seguida, à medida que se aproxima do intervalo final, diminui em um intervalo muito menor. Essa opção de interpolação não é permitida em funções de pontuação de marca. |
Definir o atributo boostingDuration para função "freshness"
boostingDuration
é um atributo da função freshness
. Você pode usá-lo para definir um período de expiração após o qual o aumento será interrompido para um documento específico. Por exemplo, para aumentar uma linha de produtos ou marca por um período promocional de 10 dias, você especificaria o período de 10 dias como "P10D" para esses documentos.
boostingDuration
deve ser formatado como um valor XSD de "dayTimeDuration" (um subconjunto restrito de um valor de duração ISO 8601). O padrão para isso é: "P[nD][T[nH][nM][nS]]".
A tabela a seguir fornece vários exemplos.
Duration | boostingDuration |
---|---|
1 dia | "P1D" |
2 dias e 12 horas | "P2DT12H" |
15 minutos | "PT15M" |
30 dias, 5 horas, 10 minutos e 6,334 segundos | "P30DT5H10M6.334S" |
Para obter mais exemplos, consulte Esquema XML: tipos de dados (site W3.org).
Exemplo estendido para busca em vetores e híbrida
Confira essa postagem no blog e esse notebook para uma demonstração de uso dos perfis de pontuação e aumento de pontuação de documentos em cenários de IA generativa e vetorial.
Exemplo estendido para busca por palavra-chave
O exemplo a seguir mostra o esquema de um índice com dois perfis de pontuação (boostGenre
, newAndHighlyRated
). Qualquer consulta em relação a esse índice que inclua um dos perfis como um parâmetro de consulta usará o perfil para pontuar o conjunto de resultados.
O perfil boostGenre
usa campos de texto ponderados, aumentando as correspondências encontradas nos campos albumTitle, genre e artistName. Os campos são aumentados 1,5, 5 e 2, respectivamente. Por que o campo gênero aumentou muito mais do que os outros? Se a pesquisa for conduzida sobre dados relativamente homogêneos (como é o caso de 'genre' em musicstoreindex), uma variação maior nos pesos relativos poderá ser necessária. Por exemplo, em musicstoreindex, 'rock' é exibido como um gênero e em descrições de gênero redigidas de forma idêntica. Se você quiser que gênero tenha um peso maior do que a descrição do gênero, o campo gênero precisará ter um peso relativo muito mais alto.
{
"name": "musicstoreindex",
"fields": [
{ "name": "key", "type": "Edm.String", "key": true },
{ "name": "albumTitle", "type": "Edm.String" },
{ "name": "albumUrl", "type": "Edm.String", "filterable": false },
{ "name": "genre", "type": "Edm.String" },
{ "name": "genreDescription", "type": "Edm.String", "filterable": false },
{ "name": "artistName", "type": "Edm.String" },
{ "name": "orderableOnline", "type": "Edm.Boolean" },
{ "name": "rating", "type": "Edm.Int32" },
{ "name": "tags", "type": "Collection(Edm.String)" },
{ "name": "price", "type": "Edm.Double", "filterable": false },
{ "name": "margin", "type": "Edm.Int32", "retrievable": false },
{ "name": "inventory", "type": "Edm.Int32" },
{ "name": "lastUpdated", "type": "Edm.DateTimeOffset" }
],
"scoringProfiles": [
{
"name": "boostGenre",
"text": {
"weights": {
"albumTitle": 1.5,
"genre": 5,
"artistName": 2
}
}
},
{
"name": "newAndHighlyRated",
"functions": [
{
"type": "freshness",
"fieldName": "lastUpdated",
"boost": 10,
"interpolation": "quadratic",
"freshness": {
"boostingDuration": "P365D"
}
},
{
"type": "magnitude",
"fieldName": "rating",
"boost": 10,
"interpolation": "linear",
"magnitude": {
"boostingRangeStart": 1,
"boostingRangeEnd": 5,
"constantBoostBeyondRange": false
}
}
]
}
],
"suggesters": [
{
"name": "sg",
"searchMode": "analyzingInfixMatching",
"sourceFields": [ "albumTitle", "artistName" ]
}
]
}