Skapa ett vektorindex

I Azure AI Search har ett vektorlager ett indexschema som definierar vektor- och icke-vektorfält, en vektorkonfiguration för algoritmer som skapar och komprimerar inbäddningsutrymmet och inställningar för vektorfältdefinitioner som används i frågebegäranden.

API: et Skapa eller uppdatera index skapar vektorarkivet. Följ dessa steg för att indexera vektordata:

  • Definiera ett schema med vektoralgoritmer och valfri komprimering
  • Lägga till definitioner för vektorfält
  • Läs in fördefinierade data som ett separat steg eller använd integrerad vektorisering för datasegmentering och kodning under indexering

Den här artikeln förklarar arbetsflödet och använder REST som illustration. När du förstår det grundläggande arbetsflödet fortsätter du med Azure SDK-kodexemplen på lagringsplatsen azure-search-vector-samples för vägledning om hur du använder dessa funktioner i test- och produktionskoden.

Dricks

Använd Azure-portalen för att skapa ett vektorindex och prova integrerad datasegmentering och vektorisering.

Förutsättningar

  • Azure AI Search, i valfri region och på valfri nivå. De flesta befintliga tjänster stöder vektorsökning. För tjänster som skapades före januari 2019 finns det en liten delmängd som inte kan skapa ett vektorindex. I det här fallet måste en ny tjänst skapas. Om du använder integrerad vektorisering (kompetensuppsättningar som anropar Azure AI) måste Azure AI Search finnas i samma region som Azure OpenAI- eller Azure AI-tjänster.

  • Befintliga vektorinbäddningar eller använda integrerad vektorisering, där inbäddningsmodeller anropas från indexeringspipelinen.

  • Du bör känna till dimensionsgränsen för den modell som används för att skapa inbäddningarna. Giltiga värden är 2 till 3 072 dimensioner. För textinbäddning-ada-002 i Azure OpenAI är längden på den numeriska vektorn 1536. För text-embedding-3-small eller text-embedding-3-large är vektorlängden 3072.

  • Du bör också veta vilka likhetsmått som stöds. För Azure OpenAI beräknas likheten med .cosine

  • Du bör vara bekant med att skapa ett index. Schemat måste innehålla ett fält för dokumentnyckeln, andra fält som du vill söka efter eller filtrera samt andra konfigurationer för beteenden som behövs under indexering och frågor.

Förbereda dokument för indexering

Innan du indexerar ska du sätta ihop en nyttolast för dokument som innehåller fält med vektor- och icke-vektordata. Dokumentstrukturen måste överensstämma med indexschemat.

Kontrollera att dina dokument:

  1. Ange ett fält eller en metadataegenskap som unikt identifierar varje dokument. Alla sökindex kräver en dokumentnyckel. För att uppfylla kraven för dokumentnyckeln måste ett källdokument ha ett fält eller en egenskap som unikt kan identifiera det i indexet. Det här källfältet måste mappas till ett indexfält av typen Edm.String och key=true i sökindexet.

  2. Ange vektordata (en matris med flyttal med enkel precision) i källfält.

    Vektorfält innehåller en matris som genereras av inbäddningsmodeller, en inbäddning per fält, där fältet är ett fält på toppnivå (inte en del av en kapslad eller komplex typ). För den enklaste integreringen rekommenderar vi inbäddningsmodellerna i Azure OpenAI, till exempel textinbäddning-ada-002 för textdokument eller REST API för bildhämtning för bilder.

    Om du kan vara beroende av indexerare och kompetensuppsättningar kan du överväga att använda integrerad vektorisering som kodar bilder och alfanumeriskt innehåll under indexeringen. Fältdefinitionerna är för vektorfält, men källdata kan vara text eller bilder, med vektormatriser som skapas under indexeringen.

  3. Ange andra fält med alfanumeriskt innehåll som kan läsas av människor för frågesvaret och för hybridfrågescenarier som innehåller fulltextsökning eller semantisk rangordning i samma begäran.

Ditt sökindex bör innehålla fält och innehåll för alla frågescenarier som du vill stödja. Anta att du vill söka eller filtrera efter produktnamn, versioner, metadata eller adresser. I det här fallet är likhetssökning inte särskilt användbart. Nyckelordssökning, geo-sökning eller filter skulle vara ett bättre val. Ett sökindex som innehåller en omfattande fältsamling med vektor- och icke-bevektordata ger maximal flexibilitet för frågekonstruktion och svarssammansättning.

Ett kort exempel på en dokumentnyttolast som innehåller vektor- och icke-bevektorfält finns i avsnittet data för belastningsvektorer i den här artikeln.

Lägga till en konfiguration för vektorsökning

En vektorkonfiguration anger de parametrar som används under indexeringen för att skapa "närmaste granne"-information bland vektornoderna:

  • Hierarkisk navigerbar liten värld (HNSW)
  • Fullständig KNN

Om du väljer HNSW i ett fält kan du välja fullständig KNN vid frågetillfället. Men den andra riktningen fungerar inte: om du väljer fullständig kan du inte senare begära HNSW-sökning eftersom de extra datastrukturer som möjliggör ungefärlig sökning inte finns.

En vektorkonfiguration anger också kvantiseringsmetoder för att minska vektorstorleken:

  • Skalär
  • Binärt (endast tillgängligt i 2024-07-01 och i nyare Azure SDK-paket)

Anvisningar om hur du migrerar till den senaste versionen finns i Uppgradera REST API.

2024-07-01 är allmänt tillgängligt. Den stöder en vektorkonfiguration med:

  • vectorSearch.algorithms stöd för HNSW och uttömmande KNN.
  • vectorSearch.compressions stöder skalär och binär kvantisering, översampling och reranking med ursprungliga vektorer.
  • vectorSearch.profiles tillhandahålla flera kombinationer av algoritm- och komprimeringskonfigurationer.

Se till att ha en strategi för att vektorisera ditt innehåll. Vi rekommenderar integrerad vektorisering och frågetidsvektoriserare för inbyggd kodning.

  1. Använd API:et Skapa eller uppdatera index för att skapa indexet.

  2. Lägg till ett vectorSearch avsnitt i indexet som anger de sökalgoritmer som används för att skapa inbäddningsutrymmet.

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

    Viktiga punkter:

    • Namn för varje konfiguration av komprimering, algoritm och profil måste vara unika för dess typ i indexet.

    • vectorSearch.compressions.kind kan vara scalarQuantization eller binaryQuantization.

    • vectorSearch.compressions.rerankWithOriginalVectors använder de ursprungliga, okomprimerade vektorerna för att beräkna om likheten och beräkna om de översta resultaten som returneras av den första sökfrågan. De okomprimerade vektorerna finns i sökindexet även om stored det är falskt. Den här egenskapen är valfri. Standard är sant.

    • vectorSearch.compressions.defaultOversampling Parlamentet anser att det finns en bredare uppsättning potentiella resultat för att kompensera för minskningen av informationen från kvantiseringen. Formeln för potentiella resultat består av k i frågan, med en översamplingsmultiplikator. Om frågan till exempel anger en k av 5 och översampling är 20, begär frågan effektivt 100 dokument för användning vid omrankning, med den ursprungliga okomprimerade vektorn för det ändamålet. Endast de högst k rankade resultaten returneras. Den här egenskapen är valfri. Standardvärdet är 4.

    • vectorSearch.compressions.scalarQuantizationParameters.quantizedDataType måste anges till int8. Det här är den enda primitiva datatypen som stöds just nu. Den här egenskapen är valfri. Standard är int8.

    • vectorSearch.algorithms.kind är antingen "hnsw" eller "exhaustiveKnn". Det här är ann-algoritmerna (Ungefärliga närmaste grannar) som används för att organisera vektorinnehåll under indexering.

    • vectorSearch.algorithms.m är antalet dubbelriktade länkar. Standardvärdet är 4. Intervallet är 4 till 10. Lägre värden bör returnera mindre brus i resultatet.

    • vectorSearch.algorithms.efConstruction är antalet närmaste grannar som används under indexeringen. Standardvärdet är 400. Intervallet är mellan 100 och 1 000.

    • "vectorSearch.algorithms.fSearch är antalet närmaste grannar som används under sökningen. Standardvärdet är 500. Intervallet är mellan 100 och 1 000.

    • vectorSearch.algorithms.metric bör vara "cosiné" om du använder Azure OpenAI, annars använder du likhetsmåttet som är associerat med den inbäddningsmodell som du använder. Värden som stöds är cosine, dotProduct, euclidean, hamming (används för indexering av binära data).

    • vectorSearch.profiles lägg till ett abstraktionslager för att ta emot mer omfattande definitioner. En profil definieras i vectorSearchoch refereras sedan med namn på varje vektorfält. Det är en kombination av komprimerings- och algoritmkonfigurationer. Det här är den egenskap som du tilldelar till ett vektorfält och avgör fältens algoritm och komprimering.

Lägga till ett vektorfält i fältsamlingen

Fältsamlingen måste innehålla ett fält för dokumentnyckeln, vektorfälten och alla andra fält som du behöver för hybridsökningsscenarier.

Vektorfält kännetecknas av sin datatyp, en dimensions egenskap som baseras på den inbäddningsmodell som används för att mata ut vektorerna och en vektorprofil.

2024-07-01 är allmänt tillgängligt.

  1. Använd Skapa eller uppdatera index för att skapa indexet.

  2. Definiera ett vektorfält med följande attribut. Du kan lagra en genererad inbäddning per fält. För varje vektorfält:

    • type måste vara en vektordatatyp. Collection(Edm.Single) är den vanligaste för inbäddningsmodeller.
    • dimensions är antalet dimensioner som genereras av inbäddningsmodellen. För text-embedding-ada-002 är det 1536.
    • vectorSearchProfile är namnet på en profil som definierats någon annanstans i indexet.
    • searchable måste vara sant.
    • retrievable kan vara sant eller falskt. True returnerar råvektorerna (1536 av dem) som oformaterad text och förbrukar lagringsutrymme. Ange sant om du skickar ett vektorresultat till en nedströmsapp.
    • stored kan vara sant eller falskt. Den avgör om en extra kopia av vektorer lagras för hämtning. Mer information finns i Minska vektorstorlek.
    • filterable, facetable, sortable måste vara falskt.
  3. Lägg till filterbara icke-inledande fält i samlingen, till exempel "rubrik" med filterable värdet true, om du vill anropa förfiltrering eller postfiltrering i vektorfrågan.

  4. Lägg till andra fält som definierar ämnet och strukturen för det textinnehåll som du indexerar. Du behöver minst en dokumentnyckel.

    Du bör också lägga till fält som är användbara i frågan eller i dess svar. I följande exempel visas vektorfält för rubrik och innehåll ("titleVector", "contentVector") som motsvarar vektorer. Den innehåller också fält för motsvarande textinnehåll ("rubrik", "innehåll") som är användbart för sortering, filtrering och läsning i ett sökresultat.

    I följande exempel visas fältsamlingen:

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

Läsa in vektordata för indexering

Innehåll som du anger för indexering måste överensstämma med indexschemat och innehålla ett unikt strängvärde för dokumentnyckeln. Fördefinierade data läses in i ett eller flera vektorfält, som kan samexistera med andra fält som innehåller alfanumeriskt innehåll.

Du kan använda push - eller pull-metoder för datainmatning.

Använd Dokument – Index för att läsa in vektor- och icke-bevektordata till ett index. Push-API:erna för indexering är identiska i alla stabila versioner och förhandsversioner. Använd något av följande API:er för att läsa in dokument:

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

Kontrollera ditt index för vektorinnehåll

I valideringssyfte kan du fråga indexet med hjälp av Search Explorer i Azure-portalen eller ett REST API-anrop. Eftersom Azure AI Search inte kan konvertera en vektor till text som kan läsas av människor kan du försöka returnera fält från samma dokument som visar matchningen. Om vektorfrågan till exempel riktar sig mot fältet "titleVector" kan du välja "rubrik" för sökresultaten.

Fält måste tillskrivas som "hämtningsbara" för att inkluderas i resultatet.

  • Granska indexen i Sökhanteringsindex> för att visa indexstorlekens upp- och vektorindexstorlek. En positiv vektorindexstorlek indikerar att vektorer finns.

  • Använd Sökutforskaren för att köra frågor mot ett index. Sökutforskaren har två vyer: Frågevy (standard) och JSON-vy.

    • Ange Frågealternativ>Dölj vektorvärden i sökresultat för mer läsbara resultat.

    • Använd JSON-vyn för vektorfrågor. Du kan antingen klistra in en JSON-definition av den vektorfråga som du vill köra eller använda den inbyggda text-till-vektor- eller bild-till-vektorkonverteringen om ditt index har en vektoriserartilldelning. Mer information om bildsökning finns i Snabbstart: Sök efter bilder i Sökutforskaren.

    • Använd standardvyn Fråge för en snabb bekräftelse på att indexet innehåller vektorer. Frågevyn är avsedd för fulltextsökning. Även om du inte kan använda den för vektorfrågor kan du skicka en tom sökning (search=*) för att söka efter innehåll. Innehållet i alla fält, inklusive vektorfält, returneras som oformaterad text.

    • Mer information finns i Skapa en vektorfråga .

Uppdatera ett vektorlager

Om du vill uppdatera ett vektorlager ändrar du schemat och läser in dokument igen för att fylla i nya fält. API:er för schemauppdateringar inkluderar Create or Update Index (REST), CreateOrUpdateIndex i Azure SDK för .NET, create_or_update_index i Azure SDK för Python och liknande metoder i andra Azure SDK:er.

Standardvägledningen för att uppdatera ett index beskrivs i Uppdatera eller återskapa ett index.

Viktiga punkter är:

  • Släpp och återskapa krävs ofta för uppdateringar av och borttagning av befintliga fält.

  • Du kan dock uppdatera ett befintligt schema med följande ändringar, utan att behöva återskapa det:

    • Lägg till nya fält i en fältsamling.
    • Lägg till nya vektorkonfigurationer, tilldelade till nya fält men inte befintliga fält som redan har vektoriserats.
    • Ändra "hämtningsbar" (värden är sanna eller falska) i ett befintligt fält. Vektorfält måste vara sökbara och hämtningsbara, men om du vill inaktivera åtkomsten till ett vektorfält i situationer där det inte går att släppa och återskapa kan du ange hämtningsbar till false.

Nästa steg

Som ett nästa steg rekommenderar vi Frågevektordata i ett sökindex.

Kodexempel på lagringsplatsen azure-search-vector visar arbetsflöden från slutpunkt till slutpunkt som innehåller schemadefinition, vektorisering, indexering och frågor.

Det finns demokod för Python, C#och JavaScript.