Share via


Relevans i vektorsökning

Under körningen av vektorfrågor letar sökmotorn efter liknande vektorer för att hitta de bästa kandidaterna att returnera i sökresultat. Beroende på hur du indexerade vektorinnehållet är sökningen efter relevanta matchningar antingen fullständig eller begränsad till nära grannar för snabbare bearbetning. När kandidater hittas används likhetsmått för att poängsätta varje resultat baserat på matchningens styrka.

Den här artikeln beskriver de algoritmer som används för att hitta relevanta matchningar och likhetsmått som används för bedömning. Det ger också tips för att förbättra relevansen om sökresultaten inte uppfyller förväntningarna.

Vektorsökningsalgoritmer innehåller fullständiga k-närmaste grannar (KNN) och Hierarkisk navigerbar liten värld (HNSW).

Endast vektorfält som markerats som searchable i indexet, eller som searchFields i frågan, används för sökning och bedömning.

När du ska använda uttömmande KNN

Uttömmande KNN beräknar avstånden mellan alla par med datapunkter och hittar de exakta k närmaste grannarna för en frågepunkt. Det är avsett för scenarier där hög träffsäkerhet är av yttersta vikt och användarna är villiga att acceptera kompromisserna i frågesvarstid. Eftersom det är beräkningsintensivt använder du fullständigt KNN för små till medelstora datamängder, eller när precisionskraven överväger frågeprestandaöverväganden.

Ett sekonärt användningsfall är att skapa en datauppsättning för att utvärdera ungefärlig närmsta grannalgoritmåterkallelse. Uttömmande KNN kan användas för att bygga grunden sanningsuppsättningen av närmaste grannar.

Uttömmande KNN-stöd är tillgängligt via REST API för 2023-11-01, 2023-10-01-Preview REST API och i Azure SDK-klientbibliotek som riktar sig till någon av REST API-versionerna.

När du ska använda HNSW

Under indexeringen skapar HNSW extra datastrukturer för snabbare sökning och organiserar datapunkter i en hierarkisk grafstruktur. HNSW har flera konfigurationsparametrar som kan justeras för att uppnå mål för dataflöde, svarstid och återkallande för ditt sökprogram. Vid frågetillfället kan du till exempel ange alternativ för fullständig sökning, även om vektorfältet indexeras för HNSW.

Under frågekörningen aktiverar HNSW snabba grannfrågor genom att navigera i diagrammet. Den här metoden skapar en balans mellan söknoggrannhet och beräkningseffektivitet. HNSW rekommenderas för de flesta scenarier på grund av dess effektivitet vid sökning över större datamängder.

Så här fungerar närmsta grannsökning

Vektorfrågor körs mot ett inbäddningsutrymme som består av vektorer som genereras från samma inbäddningsmodell. I allmänhet matas indatavärdet i en frågebegäran in i samma maskininlärningsmodell som genererade inbäddningar i vektorindexet. Utdata är en vektor i samma inbäddningsutrymme. Eftersom liknande vektorer grupperas nära varandra motsvarar sökningen av matchningar att hitta de vektorer som är närmast frågevektorn och returnera de associerade dokumenten som sökresultat.

Om en frågebegäran till exempel gäller hotell mappar modellen frågan till en vektor som finns någonstans i klustret med vektorer som representerar dokument om hotell. Att identifiera vilka vektorer som liknar frågan mest, baserat på ett likhetsmått, avgör vilka dokument som är mest relevanta.

När vektorfält indexeras för fullständig KNN körs frågan mot "alla grannar". För fält som indexerats för HNSW använder sökmotorn en HNSW-graf för att söka över en delmängd av noder i vektorindexet.

Skapa HNSW-grafen

Under indexeringen konstruerar söktjänsten HNSW-grafen. Målet med att indexera en ny vektor i en HNSW-graf är att lägga till den i grafstrukturen på ett sätt som möjliggör effektiv sökning efter närmaste granne. Följande steg sammanfattar processen:

  1. Initiering: Börja med ett tomt HNSW-diagram eller det befintliga HNSW-diagrammet om det inte är ett nytt index.

  2. Startpunkt: Det här är den översta nivån i det hierarkiska diagrammet och fungerar som startpunkt för indexering.

  3. Lägga till i diagrammet: Olika hierarkiska nivåer representerar olika kornigheter i diagrammet, där högre nivåer är mer globala och lägre nivåer är mer detaljerade. Varje nod i diagrammet representerar en vektorpunkt.

    • Varje nod är ansluten till upp till m grannar som finns i närheten. Det här är parametern m .

    • Antalet datapunkter som betraktas som kandidatanslutningar styrs av parametern efConstruction . Den här dynamiska listan utgör uppsättningen med närmaste punkter i det befintliga diagrammet som algoritmen ska överväga. Högre efConstruction värden resulterar i att fler noder beaktas, vilket ofta leder till tätare lokala stadsdelar för varje vektor.

    • Dessa anslutningar använder den konfigurerade likheten metric för att fastställa avståndet. Vissa anslutningar är "fjärranslutningar" som ansluter över olika hierarkiska nivåer, vilket skapar genvägar i diagrammet som förbättrar sökeffektiviteten.

  4. Diagramrensning och optimering: Detta kan inträffa efter indexering av alla vektorer, och det förbättrar navigeringen och effektiviteten i HNSW-grafen.

En vektorfråga navigerar i den hierarkiska grafstrukturen för att söka efter matchningar. Följande sammanfattar stegen i processen:

  1. Initiering: Algoritmen initierar sökningen på den översta nivån i den hierarkiska grafen. Den här startpunkten innehåller den uppsättning vektorer som fungerar som startpunkter för sökning.

  2. Bläddring: Därefter passerar den grafnivån efter nivå, navigerar från den översta nivån till lägre nivåer och väljer kandidatnoder som ligger närmare frågevektorn baserat på det konfigurerade avståndsmåttet, till exempel cosininlikitet.

  3. Beskärning: För att förbättra effektiviteten rensar algoritmen sökutrymmet genom att endast överväga noder som sannolikt kommer att innehålla närmaste grannar. Detta uppnås genom att upprätthålla en prioritetskö med potentiella kandidater och uppdatera den när sökningen fortskrider. Längden på den här kön konfigureras av parametern efSearch.

  4. Förfining: När algoritmen flyttas till lägre, mer detaljerade nivåer överväger HNSW fler grannar nära frågan, vilket gör att kandidatuppsättningen av vektorer kan förfinas, vilket förbättrar noggrannheten.

  5. Slutförande: Sökningen slutförs när det önskade antalet närmaste grannar har identifierats eller när andra stoppvillkor uppfylls. Det här önskade antalet närmaste grannar styrs av frågetidsparametern k.

Likhetsmått som används för att mäta närhet

Algoritmen hittar kandidatvektorer för att utvärdera likheten. För att utföra den här uppgiften jämför en likhetsmåttberäkning kandidatvektorn med frågevektorn och mäter likheten. Algoritmen håller reda på den ordnade uppsättningen med de flesta liknande vektorer som hittas, vilket utgör den rankade resultatuppsättningen när algoritmen har slutförts.

Mätvärde Beskrivning
cosine Det här måttet mäter vinkeln mellan två vektorer och påverkas inte av olika vektorlängder. Matematiskt beräknar den vinkeln mellan två vektorer. Cosiné är likhetsmåttet som används av Azure OpenAI-inbäddningsmodeller, så om du använder Azure OpenAI anger du cosine i vektorkonfigurationen.
dotProduct Det här måttet mäter både längden på varje par med två vektorer och vinkeln mellan dem. Matematiskt beräknar den produkterna av vektorernas magnituder och vinkeln mellan dem. För normaliserade vektorer är detta identiskt med cosine likheten, men något mer högpresterande.
euclidean (kallas l2 normäven ) Det här måttet mäter längden på vektorskillnaden mellan två vektorer. Matematiskt beräknar det euklidiska avståndet mellan två vektorer, vilket är l2-normen för skillnaden mellan de två vektorerna.

Poäng i ett vektorsökresultat

Poängen beräknas och tilldelas till varje matchning, där de högsta matchningarna returneras som k resultat. Egenskapen @search.score innehåller poängen. I följande tabell visas det intervall inom vilket en poäng kommer att falla.

Sökmetod Parameter Bedömningsmått Intervall
vektorsökning @search.score Cosinus 0.333 - 1.00

Förcosine mått är det viktigt att observera att det beräknade @search.score inte är cosinévärdet mellan frågevektorn och dokumentvektorerna. I stället tillämpar Azure AI Search transformeringar så att poängfunktionen monotont minskar, vilket innebär att poängvärden alltid minskar i värde när likheten blir sämre. Den här omvandlingen säkerställer att sökpoäng kan användas i rangordningssyfte.

Det finns vissa nyanser med likhetspoäng:

  • Cosininlikitet definieras som cosiné för vinkeln mellan två vektorer.
  • Cosinnavståndet definieras som 1 - cosine_similarity.

För att skapa en monotont minskande funktion definieras den @search.score som 1 / (1 + cosine_distance).

Utvecklare som behöver ett cosininvärde i stället för det syntetiska värdet kan använda en formel för att konvertera sökpoängen tillbaka till cosinéavstånd:

double ScoreToSimilarity(double score)
{
    double cosineDistance = (1 - score) / score;
    return  -cosineDistance + 1;
}

Att ha det ursprungliga cosinévärdet kan vara användbart i anpassade lösningar som ställer in tröskelvärden för att trimma resultat av resultat av låg kvalitet.

Tips för relevansjustering

Om du inte får relevanta resultat kan du experimentera med ändringar i frågekonfigurationen. Det finns inga specifika justeringsfunktioner, till exempel en bedömningsprofil eller fält- eller termförstärkning, för vektorfrågor:

  • Experimentera med segmentstorlek och överlappning. Försök att öka segmentstorleken och se till att det finns tillräckligt med överlappning för att bevara kontexten eller kontinuiteten mellan segment.

  • För HNSW kan du prova olika nivåer för efConstruction att ändra den interna sammansättningen av närhetsdiagrammet. Standardvärdet är 400. Intervallet är mellan 100 och 1 000.

  • Öka k resultaten för att mata in fler sökresultat i en chattmodell, om du använder en.

  • Prova hybridfrågor med semantisk rangordning. Vid benchmark-testning gav den här kombinationen konsekvent de mest relevanta resultaten.

Nästa steg