取得 Vertex AI 文字嵌入

本頁面說明如何使用 Vertex AI 文字嵌入 API,針對儲存在 Spanner for GoogleSQL 方言資料庫和 PostgreSQL 方言資料庫中的資料,產生、儲存及更新文字嵌入。

文字嵌入是文字資料的向量表示法,可用於多種方式找出相似項目。每次完成 Google 搜尋或在線上購物時看到推薦內容,都會與這些內容互動。建立文字嵌入項目時,您會以浮點數陣列的形式,取得自然文字的向量表示法。也就是說,系統會為您輸入的所有文字指派數值表示法。應用程式可以比較兩段文字向量表示法之間的數字距離,藉此判斷文字之間的相似度,或文字所代表的物件。

您可以使用 Vertex AI 文字嵌入 API 搭配生成式 AI 建立文字嵌入。您可以透過本教學課程,為儲存在 Spanner 和 Vertex AI 嵌入模型 (例如 textembedding-gecko 模型) 中的資料產生文字嵌入資料。

如要進一步瞭解嵌入,請參閱「取得文字嵌入」。

目標

在本教學課程中,您將瞭解以下內容:

  • 使用 DDL 陳述式,在 Spanner 結構定義中註冊 Vertex AI textembedding-gecko 模型。
  • 使用 SQL 查詢參照已註冊的模型,從 Spanner 中儲存的資料產生嵌入資料。

費用

本教學課程使用 Google Cloud的計費元件,包括:

  • Spanner
  • Vertex AI

如要進一步瞭解 Spanner 費用,請參閱 Spanner 定價頁面。

如要進一步瞭解 Vertex AI 費用,請參閱 Vertex AI 定價頁面。

產生並儲存文字嵌入

產生嵌入資料可能需要一段時間,具體時間長短取決於您使用的模型。對於效能較敏感的工作負載,最佳做法是避免在讀寫交易中產生嵌入物。請改為使用下列 SQL 範例,在唯讀交易中產生嵌入資料。

GoogleSQL

在 Spanner 中註冊文字嵌入模型

在 GoogleSQL 中,您必須先註冊模型,才能搭配 ML.PREDICT 函式使用。如要在 Spanner 資料庫中註冊 textembedding-gecko 模型,請執行下列 DDL 陳述式

CREATE MODEL MODEL_NAME
INPUT(content STRING(MAX))
OUTPUT(
  embeddings
    STRUCT<
      statistics STRUCT<truncated BOOL, token_count FLOAT64>,
      values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION'
);

取代下列內容:

  • MODEL_NAME:嵌入模型名稱
  • PROJECT:代管 Vertex AI 端點的專案
  • LOCATION:Vertex AI 端點的位置
  • MODEL_VERSIONtextembedding-gecko 嵌入模型的版本

Spanner 會自動授予適當的權限。如果不是,請檢查模型端點存取權控制

結構定義探索和驗證功能不適用於生成式 AI 模型。您必須提供與模型結構定義相符的 INPUTOUTPUT 子句。如需 Gecko 模型的完整結構定義,請參閱「取得文字嵌入資料」。

產生文字嵌入

如要產生嵌入,請使用下列 SQL 將文字直接傳遞至 ML.PREDICT 函式:

SELECT embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT "A product description" as content)
);

如要為儲存在資料表中的資料產生嵌入項目,請使用下列 SQL:

SELECT id, embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT id, description as content FROM Products)
);

儲存文字嵌入

在唯讀交易中產生嵌入資料後,請將這些資料儲存在 Spanner 中,以便透過作業資料進行管理。如要儲存嵌入資料,請使用讀取/寫入交易

對於不太在意效能的工作負載,您可以在讀寫交易中使用下列 SQL 產生並插入嵌入項目:

CREATE TABLE Products(
  id INT64 NOT NULL,
  description STRING(MAX),
  embeddings ARRAY<FLOAT32>,
) PRIMARY KEY(id);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT @Description as content)
);

PostgreSQL

產生文字嵌入

如要產生嵌入,請使用下列 SQL 將文字直接傳遞至 spanner.ML_PREDICT_ROW 函式:

SELECT
  spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    '{"instances": [{"content": "A product description"}]}'::jsonb
  ) ->'predictions'->0->'embeddings'->'values';

取代下列內容:

  • PROJECT:代管 Vertex AI 端點的專案
  • LOCATION:Vertex AI 端點的位置
  • MODEL_VERSIONtextembedding-gecko 嵌入模型的版本

如要為儲存在資料表中的資料產生嵌入項目,請使用下列 SQL:

SELECT id, spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
  ) -> `predictions`->0->`embeddings`->`values``
FROM Products;

取代下列內容:

  • PROJECT:代管 Vertex AI 端點的專案
  • LOCATION:Vertex AI 端點的位置
  • MODEL_VERSIONtextembedding-gecko 嵌入模型的版本

儲存文字嵌入

在唯讀交易中產生嵌入資料後,請將這些資料儲存在 Spanner 中,以便透過作業資料進行管理。如要儲存嵌入資料,請使用讀取/寫入交易

對於不太在意效能的工作負載,您可以在讀寫交易中使用下列 SQL 產生並插入嵌入項目:

CREATE TABLE Products (
  id INT8 NOT NULL,
  description TEXT,
  embeddings REAL[],
  PRIMARY KEY(id)
);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', @Description)))
  ) -> 'predictions'->0->'embeddings'->'values'
));

取代下列內容:

  • PROJECT:代管 Vertex AI 端點的專案
  • LOCATION:Vertex AI 端點的位置
  • MODEL_VERSIONtextembedding-gecko 嵌入模型的版本

更新文字嵌入

如要更新嵌入資料或即時擷取資料,請使用 UPDATE (GoogleSQLPostgreSQL) 陳述式。

如要更新上述範例中的 Products 資料表,請使用下列 SQL:

GoogleSQL

UPDATE Products
SET
  description = @description,
  embeddings = (SELECT embeddings.values
                  FROM ML.PREDICT(MODEL MODEL_NAME, (SELECT @description as content))
              )
WHERE id = @id;

更改下列內容:

  • MODEL_NAME:嵌入模型名稱

PostgreSQL

UPDATE
  Products
SET
  description = $1,
  embeddings = spanner.FLOAT32_ARRAY(
    spanner.ML_PREDICT_ROW(
      'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
      JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', $1)))
    ) -> 'predictions'->0->'embeddings'->'values')
WHERE
  id = $2;

取代下列內容:

  • PROJECT:代管 Vertex AI 端點的專案
  • LOCATION:Vertex AI 端點的位置
  • MODEL_VERSIONtextembedding-gecko 嵌入模型的版本

後續步驟