日本語でのキーワード検索とベクトル検索に対して、検索結果のリランキングを適用して性能を評価してみました。
リランキングとは?
文書検索では検索クエリにマッチングした文書を順位付けして返しますが、その結果を何らかのモデルを使って並び替えることをリランキングと呼びます。このようなモデルを使って並び替えることで、検索結果の上位により適した文書が表示され、結果としてビジネス上のKPIの向上に繋がることが期待されます。典型的な構成は以下のとおりです。
リランキング自体は必ずしも機械学習を使ったり、テキストだけを入力として使う必要はありませんが、今回は検索クエリと検索結果の文書をリランキング用の機械学習モデルに与えて並び替えます。このような方法に限らず、検索ランキングを改善する方法については以下の本を参照するとよいでしょう。
実験設定
本記事では、日本語でのキーワード検索とベクトル検索の結果に対して、リランキング用のモデルを適用し、その結果を評価します。構成としては、上記の図と同じものになります。以下では、検索器とリランカー、評価用データセットおよび評価指標について説明します。
構成図のうち、最初の段階である検索には以下の2つを用意しました。それぞれキーワード検索とベクトル検索に対応しています。どちらもLangChainの実装を使い[1][2]、上位100件の文書を検索しています。
- BM25
- OpenAIの
text-embedding-ada-002
リランカーとしては以下の3つを用意しました。mmarco-mMiniLMv2-L12-H384-v1
(以下、mMiniLM)は、MS MARCOパッセージランキングデータセットを機械翻訳して作成した多言語版データセットであるmMARCOを用いて学習されています[3]。bge-reranker-large
(以下、bge)は、XLM-RoBERTaをベースに主に中国語と英語のデータセットを使って作成されたモデルです。Cohereのモデルは、本記事の執筆時点では日本語を含む14言語に対応したモデルであり、API経由で利用可能です[4]。
- mmarco-mMiniLMv2-L12-H384-v1
- bge-reranker-large
- Cohereの
rerank-multilingual-v2.0
評価用のデータセットとしては、以前に書いた「Cohereの多言語用の埋め込みモデルを日本語で評価してみる」でも使った尼崎市のQAデータ[5]を使用します。評価については上位10件のヒット率とMRR(Hit Rate@10
、MRR@10
)ですることにします。つまり、全体としては、検索で上位100件の文書を選択後、リランカーで順位付けし、上位10件の文書を選択して評価していることになります。
実験結果
評価結果は以下のとおりです。キーワード検索の場合は、リランカーを適用することで性能が向上する結果となりました。bge
は英語と中国語以外での性能が劣る可能性がありましたが、学習データに多少は日本語データが含まれていることや、英語と中国語での学習が転移していることが効いたと考えられます。一方、ベクトル検索の場合はリランカーを入れることで性能が低下しました。別のデータセットでは性能が向上するという報告[6]もあるので、ベクトル検索と併用することで必ずしも性能が低下するわけではありませんが、いかなる場合でもリランカーを入れれば性能が向上するという単純な話ではなさそうです。
モデル | Hit Rate@10 | MRR@10 |
---|---|---|
BM25 | 0.5804 | 0.3936 |
BM25 + mMiniLM | 0.6671 | 0.4589 |
BM25 + bge | 0.7730 | 0.5546 |
BM25 + Cohere | 0.7194 | 0.5089 |
text-embedding-ada-002 |
0.8355 | 0.6436 |
text-embedding-ada-002 + mMiniLM |
0.7564 | 0.5119 |
text-embedding-ada-002 + bge |
0.8201 | 0.5213 |
text-embedding-ada-002 + Cohere |
0.7602 | 0.5265 |
おわりに
本記事では、日本語でのキーワード検索とベクトル検索に対して、検索結果のリランキングを適用して性能を評価してみました。本記事を書くきっかけは、[7]の論文中で取り上げられていた多言語用のモデル(mMiniLM)を日本語での検索に使ったらどうなるか気になったことだったのですが、単純にリランカーを入れればすべての場合で性能が向上するという結果にならなかったことに満足しています。このあたりは、いくつかのデータセットで検証してみたいところです。また、[7]の手法を使って、社内用のリランカーを構築するとかしてもおもしろいかもしれません。
参考資料
- BM25Retriever | LangChain
- Vector store-backed retriever
- mMARCO: A Multilingual Version of the MS MARCO Passage Ranking Dataset
- Reranking | Cohere Documentation
- FAQ Retrieval using Query-Question Similarity and BERT-Based Query-Answer Relevance
- Boosting RAG: Picking the Best Embedding & Reranker models
- Is ChatGPT Good at Search? Investigating Large Language Models as Re-Ranking Agents