Relevantie in vectorzoekopdrachten

Tijdens het uitvoeren van vectorquery's zoekt de zoekmachine naar vergelijkbare vectoren om de beste kandidaten te vinden die in zoekresultaten kunnen worden geretourneerd. Afhankelijk van hoe u de vectorinhoud hebt geïndexeerd, is de zoekopdracht naar relevante overeenkomsten volledig of beperkt tot nabijgelegen buren voor snellere verwerking. Zodra kandidaten zijn gevonden, worden metrische overeenkomsten gebruikt om elk resultaat te scoren op basis van de sterkte van de overeenkomst.

In dit artikel worden de algoritmen uitgelegd die worden gebruikt om relevante overeenkomsten te vinden en de overeenkomsten metrische gegevens die worden gebruikt voor scoren. Het biedt ook tips voor het verbeteren van relevantie als zoekresultaten niet voldoen aan de verwachtingen.

Vectorzoekalgoritmen omvatten uitgebreide k-dichtstbijzijnde buren (KNN) en Hierarchical Navigable Small World (HNSW).

  • Uitgebreide KNN voert een brute-force zoekopdracht uit die de gehele vectorruimte scant.

  • HNSW voert een dichtstbijzijnde buur (ANN) zoekopdracht uit.

Alleen vectorvelden die zijn gemarkeerd als searchable in de index, of zoals searchFields in de query, worden gebruikt voor het zoeken en scoren.

Wanneer moet u een volledige KNN gebruiken

Uitgebreide KNN berekent de afstanden tussen alle paren gegevenspunten en zoekt de exacte k dichtstbijzijnde buren voor een querypunt. Het is bedoeld voor scenario's waarbij hoge relevante overeenkomsten van groot belang zijn en gebruikers bereid zijn om de afwegingen in querylatentie te accepteren. Omdat het rekenintensief is, kunt u uitgebreide KNN gebruiken voor kleine tot middelgrote gegevenssets of wanneer precisievereisten opwegen tegen overwegingen voor queryprestaties.

Een seconary use case is het bouwen van een gegevensset om geschatte dichtstbijzijnde buuralgoritmen te evalueren. Uitgebreide KNN kan worden gebruikt om de grondwaarset van dichtstbijzijnde buren te bouwen.

Uitgebreide KNN-ondersteuning is beschikbaar via 2023-11-01 REST API, 2023-10-01-Preview REST API en in Azure SDK-clientbibliotheken die gericht zijn op een VAN de REST API-versies.

Wanneer gebruikt u HNSW?

Tijdens het indexeren maakt HNSW extra gegevensstructuren voor snellere zoekopdrachten, het ordenen van gegevenspunten in een hiërarchische grafiekstructuur. HNSW heeft verschillende configuratieparameters die kunnen worden afgestemd om de doorvoer, latentie en relevante doelstellingen voor uw zoektoepassing te bereiken. U kunt bijvoorbeeld tijdens query's opties opgeven voor uitgebreide zoekopdrachten, zelfs als het vectorveld is geïndexeerd voor HNSW.

Tijdens het uitvoeren van query's maakt HNSW snelle buurquery's mogelijk door door de grafiek te navigeren. Deze aanpak zorgt voor een evenwicht tussen de nauwkeurigheid van de zoekfunctie en de rekenkundige efficiëntie. HNSW wordt aanbevolen voor de meeste scenario's vanwege de efficiëntie bij het zoeken naar grotere gegevenssets.

Hoe dichtstbijzijnde buren zoeken werkt

Vectorquery's worden uitgevoerd op basis van een insluitruimte die bestaat uit vectoren die zijn gegenereerd op basis van hetzelfde insluitingsmodel. Over het algemeen wordt de invoerwaarde binnen een queryaanvraag ingevoerd in hetzelfde machine learning-model dat insluitingen in de vectorindex heeft gegenereerd. De uitvoer is een vector in dezelfde insluitingsruimte. Omdat vergelijkbare vectoren dicht bij elkaar zijn geclusterd, komt het zoeken naar overeenkomsten overeen met het vinden van de vectoren die het dichtst bij de queryvector liggen en de bijbehorende documenten retourneren als zoekresultaat.

Als een queryaanvraag bijvoorbeeld betrekking heeft op hotels, wijst het model de query toe aan een vector die zich ergens in het cluster van vectoren bevindt die documenten over hotels vertegenwoordigen. Bepalen welke vectoren het meest vergelijkbaar zijn met de query, op basis van een metrische overeenkomst, bepaalt welke documenten het meest relevant zijn.

Wanneer vectorvelden worden geïndexeerd voor een volledige KNN, wordt de query uitgevoerd op alle buren. Voor velden die zijn geïndexeerd voor HNSW, gebruikt de zoekmachine een HNSW-grafiek om te zoeken naar een subset van knooppunten binnen de vectorindex.

De HNSW-grafiek maken

Tijdens het indexeren maakt de zoekservice de HNSW-grafiek. Het doel van het indexeren van een nieuwe vector in een HNSW-grafiek is om deze toe te voegen aan de grafiekstructuur op een manier die efficiënt zoeken naar dichtstbijzijnde buren mogelijk maakt. De volgende stappen geven een overzicht van het proces:

  1. Initialisatie: Begin met een lege HNSW-grafiek of de bestaande HNSW-grafiek als dit geen nieuwe index is.

  2. Toegangspunt: dit is het hoogste niveau van de hiërarchische grafiek en fungeert als uitgangspunt voor indexering.

  3. Toevoegen aan de grafiek: Verschillende hiërarchische niveaus vertegenwoordigen verschillende granulariteiten van de grafiek, waarbij hogere niveaus globaaler zijn en lagere niveaus gedetailleerder zijn. Elk knooppunt in de grafiek vertegenwoordigt een vectorpunt.

    • Elk knooppunt is verbonden met maximaal m buren die zich in de buurt bevinden. Dit is de m parameter.

    • Het aantal gegevenspunten dat als kandidaatverbindingen wordt beschouwd, wordt bepaald door de efConstruction parameter. Deze dynamische lijst vormt de set dichtstbijzijnde punten in de bestaande grafiek die het algoritme kan overwegen. Hogere efConstruction waarden resulteren in meer knooppunten die vaak leiden tot dichtere lokale buurten voor elke vector.

    • Deze verbindingen maken gebruik van de geconfigureerde gelijkenis metric om de afstand te bepalen. Sommige verbindingen zijn 'langeafstandsverbindingen' die verbinding maken tussen verschillende hiërarchische niveaus, waardoor snelkoppelingen in de grafiek worden gemaakt die de zoekefficiëntie verbeteren.

  4. Graafsnoeien en optimalisatie: dit kan gebeuren na het indexeren van alle vectoren en verbetert de navigatie en efficiëntie van de HNSW-grafiek.

Een vectorquery navigeert door de hiërarchische grafiekstructuur om te scannen op overeenkomsten. Hieronder vindt u een overzicht van de stappen in het proces:

  1. Initialisatie: Het algoritme initieert de zoekopdracht op het hoogste niveau van de hiërarchische grafiek. Dit toegangspunt bevat de set vectoren die dienen als uitgangspunt voor zoeken.

  2. Doorkruising: Vervolgens wordt het grafiekniveau op niveau doorlopen, van het hoogste niveau naar lagere niveaus navigeren, kandidaatknooppunten selecteren die zich dichter bij de queryvector bevinden, op basis van de geconfigureerde afstandsmetriek, zoals cosinus-overeenkomsten.

  3. Pruning: Om de efficiëntie te verbeteren, verwijdert het algoritme de zoekruimte door alleen rekening te houden met knooppunten die waarschijnlijk de dichtstbijzijnde buren bevatten. Dit wordt bereikt door een prioriteitswachtrij van potentiële kandidaten te behouden en bij te werken naarmate de zoekopdracht vordert. De lengte van deze wachtrij wordt geconfigureerd door de parameter efSearch.

  4. Verfijning: Naarmate het algoritme wordt verplaatst naar lagere, gedetailleerdere niveaus, beschouwt HNSW meer buren in de buurt van de query, waardoor de kandidaat-set vectoren kan worden verfijnd, waardoor de nauwkeurigheid wordt verbeterd.

  5. Voltooiing: De zoekopdracht wordt voltooid wanneer het gewenste aantal dichtstbijzijnde buren is geïdentificeerd of wanneer aan andere stopcriteria wordt voldaan. Dit gewenste aantal dichtstbijzijnde buren wordt bepaald door de parameter kquerytijd.

Metrische overeenkomsten die worden gebruikt om de nabijheid te meten

Het algoritme vindt kandidaatvectoren om overeenkomsten te evalueren. Om deze taak uit te voeren, vergelijkt een metrische vergelijking van de kandidaatvector de kandidaatvector met de queryvector en meet de gelijkenis. Het algoritme houdt de geordende set met de meeste vergelijkbare vectoren bij die zijn gevonden, die de gerangschikte resultatenset vormt wanneer het algoritme is voltooid.

Metrisch Beschrijving
cosine Deze metrische waarde meet de hoek tussen twee vectoren en wordt niet beïnvloed door verschillende vectorlengten. Wiskundig wordt de hoek tussen twee vectoren berekend. Cosinus is de overeenkomstwaarde die wordt gebruikt door Azure OpenAI-insluitingsmodellen, dus als u Azure OpenAI gebruikt, geeft cosine u deze op in de vectorconfiguratie.
dotProduct Deze metrische waarde meet zowel de lengte van elk paar van twee vectoren als de hoek ertussen. Wiskundig berekent het de producten van de grootten van vectoren en de hoek ertussen. Voor genormaliseerde vectoren is dit identiek aan cosine overeenkomsten, maar iets beter presterend.
euclidean (ook wel bekend als l2 norm) Deze metrische waarde meet de lengte van het vectorverschil tussen twee vectoren. Wiskundig berekent het de Euclidische afstand tussen twee vectoren, wat de l2-norm is van het verschil van de twee vectoren.

Scores in een vectorzoekresultaat

Scores worden berekend en toegewezen aan elke overeenkomst, waarbij de hoogste overeenkomsten worden geretourneerd als k resultaten. De @search.score eigenschap bevat de score. In de volgende tabel ziet u het bereik waarin een score valt.

Zoekmethode Parameter Scoremetriek Bereik
vector zoeken @search.score Cosinus 0.333 - 1.00

Voorcosine metrische gegevens is het belangrijk om te weten dat de berekende @search.score waarde niet de cosinuswaarde is tussen de queryvector en de documentvectoren. In plaats daarvan past Azure AI Search transformaties toe, zodat de scorefunctie monotonisch afneemt, wat betekent dat scorewaarden altijd in waarde afnemen, omdat de gelijkenis erger wordt. Deze transformatie zorgt ervoor dat zoekscores bruikbaar zijn voor classificatiedoeleinden.

Er zijn enkele nuances met overeenkomstenscores:

  • Cosinus-gelijkenis wordt gedefinieerd als de cosinus van de hoek tussen twee vectoren.
  • Cosinusafstand wordt gedefinieerd als 1 - cosine_similarity.

Als u een monotonisch afnemende functie wilt maken, wordt de @search.score functie gedefinieerd als 1 / (1 + cosine_distance).

Ontwikkelaars die een cosinuswaarde nodig hebben in plaats van de synthetische waarde, kunnen een formule gebruiken om de zoekscore terug te zetten naar cosinusafstand:

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

Het gebruik van de oorspronkelijke cosinuswaarde kan nuttig zijn in aangepaste oplossingen die drempelwaarden instellen om de resultaten van resultaten van lage kwaliteit te knippen.

Tips voor het afstemmen van relevantie

Als u geen relevante resultaten krijgt, experimenteer dan met wijzigingen in de queryconfiguratie. Er zijn geen specifieke afstemmingsfuncties, zoals een scoreprofiel of veld of termverhoging, voor vectorquery's:

  • Experimenteer met segmentgrootte en overlap. Vergroot de segmentgrootte en zorg ervoor dat er voldoende overlap is om de context of continuïteit tussen segmenten te behouden.

  • Voor HNSW kunt u verschillende niveaus efConstruction proberen om de interne samenstelling van de nabijheidsgrafiek te wijzigen. De standaardwaarde is 400. Het bereik is 100 tot 1.000.

  • Verhoog k de resultaten om meer zoekresultaten in te voeren in een chatmodel, als u er een gebruikt.

  • Hybride query's proberen met semantische classificatie. Bij benchmarktests leverde deze combinatie consistent de meest relevante resultaten op.

Volgende stappen