Dela 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ärmaste 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.

Algoritmer för vektorsökning är:

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

Om 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. Eftersom algoritmen inte kräver snabb slumpmässig åtkomst av datapunkter förbrukar KNN inte kvot för vektorindexstorlek . Den tillhandahåller dock den globala uppsättningen med närmsta grannar.

Uttömmande KNN är beräkningsintensivt, så använd det för små till medelstora datamängder eller när behovet av precision överväger behovet av frågeprestanda. Ett annat användningsfall är att skapa en datauppsättning för att utvärdera återkallandet av en ANN-algoritm, eftersom fullständig KNN kan användas för att bygga den grundläggande sanningsuppsättningen för närmaste grannar.

Om HNSW

HNSW är en ANN-algoritm som är optimerad för program med hög träffsäkerhet och låg latens med okänd eller flyktig datadistribution. Under indexeringen skapar HNSW extra datastrukturer som organiserar datapunkter i ett hierarkiskt diagram. Under frågeexekveringen navigerar HNSW genom den här grafen för att hitta de mest relevanta matchningarna, vilket möjliggör effektiva sökningar efter närmaste grannar.

HNSW kräver att alla datapunkter finns i minnet för snabb slumpmässig åtkomst, vilket förbrukar vektorindexstorlekskvot . Den här designen balanserar söknoggrannheten med beräkningseffektivitet och gör HNSW lämplig för de flesta scenarier, särskilt vid sökning över större datamängder.

HNSW erbjuder flera justerbara konfigurationsparametrar för att optimera dataflöde, svarstid och återkalla för ditt sökprogram. Fält som anger HNSW stöder till exempel även fullständig KNN med hjälp av frågebegäransparametern"exhaustive": true. Fält som indexerats för exhaustiveKnn stöder dock inte HNSW-frågor eftersom de extra datastrukturer som möjliggör effektiv sökning inte finns.

Om ANN

ANN är en klass med algoritmer för att hitta matchningar i vektorutrymme. Den här klassen av algoritmer använder olika datastrukturer eller metoder för datapartitionering för att avsevärt minska sökutrymmet och påskynda frågebearbetningen.

ANN-algoritmer offrar viss noggrannhet men erbjuder skalbar och snabbare hämtning av ungefärliga närmaste grannar, vilket gör dem idealiska för att balansera noggrannhet och effektivitet i moderna program för informationshämtning. Du kan justera parametrarna för din algoritm för att finjustera kraven på återkallande, svarstid, minne och diskfotavtryck i sökprogrammet.

Azure AI Search använder HNSW för sin ANN-algoritm.

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.

Kommentar

Om du kör två eller flera vektorfrågor parallellt, eller om du gör en hybridsökning som kombinerar vektor- och textfrågor i samma begäran, används Reciprocal Rank Fusion (RRF) för att bedöma de slutliga sökresultaten.

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