在 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_tsvector
和to_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 向量儲存庫的混合搜尋會同時執行語意搜尋,瞭解查詢的意義和脈絡,以及關鍵字搜尋,找出完全相符的詞彙。然後合併這兩項搜尋的結果,提供更全面的結果集。