RAG入門:AIに知識を与える技術
RAG精度改善(3):プロンプトエンジニアリングの勘所
資料は渡っているのに、資料に無いことを答える
前回の切り分けで、正解のチャンクはちゃんと渡っていた。それでも回答が外れている。ここまで来たら、直す場所は Generation の側です。
いちばん多い失敗は、資料に答えが書かれていない質問への対応です。「アルバイトでも夏季休暇は取れますか」と聞かれ、渡した資料には正社員の話しか書かれていない。このとき LLM は、資料が足りないとは言わずに、世間一般の慣行を持ち出して答えを埋めます。素の LLM と同じ状態に戻ってしまうわけです。
原因は、資料の外を使うなと誰も言っていないことです。LLM から見れば、資料は参考のひとつであって、唯一の材料だとは書かれていません。渡しただけでは縛ったことにならない、というのがここでの要点です。
指示と資料と質問を、はっきり分ける
RAG のプロンプトは、3 つの部分でできています。役割とルールを伝える指示、検索で取ってきた資料、そしてユーザーの質問です。
この 3 つを地の文で混ぜて書くと、LLM はどこまでが命令でどこからが参考情報なのかを取り違えます。資料の中に「以下の手順で申請してください」という一文があれば、それを自分への命令だと受け取ることさえあります。見出しや区切り記号を入れて、境界を目に見える形にしてください。
プレーンテキスト
あなたは社内の人事アシスタントです。
以下の【資料】に書かれている内容だけを使って回答してください。
【資料】
{retrieved_context}
【質問】
{user_query}区切りに使う記号は何でもかまいませんが、資料の本文に出てこない形を選んでください。本文中に同じ記号があると、境界そのものが曖昧になります。
資料の側にも注意が要ります。チャンクをそのまま連結すると、どこからどこまでが 1 件なのか分からなくなります。1 件ずつ番号とタイトルを付けて並べておくと、後の出典表示がそのまま作れます。
「書いていない」と言わせる一文を足す
そのうえで、いちばん効く一文がこれです。
プレーンテキスト
【資料】に該当する記述が無い場合は、推測で補わず
「提供された資料には記載がありませんでした」とだけ回答してください。
回答した文の末尾には、根拠にした資料の番号を [1] の形式で付けてください。制約は 2 つ入っています。前半が、資料の外を使わせないための歯止めです。後半が出典の指定で、どの資料を読んで書いたのかを回答の中に残させます。
出典を付けさせる効果は、体裁の問題ではありません。番号が付いていれば、読み手はその 1 件を開いて確かめられます。そして運用する側から見ると、間違った回答が出たときに、検索が悪かったのか生成が悪かったのかを、ログを掘らずに判別できます。示された資料に答えが書いてあるのに回答が違えば生成の問題、資料自体が的外れなら検索の問題です。前回やった切り分けが、日常運用の中で自動的に回るようになります。
役割の指定、資料の外を禁じる制約、出典の強制。まずこの 3 つを入れてください。そのうえで、該当箇所を先に抜き出させてから答えさせる、望ましい回答例をいくつか添えておく、といった工夫が効いてきます。順番を逆にすると、土台が抜けたまま装飾だけが増え、何が効いているのか分からなくなります。
復習ミニクイズ
RAGシステムにおいて、検索したドキュメントの中にユーザーの質問への回答が含まれていない場合に、AIがもっともらしい嘘(ハルシネーション)を答えてしまうのを防ぐ最も適切な指示はどれですか?