AlloyDB for PostgreSQL 的倒排檔案 (IVF) 索引可讓您使用純量量化,加速高維度儲存嵌入的向量相似度搜尋。您可以使用 vector 擴充功能建立 IVF 索引,減少記憶體用量,並加快查詢速度,適用於最多 8,000 個維度的向量。如要進一步瞭解如何儲存嵌入,請參閱「儲存向量嵌入」。
事前準備
開始建立索引前,請先完成下列必要條件。
已安裝
vector擴充功能0.5.0以上版本,該版本以pgvector為基礎,由 Google 針對 AlloyDB 擴充。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則表示索引建立作業即將完成。
如要調整索引,以達到目標召回率和 QPS 平衡,請參閱「調整IVF索引」。
執行查詢
在資料庫中儲存嵌入並建立索引後,即可使用 pgvector 查詢功能開始查詢。
如要找出嵌入向量最鄰近的語意項目,可以執行下列範例查詢,並設定與建立索引時相同的距離函式。
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
更改下列內容:
TABLE:包含要與文字比較之嵌入內容的資料表。EMBEDDING_COLUMN:包含儲存嵌入的資料欄。DISTANCE_FUNCTION_QUERY:要用於這項查詢的距離函式。根據建立索引時使用的距離函式,選擇下列其中一項:L2 距離:
<->內積:
<#>餘弦距離:
<=>
EMBEDDING:要找出最鄰近儲存語意鄰居的嵌入向量。ROW_COUNT:要傳回的列數。如果只要單一最佳相符項目,請指定
1。
如要進一步瞭解其他查詢範例,請參閱「查詢」。
您也可以使用 embedding() 函式,將文字翻譯成向量。您將向量套用至其中一個 pgvector 最鄰近運算子 (<-> 代表 L2 距離),找出語意最相似嵌入的資料庫資料列。
由於 embedding() 會傳回 real 陣列,因此您必須明確將 embedding() 呼叫轉換為 vector,才能搭配 pgvector 運算子使用這些值。