建立索引和查詢向量

選取說明文件版本:

本文說明如何使用儲存的嵌入生成索引,以及查詢嵌入。如要進一步瞭解如何儲存嵌入內容,請參閱「儲存向量嵌入內容」。

您可以使用 AlloyDB 建立 ScaNNIVFIVFFlatHNSW 索引。

事前準備

開始建立索引前,請先完成下列必要條件。

  • 嵌入向量會新增至 AlloyDB 資料庫的資料表

  • 已安裝以 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/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 改成

嵌入資料欄。如要進一步瞭解如何找出尺寸,

請參閱 [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 陣列,因此您必須明確轉換

呼叫 vectorembedding(),以便搭配 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:要翻譯成向量嵌入的文字。

後續步驟