WhatsAppベースの新しいRAG(検索拡張生成)アシスタントは、すべての回答にJSONエンコードされた引用を求めることで、ハルシネーションを停止させました。モデルが特定のチャンクを指し示せない場合、「その質問に答えるための十分な情報がありません」と回答するようにしたことで、自信満々に嘘をつくシステムから、信頼できる「わかりません」と言えるシステムへと生まれ変わりました。

RAGにおいて信頼が重要な理由

RAGに関するチュートリアルの多くは、埋め込み(embeddings)の選択、ドキュメントのチャンク分割、結果の再ランキングといった「検索(retrieval)」プロセスに執着しがちです。しかし、関連するテキストが見つかった後に何が起こるかについては、見落とされがちです。検索されたコンテキストが実際には裏付けていないにもかかわらず、アシスタントが断定的な回答を提示してしまうと、ユーザーは信頼を失ってしまいます。

自信と正確性のギャップ

PostgreSQLとpgvector拡張機能を使用して構築されたプロトタイプでは、検索パイプラインは単純なものでした。しかし、本番環境で真の課題が浮き彫りになりました。検索されたスニペットに必要な情報が含まれていない場合でも、言語モデルは自信たっぷりに回答してしまうのです。デモでは問題を隠せるかもしれませんが、実際のユーザーは「自信があるように聞こえること」と「正しいこと」の間のギャップを露呈させました。

JSONによる引用の強制

「コンテキストがある場合のみ回答してください」といったプロンプトでモデルを説得する代わりに、著者は出力形式を変更しました。現在のシステムでは、各主張(claim)がそれを裏付ける正確なチャンクへの参照を含むJSONオブジェクトを要求します。モデルが引用を添付できない場合、その回答は拒否され、ユーザーには明確な「わかりません」というメッセージが表示されます。

この強制力は、自然言語による指示からスキーマ検証へと移行しました。モデルは依然としてテキストを生成しますが、周囲のコードが、JSONがユーザーに届く前に必要な構造に一致しているかを確認します。

変化した点

  • チャンク分割が保守的になった。 曖昧すぎる、あるいは広すぎるチャンクは、引用なしの主張を生成することになり、結果として「わかりません」というフォールバックがトリガーされます。
  • システムプロンプトが短縮された。 モデルの挙動を制御しようとする強引なプロンプトは、短い指示セットに置き換えられ、スキーマが実質的な役割を担うようになりました。
  • 失敗が可視化された。 検索結果に関連性のない内容が含まれている場合、アシスタントは自信満々な誤答でエラーを隠蔽するのではなく、不確実であることを率直に認めます。

教訓: RAGアシスタントにおいて、すべての主張が検索されたソースに追跡可能であることを保証することは、検索ステップを磨き上げるだけよりも確実にユーザーの信頼を築きます。引用の欠落を可視化された「わかりません」に変換することで、開発者はシステムに回答を捏造させるのではなく、その限界を認めさせることができるのです。