建立索引和查詢向量

選取說明文件版本:

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

您可以使用 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;
    

建立索引

您可以為資料庫中的資料表建立下列其中一種索引類型。

建立 HNSW 索引

AlloyDB 支援使用 AlloyDB pgvector 擴充功能,建立以圖表為基礎的 hnsw 索引 ,這項功能適用於股票 pgvector。使用 hnsw 索引會產生貪婪搜尋,在圖表中移動,不斷尋找最接近查詢向量的鄰項,直到找到最佳結果為止。與 IVF 相比,這項功能可加快查詢效能,但建構時間較慢。

如要進一步瞭解 HNSW 演算法,請參閱「階層式可導覽小世界」。

如要建立 hnsw 索引,請執行下列查詢:

CREATE INDEX INDEX_NAME ON TABLE
  USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');

更改下列內容:

  • INDEX_NAME:要建立的索引名稱,例如 my-hnsw-index

  • TABLE:要新增索引的資料表。

  • EMBEDDING_COLUMN:儲存vector資料的資料欄。

  • DISTANCE_FUNCTION:要搭配這個索引使用的距離函式。選擇下列其中一個選項:

    • L2 距離: vector_l2_ops

    • 內積: vector_ip_ops

    • 餘弦距離: vector_cosine_ops

  • NUMBER_OF_CONNECTIONS:圖表中每個節點的連線數量上限。您可以先將預設值設為 16,然後根據資料集大小,嘗試使用較高的值。

  • CANDIDATE_LIST_SIZE:圖表建構期間維護的候選清單大小,會不斷更新節點最近鄰居的目前最佳候選項目。請將這個值設為高於 m 值的兩倍,例如 64

如要查看索引建立進度,請使用 pg_stat_progress_create_index 檢視畫面:

SELECT * FROM pg_stat_progress_create_index;

phase」欄會顯示目前建立索引的狀態,而「building graph」階段會在索引建立完成後消失。

如要調整索引,以達到目標召回率和 QPS 平衡,請參閱調整索引hnsw

執行查詢

將嵌入內容儲存並編入資料庫索引後,即可開始使用 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() 函式將文字翻譯成向量。將向量套用至其中一個最鄰近運算子 (例如 L2 距離的 <->),找出具有語意最相似嵌入項目的資料庫列。pgvector

由於 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:要翻譯成向量嵌入的文字。

後續步驟