本教學課程說明如何使用 VECTOR_SEARCH 函式和向量索引,對儲存在 BigQuery 資料表中的嵌入執行相似度搜尋。
向量搜尋是一種技術,可使用嵌入項目比較相似的物件,並為 Google 搜尋、YouTube 和 Google Play 等 Google 產品提供支援。您可以運用向量搜尋大規模執行語意搜尋,也可以執行混合搜尋,結合語意搜尋和詞彙 (關鍵字) 搜尋。使用向量搜尋功能時,您可以搭配向量索引,運用反向檔案索引 (IVF) 和 ScaNN 演算法等基礎技術。
向量搜尋是以嵌入為基礎建構而成。嵌入是高維度數值向量,代表特定實體,例如一段文字或音訊檔案。機器學習 (ML) 模型會使用嵌入技術,將這類實體的語意編碼,方便推理及比較。舉例來說,在分群、分類和建議模型中,常見的作業是測量嵌入空間中向量之間的距離,找出語意上最相似的項目。
目標
- 使用
VECTOR_SEARCH函式,對儲存在 BigQuery 資料表中的嵌入執行相似度搜尋。 - 使用向量索引提升向量搜尋效能。
- 執行使用向量索引的搜尋,以及不使用索引的搜尋。
- 比較有索引和沒有索引的搜尋結果,評估召回率。
費用
VECTOR_SEARCH 函式會採用 BigQuery 運算定價。系統會根據以量計價或版本定價,向您收取相似度搜尋費用。
- 以量計價:系統會根據掃描的位元組數向您收費,包括基本資料表、索引和搜尋查詢。
方案定價:系統會根據預留方案中完成工作所需的運算單元數向您收費。如果相似度計算的範圍較大或較複雜,費用就會增加。
詳情請參閱 BigQuery 計價方式一文。
事前準備
-
在 Google Cloud 控制台的專案選擇器頁面中,選取或建立 Google Cloud 專案。
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要「專案建立者」角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
啟用 BigQuery API。
啟用 API 時所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。
必要的角色
如要取得完成本教學課程所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
-
建立資料集、資料表和向量索引:
BigQuery 資料編輯者 (
roles/bigquery.dataEditor) -
執行 BigQuery 工作:
BigQuery 工作使用者 (
roles/bigquery.jobUser)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
建立資料集
如要建立 BigQuery 資料集,請選取下列任一選項:
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。
在「Explorer」中展開專案,然後按一下「Datasets」。
在「資料集」頁面,按一下 「建立資料集」。
在「建立資料集」窗格中,執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial。選取「資料位置」的「美國」。
其餘預設設定均保留原樣。
點選「建立資料集」。
bq
如要建立新的資料集,請使用 bq mk --dataset 指令。
建立名為
bqml_tutorial的資料集,並將資料位置設為US:bq mk --dataset \ --location=US \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
確認資料集已建立完成:
bq ls
API
使用已定義的資料集資源呼叫 datasets.insert 方法:
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
建立資料表來儲存資料和嵌入
在本節中,您將建立包含專利嵌入內容的 patents 資料表。這些嵌入內容是以 Google 專利公開資料集的一小部分為基礎。您也會建立 patents2 資料表,其中包含專利嵌入內容,可找出最相近的鄰點。
如要建立資料表,請按照下列步驟操作:
如要建立
patents資料表,請在查詢編輯器中貼上下列內容,然後點選 「執行」:CREATE TABLE bqml_tutorial.patents AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE ARRAY_LENGTH(embedding_v1) > 0 AND publication_number NOT IN ('KR-20180122872-A') LIMIT 1000000;
你會收到類似以下的確認訊息:
This statement created a new table named patents.如要建立包含專利嵌入的
patents2資料表,以找出最接近的鄰近項目,請將下列內容貼到查詢編輯器,然後按一下 「執行」:CREATE TABLE bqml_tutorial.patents2 AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE publication_number = 'KR-20180122872-A';
你會收到類似以下的確認訊息:
This statement created a new table named patents2.
建立向量索引
搭配向量索引使用 VECTOR_SEARCH 時,VECTOR_SEARCH 會採用「近似最鄰近」方法提升向量搜尋效能,但會降低召回率,因此傳回的結果會更近似。如果沒有向量索引,VECTOR_SEARCH 會使用暴力搜尋來測量每筆記錄的距離。
在本節中,您將在 patents 資料表的 embedding_v1 資料欄上建立 my_index 向量索引。然後確認索引是否可用。
如要建立向量索引,請按照下列步驟操作:
如要在
patents資料表的embedding_v1欄上建立my_index向量索引,請在查詢編輯器中貼上下列內容,然後點選「執行」:CREATE OR REPLACE VECTOR INDEX my_index ON bqml_tutorial.patents(embedding_v1) STORING(publication_number, title) OPTIONS(distance_type='COSINE', index_type='IVF');
你會收到類似以下的確認訊息:
The vector index creation on table bqml_tutorial.patents was initiated. Please query bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES to check the progress of the index.如要確認向量索引是否已準備就緒,請將下列內容貼到查詢編輯器,然後按一下「執行」:
SELECT * FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES;
在查詢結果中,確認
index_status為ACTIVE,且coverage_percentage值為100。「coverage_percentage」可能要過幾分鐘才會達到100。
使用含索引的 VECTOR_SEARCH 函式
建立並填入向量索引後,請使用 VECTOR_SEARCH 函式,在 patents2 資料表的 embedding_v1 欄中找出嵌入的最鄰近項目。這項查詢會使用搜尋中的向量索引,因此 VECTOR_SEARCH 會使用近似最鄰近方法,找出嵌入項目的最鄰近項目。
如要搭配索引使用 VECTOR_SEARCH 函式,請將下列內容貼到查詢編輯器中,然後按一下 「執行」:
SELECT query.publication_number AS query_publication_number, query.title AS query_title, base.publication_number AS base_publication_number, base.title AS base_title, distance FROM VECTOR_SEARCH( TABLE bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.patents2, top_k => 5, distance_type => 'COSINE', options => '{"fraction_lists_to_search": 0.005}');
結果類似下方:
+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | query_publication_number | query_title | base_publication_number | base_title | distance | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-106599080-B | A kind of rapid generation for keeping away big vast transfer figure based on GIS | 0.14471956347590609 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-114118544-A | Urban waterlogging detection method and device | 0.17472108931171348 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-20200048143-A | Method and system for mornitoring dry stream using unmanned aerial vehicle | 0.17561990745619782 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-101721695-B1 | Urban Climate Impact Assessment method of Reflecting Urban Planning Scenarios and Analysis System using the same | 0.17696129365559843 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-109000731-B | The experimental rig and method that research inlet for stom water chocking-up degree influences water discharged amount | 0.17902723269642917 | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
使用 VECTOR_SEARCH 函式進行暴力破解
在本節中,您將使用 VECTOR_SEARCH 函式,找出 patents2 資料表中 embedding_v1 欄內嵌入內容的最鄰近項目。這項查詢不會在搜尋中使用向量索引,因此 VECTOR_SEARCH 會找出嵌入項目的精確最鄰近項目。
如要使用 VECTOR_SEARCH 進行暴力破解,請在查詢編輯器中貼上下列內容,然後按一下 「執行」:
SELECT query.publication_number AS query_publication_number, query.title AS query_title, base.publication_number AS base_publication_number, base.title AS base_title, distance FROM VECTOR_SEARCH( TABLE bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.patents2, top_k => 5, distance_type => 'COSINE', options => '{"use_brute_force":true}');
結果類似下方:
+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | query_publication_number | query_title | base_publication_number | base_title | distance | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-106599080-B | A kind of rapid generation for keeping away big vast transfer figure based on GIS | 0.1447195634759062 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-114118544-A | Urban waterlogging detection method and device | 0.1747210893117136 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-20200048143-A | Method and system for mornitoring dry stream using unmanned aerial vehicle | 0.17561990745619782 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-101721695-B1 | Urban Climate Impact Assessment method of Reflecting Urban Planning Scenarios and Analysis System using the same | 0.17696129365559843 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-109000731-B | The experimental rig and method that research inlet for stom water chocking-up degree influences water discharged amount | 0.17902723269642928 | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
評估召回率
使用索引執行向量搜尋時,系統會傳回近似結果,但會降低召回率。您可以比較向量搜尋 (含索引) 傳回的結果,以及向量搜尋 (含暴力破解) 傳回的結果,藉此計算召回率。publication_number 值是專利的專屬 ID,因此可用於下列查詢中的比較。
如要評估召回率,請將下列內容貼到查詢編輯器,然後點選「執行」:
WITH approx_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.patents2, top_k => 5, distance_type => 'COSINE', options => '{"fraction_lists_to_search": 0.005}') ), exact_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE bqml_tutorial.patents, 'embedding_v1', TABLE bqml_tutorial.patents2, top_k => 5, distance_type => 'COSINE', options => '{"use_brute_force":true}') ) SELECT a.query_publication_number, SUM(CASE WHEN a.base_publication_number = e.base_publication_number THEN 1 ELSE 0 END) / 5 AS recall FROM exact_results e LEFT JOIN approx_results a ON e.query_publication_number = a.query_publication_number GROUP BY a.query_publication_number;
結果如下所示:
+--------------------------+--------+ | query_publication_number | recall | +--------------------------+--------+ | KR-20180122872-A | 1.0 | +--------------------------+--------+
如果召回率低於預期,可以提高 fraction_lists_to_search 值,但延遲時間和資源用量可能會增加。如要調整向量搜尋,可以嘗試使用不同引數值多次執行 VECTOR_SEARCH,將結果儲存至表格,然後比較結果。
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 帳戶收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
如要保留專案,但刪除本教學課程中使用的資源,請按照下列步驟操作:
前往「BigQuery」頁面
在左側窗格中展開專案,然後按一下「資料集」。
針對
bqml_tutorial資料集,依序點按 「Open actions」(開啟動作) >「Delete」(刪除)。在「Delete dataset」(刪除資料集) 對話方塊中,按一下「Delete」(刪除) 進行確認。