RAGパイプラインにRerankerを追加したら、すべてが台無しになった
RAGパイプラインにrerankerを追加しました。すると、すぐにテストが失敗しました。
バージョン2では、FAISSとBM25を用いたハイブリッド検索を使用していました。その時は19個のテスト質問すべてに合格していました。そこで、精度を向上させるためにcross-encoder rerankerを追加したのです。
理論は単純です:
- ステージ1:高速な検索を使用して、広範な候補セットを取得する。
- ステージ2:スマートなrerankerを使用して、最適なものを選び出す。
実装には20分かかりました。すると、19個のテストのうち2つが即座に失敗しました。
失敗の原因はデータ形式にありました。私のデータには、次のような密度の高い表形式のチャンクが含まれていました: "Company: Zentara Robotics | CEO: Iris Kallas | Employees: 287"
cross-encoderモデルは自然言語の段落で学習されていました。そのため、表の行を見ると、非常に低いスコアを付けてしまったのです。モデルはそのチャンクを「無関係」だと判断しました。
ハイブリッド検索では正解を見つけていたのですが、rerankerがそれを捨ててしまったのです。
これを修正するために7つの異なる方法を試しました:
- 候補プールを大きくする。
- rerankerとretrieverのスコアをブレンドする。
- rank fusionを使用する。
どれもうまくいきませんでした。rerankerのスコアがあまりにも低かったため、他のすべてを圧倒してしまったのです。モデルは単に順位を下げただけではありませんでした。表形式を積極的に拒絶していたのです。
私は数学的な修正を試みるのをやめ、構造を変更することにしました。
rerankerにすべてを決定させるのではなく、最良の結果を保護することにしたのです。「guaranteed slot(保証枠)」戦略を採用しました:
- 上位3つの結果が欲しい場合は、第1ステージのトップ2をそのまま保持する。
- rerankerは3番目の結果を選ぶためだけに使う。
これにより、ハイブリッド検索の結果が最終リストに残ることが保証されます。rerankerは残りのスロットを改善するためだけに機能します。
結果:19/19のテストに合格しました。
学んだ教訓:
- Rerankerは即効性のあるアップグレードではありません。構造化データや表形式のデータではパフォーマンスを低下させる可能性があります。
- 評価セットはセーフティネットです。19個のテストがなければ、壊れたシステムをリリースしていたでしょう。
- うまくいっているものは保護すること。第1ステージの検索が優れているなら、rerankerにそれを上書きさせてはいけません。
Rerankerに手を出す前に、まずは強力なretrieverを構築してください。
学習コミュニティ(任意): https://t.me/GyaanSetuAi
