ここ数か月(法務領域、ドイツの規制文書)で、RAGシステムを本番稼働しています。うまく処理できているのは問い合わせの80%ですが、失敗するパターンが3つあり、まだきれいな解決策が見つかっていません。
散乱(scatter)の問題。
中には8〜10個の異なる文書から情報を集める必要がある質問がありますが、各文書はほんの少しずつしか寄与しません。ベクトル検索はクエリに関連するチャンクを見つけますが、互いに関連するチャンクは見つけません。そのため、「ドイツの異なる連邦州で通知期限がどのように機能しているかを比較して」といった質問をすると、うまくクエリに一致した2〜3の州固有文書だけが見つかり、残りは取りこぼされます。回答は一見完成しているように見えますが、実際には部分的です。kを増やすとノイズが増え、欠けている文書が同じ概念でもまったく別の用語を使っている可能性があるため、確実に解決されるわけではなくトークンを浪費します。
クエリ分解(州ごとにサブクエリへ分解)も考えましたが、それはシステムが事前に、生成すべきサブクエリ数や、どの次元で分解するかを知っていることを前提にします。汎用の調査ツールとしては、どうしても脆さが残る感じがします。
否定的知識(negative knowledge)の問題。
「従業員の監視に関するガイダンスはありますか?」のように、答えが本当に「いいえ、ありません」だとすると、システムはきれいにそれを言えません。関連度が低い(ただし無関係とは言い切れない)チャンクを何でも拾ってきて、LLMがそれらから何かを合成してしまいます。ユーザーは、本筋から外れた話題について自信ありげな回答を受け取ることになり、「あなたの知識ベースではカバーされていません」という率直な答えは得られません。
ゲートとして類似度スコアの閾値も試しましたが、問題は「きれいな境界線」が存在しないことです。正当だが珍しいクエリは類似度スコアが低くなり得ます。一方で、完全に論点がずれていても、語彙の共通性のせいでいくつかのチャンクにそれなりにマッチしてしまうかもしれません。私がテストしたあらゆる閾値は、少なすぎる(切り捨てすぎる)か多すぎる(通しすぎる)かのどちらかになります。プロンプトで不確実性を認めるよう指示するのは、おそらく60%程度は助けになりますが、残り40%ではモデルは結局押し切ってしまいます。
タイムライン(timeline)の問題。
「2023年の裁定(判決)の後で、Xの解釈はどう変わったか」のような質問では、システムが裁定前の文書を見つけ、裁定後の文書を見つけ、時間的関係を理解し、比較のための物語(ナラティブ)を構築する必要があります。メタデータには文書の日付があります。プロンプトでは時間順を尊重するように言っています。ですが、取得されたチャンク同士が明示的に互いを参照していないと、モデルは「前/後」の筋の通ったストーリーを組み立てるのが難しいようです。モデルは、すべてを1つの平坦な回答にまとめるか、単に新しい情報源を引用して古い解釈を無視する傾向があります。
これは、プロンプトのエンジニアリングをさらに工夫するというより、根本的に異なる検索アプローチ(たとえば、検索レベルでの時間フィルタリング、あるいは異なる時期ごとに別々に取得する)を必要としているように感じます。
グラフRAGのアプローチ、エージェント型の取得ループ、マルチホップ推論チェーンについて読んできましたが、ほとんどの文献は合成データセットでのベンチマークで、本番での実装ではありません。もしこの3つのパターンのどれかについて、実際にデプロイされた解決策があるなら、何がうまくいって何がダメだったのかをぜひ聞きたいです。特に、パイプライン全体を再構築する必要がないアプローチに興味があります。
[link] [comments]




