本頁說明如何使用儲存的嵌入項目產生索引,以及如何使用 IVF
索引查詢 AlloyDB for PostgreSQL 的嵌入項目。如要進一步瞭解如何儲存嵌入內容,請參閱「儲存向量嵌入內容」。
事前準備
開始建立索引前,請先完成下列必要條件。
已安裝以
pgvector
為基礎,由 Google 為 AlloyDB 擴充的vector
擴充功能版本0.5.0
以上版本。CREATE EXTENSION IF NOT EXISTS vector;
建立 IVF
索引
Stock pgvector
支援透過索引進行近似最鄰近搜尋。AlloyDB 支援這項功能,並提供純量量化功能,您可以在建立索引時指定這項功能。啟用純量量化後,可大幅加快維度較大的向量查詢速度,並儲存最多 8,000 個維度的向量。
如要在以 pgvector
為基礎的索引上啟用純量量化,請將 IVF
指定為索引方法,並將 SQ8
指定為量化器:
CREATE INDEX INDEX_NAME ON TABLE
USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');
更改下列內容:
INDEX_NAME
:要建立的索引名稱,例如my-ivf-index
。索引名稱會在資料庫中共用。請確保資料庫中每個資料表的索引名稱都不重複。TABLE
:要新增索引的資料表。EMBEDDING_COLUMN
:儲存vector
資料的資料欄。DISTANCE_FUNCTION
:要用於這個索引的距離函式。選擇下列其中一個選項:L2 距離:
vector_l2_ops
內積:
vector_ip_ops
餘弦距離:
vector_cosine_ops
LIST_COUNT
:要搭配這個索引使用的清單數量。如要進一步瞭解如何決定這個值,請參閱「調整 IVF 索引」。QUANTIZER
:要使用的量化器類型。設為下列任一值:
SQ8
:建議使用。查詢回應速度較快,但會造成部分召回率損失,不會影響實際運作情境。FLAT
:查詢回應速度較慢,記憶體用量較高,但可達到可忽略的召回率損失。
如要在使用
real[]
資料類型 (而非vector
) 的嵌入資料欄上建立這個索引,請將資料欄轉換為vector
資料類型:
CREATE INDEX INDEX_NAME ON TABLE
USING ivf (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'SQ8');
請將 DIMENSIONS
改成嵌入資料欄的維度寬度。如要進一步瞭解如何尋找維度,請參閱向量函式中的 vector_dims
函式。
如要查看索引建立進度,請使用 pg_stat_progress_create_index
檢視畫面:
SELECT * FROM pg_stat_progress_create_index;
「phase
」欄會顯示索引建立作業的目前狀態,而「building postings
」階段表示索引建立作業即將完成。
如要調整索引,以達到目標召回率和每秒查詢次數的平衡,請參閱「調整 IVF
索引」。
執行查詢
將嵌入內容儲存並編入資料庫索引後,即可開始使用pgvector
查詢功能進行查詢。
如要找出嵌入向量最鄰近的語意鄰項,可以執行下列查詢範例,並設定與建立索引時相同的距離函式。
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
更改下列內容:
TABLE
:包含要與文字比較的嵌入內容的資料表。INDEX_NAME
:要使用的索引名稱,例如my-scann-index
。EMBEDDING_COLUMN
:包含儲存的嵌入內容的資料欄。DISTANCE_FUNCTION_QUERY
:要用於這項查詢的距離函式。根據建立索引時使用的距離函式,選擇下列其中一項:L2 距離:
<->
內積:
<#>
餘弦距離:
<=>
EMBEDDING
:您要找出最鄰近儲存語意鄰項的嵌入向量。ROW_COUNT
:要傳回的列數。如只要取得最佳單一比對結果,請指定
1
。
如要查看其他查詢範例,請參閱「查詢」。
您也可以使用 embedding()
函式將文字翻譯成向量。將向量套用至其中一個pgvector
最鄰近運算子<->
(適用於 L2 距離),找出具有語意最相似嵌入項目的資料庫列。
由於 embedding()
會傳回 real
陣列,您必須明確將 embedding()
呼叫轉換為 vector
,才能搭配 pgvector
運算子使用這些值。