Creare una query ibrida in Ricerca di intelligenza artificiale di Azure

La ricerca ibrida combina una o più query con parole chiave con una o più query vettoriali in una singola richiesta di ricerca. Le query sono eseguite in parallelo. I risultati vengono uniti e riordinati in base ai nuovi punteggi di ricerca, usando La fusione di rango reciproco (RRF) per restituire un singolo set di risultati classificato.

Nella maggior parte dei casi, per test di benchmark, le query ibride con classificazione semantica restituiscono i risultati più rilevanti.

Per definire una query ibrida, usare l'API REST 2023-11-01, 2023-10-01-preview, 2024-03-01-preview, Esplora ricerche nella portale di Azure o versioni più recenti degli SDK di Azure.

Prerequisiti

Eseguire una query ibrida in Esplora ricerche

  1. In Esplora ricerche verificare che la versione dell'API sia 2023-10-01-preview o successiva.

  2. In Visualizzazione selezionare Visualizzazione JSON.

  3. Sostituire il modello di query predefinito con una query ibrida, ad esempio quella iniziale alla riga 539 per l'esempio di avvio rapido del vettore. Per brevità, il vettore viene troncato in questo articolo.

    Una query ibrida include una query di testo specificata in e una query vettoriale specificata in searchvectorQueries.vector.

    La query di testo e la query vettoriale devono essere equivalenti o almeno non devono essere in conflitto. Se le query sono diverse, non si ottiene il vantaggio dell'ambiente ibrido.

    {
        "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. Seleziona Cerca.

Richiesta di query ibrida (API REST)

Una query ibrida combina la ricerca di testo e la ricerca vettoriale, in cui il search parametro accetta una stringa di query e vectorQueries.vector accetta la query vettoriale. Il motore di ricerca esegue query full-text e vettoriali in parallelo. L'unione di tutte le corrispondenze viene valutata per pertinenza usando La fusione di rango reciproco (RRF) e nella risposta viene restituito un singolo set di risultati.

I risultati vengono restituiti in testo normale, inclusi i vettori nei campi contrassegnati come retrievable. Poiché i vettori numerici non sono utili nei risultati della ricerca, scegliere altri campi nell'indice come proxy per la corrispondenza del vettore. Ad esempio, se un indice ha campi "descriptionVector" e "descriptionText", la query può corrispondere a "descriptionVector", ma il risultato della ricerca può visualizzare "descriptionText". Usare il select parametro per specificare solo campi leggibili dall'utente nei risultati.

L'esempio seguente illustra una configurazione di query ibrida.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-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
    }],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "top": "10"
}

Punti principali:

  • La stringa di query vettoriale viene specificata tramite la vectorQueries.vector proprietà . La query viene eseguita sul campo "DescriptionVector". Impostare kind su "vector" per indicare il tipo di query. Facoltativamente, impostare su exhaustive true per eseguire una query sul contenuto completo del campo vettore.

  • La ricerca di parole chiave viene specificata tramite search la proprietà . Viene eseguito in parallelo con la query vettoriale.

  • k determina il numero di corrispondenze adiacenti più vicine restituite dalla query vettoriale e fornite al ranker RRF.

  • top determina il numero di corrispondenze restituite nella risposta all-up. In questo esempio la risposta include 10 risultati, presupponendo che nei risultati uniti siano presenti almeno 10 corrispondenze.

Ricerca ibrida con filtro

In questo esempio viene aggiunto un filtro, applicato ai filterable campi non di filtro dell'indice di ricerca.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-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"
}

Punti principali:

  • I filtri vengono applicati al contenuto dei campi filtrabili. In questo esempio il campo ParkingIncluded è un valore booleano e viene contrassegnato come filterable nello schema dell'indice.

  • Nelle query ibride, i filtri possono essere applicati prima dell'esecuzione della query per ridurre la superficie di query o dopo l'esecuzione della query per ridurre i risultati. "preFilter" è l'impostazione predefinita. Per usare postFilter, impostare la modalità di elaborazione del filtro come illustrato in questo esempio.

  • Quando si esegue il postfiltro dei risultati della query, il numero di risultati potrebbe essere minore di top-n.

Supponendo che sia stata abilitata la classificazione semantica e la definizione dell'indice includa una configurazione semantica, è possibile formulare una query che include la ricerca vettoriale e la ricerca di parole chiave, con classificazione semantica sul set di risultati unito. Facoltativamente, è possibile aggiungere didascalia e risposte.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-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"
}

Punti principali:

  • La classificazione semantica accetta fino a 50 risultati dalla risposta unita. Impostare "k" e "top" su 50 per la rappresentazione uguale di entrambe le query.

  • Sono necessari "queryType" e "semanticConfiguration".

  • "didascalia" e "risposte" sono facoltativi. I valori vengono estratti dal testo verbatim nei risultati. Viene restituita una risposta solo se i risultati includono il contenuto con le caratteristiche di una risposta alla query.

Ricerca ibrida semantica con filtro

Ecco l'ultima query nella raccolta. Si tratta della stessa query ibrida semantica dell'esempio precedente, ma con un filtro.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-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"
}

Punti principali:

  • La modalità filtro può influire sul numero di risultati disponibili per il reranker semantico. Come procedura consigliata, è consigliabile assegnare al semantic ranker il numero massimo di documenti (50). Se i prefiltri o i postfiltri sono troppo selettivi, è possibile conservare il ranker semantico assegnando meno di 50 documenti con cui lavorare.

  • Il prefiltro viene applicato prima dell'esecuzione della query. Se il filtro preliminare riduce l'area di ricerca a 100 documenti, la query vettoriale viene eseguita sul campo "DescriptionVector" per tali 100 documenti, restituendo le corrispondenze k=50 migliori. Questi 50 documenti corrispondenti passano quindi a RRF per i risultati uniti e quindi a semantic ranker.

  • Il postfilter viene applicato dopo l'esecuzione della query. Se k=50 restituisce 50 corrispondenze sul lato della query vettoriale, il post-filtro viene applicato alle 50 corrispondenze, riducendo i risultati che soddisfano i criteri di filtro, lasciando meno di 50 documenti da passare al ranker semantico

Configurare una risposta di query

Quando si configura la query ibrida, considerare la struttura di risposta. La risposta è un set di righe bidimensionale. I parametri della query determinano quali campi si trovano in ogni riga e il numero di righe nella risposta. Il motore di ricerca classifica i documenti corrispondenti e restituisce i risultati più rilevanti.

Campi in una risposta

I risultati della retrievable ricerca sono costituiti da campi dell'indice di ricerca. Un risultato è:

  • Tutti i retrievable campi (impostazione predefinita dell'API REST).
  • I campi elencati in modo esplicito in un parametro "select" nella query.

Negli esempi di questo articolo è stata usata un'istruzione "select" per specificare i campi di testo (nonvector) nella risposta.

Nota

I vettori non vengono invertiti nel testo leggibile, quindi evitano di restituirli nella risposta. Scegliere invece campi non di filtro rappresentativi del documento di ricerca. Ad esempio, se la query è destinata a un campo "DescriptionVector", restituisce un campo di testo equivalente se ne è presente uno ("Descrizione") nella risposta.

Numero di risultati

Una query può corrispondere a un numero qualsiasi di documenti, come tutti se i criteri di ricerca sono deboli ,ad esempio "search=*" per una query Null. Poiché raramente è pratico restituire risultati non associati, è consigliabile specificare un valore massimo per la risposta:

  • "k": n risultati per query solo vettoriali
  • "top": n risultati per le query ibride che includono un parametro "search"

Sia "k" che "top" sono facoltativi. Non specificato, il numero predefinito di risultati in una risposta è 50. È possibile impostare "top" e "skip" sulla pagina tramite più risultati o modificare il valore predefinito.

Se si usa la classificazione semantica, è consigliabile impostare sia "k" che "top" su almeno 50. Il ranker semantico può richiedere fino a 50 risultati. Specificando 50 per ogni query, si ottiene una rappresentazione uguale da entrambi i sottosistemi di ricerca.

Classifica

Vengono creati più set per le query ibride, con o senza il reranking semantico facoltativo. La classificazione dei risultati viene calcolata in Base al rango reciproco Fusion (RRF).

In questa sezione confrontare le risposte tra la ricerca a vettore singolo e la ricerca ibrida semplice per il risultato principale. I diversi algoritmi di classificazione, la metrica di somiglianza di HNSW e RRF in questo caso, producono punteggi con grandezza diversa. Questo comportamento è impostato a livello di progettazione. I punteggi RRF possono apparire piuttosto bassi, anche con una corrispondenza di somiglianza elevata. I punteggi inferiori sono una caratteristica dell'algoritmo RRF. In una query ibrida con RRF, più dei documenti classificati sono inclusi nei risultati, dato il punteggio relativamente più piccolo dei documenti classificati RRF, invece della ricerca vettoriale pura.

Ricerca a vettore singolo: @search.score per i risultati ordinati in base alla somiglianza del coseno (funzione di distanza di somiglianza vettore predefinita).

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

Ricerca ibrida: @search.score per i risultati ibridi classificati con La fusione di rango reciproco.

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

Passaggi successivi

Come passaggio successivo, è consigliabile esaminare il codice demo per Python, C# o JavaScript.