建立索引和查詢向量

選取說明文件版本:

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

您可以使用 AlloyDB 建立 ScaNN、IVF、IVFFlat 和 HNSW 索引。

事前準備

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

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

  • 已安裝 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:要轉換成向量嵌入的文字。

後續步驟