自主生成嵌入內容
本文說明如何使用資料的自主嵌入生成功能,讓 BigQuery 根據來源資料欄,維護資料表中的嵌入資料欄。在來源資料欄中新增或修改資料時,BigQuery 會使用 Vertex AI 嵌入模型,自動為該資料產生或更新嵌入資料欄。如果來源資料會定期更新,這項功能就非常實用,可讓 BigQuery 維護您的嵌入內容。
嵌入項目適用於檢索增強生成 (RAG) 等現代生成式 AI 應用程式,但建立、管理及查詢嵌入項目可能相當複雜。您可以使用自主嵌入生成功能,簡化建立、維護及查詢嵌入的程序,以便用於相似度搜尋和其他生成式 AI 應用程式。
舉例來說,您可以透過類似下列的查詢建立啟用自主嵌入生成功能的資料表、插入資料,然後執行語意搜尋:
CREATE TABLE mydataset.products (
name STRING,
description STRING,
description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (
AI.EMBED(description, connection_id => 'us.example_connection',
endpoint => 'text-embedding-005'))
STORED OPTIONS( asynchronous = TRUE ));
# Values in the description_embedding column are automatically generated.
INSERT INTO mydataset.products (name, description) VALUES
("Super slingers"), ("An exciting board game for the whole family"), ...;
SELECT * FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");
事前準備
如要在資料表上啟用自主嵌入生成功能,您必須具備必要權限和連線。
必要的角色
如要取得啟用自主產生嵌入內容所需的權限,請要求管理員授予下列 IAM 角色:
-
如要使用連線資源,請在連線上授予 BigQuery Connections 使用者 (
roles/bigquery.connectionUser) 角色。 -
如要建立資料表:
資料表的 BigQuery 資料編輯者 (
roles/bigquery.dataEditor) -
為連線的服務帳戶授予下列角色,以便存取 Vertex AI 端點中託管的模型:
Vertex AI 使用者 (
roles/aiplatform.user) 在具有連線的專案中
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
建立連線並將權限授予服務帳戶
如要在資料表上啟用自主嵌入生成功能,您必須建立 Cloud 資源連線。接著,授予您在建立連線時建立的服務帳戶 Vertex AI 使用者角色 (roles/aiplatform.user)。
建立可自主產生嵌入內容的資料表
您可以使用自主嵌入生成功能,在 CREATE TABLE 陳述式中,透過 AI.EMBED 函式生成嵌入。
CREATE TABLE DATASET_ID.TABLE (
[COLUMN, ...]
STRING_COL STRING,
EMBEDDING_COL_NAME STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (
AI.EMBED(
STRING_COL,
connection_id => CONNECTION_ID,
endpoint => ENDPOINT)
)
STORED OPTIONS (asynchronous = TRUE)
);
更改下列內容:
DATASET_ID:要在其中建立資料表的資料集名稱。TABLE:要建立自主嵌入生成功能的資料表名稱。COLUMN, ...:資料表應包含的任何資料欄,但您要自動嵌入的資料欄除外。STRING_COL:要自動嵌入的STRING資料欄名稱。EMBEDDING_COL_NAME:系統自動產生的嵌入資料欄名稱。CONNECTION_ID:STRING值,其中包含要使用的連線名稱,例如my_project.us.example_connection。您必須在建立資料表的專案中,將「Vertex AI 使用者」角色授予連線的服務帳戶。ENDPOINT:指定要用於文字嵌入模型的支援 Vertex AI 文字嵌入模型端點的STRING值。您指定的端點值必須包含模型版本,例如text-embedding-005。如果您指定模型名稱而非網址,BigQuery ML 會自動識別模型,並使用模型的完整端點。
建立資料表後,或更新來源資料欄中的資料後,系統很快就會開始產生背景嵌入作業。
如要追蹤嵌入生成作業的進度,可以使用類似下列的查詢:
SELECT
COUNT(*) AS total_num_rows,
COUNTIF(description_embedding IS NOT NULL
AND description_embedding.status = '') AS total_num_generated_embeddings
FROM
PROJECT_ID.DATASET_ID.TABLE;
建立含有嵌入內容的資料表後,您可以在包含自動產生嵌入內容的 STRUCT 欄上建立向量索引。
範例
假設您是銷售多種產品的大型零售商,你有一份產品名稱和說明表格,並想協助顧客找到所需產品。下列查詢說明如何設定自主嵌入生成功能,協助對產品說明進行語意搜尋。
首先,請建立資料集:
CREATE SCHEMA mydataset;
接著,建立啟用自主嵌入生成功能的資料表,用來保存產品資訊。系統會根據 description 欄自動產生 description_embedding 欄。
# Create a table of products and descriptions with a generated embedding column.
CREATE TABLE mydataset.products (
name STRING,
description STRING,
description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (AI.EMBED(
description,
connection_id => 'us.example_connection',
endpoint => 'text-embedding-005'
))
STORED OPTIONS( asynchronous = TRUE )
);
下列查詢會將一些產品名稱和說明插入資料表。您不必為 description_embedding 指定值,因為系統會自動產生該值。
# Insert product descriptions into the table.
# The description_embedding column is automatically updated.
INSERT INTO mydataset.products (name, description) VALUES
("Lounger chair", "A comfortable chair for relaxing in."),
("Super slingers", "An exciting board game for the whole family."),
("Encyclopedia set", "A collection of informational books.");
您也可以選擇在資料表上建立向量索引,加快搜尋速度。
向量索引需要三個以上的資料列,因此下列查詢假設您已插入額外資料。每次插入資料時,系統都會自動更新 description_embedding 欄。
CREATE VECTOR INDEX my_index
ON mydataset.products(description_embedding)
OPTIONS(index_type = 'IVF');
最後,您可以使用 AI.SEARCH 函式,對產品執行語意搜尋,找出有趣的玩具:
# Search for products that are fun to play with.
SELECT base.name, base.description, distance
FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");
/*------------------+----------------------------------------------+----------------------+
| name | description | distance |
+------------------+----------------------------------------------+----------------------+
| Super slingers | An exciting board game for the whole family. | 0.80954913893618929 |
| Lounger chair | A comfortable chair for relaxing in. | 0.938933930620146 |
| Encyclopedia set | A collection of informational books. | 1.1119297739353384 |
+------------------+----------------------------------------------+----------------------*/
取得自動生成的嵌入欄資訊
如要確認資料欄是否為自動產生的嵌入資料欄,請查詢 INFORMATION_SCHEMA.COLUMNS 檢視區塊。
下列查詢會顯示所有自動產生的嵌入資料欄相關資訊:
SELECT *
FROM PROJECT_ID.DATASET_ID.INFORMATION_SCHEMA.COLUMNS
WHERE is_generated = 'ALWAYS';
generation_expression 欄位會顯示用於在資料欄上生成嵌入的 AI.EMBED 函式呼叫。
使用自己的預留項目
根據預設,BigQuery 會使用隨選運算單元處理維護所產生嵌入資料欄所需的處理作業。如要確保效能可預測且一致,您可以選擇建立預留項目,並將 job_type 設為 BACKGROUND。如果存在背景保留項目,BigQuery 會改用該項目維護產生的嵌入欄。
疑難排解
產生的嵌入資料欄包含兩個欄位:result 和 status。
如果 BigQuery 嘗試為資料表中的特定資料列產生嵌入時發生錯誤,則 result 欄位會顯示 NULL,而 status 欄位則會說明錯誤。舉例來說,如果來源資料欄為 NULL,則 result 嵌入也是 NULL,狀態為 NULL value is not supported for embedding generation。
如果發生更嚴重的錯誤,可能會導致系統無法產生嵌入內容。在這種情況下,您可以查詢INFORMATION_SCHEMA.JOBS檢視區塊的背景工作,並查看 error_result 欄位中的資訊。背景嵌入工作的 ID 前置字串為 gc_。舉例來說,下列查詢會擷取錯誤結果不是 NULL 的所有背景工作:
SELECT * FROM `region-REGION.INFORMATION_SCHEMA.JOBS` j
WHERE EXISTS (
SELECT 1
FROM unnest(j.referenced_tables) t
WHERE
j.project_id = 'PROJECT_ID'
AND t.dataset_id = 'DATASET_ID'
AND t.table_id = 'TABLE'
)
AND starts_with(job_id, 'gc')
AND error_result IS NOT NULL
ORDER BY j.creation_time DESC;
追蹤費用
自主生成嵌入功能會向 Vertex AI 傳送要求,這可能會產生費用。如要追蹤背景嵌入作業產生的 Vertex AI 費用,請按照下列步驟操作:
- 在 Cloud Billing 中查看帳單報表。
使用篩選器縮小搜尋結果範圍。
選取「Vertex AI」服務。
如要查看特定作業的費用,請依標籤篩選。
將索引鍵設為
bigquery_ml_job,並將值設為嵌入工作的工作 ID。背景嵌入工作的前置字元都是gc_。
部分費用最多可能需要 24 小時才會顯示在 Cloud Billing 中。
限制
- 每個資料表最多支援一個自動產生的嵌入欄。
- 使用 Google Cloud 控制台、
bq show指令或INFORMATION_SCHEMA.TABLES檢視的ddl欄位查看資料表結構定義時,系統不會指出資料欄是自動產生。 - 您無法使用
ALTER TABLE ADD COLUMN將產生的嵌入資料欄新增至現有資料表。 - 如果您建立含有生成嵌入欄的資料表副本、複製資料表或建立快照,系統只會複製資料。生成設定不會套用至新資料表,且更新新資料表的來源資料欄不會產生新的嵌入內容。
- 如果從快照還原已啟用自主嵌入產生功能的資料表,系統不會還原嵌入產生設定。
- 您只能使用 SQL 建立生成的嵌入資料欄。您無法使用
bq mk或bq update指令建立產生的嵌入欄。 - 產生資料欄的來源資料欄必須是
STRING資料欄。 建立產生的嵌入欄後,會受到下列限制:
- 您無法捨棄或重新命名來源資料欄,但仍可捨棄或重新命名產生的嵌入資料欄。如果捨棄嵌入資料欄,則可以捨棄或重新命名來源資料欄。
- 您無法變更來源資料欄或產生的嵌入資料欄的資料類型。
您無法為自動產生的嵌入資料欄指定預設值。
您無法使用下列方法,直接寫入產生的嵌入資料欄:
- DML
- 串流寫入
bq insertbq copy -a
含有產生的嵌入資料欄的資料表不支援任何資料欄層級安全性政策,例如政策標記。
呼叫
VECTOR_SEARCH或AI.SEARCH等搜尋函式時,系統會在搜尋期間略過基本資料表中缺少嵌入的資料列。如果資料表已啟用自主嵌入生成功能,您就無法在該資料表上建立分區向量索引。
如果您在系統自動產生的嵌入欄上建立向量索引,則至少 80% 的資料列產生嵌入後,系統就會開始訓練索引。您可以使用下列查詢,查看資料表上已生成嵌入的百分比:
SELECT COUNTIF(description_embedding IS NOT NULL AND description_embedding.status = '') * 100.0 / COUNT(*) AS percent FROM PROJECT_ID.DATASET_ID.TABLE;