Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BQを用いた近似最近傍探索

 BQを用いた近似最近傍探索

2025/01/23 のDeNA/Go AI技術共有会の発表資料です。
BigQuery Vector Search による近似最近傍探索の使い方について発表しています。

Avatar for rin sato

rin sato

June 04, 2025
Tweet

Other Decks in Programming

Transcript

  1. AI 5 ▪ user_id: 100万程度 ▪ user_embedding: 1000次元程度 使用データのイメージ user_id

    user_embedding A [0.1, 0.9, …, 0.1] B [0.8, 0.2, …, 0.4] C [0.2, 0.7, …, 0.1] D [0.7, 0.4, …, 0.2]
  2. AI 6 ▪ 類似しているuserを列挙したい(今回はcosine 類似度とする) ▪ BQでできるだけ処理したい やりたいこと 類似top1 user

    user_A user C user_B user D user_C user A user_D user B user_id user_embedding A [0.1, 0.9, …, 0.1] B [0.8, 0.2, …, 0.4] C [0.2, 0.7, …, 0.1] D [0.7, 0.4, …, 0.2]
  3. AI 8 self join してdot product を計算することでcosine 類似度を得る 100万のテーブルをself join

    するので遅すぎて終わらない 自前の実装 user_id user_embedding A [0.1, 0.9, …, 0.1] B [0.8, 0.2, …, 0.4] C [0.2, 0.7, …, 0.1] user_id user_embedding A [0.1, 0.9, …, 0.1] B [0.8, 0.2, …, 0.4] C [0.2, 0.7, …, 0.1] base user_id query user_id base user_emb query user emb A A [0.1, 0.9, …, 0.1] [0.1, 0.9, …, 0.1] A B [0.1, 0.9, …, 0.1] [0.8, 0.2, …, 0.4] A C [0.1, 0.9, …, 0.1] [0.2, 0.7, …, 0.1] B A [0.8, 0.2, …, 0.4] [0.1, 0.9, …, 0.1]
  4. AI 10 Vector Search Function の使い方1 https://cloud.google.com/bigquery/docs/reference/standard-sql/search_functions#vector_search SELECT query.query_id, query.embedding,

    base.id, base.my_embedding, distance FROM VECTOR_SEARCH( TABLE mydataset.table1, "my_embedding", ( SELECT query_id, embedding FROM mydataset.table2), "embedding", top_k => 2, distance_type => "cosine" options => '{"use_brute_force":true}');
  5. AI 11 Vector Search Function の使い方2 https://cloud.google.com/bigquery/docs/reference/standard-sql/search_functions#vector_search SELECT query.query_id, query.embedding,

    base.id, base.my_embedding, distance FROM VECTOR_SEARCH( TABLE mydataset.table1, "my_embedding", ( SELECT query_id, embedding FROM mydataset.table2), "embedding", top_k => 2, distance_type => "cosine" options => '{"use_brute_force":true}'); TABLE `table_id` または (select * from table_id)
  6. AI 12 Vector Search Function の使い方3 https://cloud.google.com/bigquery/docs/reference/standard-sql/search_functions#vector_search SELECT query.query_id, query.embedding,

    base.id, base.my_embedding, distance FROM VECTOR_SEARCH( TABLE mydataset.table1, "my_embedding", ( SELECT query_id, embedding FROM mydataset.table2), "embedding", top_k => 2, distance_type => "cosine" options => '{"use_brute_force":true}'); 検索するのに用いるカラム名 array<float64 not null>
  7. AI 13 Vector Search Function の使い方4 https://cloud.google.com/bigquery/docs/reference/standard-sql/search_functions#vector_search SELECT query.query_id, query.embedding,

    base.id, base.my_embedding, distance FROM VECTOR_SEARCH( TABLE mydataset.table1, "my_embedding", ( SELECT query_id, embedding FROM mydataset.table2), "embedding", top_k => 2, distance_type => "cosine" options => '{"use_brute_force":true}'); distance_type: EUCLIDEAN, COSINE, DOT_PRODUCT options: 探索のoption をjson で渡す
  8. AI 15 近似最近傍探索による高速化がよくあるアプローチ 例:faiss, scann など BQでもcreate vector index で近似最近傍探索できる

    近似最近傍探索について https://github.com/google-research/google-research/tree/master/scann より引用
  9. AI 16 ベースとなるテーブルにindex を作る Create Vector Index の使い方1 CREATE TABLE

    my_dataset.my_table( embedding ARRAY<FLOAT64>, category string ); CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) STORING (category) OPTIONS ( index_type = 'IVF', distance_type = 'COSINE', ivf_options = '{"num_lists":2500}' );
  10. AI 17 Create Vector Index の使い方2 CREATE TABLE my_dataset.my_table( embedding

    ARRAY<FLOAT64>, category string ); CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) STORING (category) OPTIONS ( index_type = 'IVF', distance_type = 'COSINE', ivf_options = '{"num_lists":2500}' ); ベクトルを含んだテーブルを作る (必ずembedding は array<FLOAT64 not null>)
  11. AI 18 Create Vector Index の使い方3 CREATE TABLE my_dataset.my_table( embedding

    ARRAY<FLOAT64>, category string ); CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) STORING (category) OPTIONS ( index_type = 'IVF', distance_type = 'COSINE', ivf_options = '{"num_lists":2500}' ); テーブルとそのベクトルカラムを渡す
  12. AI 19 Create Vector Index の使い方4 CREATE TABLE my_dataset.my_table( embedding

    ARRAY<FLOAT64>, category string ); CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) STORING (category) OPTIONS ( index_type = 'IVF', distance_type = 'COSINE', ivf_options = '{"num_lists":2500}' ); (Optional) 商品カテゴリなどのフィルターをつけたいとき はここにカラム名を入れる store column はインデックスサイズを大きくし てしまうので必要なもののみ
  13. AI 20 Create Vector Index の使い方5 CREATE TABLE my_dataset.my_table( embedding

    ARRAY<FLOAT64>, category string ); CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) STORING (category) OPTIONS ( index_type = 'IVF', distance_type = 'COSINE', ivf_options = '{"num_lists":2500}' ); index_type: IVF: 反転ファイルインデックス TREE_AH: scann distance_type: EUCLIDEAN, COSINE, DOT_PRODUCT
  14. AI 21 Vector Index の制約 ▪ ベクトルの次元数は1600までに制限される ▪ プロジェクト内で1日にcreate index

    できる回数に制限がある ▪ ベクトルテーブルの行数に制限がある ▪ 最小 5,000 ▪ 最大 10,000,000,000行(IVF) or 200,000,000 行(TREE_AH) https://cloud.google.com/bigquery/quotas?hl=ja#vector_index_limits
  15. AI 22 Vector Index の準備時間 ▪ Create してから10分くらい準備時間がある ▪ 準備中にVector

    Search するとエラーが出ずにbrute force で実 行される ▪ 以下のクエリで準備が終わったか確認する必要がある select coverage_percentage = 100 as is_available, from `project_id.my_dataset_id.INFORMATION_SCHEMA.VECTOR_INDEXES` where table_name = "my_table_name"
  16. AI 23 Vector Index の更新 ▪ テーブルが削除されると自動でIndex も削除される ▪ テーブルが更新されるとIndex

    も更新される ▪ 更新中はbrute force になるっぽい?(明確に書かれてない)
  17. AI 24 Store Column を指定すると検索前にフィルタをかけることができて 効率的なクエリになる Store Column にないカラムでもフィルタはできるが後処理フィルタ になり効率も悪く、topk

    の件数を満たさない可能性もある Vector Index のStore column SELECT * FROM VECTOR_SEARCH( (SELECT * FROM my_dataset.my_table WHERE type = 'animal'), 'embedding', TABLE my_dataset.my_testdata);
  18. AI 26 ▪ Vector Search は通常のBigQuery コンピューティングの料金 ▪ もし容量課金だったらbrute force

    に比べスロット数が減って安くなる かも ▪ Vector Index のストレージ費用もかかる Vector Index の料金
  19. AI 28 速度比較 TREE_AHが実験では高速だった(1M x 1M の全通りをtop10 抽出) 手法 インデックス作成時間

    実行時間 ナイーブ実装 N/A 終わらない Vector Search N/A resource limit error Vector Search (IVF) 8分 35分 Vector Search (TREE_AH) 8分 5分