Dela via


Vektorindex i Azure AI Search

Vektorer är högdimensionella inbäddningar som representerar text, bilder och annat innehåll matematiskt. Azure AI Search lagrar vektorer på fältnivå, vilket gör att vektor- och icke-bevektorinnehåll kan samexistera inom samma sökindex.

Ett sökindex blir ett vektorindex när du definierar vektorfält och en vektorkonfiguration. Om du vill fylla i vektorfält kan du push-överföra förberäknade inbäddningar till dem eller använda integrerad vektorisering, en inbyggd Azure AI Search-funktion som genererar inbäddningar under indexering.

Vid frågetillfället möjliggör vektorfälten i indexet likhetssökning, där systemet hämtar dokument vars vektorer mest liknar vektorfrågan. Du kan använda vektorsökning för likhetsmatchning ensam eller hybridsökning efter en kombination av likhet och nyckelordsmatchning.

Den här artikeln beskriver de viktigaste begreppen för att skapa och hantera ett vektorindex, inklusive:

  • Mönster för vektorhämtning
  • Innehåll (vektorfält och konfiguration)
  • Fysisk datastruktur
  • Grundläggande åtgärder

Tips/Råd

Vill du komma igång direkt? Se Skapa ett vektorindex.

Mönster för vektorhämtning

Azure AI Search stöder två mönster för vektorhämtning:

  • Klassisk sökning. Det här mönstret använder ett sökfält, frågeindata och renderade resultat. Under frågekörningen vektoriserar sökmotorn eller programkoden användarens indata. Sökmotorn utför sedan vektorsökning över vektorfälten i ditt index och formulerar ett svar som du renderar i en klientapp.

    I Azure AI Search returneras resultaten som en utplattad raduppsättning och du kan välja vilka fält som ska inkluderas i svaret. Även om sökmotorn matchar vektorer bör ditt index ha icke-beläsbart innehåll som kan läsas av människor för att fylla i sökresultaten. Klassisk sökning stöder både vektorfrågor och hybridfrågor.

  • Generativ sökning. Språkmodeller använder data från Azure AI Search för att svara på användarfrågor. Ett orkestreringslager samordnar vanligtvis frågor och underhåller kontexten och matar sökresultat till chattmodeller som GPT. Det här mönstret baseras på RAG-arkitekturen (retrieval augmented generation), där sökindexet tillhandahåller grunddata.

Schema för ett vektorindex

Schemat för ett vektorindex kräver följande:

  • Namn
  • Nyckelfält (sträng)
  • Ett eller flera vektorfält
  • Vektorkonfiguration

Icke-vektorfält krävs inte, men vi rekommenderar att inkludera dem för hybridfrågor eller för att returnera ordagrant innehåll som inte bearbetas av en språkmodell. Mer information finns i Skapa ett vektorindex.

Indexschemat bör återspegla vektorhämtningsmönstret. I det här avsnittet beskrivs främst fältsammansättning för klassisk sökning, men det innehåller även schemavägledning för generativ sökning.

Grundläggande konfiguration av vektorfält

Vektorfält har unika datatyper och egenskaper. Så här ser ett vektorfält ut i en fältsamling:

{
    "name": "content_vector",
    "type": "Collection(Edm.Single)",
    "searchable": true,
    "retrievable": true,
    "dimensions": 1536,
    "vectorSearchProfile": "my-vector-profile"
}

Endast vissa datatyper stöds för vektorfält. Den vanligaste typen är Collection(Edm.Single), men att använda smala typer kan spara på lagringen.

Vektorfält måste vara sökbara och hämtningsbara, men de kan inte vara filterbara, fasettbara eller sorterbara. De kan inte heller ha analysverktyg, normaliserare eller synonymmappningstilldelningar.

Egenskapen dimensions måste anges till antalet inbäddningar som genereras av inbäddningsmodellen. Text-embedding-ada-002 genererar till exempel 1 536 inbäddningar för varje textsegment.

Vektorfält indexeras med hjälp av algoritmer som anges i en vektorsökningsprofil, som definieras någon annanstans i indexet och inte visas i det här exemplet. Mer information finns i Lägga till en konfiguration för vektorsökning.

Fältsamling för grundläggande vektorarbetsbelastningar

Vektorindex kräver mer än bara vektorfält. Till exempel måste alla index ha ett nyckelfält, som finns id i följande exempel:

"name": "example-basic-vector-idx",
"fields": [
  { "name": "id", "type": "Edm.String", "searchable": false, "filterable": true, "retrievable": true, "key": true },
  { "name": "content_vector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": null },
  { "name": "content", "type": "Edm.String", "searchable": true, "retrievable": true, "analyzer": null },
  { "name": "metadata", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true }
]

Andra fält, till exempel fältet content , anger den läsbara motsvarigheten till content_vector fältet. Om du använder språkmodeller uteslutande för svarsformulering kan du utelämna icke-bevektorinnehållsfält, men lösningar som skickar sökresultat direkt till klientappar bör ha icke-bevektorinnehåll.

Metadatafält är användbara för filter, särskilt om de innehåller ursprungsinformation om källdokumentet. Även om du inte kan filtrera direkt på ett vektorfält kan du ange förfilter- eller postfilterlägen för att filtrera före eller efter körning av vektorfrågor.

Schema som genereras av guiden Importera och vektorisera data

Vi rekommenderar guiden Importera och vektorisera data för utvärderings- och koncepttestning. Guiden genererar exempelschemat i det här avsnittet.

Guiden delar upp innehållet i mindre sökdokument, vilket gynnar RAG-appar som använder språkmodeller för att formulera svar. Segmentering hjälper dig att hålla dig inom indatagränserna för språkmodeller och tokengränserna för semantisk rankning. Det förbättrar också precisionen i likhetssökningen genom att matcha frågor mot segment som hämtats från flera överordnade dokument. För mer information, se Segmentera stora dokument för vektorsökningslösningar.

För varje sökdokument i följande exempel finns det ett segment-ID, överordnat ID, segment, rubrik och vektorfält. Guiden:

  • Fyller i fälten chunk_id och parent_id med base64-kodade blobmetadata (sökväg).

  • Extraherar fälten chunk och title från blobinnehållet respektive blobnamnet.

  • Skapar fältet vector genom att anropa en Inbäddningsmodell för Azure OpenAI som du anger för att vektorisera fältet chunk . Endast vektorfältet genereras helt under den här processen.

"name": "example-index-from-import-wizard",
"fields": [
  { "name": "chunk_id", "type": "Edm.String", "key": true, "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true, "analyzer": "keyword"},
  { "name": "parent_id", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "sortable": true},
  { "name": "chunk", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true, "sortable": false},
  { "name": "title", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "sortable": false},
  { "name": "vector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-1707768500058-profile"}
]

Om du utformar vektorlagring för RAG- och chattappar kan du skapa två index:

  • En för statiskt innehåll som du indexerade och vektoriserade.
  • En för konversationer som kan användas i promptflöden.

I illustrativt syfte använder det här avsnittet chat-with-your-data-solution-accelerator för att skapa indexen chat-index och conversations .

Skärmbild av indexen som skapats av acceleratorn.

Följande fält från chat-index stödjer generativa sökupplevelser:

"name": "example-index-from-accelerator",
"fields": [
  { "name": "id", "type": "Edm.String", "searchable": false, "filterable": true, "retrievable": true },
  { "name": "content", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true },
  { "name": "content_vector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "my-vector-profile"},
  { "name": "metadata", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true },
  { "name": "title", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "facetable": true },
  { "name": "source", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true  },
  { "name": "chunk", "type": "Edm.Int32", "searchable": false, "filterable": true, "retrievable": true },
  { "name": "offset", "type": "Edm.Int32", "searchable": false, "filterable": true, "retrievable": true }
]

Följande fält från conversations stöder orkestrering och chatthistorik:

"fields": [
    { "name": "id", "type": "Edm.String", "key": true, "searchable": false, "filterable": true, "retrievable": true, "sortable": false, "facetable": false },
    { "name": "conversation_id", "type": "Edm.String", "searchable": false, "filterable": true, "retrievable": true, "sortable": false, "facetable": true },
    { "name": "content", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true },
    { "name": "content_vector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "default-profile" },
    { "name": "metadata", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true },
    { "name": "type", "type": "Edm.String", "searchable": false, "filterable": true, "retrievable": true, "sortable": false, "facetable": true },
    { "name": "user_id", "type": "Edm.String", "searchable": false, "filterable": true, "retrievable": true, "sortable": false, "facetable": true },
    { "name": "sources", "type": "Collection(Edm.String)", "searchable": false, "filterable": true, "retrievable": true, "sortable": false, "facetable": true },
    { "name": "created_at", "type": "Edm.DateTimeOffset", "searchable": false, "filterable": true, "retrievable": true },
    { "name": "updated_at", "type": "Edm.DateTimeOffset", "searchable": false, "filterable": true, "retrievable": true }
]

Följande skärmbild visar sökresultat för conversations i Sökutforskaren:

Skärmbild av Sökutforskaren med resultat från ett index som utformats för RAG-appar.

I vårt exempel är sökpoängen 1,00 eftersom sökningen är okvalificerad. Flera fält stöder orkestrering och promptflöden:

  • conversation_id identifierar varje chattsession.
  • type anger om innehållet kommer från användaren eller assistenten.
  • created_at och updated_at tar bort chattar från historiken.

Fysisk struktur och storlek

I Azure AI Search är den fysiska strukturen för ett index till stor del en intern implementering. Du kan komma åt dess schema, läsa in och fråga dess innehåll, övervaka dess storlek och hantera dess kapacitet. Microsoft hanterar dock infrastruktur- och fysiska datastrukturer som lagras med din söktjänst.

Indexets storlek och ämne bestäms av följande:

  • Kvantitet och sammansättning av dina dokument.

  • Attribut för enskilda fält. Det krävs till exempel mer lagringsutrymme för filterbara fält.

  • Indexkonfiguration, inklusive vektorkonfigurationen som anger hur de interna navigeringsstrukturerna skapas. Du kan välja HNSW eller fullständig KNN för likhetssökning.

Azure AI Search begränsar vektorlagring, vilket hjälper till att upprätthålla ett balanserat och stabilt system för alla arbetsbelastningar. För att hjälpa dig att hålla dig under gränserna spåras vektoranvändningen och rapporteras separat i Azure-portalen och programmatiskt via tjänst- och indexstatistik.

Följande skärmbild visar en S1-tjänst som konfigurerats med en partition och en replik. Den här tjänsten har 24 små index, var och en med ett genomsnitt av ett vektorfält som består av 1 536 inbäddningar. Den andra panelen visar kvoten och användningen för vektorindex. Eftersom ett vektorindex är en intern datastruktur som skapats för varje vektorfält är lagring för vektorindex alltid en bråkdel av den totala lagring som används av indexet. Icke-vektorfält och andra datastrukturer förtär resten.

Skärmbild av användningspaneler som visar lagring, vektorindex och indexantal.

Gränser och uppskattningar för vektorindex beskrivs i en annan artikel, men två saker att betona är att maximal lagring beror på skapandedatum och prisnivå för söktjänsten. Nyare tjänster på samma nivå har betydligt mer kapacitet för vektorindex. Av följande skäl bör du:

Grundläggande åtgärder och interaktion

I det här avsnittet beskrivs vektorkörningsåtgärder, inklusive anslutning till och skydd av ett enda index.

Kommentar

Det finns inget portal- eller API-stöd för att flytta eller kopiera ett index. Vanligtvis pekar du antingen din applikationsdistribution till en annan söktjänst (med samma indexnamn) eller ändrar namnet för att skapa en kopia på den aktuella söktjänsten och sedan bygga den.

Indexisolering

I Azure AI Search arbetar du med ett index i taget. Alla indexrelaterade åtgärder riktar sig mot ett enda index. Det finns inget begrepp om relaterade index eller sammanfogning av oberoende index för indexering eller frågor.

Kontinuerligt tillgänglig

Ett index är omedelbart tillgängligt för frågor så snart det första dokumentet indexeras, men det fungerar inte fullt ut förrän alla dokument har indexerats. Internt distribueras ett index mellan partitioner och körs på repliker. Det fysiska indexet hanteras internt. Du hanterar det logiska indexet.

Ett index är kontinuerligt tillgängligt och kan inte pausas eller tas offline. Eftersom det är utformat för kontinuerlig drift sker uppdateringar av innehållet och tillägg till själva indexet i realtid. Om en begäran sammanfaller med en dokumentuppdatering kan frågor tillfälligt returnera ofullständiga resultat.

Frågekontinuitet finns för dokumentåtgärder, till exempel uppdatering eller borttagning, och för ändringar som inte påverkar den befintliga strukturen eller integriteten för ett index, till exempel att lägga till nya fält. Strukturella uppdateringar, till exempel ändring av befintliga fält, hanteras vanligtvis med hjälp av ett drop-and-rebuild-arbetsflöde i en utvecklingsmiljö eller genom att skapa en ny version av indexet på produktionstjänsten.

För att undvika återskapande av index väljer vissa kunder som gör små ändringar att 'versionera' ett fält genom att skapa ett nytt som samexisterar med en tidigare version. Med tiden leder detta till överblivet innehåll genom föråldrade fält och föråldrade anpassade analysverktygsdefinitioner, särskilt i ett produktionsindex som är dyrt att replikera. Du kan åtgärda dessa problem under planerade uppdateringar av indexet som en del av indexets livscykelhantering.

Slutpunktsanslutning

Alla vektorindexerings- och frågebegäranden riktar sig mot ett index. Slutpunkter är vanligtvis en av följande:

Slutpunkt Anslutning och åtkomstkontroll
<your-service>.search.windows.net/indexes Siktar in sig på indexsamlingen. Används när du skapar, listar eller tar bort ett index. Administratörsrättigheter krävs för dessa åtgärder och är tillgängliga via administratörs-API-nycklar eller en sökdeltagareroll.
<your-service>.search.windows.net/indexes/<your-index>/docs Riktar in sig på dokumentsamlingen för ett enda index. Används när du kör frågor mot ett index eller en uppdatering av data. För frågor är läsbehörigheter tillräckliga och tillgängliga via fråge-API-nycklar eller en dataläsarroll. För datauppdatering krävs administratörsbehörighet.
  1. Kontrollera att du har behörigheter eller en API-åtkomstnyckel. Såvida du inte ställer frågor mot ett befintligt index behöver du administratörsrättigheter eller rollen Deltagare för att hantera och visa innehåll i en söktjänst.

  2. Börja med Azure Portal. Den person som skapade söktjänsten kan visa och hantera den, inklusive att ge åtkomst till andra på sidan Åtkomstkontroll (IAM).

  3. Gå vidare till andra klienter för programmatisk åtkomst. För de första stegen rekommenderar vi snabbstart: Vektorsökning med REST och lagringsplatsen azure-search-vector-samples .

Hantera vektorlager

Azure tillhandahåller en övervakningsplattform som innehåller diagnostikloggning och aviseringar. Vi rekommenderar att du gör följande:

Säker åtkomst till vektordata

Azure AI Search implementerar datakryptering, privata anslutningar för scenarier utan Internet och rolltilldelningar för säker åtkomst via Microsoft Entra-ID. Mer information om företagssäkerhetsfunktioner finns i Säkerhet i Azure AI Search.