概要
ChatGPT APIを活用したアプリケーションでは、要件が複雑化することで、システムプロンプトが肥大化していくことがあります。
しかしプロンプトが肥大化すると、ハルシネーションの起きる可能性が上がり、思ったような精度が出なくなってくることがあります。
以下を意識してプロンプトを改善させることで、精度向上できる可能性があります
- FunctionCallingを使って処理の分岐を行う
- 1つのプロンプトには1つの命令に留める
精度が落ちるプロンプトとは
例えば、あなたの作っているアプリでは以下のようなシステムプロンプトのようになっていないでしょうか?
あなたはXXXです。
ルール:
Aの時は、Xしてください。
Bの時は、Yしてください。
Cの時は、Zしてください。
# Bの時は以下のデータを使ってください
<RAG用のデータ>
日本語で回答してください。嘘はつかないでください。etc etc...
このようなプロンプトは、以下の理由で思ったような振る舞いをしてくれないことが多いです。
- 複数のことを同時に命令することで指示が混ざってしまう
- 文章が長いことでLLMが命令の一部を無視することがある
GPTsの場合はこの方法でしか書くことができないことやGPT4であるためあまり問題になることはないですが、APIを使う場合はGPT3.5を使うことが多いと思います。そのような時は特に問題が発生しやすいです。
改善① FunctionCallingを使って処理の分岐を行う
一度に複数のことを同時に命令することでLLMがハルシネーションを起こしてしまう可能性が高まるため、まず前段でFunctionCalling(もしくはJSON Modeでの判定)を行い、ユーザの意図で処理の分岐を行いましょう。
ユーザの意図がどれであるかをJSONで出力してください。
A: Aの説明
B: Bの説明
C: Cの説明
Response: {type: A or B or C}
これにより、前段でユーザ意図を把握して処理の分岐を行うことができます。
改善② 分岐した先で1つの命令に留めたプロンプトを実行する
例えば、前段でユーザの意図がAであるとわかった場合は、以下を実行します。
Xしてください。
ユーザの意図がBであるとわかった場合は、以下を実行します。
Yしてください。
# 以下のデータを使ってください
<RAG用のデータ>
このように場合分けをしたことによって、その後に実行するプロンプトの文字数を最小化させ、単一命令にすることができます。
まとめ
「長い」「命令が複数書かれている」プロンプトを、「短くて」「単一の命令が書かれている」プロンプトに書き換えることでハルシネーションのリスクを抑えることができます。
精度が問題になっている場合は、プロンプトが肥大化していないか確認してみましょう。
生成AIを専門にシステム開発やコンサルティングをやっています。興味があればご連絡ください。