產生嵌入

選取說明文件版本:

本頁面說明如何將 AlloyDB Omni 做為大型語言模型 (LLM) 工具,並根據 LLM 生成向量嵌入。

如要進一步瞭解如何搭配使用 ML 模型與 AlloyDB Omni,請參閱「建構生成式 AI 應用程式」。

AlloyDB Omni 可讓您使用 Vertex AI 託管的 LLM,將文字字串轉換為嵌入項目,也就是模型以數值向量表示指定文字的語意。如要進一步瞭解 Vertex AI 對文字嵌入模型的支援,請參閱「文字嵌入模型」。

事前準備

如要讓 AlloyDB Omni 生成嵌入內容,請確認符合下列規定:

區域限制

您可以在可使用 Generative AI on Vertex AI 的區域生成嵌入內容。如需查看地區清單,請參閱「Vertex AI 的生成式 AI 服務地區 」一文。

如果是 AlloyDB Omni,請確認 AlloyDB Omni 叢集和您查詢的 Vertex AI 模型位於相同區域。

必要的資料庫擴充功能

  • 確認 AlloyDB Omni 資料庫已安裝 google_ml_integration 擴充功能。

    CREATE EXTENSION IF NOT EXISTS google_ml_integration;
    

    這項擴充功能隨附於 AlloyDB Omni。您可以在叢集中的任何資料庫上安裝。

  • google_ml_integration.enable_model_support 資料庫標記設為 off

設定模型存取權

如要從 AlloyDB Omni 資料庫產生嵌入內容,請務必先設定 AlloyDB Omni,使其能與文字嵌入模型搭配運作。

如要使用雲端 text-embedding-005 模型,您需要將資料庫與 Vertex AI 整合

授予資料庫使用者產生嵌入內容的權限

授予資料庫使用者執行 embedding 函式的權限,以執行預測:

  1. 如「psql 用戶端連線至執行個體」一文所述,將 psql 用戶端連線至叢集的主要執行個體。

  2. 在 psql 指令提示中,連線至資料庫並授予權限:

    \c DB_NAME
    
    GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;
    

    更改下列內容:

    • DB_NAME:要授予權限的資料庫名稱

    • USER_NAME:要授予權限的使用者名稱

生成嵌入

AlloyDB Omni 提供可將文字轉換為向量嵌入的函式。接著,您可以將該嵌入項目以向量資料的形式儲存在資料庫中,並視需要使用 pgvector 函式,根據該嵌入項目建立查詢。

如要使用 AlloyDB Omni 產生嵌入,請使用 google_ml_integration 擴充功能提供的 embedding() 函式:

SELECT embedding( 'MODEL_IDVERSION_TAG', 'TEXT');

更改下列內容:

  • MODEL_ID:要查詢的模型 ID。

    如果您使用 Vertex AI Model Garden,請指定 text-embedding-005 做為模型 ID。AlloyDB Omni 可使用這些雲端模型進行文字嵌入。詳情請參閱「文字嵌入」。

  • 選用:VERSION_TAG:要查詢的模型版本標記。在標記開頭加上 @

    如果您使用 Vertex AI 搭配其中一個 text-embedding 英文模型,請指定其中一個版本標記,例如「text-embedding-005」,如「模型版本」一文所列。

    Google 強烈建議您一律指定版本標記。 如果未指定版本標記,AlloyDB 一律會使用最新模型版本,這可能會導致非預期結果。

  • TEXT:要翻譯成向量嵌入的文字。

以下範例使用 text-embedding 英文模型 005 版,根據提供的字串產生嵌入:

SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');

儲存嵌入

使用 google_ml_integration 擴充功能產生的嵌入項目會以 real 值陣列的形式實作。這些產生的嵌入內容會做為 pgvector 擴充功能函式的輸入內容。

如要在表格中儲存這個值,請新增 real[] 欄:

ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN real[DIMENSIONS];

建立用於儲存嵌入內容的資料欄後,您可以根據同一資料表中另一個資料欄中已儲存的值,填入該資料欄:

UPDATE TABLE SET EMBEDDING_COLUMN = embedding('MODEL_IDVERSION_TAG', SOURCE_TEXT_COLUMN);

更改下列內容:

  • TABLE:資料表名稱

  • EMBEDDING_COLUMN:嵌入資料欄的名稱

  • MODEL_ID:要查詢的模型 ID。

    如果您使用 Vertex AI Model Garden,請指定 text-embedding-005 做為模型 ID。AlloyDB Omni 可使用這些雲端模型進行文字嵌入。詳情請參閱「文字嵌入」。

  • 選用:VERSION_TAG:要查詢的模型版本標記。在標記開頭加上 @

    如果您使用 Vertex AI 搭配其中一個 text-embedding 英文模型,請指定其中一個版本標記,例如「text-embedding-005」,如「模型版本」一文所列。

    Google 強烈建議您一律指定版本標記。 如果未指定版本標記,AlloyDB 一律會使用最新模型版本,這可能會導致非預期結果。

  • SOURCE_TEXT_COLUMN:儲存要翻譯成嵌入內容的文字的資料欄名稱

您也可以使用 embedding() 函式將文字翻譯成向量。將向量套用至 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')::vector
    LIMIT ROW_COUNT

使用模型版本標記,避免發生錯誤

Google 強烈建議您一律使用所選嵌入模型穩定版。對大多數模型而言,這表示要明確設定版本標記。

呼叫 embedding() 函式時,如果未指定模型的版本標記,語法上雖然有效,但也很容易出錯。

在 Vertex AI Model Garden 中使用模型時,如果省略版本標記,Vertex AI 會使用最新版本的模型。這可能不是最新的穩定版。如要進一步瞭解可用的 Vertex AI 模型版本,請參閱「模型版本」。

指定 Vertex AI 模型版本一律會針對指定文字輸入傳回相同的embedding()回應。如果您在呼叫 embedding() 時未指定模型版本,新發布的模型版本可能會突然變更特定輸入內容的回傳向量,導致應用程式發生錯誤或其他非預期行為。

為避免這些問題,請務必指定模型版本。

疑難排解

ERROR: Model not found for model_id

錯誤訊息

嘗試使用 embedding()google_ml.embedding() 函式產生嵌入時,會發生下列錯誤:

ERROR: 'Model not found for model_id:

  • 升級 google_ml_integration 擴充功能,然後再試一次生成嵌入內容。

    ALTER EXTENSION IF NOT EXISTS google_ml_integration UPDATE;
    

    你也可以捨棄擴充功能,然後重新建立。

    DROP extension google_ml_integration;
    CREATE EXTENSION google_ml_integration;
    
  • 如果使用 google_ml.embedding() 函式產生嵌入內容,請確認模型已註冊,且您在查詢中使用正確的 model_id

後續步驟