ベクトル検索を使用してエンベディングを検索する
このチュートリアルでは、VECTOR_SEARCH
関数と、必要に応じてベクトル インデックスを使用して、BigQuery テーブルに保存されているエンベディングを検索する方法について説明します。
必要な権限
このチュートリアルを実行するには、次の Identity and Access Management(IAM)権限が必要です。
- データセットを作成するには、
bigquery.datasets.create
権限が必要です。 テーブルを作成するには、次の権限が必要です。
bigquery.tables.create
bigquery.tables.updateData
bigquery.jobs.create
ベクトル インデックスを作成するには、インデックスを作成するテーブルに対する
bigquery.tables.createIndex
権限が必要です。ベクトル インデックスを破棄するには、インデックスを破棄するテーブルに対する
bigquery.tables.deleteIndex
権限が必要です。
次の IAM 事前定義ロールには、ベクトル インデックスの操作に必要な権限が含まれています。
- BigQuery データオーナー(
roles/bigquery.dataOwner
) - BigQuery データ編集者(
roles/bigquery.dataEditor
)
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- BigQuery: You incur costs for index storage and data processing in BigQuery.
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
詳細については、BigQuery の料金をご覧ください。
始める前に
-
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 API.
データセットを作成する
BigQuery データセットを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
「アクションを表示」> [データセットを作成] をクリックします。
[データセットを作成する] ページで、次の操作を行います。
[データセット ID] に「
vector_search
」と入力します。[ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。
一般公開データセットは
US
マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
テストテーブルを作成する
Google 特許検索一般公開データセットのサブセットに基づいて、特許のエンベディングを含む
patents
テーブルを作成します。CREATE TABLE vector_search.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;
最近傍を検索する特許のエンベディングを含む
patents2
テーブルを作成します。CREATE TABLE vector_search.patents2 AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE publication_number = 'KR-20180122872-A';
ベクトル インデックスを作成する
patents
テーブルのembeddings_v1
列にmy_index
ベクトル インデックスを作成します。CREATE VECTOR INDEX my_index ON vector_search.patents(embedding_v1) OPTIONS(distance_type='COSINE', index_type='IVF', ivf_options='{"num_lists": 1000}');
ベクトル インデックスが作成されるまで数分待ってから、次のクエリを実行して、
coverage_percentage
値が100
であることを確認します。SELECT * FROM vector_search.INFORMATION_SCHEMA.VECTOR_INDEXES;
インデックスで VECTOR_SEARCH
関数を使用する
ベクトル インデックスを作成して入力した後で、VECTOR_SEARCH
関数を使用して、patents2
テーブルの embedding_v1
列でエンベディングの最近傍を見つけます。このクエリは検索でベクトル インデックスを使用するため、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 vector_search.patents, 'embedding_v1', TABLE vector_search.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
はエンベディングの正確な最近傍を検索します。
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 vector_search.patents, 'embedding_v1', TABLE vector_search.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
値によって特許が一意に識別されるため、この値が比較に使用されます。
WITH approx_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE vector_search.patents, 'embedding_v1', TABLE vector_search.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 vector_search.patents, 'embedding_v1', TABLE vector_search.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
再現率が予想よりも低い場合は fraction_lists_to_search
値を増やすことができますが、レイテンシとリソース使用量が高くなる可能性があります。ベクトル検索を調整するには、さまざまな引数値で VECTOR_SEARCH
を複数回実行し、結果をテーブルに保存して結果を比較してみます。
クリーンアップ
- 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.