In Azure AI Search, un archivio vettoriale ha uno schema di indice che definisce campi vettoriali e non vettoriali, una configurazione vettoriale per algoritmi che creano lo spazio di incorporamento e le impostazioni sulle definizioni di campo vettoriale usate nelle richieste di query. L'API Crea o Aggiorna indice crea l'archivio vettoriale.
Seguire questa procedura per indicizzare i dati vettoriali:
Definire uno schema con algoritmi vettoriali per l'indicizzazione e la ricerca
Questo articolo illustra il flusso di lavoro e usa REST per illustrare ogni passaggio. Ogni versione recente dell'API REST aggiunge nuove funzionalità. Dopo aver compreso il flusso di lavoro di base e il contenuto di ogni versione dell'API, continuare con gli esempi di codice di Azure SDK nel repository azure-search-vector-samples per indicazioni sull'uso di queste funzionalità nel codice di test e produzione.
Suggerimento
Usare il portale di Azure per creare un indice vettoriale e provare la vettorializzazione integrata.
Prerequisiti
Azure AI Search, in qualsiasi area e a qualsiasi livello di servizio. La maggior parte dei servizi esistenti supporta la ricerca vettoriale. Per i servizi creati prima di gennaio 2019, è presente un piccolo subset che non può creare un indice vettoriale. In questo caso, è necessario creare un nuovo servizio.
Incorporamenti di vettori preesistenti nei documenti di origine se si usa la versione disponibile a livello generale degli SDK di Azure e delle API REST. Per ulteriori informazioni, vedere Generare incorporamenti. Un'alternativa è la vettorializzazione integrata (anteprima).
È necessario conoscere il limite di dimensioni del modello usato per creare gli incorporamenti e la modalità di calcolo della somiglianza. In Azure OpenAI, per text-embedding-ada-002, la lunghezza del vettore numerico è 1536. La somiglianza viene calcolata usando cosine. I valori validi vanno da 2 a 3072 dimensioni.
È necessario avere familiarità con la creazione di un indice. Lo schema deve includere un campo per la chiave del documento, altri campi da cercare o filtrare e altre configurazioni di comportamenti necessari durante l'indicizzazione e le query.
Preparare i documenti per l'indicizzazione
Prima dell'indicizzazione, assemblare un payload del documento che includa campi di dati vettoriali e non vettoriali. La struttura del documento deve essere conforme allo schema dell'indice.
Assicurarsi che i documenti:
Forniscano un campo o una proprietà di metadati che identifichi ogni documento in modo univoco. Tutti gli indici di ricerca richiedono una chiave del documento. Per soddisfare i requisiti della chiave del documento, un documento di origine deve avere un campo o una proprietà in grado di identificarlo in modo univoco all’interno dell'indice. Questo campo di origine deve essere mappato a un campo di indice di tipo Edm.String e key=true nell'indice di ricerca.
Forniscano dati vettoriali (matrice di numeri a virgola mobile a precisione singola) nei campi di origine.
I campi vettoriali contengono dati numerici generati da modelli di incorporamento, un incorporamento per ciascun campo. È consigliabile incorporare i modelli in Azure OpenAI, ad esempio text-embedding-ada-002 per documenti di testo o l'API REST di recupero immagini per immagini. Sono supportati solo i campi vettoriali di livello superiore dell'indice: i sottocampi vettoriali non sono attualmente supportati.
Forniscano altri campi con contenuto alfanumerico leggibile per la risposta alla query e per scenari di query ibridi che includano la ricerca full-text o la classificazione semantica nella stessa richiesta.
L'indice di ricerca deve includere campi e contenuto per tutti gli scenari di query che si desidera supportare. Si supponga di voler cercare o filtrare i nomi di prodotti, versioni, metadati o indirizzi. In questo caso, la ricerca per somiglianza non è particolarmente utile. La ricerca per parole chiave, la ricerca geografica o i filtri sono una scelta migliore. Un indice di ricerca che includa una raccolta completa di campi di dati vettoriali e non vettoriali offre la massima flessibilità per la costruzione di query e risposte.
Un breve esempio di payload di documenti che include campi vettoriali e non vettoriali è disponibile nella sezione dati del vettore di caricamento di questo articolo.
Aggiungere una configurazione di ricerca vettoriale
Una configurazione vettoriale specifica l'algoritmo di ricerca vettoriale e i parametri usati durante l'indicizzazione per creare informazioni sul "vicino più prossimo" tra i nodi vettoriali:
Hierarchical Navigable Small World (HNSW)
KNN esaustivo
Se si sceglie HNSW in un campo, è possibile scegliere il KNN esaustivo in fase di query. Ma l'altra direzione non funziona: se si sceglie esaustiva, non è possibile richiedere successivamente la ricerca HNSW perché le strutture di dati aggiuntive che consentono la ricerca approssimativa non esistono.
Per informazioni sulla procedura di migrazione delle versioni da anteprima a stabile, vedere Aggiornare le API REST.
Nome della configurazione. Il nome deve essere univoco all'interno dell'indice.
profiles aggiungere un livello di astrazione per includere definizioni più complete. Un profilo viene definito in vectorSearch; quindi, vi viene fatto riferimento tramite il suo nome in ogni campo vettore.
"hnsw" e "exhaustiveKnn" sono gli algoritmi Vicino più prossimo approssimativo (ANN) usati per organizzare il contenuto vettoriale durante l'indicizzazione.
Il valore predefinito di "m" (conteggio dei collegamenti bidirezionali) è 4. L'intervallo è compreso tra i valori 4 e 10. I valori più bassi dovrebbero restituire un livello inferiore di rumore nei risultati.
Il valore predefinito di "efConstruction" è 400. L'intervallo è compreso tra i valori 100 e 1,000. È il numero di vicini più prossimi usati durante l'indicizzazione.
Il valore predefinito di "efSearch" è 500. L'intervallo è compreso tra i valori 100 e 1,000. È il numero di vicini più prossimi usati durante la ricerca.
Se si sta usando Azure OpenAI, "metric" deve essere "coseno". In caso contrario, usare la metrica di somiglianza associata al modello di incorporamento in uso. I valori supportati sono cosine, dotProduct, euclidean.
2024-05-01-Preview è la versione più recente. Aggiunge altre opzioni di codifica, ma la configurazione della ricerca vettoriale (vectorSearch struttura) è per lo più identica a 2024-03-01-preview.
Aggiunge hamming la distanza come metrica per la ricerca più vicina rispetto ai dati binari. Per altre informazioni, vedere Indicizzare i dati binari per la ricerca vettoriale.
Espande la vettorializzazione integrata con altre opzioni del modello di incorporamento. Per trarre vantaggio da questa funzionalità, è necessario prendere una dipendenza da un indicizzatore e da un set di competenze. Per un elenco delle nuove competenze di incorporamento, vedere Caricare i dati vettoriali e la sezione API pull.
Aggiungere una vectorSearch sezione nell'indice che specifica le impostazioni di compressione e gli algoritmi di ricerca usati per creare lo spazio di incorporamento. Per altre informazioni, vedere Configurare la quantizzazione dei vettori e l'archiviazione ridotta.
Il parametro vectorSearch.compressions.kind deve essere impostato su scalarQuantization.
rerankWithOriginalVectors usa i vettori originali, non compressi per ricalcolare la somiglianza e rerank i risultati principali restituiti dalla query di ricerca iniziale. I vettori non compressi sono presenti nell'indice di ricerca anche se stored è false. Questa proprietà è facoltativa. Il valore predefinito è true.
defaultOversampling considera un set più ampio di potenziali risultati per compensare la riduzione delle informazioni dalla quantizzazione. La formula per i risultati potenziali è costituita da k nella query, con un moltiplicatore di sovracampionamento. Ad esempio, se la query specifica un k valore pari a 5 e l'overcampionamento è 20, la query richiede in modo efficace 100 documenti per l'uso durante il reranking, usando il vettore originale non compresso a tale scopo. Vengono restituiti solo i risultati k più classificati. Questa proprietà è facoltativa. Il valore predefinito è 4.
quantizedDataTypeDeve essere impostato su int8. Questo è l'unico tipo di dati primitivo supportato in questo momento. Questa proprietà è facoltativa. Il valore predefinito è int8.
Nome della configurazione. Il nome deve essere univoco all'interno dell'indice.
profiles sono novità di questa anteprima. Aggiungono un livello di astrazione per includere definizioni più avanzate. Un profilo viene definito in vectorSearch e quindi come proprietà in ogni campo vettoriale.
hnsw e "exhaustiveKnn" sono gli algoritmi Vicino più prossimo approssimativo (ANN) usati per organizzare il contenuto vettoriale durante l'indicizzazione.
Il valore predefinito di m (conteggio dei collegamenti bidirezionali) è 4. L'intervallo è compreso tra i valori 4 e 10. I valori più bassi dovrebbero restituire un livello inferiore di rumore nei risultati.
Il valore predefinito di efConstruction è 400. L'intervallo è compreso tra i valori 100 e 1,000. È il numero di vicini più prossimi usati durante l'indicizzazione.
Il valore predefinito di efSearch è 500. L'intervallo è compreso tra i valori 100 e 1,000. È il numero di vicini più prossimi usati durante la ricerca.
Se si sta usando Azure OpenAI, metric deve essere "coseno". In caso contrario, usare la metrica di somiglianza associata al modello di incorporamento in uso. I valori supportati sono cosine, dotProduct, euclidean.
Importante
2023-07-01-Preview è stata la prima versione dell'API REST a supportare i vettori. Usa strutture non modificate che sono state sostituite nelle anteprime più recenti. È consigliabile eseguire la migrazione a un'API REST più recente.
Questa anteprima è stata aggiunta:
vectorSearch.algorithmConfigurations per specificare l'algoritmo HNSW.
hnsw algoritmo vicino più vicino per l'indicizzazione del contenuto vettoriale.
Nome della configurazione. Il nome deve essere univoco all'interno dell'indice.
hnsw è l'algoritmo Vicino più prossimo approssimativo (ANN) usato per creare il grafico di prossimità durante l'indicizzazione. Questa versione dell'API supporta solo Hierarchical Navigable Small World (HNSW).
Il valore predefinito di m (conteggio dei collegamenti bidirezionali) è 4. L'intervallo è compreso tra i valori 4 e 10. I valori più bassi dovrebbero restituire un livello inferiore di rumore nei risultati.
Il valore predefinito di efConstruction è 400. L'intervallo è compreso tra i valori 100 e 1,000. È il numero di vicini più prossimi usati durante l'indicizzazione.
Il valore predefinito di efSearch è 500. L'intervallo è compreso tra i valori 100 e 1,000. È il numero di vicini più prossimi usati durante la ricerca.
Se si sta usando Azure OpenAI, metric deve essere "coseno". In caso contrario, usare la metrica di somiglianza associata al modello di incorporamento in uso. I valori supportati sono cosine, dotProduct, euclidean.
Aggiungere un campo vettoriale alla raccolta campi
La raccolta campi deve includere un campo per la chiave del documento, i campi vettoriali e tutti gli altri campi necessari per gli scenari di ricerca ibrida.
I campi vettoriali sono caratterizzati dal tipo di dati, da una dimensions proprietà basata sul modello di incorporamento usato per l'output dei vettori e da un profilo vettoriale.
Definire un campo vettoriale con gli attributi seguenti. È possibile archiviare un oggetto di incorporamento generato per ciascun campo. Per ogni campo vettoriale:
type deve trovarsi Collection(Edm.Single) in questa versione dell'API.
dimensions è il numero di dimensioni generate dal modello di incorporamento. Per text-embedding-ada-002, è 1536.
vectorSearchProfile è il nome di un profilo definito altrove nell'indice.
searchable deve essere true.
retrievable può essere true o false. True restituisce i vettori non elaborati (1536) come testo normale e utilizza spazio di archiviazione. Impostare su true se si sta passando un risultato vettoriale a un'app downstream.
filterable, facetable, sortable devono essere false.
Aggiungere altri campi che definiscano la sostanza e la struttura del contenuto testuale indicizzato. È necessaria almeno una chiave del documento.
È anche necessario aggiungere campi che saranno utili nella query o nella risposta. L'esempio seguente mostra campi vettoriali per titolo e contenuto ("titleVector", "contentVector") analoghi ai vettori. Fornisce anche campi per contenuto testuale analogo ("titolo", "contenuto") utile per l'ordinamento, il filtraggio e la lettura in un risultato di ricerca.
Le definizioni dei campi vettoriali sono uguali a 2024-03-01-preview, ad eccezione di un nuovo tipo di dati binario. Per altre informazioni, vedere Indicizzare i dati binari per la ricerca vettoriale.
Usare l'API REST Create or Update Index Preview per definire la raccolta di campi di un indice.
Questa versione dell'API si basa sulla versione 2023-10-01-preview aggiungendo il supporto per i tipi di dati ristretti e la quantizzazione scalare.
Usare l'API REST Create or Update Index Preview per definire la raccolta di campi di un indice.
Aggiungere campi vettoriali alla raccolta campi. È possibile archiviare un campo di incorporamento generato per ciascun campo di documento. Per ogni campo vettoriale:
type può essere Collection(Edm.Single), Collection(Edm.Half), Collection(Edm.Int16), Collection(Edm.SByte)
dimensions è il numero di dimensioni generate dal modello di incorporamento. Per text-embedding-ada-002, è 1536.
vectorSearchProfile è il nome di un profilo definito altrove nell'indice.
searchable deve essere true.
retrievable può essere true o false. True restituisce i vettori non elaborati (1536) come testo normale e utilizza spazio di archiviazione. Impostare su true se si sta passando un risultato vettoriale a un'app downstream. False è obbligatorio se stored è false.
stored è una nuova proprietà booleana che si applica solo ai campi vettoriali. True archivia una copia dei vettori restituiti nei risultati della ricerca. False elimina la copia durante l'indicizzazione. È possibile eseguire ricerche sui vettori, ma non restituire vettori nei risultati.
filterable, facetable, sortable devono essere false.
Nell'esempio di API REST seguente, "title" e "content" contengono contenuto testuale usato nella ricerca full-text e nella classificazione semantica, mentre "titleVector" e "contentVector" contengono dati vettoriali. In questa versione dell'API è possibile usare indicizzatori e un set di competenze per popolare il campo vettoriale usando la vettorizzazione integrata. La definizione dell'indice non cambia, ma è possibile aggiungere indicizzatori e competenze alla soluzione per popolare i campi.
Usare l'API REST Create or Update Index Preview per definire la raccolta di campi di un indice.
Aggiungere campi vettoriali alla raccolta campi. È possibile archiviare un campo di incorporamento generato per ciascun campo di documento. Per ogni campo vettoriale:
Il parametro type deve essere impostato su Collection(Edm.Single).
dimensions è il numero di dimensioni generate dal modello di incorporamento. Per text-embedding-ada-002, è 1536.
vectorSearchProfile è il nome di un profilo definito altrove nell'indice.
searchable deve essere true.
retrievable può essere true o false. True restituisce i vettori non elaborati (1536) come testo normale e utilizza spazio di archiviazione. Impostare su true se si sta passando un risultato vettoriale a un'app downstream.
filterable, facetable, sortable devono essere false.
Aggiungere campi non vettoriali filtrabili alla raccolta, come "title" con filterable impostato su true, se si desidera richiamare il prefiltraggio o postfiltraggio in [query vector](vector-search-how-to-query.md
Aggiungere altri campi che definiscano la sostanza e la struttura del contenuto testuale indicizzato. È necessaria almeno una chiave del documento.
È anche necessario aggiungere campi che saranno utili nella query o nella risposta. L'esempio seguente mostra campi vettoriali per titolo e contenuto ("titleVector", "contentVector") analoghi ai vettori. Fornisce anche campi per contenuto testuale analogo ("titolo", "contenuto") utile per l'ordinamento, il filtraggio e la lettura in un risultato di ricerca.
Le definizioni dei campi vettoriali per questa versione risulteranno obsolete nelle versioni successive. È consigliabile eseguire la migrazione a un'API REST più recente.
2023-07-01-Preview è stata la prima versione dell'API REST per supportare scenari vettoriali.
Nell'esempio di API REST seguente "title" e "content" contengono contenuto testuale usato nella ricerca full-text e nella classificazione semantica, mentre "titleVector" e "contentVector" contengono dati vettoriali generati esternamente.
Usare l'API REST Create or Update Index Preview per definire la raccolta di campi di un indice.
Aggiungere campi vettoriali alla raccolta campi. È possibile archiviare un campo di incorporamento generato per ciascun campo di documento. Per ogni campo vettoriale:
Assegnare il tipo di dati Collection(Edm.Single).
Specificare il nome della configurazione dell'algoritmo di ricerca vettoriale.
Specificare il numero di dimensioni generate dal modello di incorporamento.
Impostare gli attributi:
"searchable" deve essere "true".
"retrievable" impostato su "true" consente di visualizzare i vettori non elaborati (ad esempio, come passaggio di verifica), ma questo occuperà più spazio di archiviazione. Impostare su "false" se non è necessario restituire vettori non elaborati. Non è necessario restituire vettori per una query, ma se si sta passando un risultato vettoriale a un'app downstream, impostare "retrievable" su "true".
Gli attributi "filterable", "facetable", "sortable" devono essere "false". Non impostarli su "true", poiché questi comportamenti non sono applicabili nel contesto dei campi vettoriali e la richiesta avrà esito negativo.
Aggiungere altri campi che definiscano la sostanza e la struttura del contenuto testuale indicizzato. È necessaria almeno una chiave del documento.
È anche necessario aggiungere campi che saranno utili nella query o nella risposta. L'esempio seguente mostra campi vettoriali per titolo e contenuto ("titleVector", "contentVector") analoghi ai vettori. Fornisce anche campi per contenuto testuale analogo ("titolo", "contenuto") utile per l'ordinamento, il filtraggio e la lettura in un risultato di ricerca.
Una definizione di indice con gli elementi descritti è simile alla seguente:
Il contenuto fornito per l'indicizzazione deve essere conforme allo schema di indice e includere un valore stringa univoco per la chiave del documento. I dati prevettorializzati vengono caricati in uno o più campi vettoriali, che possono coesistere con altri campi contenenti contenuto alfanumerico.
Usare Documents - Index per caricare dati vettoriali e non di operatore in un indice. Le API push per l'indicizzazione sono identiche in tutte le versioni stabili e di anteprima. Usare una delle API seguenti per caricare i documenti:
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
"value": [
{
"id": "1",
"title": "Azure App Service",
"content": "Azure App Service is a fully managed platform for building, deploying, and scaling web apps. You can host web apps, mobile app backends, and RESTful APIs. It supports a variety of programming languages and frameworks, such as .NET, Java, Node.js, Python, and PHP. The service offers built-in auto-scaling and load balancing capabilities. It also provides integration with other Azure services, such as Azure DevOps, GitHub, and Bitbucket.",
"category": "Web",
"titleVector": [
-0.02250031754374504,
. . .
],
"contentVector": [
-0.024740582332015038,
. . .
],
"@search.action": "upload"
},
{
"id": "2",
"title": "Azure Functions",
"content": "Azure Functions is a serverless compute service that enables you to run code on-demand without having to manage infrastructure. It allows you to build and deploy event-driven applications that automatically scale with your workload. Functions support various languages, including C#, F#, Node.js, Python, and Java. It offers a variety of triggers and bindings to integrate with other Azure services and external services. You only pay for the compute time you consume.",
"category": "Compute",
"titleVector": [
-0.020159931853413582,
. . .
],
"contentVector": [
-0.02780858241021633,
. . .
],
"@search.action": "upload"
}
. . .
]
}
Tutte le versioni di anteprima più recenti usano API pull (indicizzatori e set di competenze) per la vettorializzazione integrata durante l'indicizzazione e il tempo di query.
Gli indicizzatori possono recuperare e indicizzare i campi vettoriali nei documenti di origine, presupponendo uno schema di indice che soddisfi i requisiti dei campi vettoriali e l'API REST di anteprima. Le origini dati forniscono i vettori in qualsiasi formato supportato dall'origine dati (ad esempio, stringhe in JSON). L'indicizzatore presuppone che i campi digitati come Collection(Edm.Single) contengano vettori e indicizzerà tale contenuto come indici vettoriali.
Nessuna modifica al comportamento di mapping dei campi o al rilevamento delle modifiche per i vettori. I comportamenti per l'indicizzazione di testo sono applicabili anche ai vettori.
Se i dati vettoriali provengono da file, è consigliabile usare un valore non predefinito parsingMode, come json, jsonLines o csv in base alla forma dei dati.
Azure SQL non offre un metodo per archiviare una raccolta nativamente come singola colonna SQL. Al momento, non è stata identificata una soluzione alternativa.
Le dimensioni di tutti i vettori dell'origine dati devono essere uguali e corrispondere alla relativa definizione di indice per il campo a cui si sta eseguendo il mapping. L'indicizzatore genera un errore in tutti i documenti non corrispondenti.
Le competenze e i vettori vengono usati per generare incorporamenti. Per la vettorializzazione durante l'indicizzazione, scegliere tra le competenze seguenti:
A fini di convalida, è possibile eseguire query sull'indice usando Esplora ricerche nel portale di Azure o una chiamata API REST. Poiché Azure AI Search non è in grado di convertire un vettore in testo leggibile, provare a restituire campi dallo stesso documento come riscontro della corrispondenza. Ad esempio, se la query vettoriale è destinata al campo "titleVector", è possibile selezionare "title" per i risultati della ricerca.
Perché siano inclusi nei risultati, i campi devono essere attribuiti come "retrievable".
È possibile usare Esplora ricerche per eseguire query su un indice. Esplora ricerche ha due visualizzazioni: Visualizzazione query (predefinita) e Visualizzazione JSON.
Usare la vista query predefinita per ottenere rapida conferma che l'indice contenga vettori. La vista query è per la ricerca full-text. Anche se non è possibile usarla per le query vettoriali, è possibile inviare una ricerca vuota (search=*) per verificare la presenza di contenuto. Il contenuto di tutti i campi, inclusi i campi vettoriali, viene restituito come testo normale.
L'esempio di API REST seguente è una query vettoriale, ma restituisce solo campi non vettoriali (titolo, contenuto, categoria). Solo i campi contrassegnati come "retrievable" possono essere restituiti nei risultati della ricerca.
Per aggiornare un archivio vettoriale, modificare lo schema e, se necessario, ricaricare i documenti per popolare nuovi campi. Le API per gli aggiornamenti dello schema includono Creare o aggiornare l'indice (REST), CreateOrUpdateIndex in Azure SDK per .NET, create_or_update_index in Azure SDK per Python e metodi simili in altri SDK di Azure.
L'eliminazione e la ricompilazione sono spesso necessarie per aggiornamenti ed eliminazione di campi esistenti.
Tuttavia, è possibile aggiornare uno schema esistente con le modifiche seguenti, senza che sia necessaria alcuna ricompilazione:
Aggiungere nuovi campi a una raccolta campi.
Aggiungere nuove configurazioni vettoriali assegnate ai nuovi campi, ma non ai campi esistenti che sono già stati vettorializzati.
Modificare "retrievable" (i valori sono true o false) in un campo esistente. I campi vettoriali devono essere ricercabili e recuperabili, ma se si vuole disabilitare l'accesso a un campo vettoriale in situazioni in cui l'eliminazione e la ricompilazione non sono fattibili, è possibile impostare recuperabile su false.
Gli esempi di codice nel repository azure-search-vector illustrano flussi di lavoro end-to-end che includono definizione dello schema, vettorizzazione, indicizzazione e query.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedere https://aka.ms/ContentUserFeedback.