執行語意搜尋和檢索增強生成
本教學課程將引導您完成端對端程序,建立及使用文字嵌入項目,以便進行語意搜尋和檢索增強生成 (RAG)。
本教學課程涵蓋下列工作:
- 在 Vertex AI 嵌入模型上建立 BigQuery ML 遠端模型。
- 使用遠端模型搭配
ML.GENERATE_EMBEDDING
函式,從 BigQuery 資料表中的文字產生嵌入。 - 建立向量索引來為嵌入資料建立索引,以便提升搜尋效能。
- 使用
VECTOR_SEARCH
函式搭配嵌入項目,搜尋相似的文字。 - 透過
ML.GENERATE_TEXT
函式產生文字,並使用向量搜尋結果來增強提示輸入內容,進而改善結果。
本教學課程使用 BigQuery 公開資料表 patents-public-data.google_patents_research.publications
。
必要角色和權限
如要建立連結,您必須具備下列身分與存取權管理 (IAM) 角色的成員資格:
roles/bigquery.connectionAdmin
如要將權限授予連線的服務帳戶,您必須具備下列權限:
resourcemanager.projects.setIamPolicy
本教學課程中,其他 BigQuery 作業所需的 IAM 權限已納入下列兩個角色:
- BigQuery 資料編輯器 (
roles/bigquery.dataEditor
),用於建立模型、資料表和索引。 - BigQuery 使用者 (
roles/bigquery.user
),用於執行 BigQuery 工作。
- BigQuery 資料編輯器 (
費用
In this document, you use the following billable components of Google Cloud:
- BigQuery ML: You incur costs for the data that you process in BigQuery.
- Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.
To generate a cost estimate based on your projected usage,
use the pricing calculator.
如要進一步瞭解 BigQuery 定價,請參閱 BigQuery 說明文件中的「BigQuery 定價」一節。
如要進一步瞭解 Vertex AI 定價,請參閱 Vertex AI 定價頁面。
事前準備
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
建立資料集
建立 BigQuery 資料集來儲存機器學習模型。
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
在「Explorer」窗格中,按一下專案名稱。
依序點選
「View actions」(查看動作) >「Create dataset」(建立資料集)。在「Create dataset」頁面上執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial
。針對「Location type」(位置類型) 選取「Multi-region」(多區域),然後選取「US (multiple regions in United States)」(us (多個美國區域))。
保留其餘預設設定,然後點選「Create dataset」(建立資料集)。
bq
如要建立新的資料集,請使用 bq mk
指令搭配 --location
旗標。如需可能參數的完整清單,請參閱 bq mk --dataset
指令參考資料。
建立名為
bqml_tutorial
的資料集,並將資料位置設為US
,說明為BigQuery ML tutorial dataset
:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
這個指令採用
-d
捷徑,而不是使用--dataset
旗標。如果您省略-d
和--dataset
,該指令預設會建立資料集。確認資料集已建立:
bq ls
API
請呼叫 datasets.insert
方法,搭配已定義的資料集資源。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
在嘗試這個範例之前,請先參閱 BigQuery 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定 ADC」。
建立連線
建立 Cloud 資源連線,並取得連線的服務帳戶。請在與先前步驟中建立的資料集相同的位置建立連線。
如果您已設定具備適當權限的預設連線,可以略過這個步驟。
為遠端模型建立Cloud 資源連線,並取得連線的服務帳戶。請在與您在上一個步驟中建立的資料集相同的位置建立連線。
選取下列選項之一:
主控台
前往「BigQuery」頁面
在「Explorer」窗格中,按一下
「新增資料」:「Add data」對話方塊隨即開啟。
在「Filter By」窗格中的「Data Source Type」部分,選取「Business Applications」。
或者,您也可以在「Search for data sources」欄位中輸入
Vertex AI
。在「精選資料來源」部分,按一下「Vertex AI」。
按一下「Vertex AI 模型:BigQuery 聯盟」解決方案資訊卡。
在「連線類型」清單中,選取「Vertex AI 遠端模型、遠端函式和 BigLake (Cloud 資源)」。
在「連線 ID」欄位中,輸入連線的名稱。
點選「建立連線」。
按一下「前往連線」。
在「連線資訊」窗格中,複製服務帳戶 ID,以便在後續步驟中使用。
bq
在指令列環境中建立連線:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
--project_id
參數會覆寫預設專案。更改下列內容:
REGION
:您的連線區域PROJECT_ID
:您的 Google Cloud 專案 IDCONNECTION_ID
:連線 ID
建立連線資源時,BigQuery 會建立專屬的系統服務帳戶,並將該帳戶與連線建立關聯。
疑難排解:如果您收到下列連線錯誤,請更新 Google Cloud SDK:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
擷取並複製服務帳戶 ID,以便在後續步驟中使用:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
輸出結果會與下列內容相似:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
使用 google_bigquery_connection
資源。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
以下範例會在 US
地區中建立名為 my_cloud_resource_connection
的 Cloud 資源連線:
如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節中的步驟。
準備 Cloud Shell
- 啟動 Cloud Shell。
-
設定要套用 Terraform 設定的預設 Google Cloud 專案。
您只需為每個專案執行這個指令一次,而且可以在任何目錄中執行。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 設定檔中設定明確的值,系統就會覆寫環境變數。
準備目錄
每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。
-
在 Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱必須包含
.tf
副檔名,例如main.tf
。在本教學課程中,該檔案稱為main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您正在參考教學課程,可以複製各個章節或步驟中的程式碼範例。
將範例程式碼複製到新建立的
main.tf
中。您可以視需要從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您採用這種做法。
- 查看並修改要套用至環境的範例參數。
- 儲存變更。
-
初始化 Terraform。這項操作只需對每個目錄執行一次。
terraform init
如要使用最新版的 Google 供應器,請視需要加入
-upgrade
選項:terraform init -upgrade
套用變更
-
檢查設定,並確認 Terraform 將要建立或更新的資源符合您的預期:
terraform plan
視需要修正設定。
-
執行下列指令,並在提示中輸入
yes
,即可套用 Terraform 設定:terraform apply
等待 Terraform 顯示「Apply complete!」(套用完成) 訊息。
- 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。
授予服務帳戶存取權
為連線的服務帳戶授予 Vertex AI 使用者角色。您必須在開始前一節中建立或選取的專案中授予此角色。在其他專案中授予角色會導致 bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource
錯誤。
如要授予角色,請按照下列步驟操作:
前往「IAM & Admin」(IAM 與管理) 頁面。
按一下
「授予存取權」。在「新增主體」欄位,輸入先前複製的服務帳戶 ID。
在「請選擇角色」欄位中,選擇「Vertex AI」,然後選取「Vertex AI 使用者角色」。
按一下 [儲存]。
建立用於產生文字嵌入的遠端模型
建立代表已代管 Vertex AI 文字嵌入生成模型的遠端模型:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列陳述式:
CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model` REMOTE WITH CONNECTION `us.CONNECTION_ID` OPTIONS (ENDPOINT = 'text-embedding-005');
將
CONNECTION_ID
替換為 BigQuery 連線的 ID。在 Google Cloud 控制台查看連線詳細資料時,
CONNECTION_ID
是連線 ID 中顯示的完整限定連線 ID 的最後一個部分的值,例如projects/myproject/locations/connection_location/connections/myconnection
。查詢需要幾秒鐘的時間才能完成,完成後,模型
embedding_model
就會顯示在「Explorer」窗格中的bqml_tutorial
資料集中。由於查詢是使用CREATE MODEL
陳述式建立模型,因此沒有查詢結果。
產生文字嵌入
使用 ML.GENERATE_EMBEDDING
函式,從專利摘要產生文字嵌入項目,然後將這些項目寫入 BigQuery 資料表,以便進行搜尋。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列陳述式:
CREATE OR REPLACE TABLE `bqml_tutorial.embeddings` AS SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.embedding_model`, ( SELECT *, abstract AS content FROM `patents-public-data.google_patents_research.publications` WHERE LENGTH(abstract) > 0 AND LENGTH(title) > 0 AND country = 'Singapore' ) ) WHERE LENGTH(ml_generate_embedding_status) = 0;
這項查詢大約需要 5 分鐘才能完成。
使用 ML.GENERATE_EMBEDDING
函式進行嵌入生成作業可能會因 Vertex AI LLM 配額或服務無法使用而失敗。錯誤詳細資料會傳回至 ml_generate_embedding_status
欄。空白的 ml_generate_embedding_status
欄表示已成功產生嵌入項目。
如要瞭解 BigQuery 中的其他文字嵌入產生方法,請參閱使用預先訓練的 TensorFlow 模型嵌入文字教學課程。
建立向量索引
如果您在嵌入資料欄上建立向量索引,對該欄執行的向量搜尋會使用近似最鄰近搜尋技術。這項技術可提升向量搜尋效能,但代價是降低回憶率,因此會傳回更接近的結果。
如要建立向量索引,請使用 CREATE VECTOR INDEX
資料定義語言 (DDL) 陳述式:
前往「BigQuery」頁面
在查詢編輯器中執行下列 SQL 陳述式:
CREATE OR REPLACE VECTOR INDEX my_index ON `bqml_tutorial.embeddings`(ml_generate_embedding_result) OPTIONS(index_type = 'IVF', distance_type = 'COSINE', ivf_options = '{"num_lists":500}')
建立向量索引通常只需要幾秒鐘的時間。向量索引需要再花 2 或 3 分鐘才能填入資料並準備就緒。
驗證向量索引是否就緒
向量索引會以非同步方式填入。您可以查詢 INFORMATION_SCHEMA.VECTOR_INDEXES
檢視畫面,並驗證 coverage_percentage
欄值大於 0
,且 last_refresh_time
欄值不是 NULL
,以便檢查索引是否可供使用。
前往「BigQuery」頁面
在查詢編輯器中執行下列 SQL 陳述式:
SELECT table_name, index_name, index_status, coverage_percentage, last_refresh_time, disable_reason FROM `PROJECT_ID.bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES`
將
PROJECT_ID
替換為您的專案 ID。
使用向量索引執行文字相似度搜尋
使用 VECTOR_SEARCH
函式搜尋與文字查詢產生的嵌入相符的相關專利。
top_k
引數會決定要傳回的符合項目數量,在本例中為五個。fraction_lists_to_search
選項會決定要搜尋的向量索引清單百分比。您建立的向量索引有 500 個清單,因此 .01
的 fraction_lists_to_search
值表示此向量搜尋會掃描其中五個清單。如上圖所示,fraction_lists_to_search
值越低,回想率就越低,效能就越快。如要進一步瞭解向量索引清單,請參閱 num_lists
向量索引選項。
您用於在這個查詢中產生嵌入資料的模型,必須與用於在比較資料表中產生嵌入資料的模型相同,否則搜尋結果就不會準確。
前往「BigQuery」頁面
在查詢編輯器中執行下列 SQL 陳述式:
SELECT query.query, base.publication_number, base.title, base.abstract FROM VECTOR_SEARCH( TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result', ( SELECT ml_generate_embedding_result, content AS query FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.embedding_model`, (SELECT 'improving password security' AS content)) ), top_k => 5, options => '{"fraction_lists_to_search": 0.01}')
輸出結果會與下列內容相似:
+-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+ | query | publication_number | title | abstract | +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+ | improving password security | SG-120868-A1 | Data storage device security method and a... | Methods for improving security in data stora... | | improving password security | SG-10201610585W-A | Passsword management system and process... | PASSSWORD MANAGEMENT SYSTEM AND PROCESS ... | | improving password security | SG-148888-A1 | Improved system and method for... | IMPROVED SYSTEM AND METHOD FOR RANDOM... | | improving password security | SG-194267-A1 | Method and system for protecting a password... | A system for providing security for a... | | improving password security | SG-120868-A1 | Data storage device security... | Methods for improving security in data... | +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
建立用於文字生成的遠端模型
建立代表已代管 Vertex AI 文字產生模型的遠端模型:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列陳述式:
CREATE OR REPLACE MODEL `bqml_tutorial.text_model` REMOTE WITH CONNECTION `us.CONNECTION_ID` OPTIONS (ENDPOINT = 'gemini-1.5-flash-002');
將
CONNECTION_ID
替換為 BigQuery 連線的 ID。在 Google Cloud 控制台查看連線詳細資料時,
CONNECTION_ID
是連線 ID 中顯示的完整限定連線 ID 的最後一個部分的值,例如projects/myproject/locations/connection_location/connections/myconnection
。查詢需要幾秒鐘的時間才能完成,完成後,模型
text_model
就會顯示在「Explorer」窗格中的bqml_tutorial
資料集中。由於查詢是使用CREATE MODEL
陳述式建立模型,因此沒有查詢結果。
產生由向量搜尋結果增強的文字
將搜尋結果做為提示,使用 ML.GENERATE_TEXT
函式產生文字
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中執行下列陳述式:
SELECT ml_generate_text_llm_result AS generated, prompt FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.text_model`, ( SELECT CONCAT( 'Propose some project ideas to improve user password security using the context below: ', STRING_AGG( FORMAT("patent title: %s, patent abstract: %s", base.title, base.abstract), ',\n') ) AS prompt, FROM VECTOR_SEARCH( TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result', ( SELECT ml_generate_embedding_result, content AS query FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.embedding_model`, (SELECT 'improving password security' AS content) ) ), top_k => 5, options => '{"fraction_lists_to_search": 0.01}') ), STRUCT(600 AS max_output_tokens, TRUE AS flatten_json_output));
輸出結果會與下列內容相似:
+------------------------------------------------+------------------------------------------------------------+ | generated | prompt | +------------------------------------------------+------------------------------------------------------------+ | These patents suggest several project ideas to | Propose some project ideas to improve user password | | improve user password security. Here are | security using the context below: patent title: Active | | some, categorized by the patent they build | new password entry dialog with compact visual indication | | upon: | of adherence to password policy, patent abstract: | | | An active new password entry dialog provides a compact | | **I. Projects based on "Active new password | visual indication of adherence to password policies. A | | entry dialog with compact visual indication of | visual indication of progress towards meeting all | | adherence to password policy":** | applicable password policies is included in the display | | | and updated as new password characters are being... | +------------------------------------------------+------------------------------------------------------------+
清除所用資源
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
後續步驟
- 請試試在檢索增強生成管道中剖析 PDF 檔案教學課程,瞭解如何根據剖析的 PDF 內容建立 RAG 管道。