RAG入門:AIに知識を与える技術
LLMのハルシネーション問題とRAGによる解決策
「知りません」と言えないから、嘘になる
LLM は、入力の続きとして確率の高い言葉を選び続けることで文章を作ります。この仕組みには「答えを持っていない」という状態がありません。手持ちの材料が薄くても、確率がいちばん高い候補は必ず 1 つ選ばれるので、出力は止まらずに文章として完成します。
だから、存在しない条文や、社内にない休暇制度を、通常どおりの口調で書いてきます。人間なら口ごもるはずの場面で口ごもらない。これがハルシネーションの正体です。
しかも、材料が薄いときほど、書かれる内容は「世間一般でよくある形」に寄ります。もっともらしいのは偶然ではなく、確率の高い言葉を選んだ結果そのものです。読んで違和感が無いのは当然で、だから読むだけでは見抜けません。
幻覚と訳されるので不具合のように聞こえますが、モデルの内部では異常は起きていません。正常に動いた結果として、根拠の無い文章が出てきます。だから、直し方も不具合の修正とは別の形になります。
賢いモデルに替えても止まらない
「もっと新しいモデルにすれば減るのでは」と考えたくなりますが、これは半分しか効きません。学習量を増やせば、一般知識の間違いは確かに減ります。しかし、そもそも学習データに入っていない情報は、量をいくら積んでも埋まりません。あなたの会社の福利厚生規定は、どのモデルの学習データにも入っていないからです。
プロンプトで「正確に答えて」「嘘をつかないで」と念を押す方法も、同じ理由で頭打ちになります。指示を足しても、モデルの中に無い事実が生まれるわけではありません。
原因がモデルの外にある以上、打ち手もモデルの外に置くしかない。RAG がその答えになるのは、この一点においてです。
答えの出所を、モデルの外に移す
RAG がやっているのは、回答の材料を「モデルの記憶」から「その場で渡した資料」に付け替えることです。これをグラウンディング(根拠付け)と呼びます。
たとえば「リフレッシュ休暇の申請条件は」という質問に対して、資料を渡さない LLM は「勤続 5 年以上で最大 5 日」といった、世間一般でありがちな条件を書いてきます。実際の規定が「勤続 3 年で連続 10 日」なら、これは全部間違いです。
資料を先に渡してから同じ質問をすると、回答は「福利厚生規定によると、対象は勤続 3 年以上の正社員」という形になります。参照した規定の名前まで一緒に出せるので、読み手はその 1 か所を開いて確かめられます。
ここが決定的な違いです。RAG を入れてもハルシネーションはゼロにはなりません。しかし、失敗の形が変わります。根拠の無い断定が返ってくる状態から、根拠が並んで返ってくる状態へ。答えが間違っていれば、示された資料と突き合わせた瞬間に分かります。気づけない嘘と、気づける嘘の差が、業務で使えるかどうかの差になります。
そのため RAG のプロンプトには、資料の中に答えが無いときは無いと答えるよう、はっきり書いておきます。この一文が無いと、資料を渡しているのに、足りない部分をモデルが今までどおり埋めてしまいます。渡すだけでは足りず、外を使わせない縛りまで含めて、はじめてグラウンディングが成立します。
「資料に記載がありませんでした」という返事は、一見すると役に立たない回答です。それでも、間違った断定よりはるかに扱いやすい。足りない資料を足せば済むと、その場で分かるからです。
復習ミニクイズ
自社の社内規定など、LLMが学習していない特定の情報を扱う際にRAG(検索拡張生成)を活用すべき理由として、最も適切なものはどれですか?