本頁面說明如何使用 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_VERSION
:text-embedding
嵌入模型
Spanner 會自動授予適當的權限。如果沒有,請檢查模型端點存取權控制。
生成式 AI 模型不支援結構定義探索和驗證。您必須提供與模型結構定義相符的 INPUT
和 OUTPUT
子句。如需文字嵌入模型的完整結構定義,請參閱「取得文字嵌入」。
生成文字嵌入
如要生成嵌入,請使用下列 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_VERSION
:text-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_VERSION
:text-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_VERSION
:text-embedding
嵌入模型
更新文字嵌入
如要更新嵌入內容或即時擷取資料,請使用 UPDATE
(GoogleSQL
和 PostgreSQL)
陳述式。
如要更新上例中的 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_VERSION
:text-embedding
嵌入模型
後續步驟
- 瞭解如何使用 Vertex AI Vector Search 搜尋語意相似的項目。
- 如要進一步瞭解機器學習和嵌入,請參閱嵌入速成課程。