🌲

Valdで始めるHybrid Search

2024/02/29に公開

はじめに

Hybrid Searchとは、「全文検索とベクトル検索」や「Lexical SearchとSemantic Search」など異なる種類の検索を組み合わせることで検索精度の向上を目指す手法であり、近年のベクトル検索に関する盛り上がりと共に注目されている手法の一つです。
現在著しい発展を迎えているLLMなどの「機械学習モデル」や付随して進化してきた「ベクトル化・ベクトル検索技術」と、今日までの積み上げである「古典的な検索技術」の融合として盛んに研究・実用化されています。

既にLangChainやOpenSearchなど、一部の検索ライブラリ(または検索エンジン)ではHybrid Searchの機能を提供しており、有用な結果が示されているものも数多く報告されています。

私たちValdチームは、ベクトル検索に関わる開発に注力していますが、同時に検索技術全般の最新動向の追跡と調査を行っています。その中でも、特に注目しているトピックの一つがこのHybrid Searchです。
私たちは、このHybrid Searchに対して、今後の検索技術の発展に大きく寄与する重要な技術と捉えており、実際に試してみる価値があるものと考えています。

そこで本記事では、先行研究の一部としてpineconeのブログなどを参考に、ValdでHybrid Searchを試すことでどの程度精度が改善されるかを実験的に検証してみました。

検証・実験

今回の実験では、Semantic SearchとしてVald(NGT)、Lexical SearchとしてOpenSearchのBM25による検索を使用してHybrid Searchを実現しました。
評価指標としてはRecall/NDCGを用い、検索精度を評価しました。
そして、実際にどの程度精度が向上するのか? また、どの程度検索結果を混ぜることでどのように検索精度が変化するのか?といったことを検証してみました。

実験条件

実験に使用した環境・設定は以下の通りです:

  • データセット: MS MARCO passage(train: 8.84M, val: 6980)
  • モデル: SentenceBERT
  • Vald: v1.7.8
    • Search Parameters
      • raduis: -1, epsilon: 0.05, timeout: 3s, k: 1000
    • Edge size pair set
      • creation_edge: 50, search_edge: 50 [default parameter]
      • creation_edge: 100, search_edge: 100
  • OpenSearch: v2.11.0
    • BM25 Parameter(k1: 1.2, b: 0.75, k=size: 1000) [default parameter]
    • BM25 Parameter(k1: 0.9, b: 0.4, k=size: 1000)

上記の通り、基本的にデフォルトパラメータで構築された環境とチューニングを行った環境でそれぞれで実験を行い、Top-K 1000件の検索結果を用いて精度を測っています。

また、各検索結果を混ぜるにあたって、各々の検索時に得られるスコアを正規化した上で、どの程度の割合で各検索結果を用いるかというパラメータとしてαを定義します。
最終的なTop-K 1000件の検索結果としては、このαを用いて、ValdとOpenSearchの検索結果を混ぜ合わせたものとしました。
(例: α=0ならばValdの検索結果そのもので、α=0.1であればValdの上位10%の検索結果を使用し、残りをOpenSearchのBM25による検索結果上位90%と統合しリランキングする。)

本実験におけるモデルを用いたベクトル化にあたっては、512 tokensの制限を受けることになりますが、残りのtokenでベクトル化したものとの平均を取ることで、文章全体のベクトルとして使用することにしました。

結果

以下に横軸を検索結果の混ぜる比率であるα、縦軸をRecall/NDCGとしてプロットしたグラフをそれぞれ示します。

hybrid_search_recall
Recall/αのグラフ

hybrid_search_ndcg
NDCG/αのグラフ

図から分かる通り、Hybrid Searchとして各検索エンジンの結果を混ぜることで、Recall/NDCG共にVald単体での検索精度より高くなる部分が見られました。
さらに、Recall/NDCGの両方の指標共に、グラフの形は山なりで類似しており、今回の検証では評価指標によらずαの値によって一律に精度が増減するという形になりました。

また、本実験では、前述の通りデフォルトパラメータでの環境とチューニングした環境を用意しており、検索に利用する環境の組み合わせが精度にどのような影響をもたらすかも合わせて検証しています。

結果としては、どの組み合わせのパターンにおいてもα=0.5でRecall/NDCGの両方の精度が最も高くなるという結果が得られました。
加えて、Vald/OpenSearchのパラメータ変更による各指標のグラフの概形の変化については、パラメータのチューニングにより各々の指標に対して多少の精度の改善は見られたものの、全ての組み合わせにおいてα=0.5で最大値を取る上に凸の山なりのグラフとなり、αにおける全体的なグラフの傾向は変わらないという結果になりました。

以上から、今回の検証の上では、ValdでHybrid Searchを行う際は半分程度の検索結果で混ぜることが望ましいということがわかりました。

終わりに

本記事ではValdを用いてHybrid Searchの検証・実験を行ってみました。
今回使用したデータセットとモデルの組み合わせは一通りですが、別のテキストデータセットや画像・音声などの異なるドメインのデータセットとそれぞれに対応したモデルの組み合わせを用いてさらなる検証を進めることで、さらに有用な実験・検証データになると期待しています。

また、本実験を進めるにあたり、Valdに関して一部チューニングを行っていますが、そのチューニング周りの検証の様子については今後の記事になるため、興味のある方は楽しみにお待ちいただけると幸いです。

この記事が参考になったという方はぜひリアクションをお願いします。
(GitHub Starもお待ちしています😄)

Documents

Valdの更に詳しい内容については、下記ドキュメントを参考にしてください。

https://vald.vdaas.org/docs/

Slack

質問等がありましたら、下記Slack WSに投稿してください。
また、ValdへのContributionもいつでもお待ちしています。

https://join.slack.com/t/vald-community/shared_invite/zt-db2ky9o4-R_9p2sVp8xRwztVa8gfnPA

Medium

Mediumでblog(英語)を公開しているので、こちらも是非ご覧ください。

https://medium.com/@vdaas-vald

X

公式Xアカウントはこちら

https://twitter.com/vdaas_vald


参考文献

Discussion