執行混合型向量相似度搜尋

在 PostgreSQL 適用的 AlloyDB 中執行混合搜尋,結合文字搜尋、關鍵字比對、向量搜尋和語意相似度,使用 vector 擴充功能,這是為 AlloyDB 自訂的標準 pgvector PostgreSQL 擴充功能。

如要提升搜尋關聯性,可以執行混合搜尋,結合向量相似度搜尋和文字搜尋。AlloyDB 可讓您建立一般化反向索引 (GIN),用於文字搜尋,以及可擴充的近鄰 (ScaNN) 索引,用於向量搜尋。接著,您可以使用倒數排名融合 (RRF) 演算法合併這兩項搜尋的結果,並重新排名。這項演算法會將多份搜尋結果清單合併為一份排名清單,根據確切的關鍵字比對和語意相似度,擷取高度相關的結果。

如要在 PostgreSQL 適用的 AlloyDB 中執行混合搜尋,您需要在資料表上建立向量索引和文字搜尋索引。接著,系統會合併兩次搜尋的結果,並重新排序,呈現最相關的資訊。

建立 GIN 索引

廣義反向索引 (GIN) 索引是一種專門的索引類型,可針對複合值 (例如陣列、JSONB 和全文搜尋資料) 進行最佳化搜尋。

如要在文字資料上建立 GIN 索引,以執行全文搜尋,請執行下列指令:

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

更改下列內容:

  • INDEX_NAME:要建立的索引名稱,例如 my-gin-index

  • TABLE:要新增索引的資料表。

  • COLUMN_NAME:儲存要搜尋文字資料的資料欄。

建立 ScaNN 索引

如要使用 ScaNN 演算法,將兩層樹狀結構索引套用至含有儲存向量嵌入的資料欄,請執行下列 DDL 查詢:

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

更改下列內容:

  • INDEX_NAME:要建立的索引名稱,例如 my-scann-index。索引名稱會在資料庫中共用。請確保資料庫中每個資料表的索引名稱皆不重複。

  • TABLE:要新增索引的資料表。

  • EMBEDDING_COLUMN:儲存 vector 資料的資料欄。

  • DISTANCE_FUNCTION:要用於這個索引的距離函式。選擇下列其中一個選項:

    • L2 距離: l2

    • 點積: dot_product

    • 餘弦距離: cosine

  • NUM_LEAVES_VALUE:要套用至這個索引的分區數量。請設為 1 到 1048576 之間的任何值。如要進一步瞭解如何決定這個值,請參閱「調整 ScaNN 索引」。

如要進一步瞭解不同的 ScaNN 索引設定,請參閱「建立 ScaNN 索引」。您也可以建立 HNSW 索引。

使用倒數排序融合執行混合型搜尋

混合型搜尋會分別執行向量和文字搜尋,然後使用倒數排名融合 (RRF) 技術合併結果並重新排名。RRF 是一種以排名為依據的演算法,可將多份搜尋結果排名清單合併為一份排名清單,方法是為每份文件指派分數。這項分數是根據 RRF 在所有貢獻清單中的倒數排名計算,排名較高的文件貢獻度較高。使用下列 SQL 查詢,合併全文搜尋和混合搜尋,並重新排列結果:

        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;

更改下列內容:

  • MODEL_ID:要查詢的模型 ID。

    如果您使用 Vertex AI Model Garden,請指定 text-embedding-005 做為模型 ID。AlloyDB 可使用這些雲端模型進行文字嵌入。詳情請參閱「文字嵌入」。

  • TABLE:包含資料的資料表。

  • TEXT:要翻譯成向量嵌入的文字。

  • KEYWORD:要搜尋的關鍵字。

  • COLUMN_NAME:儲存要搜尋的文字資料的資料欄。

混合式搜尋查詢和相關一般資料表運算式 (CTE) 的說明:

  • vector_search CTE:執行標準向量相似度搜尋,依餘弦距離排序結果並指派排名。並擷取語意最相似的前 10 項產品。
  • text_search CTE:使用 to_tsvectorto_tsquery 執行文字搜尋,並使用 ts_rank 計算關聯性,然後擷取前 10 個最相關的文字比對結果。
  • Final SELECT Statement CTE:使用 FULL OUTER JOIN 聯結向量和文字搜尋結果、選取產品 ID、計算 RRF 分數、依分數排序,並擷取前 5 個結果。

使用 LangChain 執行混合型搜尋

結合兩種不同的查詢策略 (密集嵌入向量搜尋和關鍵字搜尋) 後,AlloyDB 向量儲存庫的混合型搜尋功能可提高搜尋準確度。AlloyDBVectorStore 是 LangChain 向量儲存庫類別,會做為 LangChain VectorStore 類別的特定實作項目,藉此使用 LangChain。瞭解如何使用 AlloyDBVectorStore 類別,透過 AlloyDB 儲存向量嵌入

設定 AlloyDBVectorStore 時,您可以使用 HybridSearchConfig 類別啟用及設定這項混合搜尋功能。

使用 AlloyDB 向量儲存庫的混合搜尋會同時執行語意搜尋,瞭解查詢的意義和脈絡,以及關鍵字搜尋,找出完全相符的詞彙。然後合併這兩項搜尋的結果,提供更全面的結果集。

後續步驟