View a markdown version of this page

Bewährte Methoden für Vektorindizes - Amazon DynamoDB

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Bewährte Methoden für Vektorindizes

Die folgenden Empfehlungen helfen Ihnen beim Entwerfen genauer, leistungsfähiger und kostengünstiger Vektorindizes.

Wählen Sie zuerst Ihr Einbettungsmodell und Ihre Abmessungen aus

Das von Ihnen verwendete Einbettungsmodell bestimmt die Anzahl der Dimensionen, die Ihre Vektoren haben, und Sie legen fest Dimensions wenn Sie den Index erstellen. Sie können die Anzahl der Dimensionen nach der Erstellung nicht ändern. Entscheiden Sie sich für ein Einbettungsmodell, bevor Sie den Index erstellen, und verwenden Sie dasselbe Modell, um sowohl gespeicherte Vektoren als auch Abfragevektoren zu generieren. Weniger Dimensionen reduzieren die Such-, Schreib- und Speicherkosten, aber höherdimensionale Modelle können mehr semantische Details erfassen. Wählen Sie die kleinste Anzahl von Dimensionen, die Ihren Relevanzanforderungen entspricht. Siehe Generieren von Vektor-Einbettungen.

Passen Sie die Distanzfunktion an Ihre Einbettungen an

Wählen Sie die Distanzfunktion, die der Darstellung der Ähnlichkeit durch Ihr Einbettungsmodell entspricht. COSINE vergleicht die Richtung und ignoriert die Größe, was für die meisten Texteinbettungsmodelle geeignet ist. EUCLIDEAN misst die absolute Entfernung und reagiert empfindlich auf die Größe. DOT_PRODUCT reagiert auch empfindlich auf die Größe. Wenn Sie es verwenden, normalisieren Sie Ihre Einbettungen auf Längeneinheiten, sodass die Punktzahlen die Richtung und nicht die Vektorlänge widerspiegeln. Sie können die Entfernungsfunktion nicht mehr ändern, nachdem Sie den Index erstellt haben. Überprüfen Sie Ihre Auswahl daher zunächst anhand eines repräsentativen Datensatzes. Siehe Wie ordnen Entfernungsfunktionen Ergebnisse.

Wählen Sie einen Partitionsschlüssel, der Ihren Abfragemustern entspricht

Ein Partitionsschlüssel schränkt jedes ein SearchVectors ruft den Teil des Vektorindex auf, der zu einem einzelnen Partitionsschlüsselwert gehört. Der Aufruf durchsucht nicht den gesamten Index. Die Suche nach weniger Daten senkt die Kosten, kann die Latenz und den Abruf verbessern und skaliert den Durchsatz horizontal über Partitionsschlüsselwerte hinweg.

Sie müssen den Partitionsschlüsselwert in angeben SearchConditionExpression bei jeder Suche. Jede Suche ist auf genau einen Partitionsschlüsselwert beschränkt. Wählen Sie einen Partitionsschlüssel, der den von Ihrer Anwendung unterstützten Abfragemustern entspricht.

Wenn Sie beispielsweise standortbezogene Daten nach US-Bundesstaaten speichern, haben Sie ungefähr 50 Partitionsschlüsselwerte. Jeder Bundesstaat enthält eine aussagekräftige Anzahl von Vektoren, sodass Sie sie sich gut merken können. Die 50 Partitionen ermöglichen eine bis zu etwa 50-fache horizontale Durchsatzskalierung. Dies funktioniert, wenn jede Suche auf einen einzelnen Bundesstaat abzielt.

Vermeiden Sie extreme Kardinalität in beide Richtungen:

  • Zu hoch (z. B. eine eindeutige Objekt-ID) — Jede Partition enthält ein einzelnes Objekt ohne vergleichbare Nachbarn, was zu einem schlechten Abruf führt.

  • Zu niedrig (z. B. ein boolescher Wert) — Die meisten Elemente landen in einer Partition, was die Durchsatzskalierung einschränkt und die Latenz sowie die Kostenvorteile reduziert.

Verwenden Sie Inline-Filterattribute, um innerhalb einer Partition weiter zu filtern.

Beispiel für einen Durchsatz. Stellen Sie sich ein 768-dimensionales Einbettungsmodell (wie Cohere Embed v3) mit 1 KB an Nicht-Vektor-Elementdaten vor, was einer Gesamtgröße von ca. 4 KB (768 Dimensionen × 4 Byte + 1 KB) entspricht. Bei dieser Elementgröße bedeuten die Grenzwerte pro Partitionsschlüssel:

  • Suche: 1 Gbit/s ÷ 4 KB ≈ 250.000 untersuchte Vektoren pro Sekunde pro Partitionsschlüsselwert. Wenn die Anzahl der Vektoren in einer Partition zunimmt, werden bei jeder Suche mehr Daten untersucht, und Sie nähern sich dieser Grenze früher.

  • Schreiben Sie: 10 MBps ÷ 4 KB ≈ 2.500 Vektor-Schreibvorgänge pro Sekunde pro Partitionsschlüsselwert

Das Wachstum ist eher logarithmisch als proportional. Eine Größenordnung mehr Vektoren in einer Partition fügen den Daten, die bei jeder Suche untersucht werden, nur eine geringe Menge hinzu.

Wenn Sie Ihre Daten auf mehrere Partitionsschlüsselwerte verteilen, werden diese Grenzwerte multipliziert. Beispielsweise bieten 50 Partitionsschlüsselwerte den bis zu 50-fachen Gesamtdurchsatz für Suchen und Schreiben. Wenn Ihre Arbeitslast diese Grenzwerte pro Partitionsschlüssel überschreitet, wenden Sie sich an AWS Unterstützung.

Synchronisieren Sie Einbettungen mit dem Quellinhalt

DynamoDB berechnet Einbettungen nicht für Sie neu. Wenn Sie den Quellinhalt ändern, den eine Einbettung darstellt, regenerieren Sie den Vektor mit demselben Einbettungsmodell und schreiben Sie ihn zurück in das Element. Andernfalls gibt der Index weiterhin Ergebnisse zurück, die auf dem veralteten Vektor basieren. Erwägen Sie, Inhaltsänderungen mit DynamoDB Streams zu erfassen und einen Downstream-Prozess zu verwenden, um die betroffenen Einbettungen zu regenerieren und neu zu schreiben.

Projizieren Sie nur die Attribute, die Sie benötigen

SearchVectors kann keine Attribute zurückgeben, die nicht in den Vektorindex projiziert werden. Die Projektion weiterer Attribute erhöht die Speicher- und Schreibkosten für den Index. Projizieren Sie die Attribute, die Ihre Anwendung liest, direkt aus den Suchergebnissen und rufen Sie den Rest mit einem Follow-up ab GetItem oder BatchGetItem auf dem Basistisch, wenn du sie brauchst.

Verwenden Sie mehrere Indizes, um Einbettungsmodelle zu vergleichen

Standardmäßig können Sie bis zu 5 Vektorindizes für eine einzelne Tabelle erstellen, und Sie können eine Erhöhung auf maximal 20 beantragen. Weitere Informationen finden Sie unter Vektor-Indizes. Verwenden Sie separate Indizes, um verschiedene Einbettungsmodelle oder Modellversionen nebeneinander zu evaluieren. Speichern Sie die Einbettungen jedes Modells in einem anderen Vektorattribut und erstellen Sie für jedes Modell einen Vektorindex. Auf diese Weise können Sie die Suchqualität zwischen Modellen mit denselben zugrunde liegenden Daten vergleichen, ohne Ihren Produktionsindex migrieren zu müssen.

Erstellen Sie beispielsweise beim Upgrade von einer Modellversion auf eine andere einen zweiten Index mit den Abmessungen und der Abstandsfunktion des neuen Modells. Füllen Sie ihn mit Einbettungen aus dem neuen Modell auf, führen Sie Testabfragen für beide Indizes aus und vergleichen Sie die Relevanz. Wenn Sie zufrieden sind, migrieren Sie Ihre Anwendung auf den neuen Index und löschen Sie den alten Index.