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://dev.to/santanu_mohanta_29/i-added-a-reranker-to-my-rag-pipeline-it-broke-everything-then-i-fixed-it-1c9i

学習コミュニティ(任意): https://t.me/GyaanSetuAi