本文說明如何使用儲存的嵌入生成索引及查詢嵌入。如要進一步瞭解如何儲存嵌入,請參閱「儲存向量嵌入」。
您可以使用 AlloyDB 建立 ScaNN、IVF、IVFFlat 和 HNSW 索引。
事前準備
開始建立索引前,請先完成下列必要條件。
已安裝以
pgvector為基礎,由 Google 為 AlloyDB 擴充的vector擴充功能 版本0.5.0以上版本。CREATE EXTENSION IF NOT EXISTS vector;如要生成
ScaNN索引,除了vector擴充功能外,還須安裝alloydb_scann擴充功能。CREATE EXTENSION IF NOT EXISTS alloydb_scann;
建立索引
您可以為資料庫中的資料表建立下列任一索引類型。
建立 ScaNN 索引
AlloyDB alloydb_scann:Google 開發的 PostgreSQL 擴充功能,可實作由 ScaNN 演算法驅動的高效率最近鄰索引。
ScaNN 索引是以樹狀結構為基礎的量化索引,用於近似最鄰近搜尋。與 HNSW 相比,這項演算法的索引建構時間較短,記憶體用量也較少。此外,相較於 HNSW,這項服務可根據工作負載提供更快的 QPS。
兩層樹狀結構 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 演算法,為含有儲存向量嵌入的資料欄建立三層樹狀結構索引,請執行下列 DDL 查詢:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
更改下列內容:
MAX_NUM_LEVELS:k-means 分群樹狀結構的層級數量上限。設為1(預設) 可進行兩層樹狀量化,設為2則可進行三層樹狀量化。
建立索引後,您可以按照「使用指定文字進行最鄰近查詢」一文中的操作說明,執行最鄰近搜尋查詢,並使用該索引。
設定索引參數時,必須在 QPS 和喚回度之間取得適當平衡。如要進一步瞭解如何調整 ScaNN 索引,請參閱「調整 ScaNN 索引」。
如要在使用 real[] 資料類型 (而非 vector) 的嵌入資料欄上建立這個索引,請將該資料欄轉換為 vector 資料類型:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
將 DIMENSIONS 替換為嵌入資料欄的維度寬度。如要進一步瞭解如何找出維度,請參閱「向量函式」中的 vector_dims 函式。
如要獲得一致的搜尋體驗,請在建立 ScaNN 索引時啟用自動維護功能。詳情請參閱「維護向量索引」。這項功能目前為預先發布版。
如要查看索引進度,請使用 pg_stat_progress_create_index 檢視畫面:
SELECT * FROM pg_stat_progress_create_index;
「phase」欄會顯示目前建立索引的狀態,索引建立完成後,「building index: tree training」階段就會消失。
如要調整索引,在目標喚回度和 QPS 之間取得平衡,請參閱「調整 ScaNN 索引」。
分析已建立索引的資料表
建立 ScaNN 索引後,請執行 ANALYZE 指令,更新資料的統計資料。
ANALYZE TABLE;
平行建立索引
AlloyDB 可能會根據資料集和您選擇的索引類型,自動產生多個平行 worker,加快建立索引的速度。
建立 3 層 ScaNN 索引時,或資料集超過 1 億列時,通常會觸發平行索引建構作業。
雖然 AlloyDB 會自動最佳化平行 worker 數量,但您可以使用 max_parallel_maintenance_workers、max_parallel_workers 和 min_parallel_table_scan_size PostgreSQL 查詢計畫參數調整平行 worker。
執行查詢
在資料庫中儲存嵌入並建立索引後,即可使用 pgvector 查詢功能開始查詢。您無法使用 alloydb_scann 擴充功能執行大量搜尋查詢。
如要找出嵌入向量最鄰近的語意項目,可以執行下列範例查詢,並設定與建立索引時相同的距離函式。
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 運算子使用這些值。
CREATE EXTENSION IF NOT EXISTS google_ml_integration;
CREATE EXTENSION IF NOT EXISTS vector;
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
LIMIT ROW_COUNT
更改下列內容:
MODEL_ID:要查詢的模型 ID。如果使用 Vertex AI Model Garden,請指定
text-embedding-005做為模型 ID。這些是 AlloyDB 可用於文字嵌入的雲端式模型。詳情請參閱「文字嵌入」。選用:
VERSION_TAG:要查詢的模型版本標記。在標記開頭加上@。英文模型與 Vertex AI 搭配使用時,請指定模型版本中列出的其中一個版本標記,例如
text-embedding-005。text-embeddingGoogle 強烈建議您一律指定版本標記。如未指定版本標記,AlloyDB 一律會使用最新模型版本,這可能會導致非預期的結果。
TEXT:要轉換成向量嵌入的文字。