Condividi tramite


Creare un indice vettoriale

In Azure AI Search, un archivio vettoriale ha uno schema di indice che definisce i campi vettoriali e non vettoriali, una configurazione vettoriale per gli algoritmi che creano e comprimono lo spazio di incorporamento e le impostazioni delle 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 e compressione facoltativa
  • Aggiungere le definizioni dei campi vettoriali
  • Caricare i dati pre-vettorializzati in un altro passaggio o usare la vettorializzazione integrata per la suddivisione dei dati in blocchi e la codifica dei dati durante l'indicizzazione

Questo articolo descrive il flusso di lavoro e usa REST a scopo illustrativo. Dopo aver compreso il flusso di lavoro di base, 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 provare il chunking e la vettorizzazione dei dati integrati.

Prerequisiti

  • Azure AI Search, in qualsiasi area e a qualsiasi livello di servizio. La maggior parte dei servizi esistenti supporta la ricerca vettoriale. Tra i servizi creati prima di gennaio 2019, è presente un piccolo gruppo che non è in grado di creare la ricerca vettoriale. In questo caso, è necessario creare un nuovo servizio. Se si usa la vettorizzazione integrata (set di competenze che chiamano Azure per intelligenza artificiale), Azure AI Searc deve trovarsi nella stessa area dei servizi di Azure OpenAI o Azure per intelligenza artificiale.

  • Incorporamenti di vettori preesistenti o usare la vettorizzazione integrata, in cui vengono chiamati i modelli di incorporamento dalla pipeline di indicizzazione.

  • È necessario conoscere il limite di dimensioni del modello usato per creare gli incorporamenti. I valori validi vanno da 2 a 3072 dimensioni. In Azure OpenAI, per text-embedding-ada-002, la lunghezza del vettore numerico è 1536. Per text-embedding-3-small o text-embedding-3-large, la lunghezza del vettore è 3072.

  • È anche necessario conoscere le metriche di somiglianza supportate. Per Azure OpenAI, la somiglianza viene calcoltata usando cosine.

  • È 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:

  1. 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.

  2. Forniscano dati vettoriali (matrice di numeri a virgola mobile a precisione singola) nei campi di origine.

    I campi vettoriali contengono una matrice generata da modelli di incorporamento, uno per campo, in cui il campo è un campo di primo livello (non facente parte di un tipo annidato o complesso). Per semplificare al massimo l’integrazione, è consigliabile incorporare i modelli in Azure OpenAI, ad esempio text-embedding-ada-002 per i documenti di testo o Image Retrieval REST API per le immagini.

    Se è possibile prendere una dipendenza da indicizzatori e set di competenze, è consigliabile usare la vettorizzazione integrata che codifica immagini e contenuto testuale durante l'indicizzazione. Le definizioni dei campi sono per i campi vettoriali, ma i dati di origine in ingresso possono essere testo o immagini, rappresentati come matrici vettoriali create durante l'indicizzazione.

  3. Fornire altri campi con contenuto leggibile per la risposta alla query e per scenari di query ibridi che includono 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 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 la regola non è valida nella direzione opposta: se si sceglie esaustivo, non è possibile richiedere successivamente la ricerca HNSW perché le strutture di dati aggiuntive che consentono la ricerca approssimativa non esistono.

Una configurazione vettoriale specifica anche i metodi di quantizzazione per ridurre le dimensioni del vettore:

  • Scalare
  • Binario (disponibile solo in 2024-07-01 e nei pacchetti Azure SDK più recenti)

Per istruzioni su come eseguire la migrazione alla versione più recente, vedere Aggiornare l'API REST.

2024-07-01 è disponibile a livello generale. Supporta una configurazione vettoriale con:

  • vectorSearch.algorithms supporta HNSW e KNN completo.
  • vectorSearch.compressions supporta la quantizzazione scalare e binaria, il sovracampionamento e il riclassificazione con vettori originali.
  • vectorSearch.profiles fornisce più combinazioni di configurazioni dell'algoritmo e di compressione.

Assicurarsi di avere una strategia per vettorializzare il proprio contenuto. È consigliabile usare la vettorizzazione integrata e i vettori in fase di query per la codifica predefinita.

  1. Usare l'API Crea o aggiorna indice per creare l'indice.

  2. Aggiungere una sezione vectorSearch nell'indice che specifichi gli algoritmi di ricerca usati per creare lo spazio di incorporamento.

     "vectorSearch": {
         "compressions": [
             {
                 "name": "scalar-quantization",
                 "kind": "scalarQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
                     "scalarQuantizationParameters": {
                         "quantizedDataType": "int8"
                     }
             },
             {
                 "name": "binary-quantization",
                 "kind": "binaryQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
             }
         ],
         "algorithms": [
             {
                 "name": "hnsw-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "hnsw-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "hamming"
                 }
             },
             {
                 "name": "eknn",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "euclidean"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "vector-profile-hnsw-scalar",
             "compression": "scalar-quantization",
             "algorithm": "hnsw-1"
           }
         ]
     }
    

    Punti principali:

    • I nomi per ogni configurazione di compressione, algoritmo e profilo devono essere univoci per il tipo all'interno dell'indice.

    • vectorSearch.compressions.kind può essere scalarQuantization o binaryQuantization.

    • vectorSearch.compressions.rerankWithOriginalVectors usa i vettori originali non compressi per ricalcolare la somiglianza e ricategorizzare 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.

    • vectorSearch.compressions.defaultOversampling considera un set più ampio di potenziali risultati per compensare la riduzione delle informazioni dalla quantizzazione. La formula per i risultati potenziali è costituita dak nella query, con un moltiplicatore di sovracampionamento. Ad esempio, se la query specifica un k di 5 e se il sovracampionamento è 20, la query richiede di fatto 100 documenti per l'uso durante la ricategorizzazione, usando il vettore originale non compresso a tale scopo. Vengono restituiti solo i primi k risultati classificati di nuovo. Questa proprietà è facoltativa. Il valore predefinito è 4.

    • vectorSearch.compressions.scalarQuantizationParameters.quantizedDataTypeDeve essere impostato su int8. Questo è l'unico tipo di dati primitivo attualmente supportato. Questa proprietà è facoltativa. Il valore predefinito è int8.

    • vectorSearch.algorithms.kind sono "hnsw" o "exhaustiveKnn". Questi sono gli algoritmi Vicino più prossimo approssimativo (ANN) usati per organizzare il contenuto vettoriale durante l'indicizzazione.

    • vectorSearch.algorithms.m è il numero di collegamenti bidirezionali. Il valore predefinito è 4. L'intervallo è compreso tra i valori 4 e 10. I valori più bassi dovrebbero restituire un livello inferiore di rumore nei risultati.

    • vectorSearch.algorithms.efConstruction è il numero di vicini più prossimi usati durante l'indicizzazione. Il valore predefinito è 400. L'intervallo è compreso tra i valori 100 e 1,000.

    • "vectorSearch.algorithms.fSearch è il numero di vicini più prossimi usati durante la ricerca. Il valore predefinito è 500. L'intervallo è compreso tra i valori 100 e 1,000.

    • Se si sta usando Azure OpenAI, vectorSearch.algorithms.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, hamming (usato per l’indicizzazione di dati binari).

    • vectorSearch.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. Si tratta di una combinazione di configurazioni di compressione e algoritmo. Questa è la proprietà che si assegna a un campo vettoriale e determina l'algoritmo e la compressione dei campi.

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 da un tipo di dati, una proprietà dimensions basata sul modello di incorporamento usato per restituire i vettori e un profilo vettoriale.

2024-07-01 è disponibile a livello generale.

  1. Usare l'istruzione Crea o aggiorna indice per creare l'indice.

  2. Definire un campo vettoriale con gli attributi seguenti. È possibile archiviare un oggetto di incorporamento generato per ciascun campo. Per ogni campo vettoriale:

    • type deve essere un tipo di dati vettoriale. Collection(Edm.Single) è il più comune per l'incorporamento dei modelli.
    • 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.
    • stored può essere true o false. Determina se per il recupero viene archiviata una copia aggiuntiva di vettori. Per altre informazioni, vedere Ridurre le dimensioni dei vettori.
    • filterable, facetable, sortable devono essere false.
  3. Aggiungere campi non vettoriali filtrabili alla raccolta, come "title" con filterable impostato su true, se si desidera richiamare il prefiltraggio o il postfiltraggio nella query vettoriale.

  4. 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.

    L'esempio seguente mostra la raccolta di campi:

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2024-07-01&allowIndexDowntime=true
    Content-Type: application/json
    api-key: {{admin-api-key}}
    {
        "name": "{{index-name}}",
        "fields": [
            {
                "name": "id",
                "type": "Edm.String",
                "key": true,
                "filterable": true
            },
            {
                "name": "title",
                "type": "Edm.String",
                "searchable": true,
                "filterable": true,
                "sortable": true,
                "retrievable": true
            },
            {
                "name": "titleVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "stored": true,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": false,
                "stored": false,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "hnsw-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "vector-profile-1",
                    "algorithm": "hnsw-1"
                }
            ]
        }
    }
    

Caricare i dati vettoriali per l'indicizzazione

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 prevettori vengono caricati in uno o più campi vettoriali, che possono coesistere con altri campi contenenti contenuto non di filtro.

È possibile usare metodologie push o pull per l'inserimento dati.

Usare Documenti - Indice per caricare in un indice dati vettoriali e non quelli di operatore. 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=2024-07-01

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

Controllare l'indice per il contenuto vettoriale

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

  • Esaminare gli indici Gestione della ricerca>Indici per visualizzare le dimensioni dell’indice all-up e le dimensioni dell’indice vettoriale. Una dimensione dell'indice vettoriale positiva indica che sono presenti vettori.

  • È possibile usare Esplora ricerche per eseguire query su un indice. Esplora ricerche ofre due visualizzazioni: Visualizzazione query (predefinita) e Visualizzazione JSON.

    • Impostare Opzioni query>Nascondere i valori vettoriali nei risultati della ricerca per ottenere risultati più leggibili.

    • Usare la visualizzazione JSON per le query vettoriali. È possibile incollare in una definizione JSON della query vettoriale da eseguire oppure usare la conversione da testo a vettore o da immagine a vettore incorporata se l'indice ha un'assegnazione di vettore. Per altre informazioni sulla ricerca di immagini, vedere Guida introduttiva: Cercare immagini in Esplora ricerche.

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

    • Per altri dettagli, vedere Creare una query vettoriale.

Aggiornare un archivio vettoriale

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.

Le linee guida standard per l'aggiornamento di un indice sono illustrate in Eliminare e ricompilare un indice.

I punti chiave includono:

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

Passaggi successivi

Come passaggio successivo, è consigliabile Eseguire query sui dati vettoriali in un indice di ricerca.

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.

È disponibile codice demo per Python, C# e JavaScript.