本文說明如何使用儲存的嵌入產生索引,以及查詢嵌入。如要進一步瞭解如何儲存嵌入,請參閱「儲存向量嵌入」。
您可以使用 AlloyDB 建立 ScaNN、IVF、IVFFlat 和 HNSW 索引。
事前準備
開始建立索引前,請先完成下列前置條件。
已安裝
vector擴充功能0.5.0以上版本,該版本以pgvector為基礎,由 Google 針對 AlloyDB 擴充。CREATE EXTENSION IF NOT EXISTS vector;如要生成
ScaNN索引,除了vector擴充功能外,還須安裝alloydb_scann擴充功能。CREATE EXTENSION IF NOT EXISTS alloydb_scann;
建立索引
您可以為資料庫中的資料表建立下列其中一種索引類型。
建立 ScaNN 索引
AlloyDB alloydb_scann,
Google 開發的 PostgreSQL 擴充功能,可實作高度
由 [ScaNN
algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).
ScaNN 索引是樹狀結構的量化索引,適用於近似
最鄰近搜尋。可縮短索引建構時間,並減少
記憶體用量HNSW。此外,在
與 HNSW 的比較。
AlloyDB 資料庫中的資料表。如果嘗試產生 ScaNN 索引
在空白或分區資料表上執行這項操作,可能會遇到一些問題。如要
如要瞭解產生的錯誤,請參閱「排解 ScaNN 索引錯誤」。
兩層樹狀結構 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則代表三層樹狀量化。
建立索引後,即可執行最鄰近搜尋查詢,
按照 [Make a nearest-neighbor
查詢指定文字](#query)。
設定索引參數時,必須在 QPS 和
召回。如要進一步瞭解如何調整 ScaNN 索引,請參閱「[Tune a ScaNN
index](/alloydb/omni/kubernetes/15.7.0/docs/ai/tune-indexes).
如要在使用 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 函式
functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).
如要查看索引進度,請使用 pg_stat_progress_create_index 檢視畫面:
SELECT * FROM pg_stat_progress_create_index;
「狀態」phase 欄會顯示索引建立作業的目前狀態,
索引建立完成後,building index: tree training 階段就會消失。
如要調整索引,在目標喚回度和 QPS 之間取得平衡,請參閱「調整 ScaNN 索引」。
分析已建立索引的資料表
建立 ScaNN 索引後,請執行 ANALYZE 指令,更新資料的統計資料。
ANALYZE TABLE;
執行查詢
在資料庫中儲存及建立嵌入索引後,即可開始
使用 [pgvector 查詢
功能](https://github.com/pgvector/pgvector#querying)。您無法執行
使用 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:要與此搭配使用的距離函式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英文模型,請指定其中一個版本標記,例如text-embedding-005,如「模型版本」一節所列。Google 強烈建議您一律指定版本標記。如未指定版本標記,AlloyDB 一律會使用最新模型版本,這可能會導致非預期結果。
TEXT:要轉換成向量嵌入的文字。