Hybride Suche nach Vektorähnlichkeiten ausführen

Führen Sie Hybridsuchen in AlloyDB for PostgreSQL durch, bei denen Textsuche, Keyword-Abgleich, Vektorsuche und semantische Ähnlichkeit kombiniert werden. Verwenden Sie dazu die vector-Erweiterung, eine Standard-PostgreSQL-Erweiterung pgvector, die für AlloyDB angepasst wurde.

Um die Suchrelevanz zu verbessern, können Sie eine hybride Suche durchführen, bei der die Suche nach Vektorähnlichkeit mit der Textsuche kombiniert wird. Mit AlloyDB können Sie GIN-Indizes (Generalized Inverted Index) für die Textsuche und ScaNN-Indizes (Scalable Nearest Neighbors) für die Vektorsuche erstellen. Anschließend können Sie die Ergebnisse beider Suchvorgänge kombinieren und mit Reciprocal Rank Fusion (RRF) neu sortieren. RRF ist ein Algorithmus, der mehrere Suchergebnislisten in einer einzigen sortierten Liste zusammenfasst, um hochrelevante Ergebnisse basierend auf genauen Keyword-Übereinstimmungen und semantischer Ähnlichkeit abzurufen.

Wenn Sie eine hybride Suche in AlloyDB for PostgreSQL durchführen möchten, müssen Sie sowohl einen Vektorindex als auch einen Textsuchindex für Ihre Tabelle erstellen. Anschließend werden die Ergebnisse beider Suchanfragen kombiniert und neu sortiert, um die relevantesten Informationen zu präsentieren.

GIN-Index erstellen

Ein GIN-Index (Generalized Inverted Index) ist ein spezieller Indextyp, der für die Suche in zusammengesetzten Werten wie Arrays, JSONB und Volltextsuchdaten optimiert ist.

Führen Sie den folgenden Befehl aus, um einen GIN-Index für Ihre Textdaten zu erstellen, mit dem Sie eine Volltextsuche durchführen können:

CREATE INDEX INDEX_NAME ON TABLE USING GIN (to_tsvector('english', COLUMN_NAME));

Ersetzen Sie Folgendes:

  • INDEX_NAME: Der Name des Index, den Sie erstellen möchten, z. B. my-gin-index.

  • TABLE: Die Tabelle, der der Index hinzugefügt werden soll.

  • COLUMN_NAME: Die Spalte, in der die Textdaten gespeichert sind, nach denen Sie suchen möchten.

ScaNN-Index erstellen

Wenn Sie einen zweistufigen Baumindex mit dem ScaNN-Algorithmus auf eine Spalte mit gespeicherten Vektoreinbettungen anwenden möchten, führen Sie die folgende DDL-Abfrage aus:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE);

Ersetzen Sie Folgendes:

  • INDEX_NAME: Der Name des Index, den Sie erstellen möchten, z. B. my-scann-index. Die Indexnamen sind in Ihrer Datenbank freigegeben. Achten Sie darauf, dass jeder Indexname für jede Tabelle in Ihrer Datenbank eindeutig ist.

  • TABLE: Die Tabelle, der der Index hinzugefügt werden soll.

  • EMBEDDING_COLUMN: eine Spalte, in der vector-Daten gespeichert werden.

  • DISTANCE_FUNCTION: Die Distanzfunktion, die für diesen Index verwendet werden soll. Wählen Sie eine der folgenden Optionen aus:

    • L2-Distanz:l2

    • Skalarprodukt: dot_product

    • Kosinus-Distanz:cosine

  • NUM_LEAVES_VALUE: Die Anzahl der Partitionen, die auf diesen Index angewendet werden sollen. Kann auf einen beliebigen Wert zwischen 1 und 1.048.576 festgelegt werden. Weitere Informationen dazu, wie Sie diesen Wert festlegen, finden Sie unter ScaNN-Index optimieren.

Weitere Informationen zu verschiedenen ScaNN-Indexkonfigurationen finden Sie unter ScaNN-Index erstellen. Sie können auch einen HNSW-Index erstellen.

Hybride Suche mit Reciprocal Rank Fusion durchführen

Bei der Hybridsuche werden separate Vektor- und Textsuchen durchgeführt. Die Ergebnisse werden dann mithilfe von Reciprocal Rank Fusion (RRF) kombiniert und neu gerankt. RRF ist ein rangbasierter Algorithmus, der mehrere sortierte Listen von Suchergebnissen in einer einzigen sortierten Liste zusammenfasst, indem jedem Dokument ein Wert zugewiesen wird. Dieser Wert basiert auf dem reziproken Rang von RRF in allen beitragenden Listen. Dokumente mit einem höheren Rang haben einen größeren Beitrag. Verwenden Sie die folgende SQL-Abfrage, um Volltextsuche und Hybridsuche zu kombinieren und die Ergebnisse neu zu sortieren:

        WITH vector_search AS (
            SELECT id,
                RANK () OVER (ORDER BY embedding <=> google_ml.embedding('MODEL_ID', 'TEXT')) AS rank
                FROM TABLE
                ORDER BY embedding <=> google_ml.embedding('MODEL_ID', 'TEXT') LIMIT 10
        ),
        text_search AS (
            SELECT id,
                RANK () OVER (ORDER BY ts_rank(to_tsvector('english', COLUMN_NAME), to_tsquery(KEYWORD)) desc)
            FROM TABLE
            WHERE to_tsvector('english', COLUMN_NAME) @@ to_tsquery(KEYWORD)
            ORDER BY ts_rank(to_tsvector('english', COLUMN_NAME), to_tsquery(KEYWORD)) desc
            LIMIT 10
        )
        SELECT
            COALESCE(vector_search.id, text_search.id) AS id,
            COALESCE(1.0 / (60 + vector_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
        FROM vector_search FULL OUTER JOIN text_search ON vector_search.id = text_search.id
        ORDER BY rrf_score DESC
        LIMIT 5;

Ersetzen Sie Folgendes:

  • MODEL_ID: Die ID des Modells, das abgefragt werden soll.

    Wenn Sie den Vertex AI Model Garden verwenden, geben Sie text-embedding-005 als Modell-ID an. Dies sind die cloudbasierten Modelle, die AlloyDB für Texteinbettungen verwenden kann. Weitere Informationen finden Sie unter Texteinbettungen.

  • TABLE: die Tabelle mit Ihren Daten.

  • TEXT: Der Text, der in eine Vektoreinbettung übersetzt werden soll.

  • KEYWORD: Das Keyword, nach dem Sie suchen möchten.

  • COLUMN_NAME: eine Spalte, in der die Textdaten gespeichert sind, nach denen Sie suchen möchten.

Erläuterung der Hybrid-Suchanfrage und des zugehörigen allgemeinen Tabellenausdrucks (Common Table Expression, CTE):

  • vector_search CTE: Führt eine Standardsuche nach Vektorähnlichkeiten durch, ordnet die Ergebnisse nach Kosinus-Distanz und weist ihnen einen Rang zu. Es werden die 10 semantisch ähnlichsten Produkte abgerufen.
  • text_search CTE: Führt eine Textsuche mit to_tsvector und to_tsquery aus, berechnet die Relevanz mit ts_rank und ruft die 10 relevantesten Textübereinstimmungen ab.
  • Final SELECT Statement CTE: Hier werden Vektor- und Textsuchergebnisse mit FULL OUTER JOIN zusammengeführt, die Produkt-ID ausgewählt, der RRF-Score berechnet, nach Score sortiert und die fünf besten Ergebnisse abgerufen.

Hybridsuche mit LangChain durchführen

Die Hybridsuche mit dem AlloyDB-Vektorspeicher verbessert die Genauigkeit der Suche, indem zwei verschiedene Suchstrategien kombiniert werden: die Vektorsuche mit dichten Einbettungen und die stichwortbasierte Suche. AlloyDBVectorStore ist eine LangChain-Vektorspeicherklasse, die LangChain verwendet und als spezifische Implementierung der VectorStore-Klasse von LangChain fungiert. Informationen zum Speichern von Vektoreinbettungen mit der Klasse „AlloyDBVectorStore“ in AlloyDB

Sie können diese hybride Suche aktivieren und konfigurieren, indem Sie die Klasse HybridSearchConfig verwenden, wenn Sie Ihre AlloyDBVectorStore einrichten.

Bei der Hybridsuche mit dem AlloyDB-Vektorspeicher wird gleichzeitig eine semantische Suche durchgeführt, um die Bedeutung und den Kontext einer Anfrage zu verstehen, und eine Stichwortsuche, um genaue lexikalische Übereinstimmungen zu finden. Die Ergebnisse beider Suchen werden dann zusammengeführt, um eine umfassendere Ergebnismenge zu erhalten.

Nächste Schritte