Creare una query vettoriale in Ricerca di intelligenza artificiale di Azure

In Ricerca di intelligenza artificiale di Azure, se sono presenti campi vettoriali in un indice di ricerca, questo articolo illustra come:

Questo articolo usa REST per l'illustrazione. Per esempi di codice in altri linguaggi, vedere il repository GitHub azure-search-vector-samples per soluzioni end-to-end che includono query vettoriali.

Prerequisiti

Suggerimento

Per determinare rapidamente se l'indice include vettori, cercare campi di tipo Collection(Edm.Single), con un dimensions attributo e un'assegnazione vectorSearchProfile .

Convertire un input di stringa di query in un vettore

Per eseguire una query su un campo vettoriale, la query stessa deve essere un vettore. Un approccio per convertire la stringa di query di testo di un utente nella relativa rappresentazione vettoriale consiste nel chiamare una libreria o un'API di incorporamento nel codice dell'applicazione. Come procedura consigliata, usare sempre gli stessi modelli di incorporamento usati per generare incorporamenti nei documenti di origine.

È possibile trovare esempi di codice che illustrano come generare incorporamenti nel repository azure-search-vector-samples .

Di seguito è riportato un esempio di API REST di una stringa di query inviata a una distribuzione di un modello di incorporamento OpenAI di Azure:

POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "input": "what azure services support generative AI'"
}

La risposta prevista è 202 per una chiamata riuscita al modello distribuito. Il campo "incorporamento" nel corpo della risposta è la rappresentazione vettoriale della stringa di query "input". A scopo di test, copiare il valore della matrice "incorporamento" in "vectorQueries.vector" in una richiesta di query, usando la sintassi illustrata nelle sezioni successive.

La risposta effettiva per questa chiamata POST al modello distribuito include 1536 incorporamenti, tagliati qui solo per i primi vettori per la leggibilità.

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "index": 0,
            "embedding": [
                -0.009171937,
                0.018715322,
                ...
                -0.0016804502
            ]
        }
    ],
    "model": "ada",
    "usage": {
        "prompt_tokens": 7,
        "total_tokens": 7
    }
}

In questo approccio, il codice dell'applicazione è responsabile della connessione a un modello, della generazione di incorporamenti e della gestione della risposta.

Suggerimento

Provare Query con vettorizzazione integrata, attualmente in anteprima pubblica, per fare in modo che Ricerca intelligenza artificiale di Azure gestisca gli input e gli output di vettorizzazione delle query.

Richiesta di query vettoriale

Questa sezione illustra la struttura di base di una query vettoriale. È possibile usare la portale di Azure, le API REST o gli SDK di Azure per formulare una query vettoriale. Se si esegue la migrazione dal 2023-07-01-Preview, sono state apportate modifiche di rilievo. Per informazioni dettagliate, vedere Eseguire l'aggiornamento all'API REST più recente.

2023-11-01 è la versione stabile dell'API REST per Search POST. Questa versione supporta:

  • vectorQueries è il costrutto per la ricerca vettoriale.
  • kind impostare su per specificare vector che la query è una matrice vettoriale.
  • vector è query (rappresentazione vettoriale di testo o immagine).
  • exhaustive (facoltativo) richiama KNN completo in fase di query, anche se il campo viene indicizzato per HNSW.

Nell'esempio seguente il vettore è una rappresentazione di questa stringa: "what Azure services support full text search". La query è destinata al contentVector campo. La query restituisce k i risultati. Il vettore effettivo ha 1536 incorporamenti, quindi viene tagliato in questo esempio per la leggibilità.

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}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Risposta di query vettoriale

In Ricerca di intelligenza artificiale di Azure le risposte alle query sono costituite da tutti i retrievable campi per impostazione predefinita. Tuttavia, è comune limitare i risultati della ricerca a un subset di retrievable campi elencandoli in un'istruzione select .

In una query vettoriale valutare attentamente se è necessario vettoriare i campi in una risposta. I campi vettoriali non sono leggibili, quindi se si esegue il push di una risposta a una pagina Web, è consigliabile scegliere campi non di controllo rappresentativi del risultato. Ad esempio, se la query viene eseguita su contentVector, è possibile restituire content .

Se si vogliono campi vettoriali nel risultato, di seguito è riportato un esempio della struttura di risposta. contentVector è una matrice di stringhe di incorporamenti, ritagliata qui per brevità. Il punteggio di ricerca indica la pertinenza. Per il contesto sono inclusi altri campi non di tori.

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.80025613,
            "title": "Azure Search",
            "category": "AI + Machine Learning",
            "contentVector": [
                -0.0018343845,
                0.017952163,
                0.0025753193,
                ...
            ]
        },
        {
            "@search.score": 0.78856903,
            "title": "Azure Application Insights",
            "category": "Management + Governance",
            "contentVector": [
                -0.016821077,
                0.0037742127,
                0.016136652,
                ...
            ]
        },
        {
            "@search.score": 0.78650564,
            "title": "Azure Media Services",
            "category": "Media",
            "contentVector": [
                -0.025449317,
                0.0038463024,
                -0.02488436,
                ...
            ]
        }
    ]
}

Punti principali:

  • k determina il numero di risultati vicini più vicini restituiti, in questo caso tre. Le query vettoriali restituiscono k sempre risultati, presupponendo che esistano almeno k documenti, anche se sono presenti documenti con scarsa somiglianza, perché l'algoritmo trova eventuali k vicini più vicini al vettore di query.

  • L'oggetto @search.score è determinato dall'algoritmo di ricerca vettoriale.

  • I campi nei risultati della ricerca sono tutti i retrievable campi o i campi di una select clausola. Durante l'esecuzione di query vettoriali, la corrispondenza viene eseguita solo sui dati vettoriali. Tuttavia, una risposta può includere qualsiasi retrievable campo in un indice. Poiché non esiste alcuna funzionalità per la decodifica di un risultato di un campo vettoriale, l'inclusione di campi di testo non visibile è utile per i valori leggibili.

Query vettoriale con filtro

Una richiesta di query può includere una query vettoriale e un'espressione di filtro. I filtri si applicano ai filterable campi di testo e numerici e sono utili per includere o escludere i documenti di ricerca in base ai criteri di filtro. Anche se un campo vettoriale non è filtrabile, una query può specificare filtri in altri campi nello stesso indice.

Nelle versioni più recenti dell'API è possibile impostare una modalità filtro per applicare filtri prima o dopo l'esecuzione di query vettoriali. Per un confronto di ogni modalità e delle prestazioni previste in base alle dimensioni dell'indice, vedere Filtri nelle query vettoriali.

Suggerimento

Se non si dispone di campi di origine con valori di testo o numerici, verificare la presenza di metadati del documento, ad esempio le proprietà LastModified o CreatedBy, che potrebbero essere utili in un filtro di metadati.

2023-11-01 è la versione stabile per questa API. Le sue caratteristiche sono:

Nell'esempio seguente il vettore è una rappresentazione di questa stringa di query: "what Azure services support full text search". La query è destinata al contentVector campo. Il vettore effettivo ha 1536 incorporamenti, quindi viene tagliato in questo esempio per la leggibilità.

I criteri di filtro vengono applicati a un campo di testo filtrabile (category in questo esempio) prima che il motore di ricerca esemplivi la query vettoriale.

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}}
{
    "count": true,
    "select": "title, content, category",
    "filter": "category eq 'Databases'",
    "vectorFilterMode": "preFilter",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Più campi vettoriali

È possibile impostare la proprietà "vectorQueries.fields" su più campi vettoriali. La query vettoriale viene eseguita su ogni campo vettore specificato nell'elenco fields . Quando si eseguono query su più campi vettoriali, assicurarsi che ognuno contenga incorporamenti dallo stesso modello di incorporamento e che la query venga generata anche dallo stesso modello di incorporamento.

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}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector, titleVector",
            "k": 5
        }
    ]
}

Più query vettoriali

La ricerca vettoriale su più query invia più query tra più campi vettoriali nell'indice di ricerca. Un esempio comune di questa richiesta di query è quando si usano modelli come CLIP per una ricerca vettoriale aggregazione in cui lo stesso modello può vettorizzare l'immagine e il contenuto di testo.

L'esempio di query seguente cerca la somiglianza sia in myImageVector e myTextVector, ma invia rispettivamente due incorporamenti di query diversi, ognuno in esecuzione in parallelo. Questa query genera un risultato che viene ottenuto con il punteggio RRF (Reciprocal Rank Fusion).

  • vectorQueries fornisce una matrice di query vettoriali.
  • vector contiene i vettori di immagine e i vettori di testo nell'indice di ricerca. Ogni istanza è una query separata.
  • fields specifica il campo vettore di destinazione.
  • k è il numero di corrispondenze adiacenti più vicine da includere nei risultati.
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "myimagevector",
            "k": 5
        },
        {
            "kind": "vector"
            "vector": [
                -0.002222222,
                0.018708462,
                -0.013770515,
            . . .
            ],
            "fields": "mytextvector",
            "k": 5
        }
    ]
}

I risultati della ricerca includono una combinazione di testo e immagini, presupponendo che l'indice di ricerca includa un campo per il file di immagine (un indice di ricerca non archivia le immagini).

Query con vettorizzazione integrata (anteprima)

Questa sezione illustra una query vettoriale che richiama la nuova funzionalità di anteprima della vettorizzazione integrata che converte una query di testo in un vettore. Usare l'API REST 2023-10-01-Preview o un pacchetto beta di Azure SDK aggiornato.

Un prerequisito è un indice di ricerca con un vettore configurato e assegnato a un campo vettoriale. Il vettore fornisce informazioni di connessione a un modello di incorporamento usato in fase di query.

Le query forniscono stringhe di testo anziché vettori:

  • kind deve essere impostato su text .
  • text deve avere una stringa di testo. Viene passato al vettore assegnato al campo vettore.
  • fields è il campo vettoriale da cercare.

Di seguito è riportato un semplice esempio di query vettorializzata in fase di query. La stringa di testo viene vettorializzata e quindi usata per eseguire una query sul campo descriptionVector.

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
{
    "select": "title, genre, description",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector",
            "k": 5
        }
    ]
}

Ecco una query ibrida che usa la vettorizzazione integrata delle query di testo. Questa query include più campi vettore di query, più campi non di filtro, un filtro e una classificazione semantica. Anche in questo caso, le differenze sono l'oggetto kind della query vettoriale e la text stringa anziché un oggetto vector.

In questo esempio, il motore di ricerca effettua tre chiamate di vettorizzazione ai vettori assegnati a descriptionVector, synopsisVectore authorBioVector nell'indice. I vettori risultanti vengono usati per recuperare i documenti sui rispettivi campi. Il motore di ricerca esegue anche una ricerca di parole chiave sulla search query, "romanzo mistero ambientato a Londra".

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "search":"mystery novel set in London", 
    "searchFields":"description, synopsis", 
    "semanticConfiguration":"my-semantic-config", 
    "queryType":"semantic",
    "select": "title, author, synopsis",
    "filter": "genre eq 'mystery'",
    "vectorFilterMode": "postFilter",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector, synopsisVector",
            "k": 5
        },
        {
            "kind": "text"
            "text": "living english author",
            "fields": "authorBioVector",
            "k": 5
        }
    ]
}

I risultati con punteggio di tutte e quattro le query vengono fusi usando la classificazione RRF. La classificazione semantica secondaria viene richiamata sui risultati della ricerca fusi, ma solo aumentando i searchFields risultati che sono i più semanticamente allineati a "search":"mystery novel set in London".

Nota

I vettori vengono usati durante l'indicizzazione e l'esecuzione di query. Se non è necessaria la suddivisione in blocchi di dati e la vettorizzazione nell'indice, è possibile ignorare i passaggi come la creazione di un indicizzatore, un set di competenze e un'origine dati. In questo scenario, il vettore viene usato solo in fase di query per convertire una stringa di testo in un incorporamento.

Quantità di risultati classificati in una risposta di query vettoriale

Una query vettoriale specifica il k parametro , che determina il numero di corrispondenze restituite nei risultati. Il motore di ricerca restituisce k sempre il numero di corrispondenze. Se k è maggiore del numero di documenti nell'indice, il numero di documenti determina il limite massimo di ciò che può essere restituito.

Se si ha familiarità con la ricerca full-text, è possibile prevedere zero risultati se l'indice non contiene un termine o una frase. Tuttavia, nella ricerca vettoriale, l'operazione di ricerca identifica i vicini più vicini e restituisce k sempre i risultati anche se i vicini più vicini non sono simili. È quindi possibile ottenere risultati per le query non sensibili o non di argomento, soprattutto se non si usano richieste per impostare i limiti. I risultati meno rilevanti hanno un punteggio di somiglianza peggiore, ma sono ancora i vettori "più vicini" se non c'è nulla di più vicino. Di conseguenza, una risposta senza risultati significativi può comunque restituire k risultati, ma il punteggio di somiglianza di ogni risultato sarebbe basso.

Un approccio ibrido che include la ricerca full-text può attenuare questo problema. Un'altra mitigazione consiste nell'impostare una soglia minima per il punteggio di ricerca, ma solo se la query è una query a vettore singolo puro. Le query ibride non sono favorevoli alle soglie minime perché gli intervalli RRF sono molto più piccoli e volatili.

I parametri di query che influiscono sul conteggio dei risultati includono:

  • "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.

Algoritmi di classificazione usati in una query vettoriale

La classificazione dei risultati viene calcolata in base a:

  • Metrica di somiglianza
  • Rank Fusion (RRF) reciproco se sono presenti più set di risultati della ricerca.

Metrica di somiglianza

Metrica di somiglianza specificata nella sezione indice vectorSearch per una query solo vettoriale. I valori validi sono cosine, euclidean e dotProduct.

I modelli di incorporamento OpenAI di Azure usano la somiglianza coseno, quindi se si usano modelli di incorporamento OpenAI di Azure, cosine è la metrica consigliata. Altre metriche di classificazione supportate includono euclidean e dotProduct.

Uso di RRF

Vengono creati più set se la query è destinata a più campi vettoriali, esegue più query vettoriali in parallelo o se la query è un ibrido di ricerca vettoriale e full-text, con o senza classificazione semantica.

Durante l'esecuzione della query, una query vettoriale può specificare come destinazione un solo indice vettoriale interno. Pertanto, per più campi vettoriali e più query vettoriali, il motore di ricerca genera più query destinate ai rispettivi indici vettoriali di ogni campo. L'output è un set di risultati classificati per ogni query, che vengono fusi tramite RRF. Per altre informazioni, vedere Assegnazione dei punteggi per pertinenza tramite La fusione di rango reciproco (RRF).

Passaggi successivi

Come passaggio successivo, esaminare esempi di codice di query vettoriali in Python, C# o JavaScript.