取得 Vertex AI 文字嵌入

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

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

您可以使用 Vertex AI 文字嵌入 API,透過生成式 AI 建立文字嵌入。在本教學課程中,您將使用 Vertex AI text-embedding 模型,為儲存在 Spanner 中的資料生成文字嵌入。

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

目標

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

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

定價

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

  • Spanner
  • Vertex AI

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

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

生成及儲存文字嵌入

視使用的模型而定,產生嵌入內容可能需要一段時間。對於效能較為敏感的工作負載,最佳做法是避免在讀寫交易中產生嵌入內容。請改用下列 SQL 範例,在唯讀交易中產生嵌入。

GoogleSQL

在 Spanner 中註冊文字嵌入模型

在 GoogleSQL 中,您必須先註冊模型,才能搭配 ML.PREDICT 函式使用。如要在 Spanner 資料庫中註冊 text-embedding 模型,請執行下列 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/text-embedding$MODEL_VERSION'
);

取代下列項目:

  • MODEL_NAME:嵌入模型名稱
  • PROJECT:代管 Vertex AI 端點的專案
  • LOCATION:Vertex AI 端點的位置
  • MODEL_VERSIONtext-embedding嵌入模型

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

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

生成文字嵌入

如要生成嵌入,請使用下列 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/text-embedding$MODEL_VERSION',
    '{"instances": [{"content": "A product description"}]}'::jsonb
  ) ->'predictions'->0->'embeddings'->'values';

取代下列項目:

  • PROJECT:代管 Vertex AI 端點的專案
  • LOCATION:Vertex AI 端點的位置
  • MODEL_VERSIONtext-embedding嵌入模型

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

SELECT id, spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/text-embedding$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_VERSIONtext-embedding嵌入模型

儲存文字嵌入

在唯讀交易中產生嵌入內容後,請將其儲存在 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/text-embedding$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_VERSIONtext-embedding嵌入模型

更新文字嵌入

如要更新嵌入內容或即時擷取資料,請使用 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/text-embedding$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_VERSIONtext-embedding嵌入模型

後續步驟