為大型資料表生成及管理自動向量嵌入項目

您可以為整個資料表欄產生及管理向量嵌入,為大規模向量嵌入建立作業提供可擴充的解決方案。這項解決方案特別適合用來對文字內容執行語意搜尋和檢索增強生成 (RAG),包括:

  • 為新資料表建立初始向量嵌入
  • 匯入大量資料後產生嵌入內容
  • 在資料大幅變更後重新整理嵌入內容
  • 逐步維護嵌入

瞭解自動向量嵌入

AlloyDB 的自動向量嵌入功能提供可擴充的方式,自動生成及維護資料的向量嵌入。您不必為每段新文字或更新的文字手動產生嵌入內容,可以設定自動向量嵌入內容來處理這項程序。對於依賴最新嵌入內容進行語意搜尋、檢索增強生成 (RAG) 和其他 AI 輔助功能的應用程式,這項功能特別實用。

使用自動向量嵌入功能,您可以執行下列操作:

  • 初始化整個資料表的嵌入:使用單一指令,為資料表資料欄中的所有現有資料產生嵌入。
  • 保持嵌入內容同步:來源資料變更時,系統會自動更新嵌入內容,確保 AI 應用程式一律使用最新資訊。
  • 大規模生成嵌入:有效率地為數百萬列的大型資料表建立嵌入。
  • 呼叫每個嵌入資料欄的管理函式,即可設定及管理同一資料表中的多個資料欄嵌入。

這項功能可簡化向量嵌入的建立和維護作業,進而簡化 AI 應用程式的開發和維護作業。

事前準備

如要為大型資料表產生及管理向量嵌入,請先完成下列步驟:

  • 使用 psql 或 AlloyDB for PostgreSQL Studio,以 postgres 使用者身分連線至資料庫。
  • 確認已安裝 google_ml_integration 擴充功能
  • 確認 google_ml_integration.enable_model_support 旗標已設為 on
  • 確認 google_ml_integration 擴充功能為 1.5.2 以上版本,且 google_ml_integration.enable_faster_embedding_generation 旗標已設為 on

    如要使用下列指令檢查擴充功能版本:

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    

    如要更新擴充功能,請使用 ALTER EXTENSION google_ml_integration UPDATE; 指令。

  • 如要從 AlloyDB 資料庫產生嵌入,必須先設定 AlloyDB 與 Vertex AI 搭配運作。詳情請參閱「整合資料庫與 Vertex AI」。

  • 如要管理及監控自動產生嵌入內容,使用者預設可存取 Selectgoogle_ml.embed_gen_progressgoogle_ml.embed_gen_settings 資料表。

    如要讓使用者管理自動產生嵌入內容的功能,請在 google_ml.embed_gen_progressgoogle_ml.embed_gen_settings 資料表上授予 INSERTUPDATEDELETE 權限:

    GRANT INSERT, UPDATE, DELETE ON google_ml.embed_gen_progress TO 'USER_NAME';
    

    更改下列內容:

    • USER_NAME:獲授權的使用者名稱。
  • 確認您使用的 PostgreSQL 用戶端中,AUTOCOMMIT 是否設為 ON

  • 確認您使用的嵌入模型有足夠的自動向量嵌入配額。如果配額不足,自動嵌入作業可能會變慢或失敗。舉例來說,以下是 Vertex AI 嵌入模型的限制:

    • 文字嵌入限制:每項要求最多可有 250 個輸入文字,每個輸入文字會產生一個嵌入,且每項要求最多 20,000 個權杖。系統只會使用每個輸入文字的前 2,048 個符記來計算嵌入。
    • 每分鐘要求數

      • base_model : text-embedding : 1500
      • base_model : gemini-embedding : 100000
    • Gemini Embedding 模型權杖限制:與主要受 RPM 配額限制的其他 Embedding 模型不同,Gemini Embedding 模型系列每個專案每分鐘最多只能使用 5,000,000 個權杖。

初始化資料表的嵌入項目

您可以在 ai 結構定義中,使用管理自動向量嵌入的功能。這個結構定義提供 AlloyDB 最新 AI 功能的介面。

使用 ai.initialize_embeddings() SQL 函式,為資料表的內容資料欄產生嵌入內容。這是封鎖式呼叫:

  • 如果函式傳回成功,向量嵌入建立作業即完成。
  • 這項功能會自動嘗試從暫時性問題 (例如模型配額錯誤) 中復原。只有在這些復原嘗試失敗時,系統才會傳回失敗訊息。如果問題持續發生 (例如 batch_size 設定錯誤導致要求超出大小限制),或是作業遭到手動取消,您必須手動重新發出呼叫。

這項功能支援 Google 提供的模型 (例如 Vertex AI 的 text-embedding-005),以及您註冊的自訂模型。

產生嵌入項目之前,請先在資料表中建立欄 content_embeddings。這個資料欄通常具有 vector(DIMENSION) 類型和 DEFAULT NULL 值。

ALTER TABLE user_reviews ADD COLUMN IF NOT EXISTS content_embeddings vector(768) DEFAULT NULL;

執行批次生成作業

根據預設,AlloyDB 會使用批次處理功能,在單一要求中為多個文字輸入內容產生嵌入項目,藉此提升效率。如果您未提供特定批次大小,AlloyDB 會套用自動判斷的預設值。

提示批次大小

ai.initialize_embeddings 中的 batch_size 參數可讓您為直接支援的模型建議偏好的批次大小,藉此引導 AlloyDB 的查詢最佳化工具。AlloyDB 可能會根據模型限制或配額動態縮減大小,但提示有助於影響查詢執行計畫。

CALL ai.initialize_embeddings(
    model_id => 'text-embedding-005',
    table_name => 'user_reviews',
    content_column => 'content',
    embedding_column => 'content_embeddings',
    batch_size => 50
);

使用支援批次作業的自訂嵌入模型

如要使用支援批次處理的自訂或外部支援模型,請定義批次轉換函式,並在建立模型時將這些函式指定為 model_batch_in_transform_fnmodel_batch_out_transform_fn。您也可以在 initialize_embeddings 呼叫中指定 batch_size。對於支援批次處理的模型,建議您使用大於 1 的 batch_size,以提升效能。

  1. 定義自訂模型的輸入、輸出和批次轉換函式。

    -- Scalar input transform functions
    CREATE OR REPLACE FUNCTION acme_text_input_transform(model_id TEXT, input TEXT) RETURNS JSON;
    CREATE OR REPLACE FUNCTION acme_text_output_transform(model_id TEXT, model_output JSON) RETURNS real[];
    CREATE OR REPLACE FUNCTION acme_generate_headers(model_id TEXT, input TEXT) RETURNS JSON;
    -- Batch input transform functions
    CREATE OR REPLACE FUNCTION acme_text_batch_input_transform(model_id TEXT, input TEXT[]) RETURNS JSON;
    CREATE OR REPLACE FUNCTION acme_text_batch_output_transform(model_id TEXT, model_output JSON) RETURNS real[][];
    
  2. 如要建立模型,請指定批次轉換函式。

    CALL
      ai.create_model(
        model_id => 'custom-embedding-model',
        model_request_url => 'https://acme.com/models/text/embeddings/v1',
        model_type => 'text_embedding',
        model_in_transform_fn => 'acme_text_input_transform',
        model_out_transform_fn => 'acme_text_output_transform',
        generate_headers_fn => 'acme_generate_headers',
        model_batch_in_transform_fn => 'acme_text_batch_input_transform',
        model_batch_out_transform_fn => 'acme_text_batch_output_transform'
      );
    
  3. 使用自訂模型生成向量嵌入。

    CALL
      ai.initialize_embeddings(
        model_id => 'custom-embedding-model',
        table_name => 'user_reviews',
        content_column => 'content',
        embedding_column => 'content_embeddings',
        batch_size => 10
    );
    

您也可以搭配使用自動嵌入功能和不支援批次的自訂模型。如要這麼做,您仍須定義批次轉換函式 model_batch_in_transform_fnmodel_batch_out_transform_fn。如果是非批次處理模型,請定義這些函式,一次處理輸入陣列中的單一輸入。呼叫這個模型的 ai.initialize_embeddings 時,請將 batch_size 設為 1

逐步重新整理嵌入內容

重新整理嵌入內容時,系統會根據輸入內容資料欄中的最新值重新產生嵌入內容。

為方便您控管一致性和效能,AlloyDB 支援多種模式,可逐步重新整理嵌入內容。您可以在 ai.initialize_embeddings() 中使用 incremental_refresh_mode 列舉引數選取模式。以下列出可能的模式:

  • transactional:在更新內容資料欄的交易中,一併重新整理嵌入內容。這個程序通常會使用類似資料庫觸發程序的機制,在內容欄更新時自動產生嵌入內容,但可能會造成額外負擔,並減緩更新作業。導入的額外負荷是為了維持交易語意,並確保嵌入內容與內容同步。這個模式會依據模型的純量轉換函式,因此您必須在建立模型時定義 model_in_transform_fnmodel_out_transform_fn。如要使用 transactional 模式,您必須具備表格的擁有者角色

    CALL
      ai.initialize_embeddings(
        model_id => 'text-embedding-005',
        table_name => 'user_reviews',
        content_column => 'content',
        embedding_column => 'content_embeddings',
        batch_size => 10,
        incremental_refresh_mode => 'transactional'
    );
    
  • none:這是預設模式。在這個模式下,AlloyDB 不會自動更新嵌入內容。系統不會追蹤增量變更,因此呼叫 ai.refresh_embeddings() 函式會重新產生整個資料表的嵌入內容。這個模式提供完整控制權。

重新整理資料表的所有嵌入項目

成功為資料表執行 ai.initialize_embeddings() 後,您可以使用 ai.refresh_embeddings() 函式重新生成嵌入。您可以透過重新整理作業,更新初始 initialize_embeddings 呼叫期間同時修改的資料列嵌入內容,或定期執行完整重新整理。

重新整理函式會重複使用初始呼叫中的設定,因此您只需要指定表格和嵌入資料欄。您也可以提供選用的 batch_size 來覆寫預設值。

CALL ai.refresh_embeddings(
    table_name => 'user_reviews',
    embedding_column => 'content_embeddings',
    batch_size => 50  -- Optional override
);

在建立向量嵌入時使用表格資料

雖然 ai.initialize_embeddings() 是在執行階段中封鎖的呼叫,但其他連線仍可繼續使用資料表。自動向量嵌入程序會分批更新資料列,這會涉及標準資料列層級的鎖定。也就是說,如果並行 DML 作業 (例如 UPDATEDELETE) 嘗試修改嵌入程序正在更新的相同資料列,只會短暫遭到封鎖。系統不會封鎖來自其他連線的查詢。請注意,initialize_embeddings 會略過同時修改的資料列。如果 incremental_refresh_modenone,系統不會更新這些修改後資料列的嵌入內容,直到呼叫後續重新整理作業為止。

-- connection1 (starts embedding generation)
SELECT
  ai.initialize_embeddings(
    model_id => 'text-embedding-005',
    table_name => 'user_reviews',
    content_column => 'content',
    embedding_column => 'content_embeddings'
  );

-- connection2 (performs DMLs/queries without blocking)
INSERT INTO user_reviews(id, review_time, is_edited, content)
VALUES (48290, now(), false, 'I really liked the product functionality, but wish it came in orange color');

UPDATE user_reviews
SET is_edited = TRUE, content = 'Changing to 5 star. My issue is resolved by the support'
WHERE id = 700;

如果您使用 pg_cancel 取消 initialize_embeddings,或 initialize_embeddings 因內部錯誤而失敗,系統會傳回失敗狀態。系統不會復原任何成功建立的向量嵌入。如要從失敗中復原並完成向量嵌入建立作業,請先使用 ai.drop_embedding_config() 函式清除設定,然後重新發出 ai.initialize_embeddings() 呼叫。

如要重新整理並行修改的資料列嵌入內容,請在 ai.initialize_embeddings 呼叫完成後呼叫 ai.refresh_embeddings。這項重新整理呼叫會重新產生整個資料表的嵌入。

刪除自動向量嵌入設定

如要移除特定表格和嵌入資料欄組合的自動向量嵌入設定,請使用 ai.drop_embedding_config() 函式。這項函式可用於清理資料,或重新設定資料欄的嵌入管理功能。

CALL
  ai.drop_embedding_config(
    table_name => 'user_reviews',
    embedding_column => 'content_embeddings');

在 Auto 中生成嵌入的範例

本節提供範例,說明如何使用已註冊的模型端點,在自動模式中生成嵌入內容。

OpenAI 嵌入模型

如要使用 OpenAI 提供的已註冊 text-embedding-3-small 模型端點生成嵌入,請執行下列陳述式:

CALL ai.initialize_embeddings(
    model_id => 'text-embedding-3-small',
    table_name => 'user_reviews',
    chunk_column => 'content',
    embedding_column => 'content_embeddings'
);

自訂嵌入模型

如果是您自己的模型或外部支援的模型,您必須定義輸入和輸出轉換函式,並向 ai.create_model 註冊。如果您打算使用自動嵌入功能,就必須同時指定純量轉換函式 (例如 acme_text_input_transformacme_text_output_transform) 和批次轉換函式 (例如 acme_text_batch_input_transformacme_text_batch_output_transform)。

後續步驟