本文說明如何使用儲存的嵌入生成索引,以及查詢嵌入。如要進一步瞭解如何儲存嵌入內容,請參閱「儲存向量嵌入內容」。
您可以使用 AlloyDB 建立 ScaNN
、IVF
、IVFFlat
和 HNSW
索引。
事前準備
開始建立索引前,請先完成下列必要條件。
已安裝以
pgvector
為基礎,由 Google 為 AlloyDB 擴充的vector
擴充功能版本0.5.0
以上版本。CREATE EXTENSION IF NOT EXISTS vector;
如要產生
ScaNN
索引,請安裝alloydb_scann
擴充功能,以及vector
擴充功能。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
索引,請參閱「[調整 ScaNN
index](/alloydb/omni/containers/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
改成
嵌入資料欄。如要進一步瞭解如何找出尺寸,
請參閱 [Vectorvector_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
階段就會消失。
如要調整索引,以達到目標召回率和每秒查詢次數的平衡,請參閱「調整 ScaNN
索引」。
分析已建立索引的資料表
建立 ScaNN
索引後,請執行 ANALYZE
指令,更新資料的統計資料。
ANALYZE TABLE;
執行查詢
將嵌入儲存並編入資料庫索引後,您就可以開始
使用 [pgvector
query
功能](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
:要搭配使用的距離函式查詢。根據使用的距離函式選擇下列其中一個選項
建立索引時:
L2 距離:
<->
內積:
<#>
餘弦距離:
<=>
EMBEDDING
:您要尋找最接近的儲存嵌入向量語意鄰近的項目。
ROW_COUNT
:要傳回的列數。如只要取得最佳單一比對結果,請指定
1
。
如要進一步瞭解其他查詢範例,請參閱
查詢。
您也可以使用 embedding()
函式翻譯
文字轉換為向量。將向量套用至其中一個
pgvector
最近鄰運算子 (適用於 L2 距離),找出與<->
語意上最相似的嵌入。
由於 embedding()
會傳回 real
陣列,因此您必須明確轉換
呼叫 vector
的 embedding()
,以便搭配 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
:要翻譯成向量嵌入的文字。