Vertex AI Vector Searchのパラメータを調整してみた
はじめに
こんにちは。ミスミグループ本社Gateway推進本部のizumiです。
当社ECサイトの検索システム開発を担当しています。
本記事ではVertex AI Vector Searchの近似最近傍探索に用いるパラメータの調整方法を簡単にご紹介したいと思います。
なお、インデックスデータの作成方法、Vector Searchへのデプロイ方法は省略しております。
Vertex AI Vector Searchとは
Vertex AI Vector Searchとは、Google Cloudが提供しているベクトル検索のサービスです。
Google検索、YouTubeなどのGoogle製品と同様のインフラ基盤を使用しています。
また、Google Researchが開発したScaNNアルゴリズムを用いた近似最近傍探索によって、大量のインデックスデータを低レイテンシーかつ高精度に検索することが可能です。
当社のECサイトでもVertex AI Vector Search上に構築したベクトル検索を使用しています。
パラメータ調整の必要性
Vertex AI Vector Searchには近似最近傍探索に用いるパラメータがいくつかあります。
これらのパラメータを調整することにより、トレードオフ関係にある「レイテンシー」と「再現率[1]」を各プロジェクトの要件に合わせて最適化することが可能です。
使用パラメータ
簡単ではありますが、下表に近似最近傍探索で使用するパラメータを抜粋しました。
google-cloud-aiplatformのバージョンによりパラメータが更新される場合があるため、最新情報は公式ページでご確認下さい。
(記事作成時点のgoogle-cloud-aiplatformのバージョンは1.60.0です。)
なお、インデックス構築時と推論時の両方にあるパラメータは、推論時にオーバーライドが可能なパラメータです。
今回はインデックス構築については省略するため、推論時にオーバーライドできないleafNodeEmbeddingCount
はデフォルト設定としました。
ちなみに、leafNodeEmbeddingCount
が大きいとリーフノード数が少なくなるため、リーフノードの抽出速度は向上しますが、再現率が低下したり、Vector Searchへのデプロイ時間が増加したりします。
インデックス構築時 | 推論時 | 概要 |
---|---|---|
- | num_neighbors | 正確な内積計算後に取得する最近傍数。 |
approximateNeighborsCount | approx_num_neighbors | 正確な内積計算を実行する前に近似探索によって粗く取得される近傍数。 |
fractionLeafNodesToSearch | fraction_leaf_nodes_to _search_override |
クエリが検索されるリーフノードの割合。デフォルトは0.05。 |
leafNodeEmbeddingCount | - | 各リーフノードに対するインデックスデータの数。デフォルトは1,000。 |
ScaNNアルゴリズムによる近似最近傍探索の流れ
各パラメータを使用し、どのように検索を行っているのかを簡単に説明します。
- 検索KWとの関連性が高いリーフノードの抽出
全リーフノードのうちfraction_leaf_nodes_to_search_override
の割合だけ、検索KWとの関連性が高いリーフノードを抽出します。 - 近似探索によるインデックスデータの抽出
抽出したリーフノードから、近似探索を用いて検索KWとの関連性が高い上位approx_num_neighbors
件を抽出します。
リーフノード内のインデックスデータ数が既にapprox_num_neighbors
件未満の場合は、リーフノード内の全インデックスデータが返却されます。 - 正確な内積計算によるインデックスデータの抽出
抽出したインデックスデータを正確に内積計算し、検索KWとの関連性が高い上位num_neighbors
件を抽出します。
やってみた
約20万件のインデックスデータでパラメータ調整を実施してみます。
本記事は実際に運用しているものとは異なる点、ご了承下さい。
①ビジネス要件からnum_neighborsを決定
今回は1,000に設定します。
②fraction_leaf_nodes_to_search_overrideとapprox_num_neighborsを変え、レイテンシーと再現率を取得
今回は上位100件の再現率を確認します。
-
fraction_leaf_nodes_to_search_override
の設定値により、返却件数がnum_neighbors
を下回る場合があるため、件数も確認しながら進めたほうが良いと思います。 -
approx_num_neighbors
がnum_neighbors
より十分に大きくないと、正確な内積計算による効果を得られない場合があります。 - 今回のインデックスデータは10万件以上のため、ScaNNアルゴリズムの経験則ではリーフノードの抽出が推奨されていますが、
fraction_leaf_nodes_to_search_override
=1.0も確認してみました。
③機能要件を基にfraction_leaf_nodes_to_search_override、approx_num_neighborsを決定
②で取得したレイテンシーと再現率を、ヒートマップ(左図:レイテンシー、右図:再現率)にして分析します。
- 全体的に20msec程度と低レイテンシーですが、よりレイテンシーを重視する場合は
fraction_leaf_nodes_to_search_override
が0.01~0.05、approx_num_neighbors
が1000(赤枠)を再調整するのが良いと思います。 -
fraction_leaf_nodes_to_search_override
が0.1と小さい数値でも0.967と高再現率ですが、より再現率を重視する場合はfraction_leaf_nodes_to_search_override
が0.2~0.5、approx_num_neighbors
が2000~5000(緑枠)で決定するのが良いと思います。
まとめ
今回は、Vertex AI Vector Searchのパラメータ調整方法についてご紹介しました。
Vertex AI Vector Searchの利用を検討している方にとって、参考になる情報があれば幸いです。
私たちと一緒に検索エンジンの開発をしていきたい方、ぜひお気軽にご連絡ください!
中途採用も随時募集しております。
-
全インデックスデータを正確に内積計算して類似度が高い上位N件を正解とした場合に、Vertex AI Vector Searchで返却された上位N件との一致率 ↩︎
Discussion