Condividi tramite


Aggiungere profili di punteggio per incrementare i punteggi di ricerca

I profili di assegnazione dei punteggi consentono di incrementare la classificazione dei documenti corrispondenti in base ai criteri. Questo articolo illustra come specificare e assegnare un profilo di assegnazione dei punteggi che aumenta il punteggio di ricerca in base ai parametri forniti.

È possibile usare i profili di assegnazione dei punteggi per la ricerca di parole chiave, la ricerca vettoriale e la ricerca ibrida. Tuttavia, i profili di assegnazione dei punteggi si applicano solo ai campi non vettoriali, per cui assicurarsi che l'indice contenga campi di testo o numerici che è possibile usare in un profilo di assegnazione dei punteggi. Il supporto del profilo di assegnazione dei punteggi per la ricerca ibrida e vettoriale è disponibile nelle API REST 2024-05-01-preview e 2024-07-01 e nei pacchetti Azure SDK destinati a tali versioni.

Punti chiave sui profili di assegnazione dei punteggi

I parametri del profilo di assegnazione dei punteggi sono i seguenti:

  • Campi ponderati, in cui viene trovata una corrispondenza in un campo stringa specifico. Ad esempio, è possibile che le corrispondenze trovate in un campo "riepilogo" siano più pertinenti rispetto alla stessa corrispondenza trovata in un campo "contenuto".

  • Funzioni per i dati numerici, incluse date, intervalli e coordinate geografiche. Esiste anche una funzione Tags che opera su un campo che fornisce una raccolta arbitraria di stringhe. È possibile scegliere questo approccio rispetto ai campi ponderati se si vuole aumentare il punteggio in base alla presenza di una corrispondenza in un campo tag.

È possibile creare più profili e quindi modificare la logica di query per scegliere quella usata.

È possibile avere fino a 100 profili di assegnazione dei punteggi all'interno di un indice (vedere Limiti dei servizi ), ma è possibile specificare solo un profilo alla volta in ogni query.

È possibile usare il ranker semantico con i profili di punteggio. Quando sono in gioco più funzionalità di classificazione o pertinenza, la classificazione semantica è l'ultimo passaggio. Il funzionamento dell'assegnazione dei punteggi di ricerca fornisce un'illustrazione.

Nota

Non si ha familiarità con i concetti di pertinenza? Per informazioni di background, vedere Pertinenza e assegnazione di punteggi in Azure AI Search. È anche possibile guardare questo segmento video su YouTube per ottenere i profili di assegnazione dei punteggi sui risultati classificati in BM25.

Definizione del profilo di punteggio

Un profilo di punteggio è denominato oggetto definito in uno schema di indice. Un profilo di assegnazione dei punteggi è composto da campi, funzioni e parametri ponderati.

La definizione seguente mostra un profilo semplice denominato "geo". In questo esempio viene aumentato il punteggio di pertinenA dei i risultati con il termine di ricerca nel campo hotelName. Usa anche la funzione distance per assegnare una preferenza maggiore ai risultati che si trovano entro 10 chilometri dalla posizione attuale. Se si cerca il termine "inn" e "inn" fa parte del nome di un hotel, i documenti che includono gli hotel con "inn" in un raggio di 10 km dalla posizione corrente verranno visualizzati più in alto nei risultati della ricerca.

"scoringProfiles": [
  {  
    "name":"geo",
    "text": {  
      "weights": {  
        "hotelName": 5
      }                              
    },
    "functions": [
      {  
        "type": "distance",
        "boost": 5,
        "fieldName": "location",
        "interpolation": "logarithmic",
        "distance": {
          "referencePointParameter": "currentLocation",
          "boostingDistance": 10
        }                        
      }                                      
    ]                     
  }            
]

Per usare questo profilo di punteggio, la query viene formulata in modo da specificare il parametro scoringProfile nella richiesta. Se si usa l'API REST, le query vengono specificate tramite richieste GET e POST. Nell'esempio seguente, "currentLocation" ha un delimitatore di un singolo trattino (-). È seguito da coordinate di longitudine e latitudine, dove la longitudine è un valore negativo.

GET /indexes/hotels/docs?search+inn&scoringProfile=geo&scoringParameter=currentLocation--122.123,44.77233&api-version=2024-07-01

Quando si usa POST, notare le differenze di sintassi. In POST, "scoringParameters" è plurale ed è una matrice.

POST /indexes/hotels/docs&api-version=2024-07-01
{
    "search": "inn",
    "scoringProfile": "geo",
    "scoringParameters": ["currentLocation--122.123,44.77233"]
}

Questa query cerca il termine “inn” e passa la posizione attuale. Si noti che questa query include altri parametri, ad esempio scoringParameter. I parametri di query, incluso "scoringParameter", sono descritti in Cerca documenti (API REST).

Per altri scenari vedere l'Esempio esteso per la ricerca di vettori e ibridi e l'Esempio esteso per la ricerca di parole chiave .

I profili di assegnazione dei punteggi integrano l'algoritmo di punteggio predefinito aumentando i punteggi delle corrispondenze che soddisfano i criteri del profilo. Le funzioni di assegnazione dei punteggi si applicano a:

Per le query di testo autonome, i profili di punteggio identificano il numero massimo di 1.000 corrispondenze in una ricerca con classificazione BM25 e i primi 50 vengono restituiti nei risultati.

Per i vettori puri, la query è solo vettoriale, ma se i documenti k-matching includono campi alfanumerici che un profilo di punteggio può elaborare, viene applicato un profilo di punteggio. Il profilo di punteggio rivede il set di risultati aumentando i documenti che corrispondono ai criteri nel profilo.

Per le query di testo in una query ibrida, i profili di punteggio identificano il numero massimo di 1.000 corrispondenze in una ricerca con classificazione BM25. Tuttavia, una volta identificati questi 1.000 risultati, vengono ripristinati al loro ordine BM25 originale in modo che possano essere ripuntati insieme ai vettori determinano l'ordine della funzione di classificazione reciproca finale (RRF ), in cui il profilo di punteggio (identificato come "rettifica finale dell'boosting del documento" nell'illustrazione) viene applicato ai risultati uniti, insieme alla ponderazione vettoriale e alla classificazione semantica come ultimo passaggio.

Diagramma che mostra quali campi hanno un profilo di assegnazione dei punteggi e quando ha luogo la classificazione.

Aggiungere un profilo di assegnazione dei punteggi a un indice di ricerca

  1. Iniziare con una definizione di indice. È possibile aggiungere e aggiornare profili di punteggio in un indice esistente senza doverlo ricompilare. Usare una richiesta Crea o aggiorna indice per pubblicare una revisione.

  2. Incollare nel modello fornito in questo articolo.

  3. Specificare un nome conforme alle convenzioni di denominazione.

  4. Specificare i criteri di boosting. Un singolo profilo può contenere campi ponderati per il testo, funzioni o entrambi.

È consigliabile lavorare in modo iterativo, usando un set di dati che consenta di dimostrare o confutare l'efficacia di un determinato profilo.

I profili di punteggio possono essere definiti nel portale di Azure, come illustrato nello screenshot seguente, oppure a livello di codice tramite API REST o in Azure SDK, come la classe ScoringProfile in Azure SDK per .NET.

Pagina Aggiungi profili di punteggio

Usare campi ponderati per il testo

Usare campi ponderati per il testo quando il contesto del campo è importante e le query includono campi stringa searchable. Ad esempio, se una query include il termine "aeroporto", si potrebbe desiderare che “aeroporto” nel campo Descrizione abbia più peso rispetto che in HotalName.

I campi ponderati sono coppie nome-valore costituite da un campo searchable e da un numero positivo utilizzato come moltiplicatore. Se il punteggio del campo originale di HotelName è 3, il punteggio con boosting per tale campo diventa 6, contribuendo a un punteggio complessivo superiore per il documento padre stesso.

"scoringProfiles": [  
    {  
      "name": "boostSearchTerms",  
      "text": {  
        "weights": {  
          "HotelName": 2,  
          "Description": 5 
        }  
      }  
    }
]

Usare le funzioni

Usare le funzioni quando i pesi relativi semplici sono insufficienti o non applicabili, come nel caso della distanza e della freschezza, che sono calcoli su dati numerici. È possibile specificare più funzioni per profilo di punteggio. Per altre informazioni sui tipi di dati EDM usati in Azure AI Search, vedere Tipi di dati supportati.

Funzione Descrizione Casi d'uso
distance Aumentare la pertinenza in base alla prossimità o alla posizione geografica. Questa funzione può essere usata solo con campi Edm.GeographyPoint . Usare per scenari "trova vicino a me".
aggiornamento Aumentare il livello di pertinenza in base ai valori in un campo datetime (Edm.DateTimeOffset). Impostare boostingDuration per specificare un valore che rappresenta un intervallo di tempo durante il quale ha luogo l'aumento di priorità. Usare quando si desidera aumentare le prestazioni in base a date più recenti o meno recenti. Classificare gli elementi come eventi di calendario con date future in modo che gli elementi più vicini possano essere classificati in un livello superiore rispetto agli elementi più lontani nel futuro. Un'estremità dell'intervallo è fissata all'ora corrente. Per aumentare la priorità per un intervallo di tempo nel passato, usare un valore positivo di boostingDuration. Per aumentare la priorità per un intervallo di tempo nel futuro, usare un valore negativo di boostingDuration.
magnitudine Modificare i punteggi in base all'intervallo di valori per un campo numerico. Il valore deve essere un numero intero o a virgola mobile. Per le classificazioni a stelle da 1 a 4, corrisponde a 1. Per i margini superiori al 50%, corrisponde a 50. Questa funzione può essere usata solo con campi Edm.Double e Edm.Int. Per la funzione “magnitude” è possibile invertire l'intervallo, dal livello più alto al più basso, se si preferisce il modello inverso (ad esempio, per aumentare il livello di priorità degli articoli più economici rispetto a quelli più costosi). Dato un intervallo di prezzi da €100 a €1, è necessario impostare boostingRangeStart su 100 e boostingRangeEnd su 1 per aumentare gli elementi con prezzo minore. Usare quando si vuole aumentare in base al margine di profitto, alle valutazioni, ai conteggi clickthrough, al numero di download, al prezzo più alto, al prezzo più basso o a un conteggio dei download. Quando due elementi sono rilevanti, viene visualizzato per primo l'elemento con la classificazione superiore.
tag Aumenta la pertinenza in base ai tag comuni sia ai documenti di ricerca che alle stringhe di query. I tag vengono forniti in un tagsParameter. Questa funzione può essere usata solo con i campi di ricerca di tipo Edm.String e Collection(Edm.String). Usare quando sono presenti campi di tag. Se un tag specificato all'interno dell'elenco è un elenco delimitato da virgole, è possibile usare un normalizzatore di testo nel campo per rimuovere le virgole in fase di query (eseguire il mapping del carattere virgola a uno spazio). Questo approccio "renderà flat" l'elenco in modo che tutti i termini siano una singola stringa lunga di termini delimitati da virgole.

Regole per l'uso delle funzioni

  • Le funzioni possono essere applicate solo ai campi attribuiti come filterable.
  • Il tipo di funzione (freshness, magnitude, distance, tag) deve essere scritto in lettere minuscole.
  • Le funzioni non possono includere valori Null o vuoti.
  • Le funzioni possono avere un solo campo per definizione di funzione. Per usare la grandezza due volte nello stesso profilo, specificare due definizioni di grandezza, una per ogni campo.

Modello

Questa sezione illustra la sintassi e il modello per i profili di punteggio. Per una descrizione delle proprietà, vedere le informazioni di riferimento sull'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) "...", 

Impostare le interpolazioni

Le interpolazioni impostano la forma dell'inclinazione usata per il punteggio. Poiché il punteggio è indicato dal valore più alto al valore più basso, l'inclinazione diminuisce sempre, ma l'interpolazione determina la curva dell'inclinazione verso il basso. È possibile usare le interpolazioni seguenti:

Interpolazione Descrizione
linear Per gli elementi inclusi nell'intervallo max e min, l'aumento viene applicato a un importo costantemente decrescente. L'interpolazione predefinita per un profilo di punteggio è lineare.
constant Per gli elementi inclusi nell'intervallo di inizio e di fine, ai risultati della classificazione è applicato un aumento di priorità costante.
quadratic Rispetto all'interpolazione lineare che prevede un aumento di priorità costantemente decrescente, l'interpolazione quadratica presenta riduzioni iniziali a ritmo più ridotto e una riduzione di intervallo molto più elevato in prossimità della fine. Questa opzione di interpolazione non è consentita nelle funzioni di assegnazione di punteggio in base a tag.
logarithmic Rispetto all'interpolazione lineare che prevede un aumento di priorità costantemente decrescente, l'interpolazione logaritmica presenta riduzioni iniziali a ritmo più elevato e una riduzione di intervallo molto più ridotto in prossimità della fine. Questa opzione di interpolazione non è consentita nelle funzioni di assegnazione di punteggio in base a tag.

Linee costanti, lineari, quadratiche e log10 sul grafico

Impostare boostingDuration per la funzione di aggiornamento

boostingDuration è un attributo della funzione freshness. Consente di impostare un periodo di scadenza, dopo il quale l'aumento di priorità non verrà più applicato a un determinato documento. Ad esempio, per aumentare la priorità di una linea di prodotti o una marca per un periodo promozionale di 10 giorni, è necessario specificare tale periodo come "P10D" per questi documenti.

boostingDuration deve essere formattato come valore XSD "dayTimeDuration" (un subset limitato di un valore di durata ISO 8601). Il modello è: "P(nD)(T(nH)(nM](nS))".

La tabella seguente fornisce alcuni esempi.

Durata boostingDuration
1 giorno "P1D"
2 giorni e 12 ore "P2DT12H"
15 minuti "PT15M"
30 giorni, 5 ore, 10 minuti e 6334 secondi "P30DT5H10M6.334S"

Per altri esempi, vedere il sito Web relativo ai tipi di dati dello schema XML (W3.org).

Vedere questo post di blog e notebook per una dimostrazione dell'uso dei profili di assegnazione dei punteggi e del miglioramento dei documenti negli scenari di intelligenza artificiale vettoriale e generativa.

Il seguente esempio illustra lo schema di un indice con due profili di punteggio (boostGenre, newAndHighlyRated). Qualsiasi query eseguita in questo indice e che include uno dei profili come parametro di query userà il profilo per assegnare un punteggio al set di risultati.

Il profilo boostGenre usa campi di testo ponderati, corrispondenze di boosting trovate nei campi albumTitle, genre e artistName. La priorità dei campi viene incrementata rispettivamente di 1,5, 5 e 2. Al campo genre viene assegnata una priorità molto più alta rispetto agli altri, Se la ricerca viene eseguita su dati abbastanza omogenei (come nel caso di "genre" in musicstoreindex), potrebbe essere necessaria una varianza maggiore nei pesi relativi. Ad esempio, nel musicstoreindex "rock" viene visualizzato sia come genere che nelle descrizioni di genere che usano lo stesso termine. Se si vuole assegnare una priorità maggiore al genere rispetto alla descrizione del genere, il campo genre dovrà avere un peso relativo decisamente maggiore.

{  
  "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" ]  
    }  
  ]   
}  

Vedi anche