Relevanz in der Vektorsuche

Während der Ausführung von Vektorabfragen sucht die Suchmaschine nach ähnlichen Vektoren, um die besten Kandidaten zu finden, die in Suchergebnissen zurückgegeben werden sollen. Je nachdem, wie Sie den Vektorinhalt indiziert haben, ist die Suche nach relevanten Übereinstimmungen entweder erschöpfend oder für eine schnellere Verarbeitung auf benachbarte Nachbarn beschränkt. Sobald Kandidaten gefunden wurden, werden Ähnlichkeitsmetriken verwendet, um jedes Ergebnis basierend auf der Stärke der Übereinstimmung zu bewerten.

Dieser Artikel erläutert die Algorithmen, die verwendet werden, um relevante Übereinstimmungen und die für die Bewertung verwendeten Ähnlichkeitsmetriken zu suchen. Es bietet auch Tipps zur Verbesserung der Relevanz, wenn Suchergebnisse nicht den Erwartungen entsprechen.

Vektorsuchalgorithmen umfassen erschöpfende KNN (k-nächste Nachbarn) und HNSW (Hierarchical Navigable Small World).

Für die Suche werden nur Vektorfelder verwendet, die im Index als searchable oder in der Abfrage als searchFields markiert sind.

Wann erschöpfende KNN verwendet werden soll

Erschöpfende KNN berechnet die Abstände zwischen allen Datenpunktpaaren und sucht die genau k nächsten Nachbarn für einen Abfragepunkt. Dies ist für Szenarien gedacht, in denen ein hoher Abruf von größter Bedeutung ist und die Benutzer bereit sind, die Kompromisse bei der Abfragewartezeit zu akzeptieren. Da es rechenintensiv ist, verwenden Sie erschöpfende KNN für kleine bis mittlere Datasets oder wenn Genauigkeitsanforderungen Überlegungen zur Abfrageleistung überwiegen.

Eine zweiter Anwendungsfall besteht darin, ein Dataset zu erstellen, um einen Algorithmusabruf der ungefähren nächsten Nachbarn auszuwerten. Erschöpfende KNN kann verwendet werden, um die Grundwahrheit der Pixelwiederholung zu erstellen.

Umfassende KNN-Unterstützung ist über die REST-API 2023-11-01, die REST-API 2023-10-01-Preview und in Azure SDK-Clientbibliotheken verfügbar, die auf eine der REST-API-Versionen abzielen.

Verwendung von HNSW

Während der Indizierung erstellt HNSW zusätzliche Datenstrukturen für eine schnellere Suche und organisiert Datenpunkte in eine hierarchische Graphstruktur. HNSW verfügt über mehrere Konfigurationsparameter, die optimiert werden können, um den Durchsatz, die Latenz und die Rückrufziele für Ihre Suchanwendung zu erreichen. Beispielsweise können Sie zur Abfragezeit Optionen für eine erschöpfende Suche angeben, auch wenn das Vektorfeld für HNSW indiziert ist.

Während der Abfrageausführung ermöglicht HNSW schnelle Nachbarschaftsabfragen durch Navigieren durch den Graphen. Mit diesem Ansatz wird ein Gleichgewicht zwischen Suchgenauigkeit und Recheneffizienz erreicht. HNSW wird für die meisten Szenarien aufgrund ihrer Effizienz bei der Suche über größere Datensätze empfohlen.

Funktionsweise der Pixelwiederholungssuche

Vektorabfragen werden für einen Einbettungsraum ausgeführt, der aus demselben Einbettungsmodell generierten Vektoren besteht. Im Allgemeinen wird der Eingabewert innerhalb einer Abfrageanforderung in dasselbe Machine Learning-Modell eingespeist, das Einbettungen im Vektorindex generiert hat. Die Ausgabe ist ein Vektor im gleichen Einbettungsraum. Da ähnliche Vektoren eng gruppiert sind, entspricht die Suche nach Übereinstimmungen dem Auffinden der Vektoren, die dem Abfragevektor am nächsten sind, und dem Zurückgeben der zugehörigen Dokumente als Suchergebnis.

Wenn sich beispielsweise eine Abfrageanfrage um Hotels handelt, ordnet das Modell die Abfrage einem Vektor zu, der irgendwo im Cluster von Vektoren vorhanden ist, die Dokumente zu Hotels darstellen. Anhand einer Ähnlichkeitsmetrik bestimmen Sie, welche Vektoren der Abfrage am ehesten ähneln.

Wenn Vektorfelder für vollständige KNN indiziert werden, wird die Abfrage für „alle Nachbarn“ ausgeführt. Bei Feldern, die für HNSW indiziert sind, verwendet die Suchmaschine ein HNSW-Diagramm, um eine Teilmenge von Knoten im Vektorindex zu durchsuchen.

Erstellen des HNSW-Diagramms

Während der Indizierung erstellt der Suchdienst den HNSW-Graphen. Das Ziel der Indizierung eines neuen Vektors in einem HNSW-Diagramm besteht darin, ihn der Diagrammstruktur auf eine Weise hinzuzufügen, die eine effiziente Pixelwiederholungssuche ermöglicht. Die folgenden Schritte fassen den Prozess zusammen:

  1. Initialisierung: Beginnen Sie mit einem leeren HNSW-Diagramm oder dem vorhandenen HNSW-Diagramm, wenn es sich nicht um einen neuen Index handelt.

  2. Einstiegspunkt: Dies ist die oberste Ebene des hierarchischen Diagramms und dient als Startpunkt für die Indizierung.

  3. Hinzufügen zum Diagramm: Verschiedene hierarchische Ebenen stellen unterschiedliche Granularitäten des Diagramms dar, wobei höhere Ebenen globaler sind und niedrigere Ebenen präziser sind. Jeder Knoten im Diagramm stellt einen Vektorpunkt dar.

    • Jeder Knoten ist mit m Nachbarn verbunden, die sich in der Nähe befinden. Dies ist der m Parameter.

    • Die Anzahl der Datenpunkte, die als Kandidatenverbindungen betrachtet werden, wird durch den efConstruction-Parameter gesteuert. Diese dynamische Liste bildet den Satz der nächstgelegenen Punkte im vorhandenen Diagramm, damit der Algorithmus berücksichtigt werden kann. Höhere efConstruction Werte führen dazu, dass mehr Knoten berücksichtigt werden, was häufig dazu führt, dass die lokalen Umgebungen für jeden Vektor verdichtet werden.

    • Diese Verbindungen verwenden die konfigurierte metric Ähnlichkeit, um den Abstand zu bestimmen. Einige Verbindungen sind „Fernverbindungen“, die sich über verschiedene hierarchische Ebenen hinweg verbinden, wodurch Verknüpfungen im Diagramm erstellt werden, die die Sucheffizienz verbessern.

  4. Bereinigung und Optimierung des Graphen: Dies kann nach der Indizierung aller Vektoren geschehen und verbessert die Navigationsfähigkeit und Effizienz des HNSW-Graphen.

Eine Vektorabfrage navigiert in der hierarchischen Graphstruktur, um nach Übereinstimmungen zu scannen. Im Folgenden werden die Schritte im Prozess zusammengefasst:

  1. Initialisierung: Der Algorithmus initiiert die Suche auf der obersten Ebene des hierarchischen Diagramms. Dieser Einstiegspunkt enthält den Satz von Vektoren, die als Ausgangspunkt für die Suche dienen.

  2. Traversal: Als Nächstes durchläuft es die Diagrammebene nach Ebene, navigiert von der obersten Ebene zu niedrigeren Ebenen und wählt Kandidatenknoten aus, die näher am Abfragevektor liegen, basierend auf der konfigurierten Entfernungsmetrik, z. B. Kosinusähnlichkeit.

  3. Pruning: Um die Effizienz zu verbessern, schneidet der Algorithmus den Suchbereich, indem nur Knoten berücksichtigt werden, die wahrscheinlich nächste Umgebung enthalten. Dies wird erreicht, indem eine Prioritätswarteschlange potenzieller Kandidaten beibehalten und aktualisiert wird, während die Suche fortschreitet. Die Länge dieser Warteschlange wird durch den Parameter efSearchkonfiguriert.

  4. Einschränkung: Wenn der Algorithmus zu niedrigeren, granulareren Ebenen wechselt, berücksichtigt HNSW weitere Umgebungen in der Nähe der Abfrage, wodurch der Kandidatensatz von Vektoren optimiert und die Genauigkeit verbessert werden kann.

  5. Abschluss: Die Suche wird abgeschlossen, wenn die gewünschte Anzahl der nächsten Umgebung identifiziert wurde oder wenn andere Stoppkriterien erfüllt sind. Diese gewünschte Anzahl der nächsten Nachbarn wird vom Abfragezeitparameter k gesteuert.

Ähnlichkeitsmetriken, die zum Messen der Nähe verwendet werden

Der Algorithmus findet Kandidatenvektoren zum Auswerten der Ähnlichkeit. Zum Ausführen dieser Aufgabe vergleicht eine Berechnung der Ähnlichkeitsmetrik den Kandidatenvektor mit dem Abfragevektor und misst die Ähnlichkeit. Der Algorithmus verfolgt den sortierten Satz der ähnlichsten Vektoren, die gefunden werden, was den bewerteten Resultset bildet, wenn der Algorithmus den Abschluss erreicht hat.

Metrik Beschreibung
cosine Diese Metrik misst den Winkel zwischen zwei Vektoren und wird von unterschiedlichen Vektorlängen nicht beeinflusst. Mathematisch berechnet sie den Winkel zwischen zwei Vektoren. Kosinus ist die Ähnlichkeitsmetrik, die von Azure Open KI-Einbettungsmodellen verwendet wird. Wenn Sie Also Azure OpenAI verwenden, geben Sie cosine in der Vektorkonfiguration an.
dotProduct Diese Metrik misst sowohl die Länge jedes Paars von zwei Vektoren als auch den Winkel dazwischen. Mathematisch berechnet es die Produkte der Größen von Vektoren und den Winkel dazwischen. Bei normalisierten Vektoren ist dies identisch mit cosine der Ähnlichkeit, aber etwas leistungsleistungsfähiger.
euclidean (auch bekannt als l2 norm) Diese Metrik misst die Länge des Vektorunterschieds zwischen zwei Vektoren. Mathematisch berechnet sie den Euklidischen Abstand zwischen zwei Vektoren, was die l2-Norm des Unterschieds der beiden Vektoren ist.

Bewertungen in Vektorsuchergebnissen

Scores werden berechnet und den einzelnen Übereinstimmungen zugewiesen, wobei die höchsten Übereinstimmungen als k-Ergebnisse zurückgegeben werden. Die @search.score-Eigenschaft enthält den Score. Die folgende Tabelle zeigt die Spanne, in die eine Score fallen wird.

Suche Parameter Bewertungsmetrik Bereich
Vektorsuche @search.score Kosinus 0.333 – 1.00

Für die cosine-Metrik ist es wichtig zu beachten, dass der berechnete @search.score nicht der Kosinuswert zwischen dem Abfragevektor und den Dokumentvektoren ist. Stattdessen wendet Azure KI Search Transformationen an, sodass die Bewertungsfunktion monoton abnimmt, was bedeutet, dass die Bewertungswerte immer kleiner werden, wenn die Ähnlichkeit schlimmer wird. Diese Transformation stellt sicher, dass Suchergebnisse für Bewertungszwecke verwendet werden können.

Es gibt einige Nuancen mit Ähnlichkeitsbewertungen:

  • Kosinusähnlichkeit wird als Kosinus des Winkels zwischen zwei Vektoren definiert.
  • Kosinusabstand ist definiert als 1 - cosine_similarity.

Um eine monotonisch abnehmende Funktion zu erstellen, wird dies @search.score als definiert. 1 / (1 + cosine_distance)

Entwickler, die anstelle des synthetischen Werts einen Kosinuswert benötigen, können eine Formel verwenden, um die Suchbewertung wieder in Kosinusabstand umzuwandeln:

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

Der ursprüngliche Kosinuswert kann bei benutzerdefinierten Lösungen hilfreich sein, die Schwellenwerte einrichten, um Ergebnisse von Ergebnissen niedriger Qualität zu kürzen.

Tipps zur Optimierung der Relevanz

Wenn Sie keine relevanten Ergebnisse erhalten, experimentieren Sie mit Änderungen an der Abfragekonfiguration. Für Vektorabfragen gibt es keine spezifischen Optimierungsfeatures, z. B. ein Bewertungsprofil oder ein Feld oder eine Ausdruckssteigerung:

  • Experimentieren Sie mit Blockgröße und Überlappung. Versuchen Sie, die Blockgröße zu erhöhen und sicherzustellen, dass genügend Überlappung vorhanden ist, um den Kontext oder die Kontinuität zwischen Blöcken beizubehalten.

  • Probieren Sie für HNSW verschiedene Ebenen von efConstruction aus, um die interne Zusammensetzung des Näherungsgraphen zu ändern. Der Standardwert ist 400. Der Bereich liegt zwischen 100 und 1.000.

  • Erhöhen Sie k-Ergebnisse, um weitere Suchergebnisse in ein Chatmodell einzuspeisen, wenn Sie eines verwenden.

  • Testen Sie Hybridabfragen mit semantischer Rangfolge. Bei Benchmarktests erzeugte diese Kombination durchweg die relevantesten Ergebnisse.

Nächste Schritte