OpenAIやAnthropicなどのドキュメントを読んでハルシネーションを防ぐ基本を学んでみた

# OpenAIやAnthropicなどのドキュメントを読んでハルシネーションを防ぐ基本を学んでみた

生成AIを使うときに気になる問題のひとつが「ハルシネーション（幻覚）」です。

ハルシネーションとは、ユーザーが入力したプロンプトに対して、AIが事実じゃない情報をさも本当のことのように出力する現象のことです。

以前、[Azure OpenAIとGitHub Actionsを組み合わせてプルリクエストのAIレビューを実施する手順](https://qiita.com/KenUehara/items/b0487acac17bac9557ad)といった記事を公開したのですが、この自動レビューでも以下のようなハルシネーションに悩まされました。

- 存在しないファイルのレビューを始める
- 存在しないコードのレビューを始める
- 存在しない関数を使用したコードで修正を要請してくる

その際、OpenAIやAnthropicなどのドキュメントを参考にし、ハルシネーションを防ぐためのプロンプト設計の基本を学習したので、その備忘も含めてこちらの記事で紹介します。


なお、この記事の対象者は以下のような方を対象としています。
- プロンプトの基本となる書き方が定まっていない方
- プロンプトの作り方を改善したいけど上手くできない方
- これから生成AIを触ってみようと思っている方

---

## ハルシネーションって何？

上述の通り、ハルシネーションは、生成AIが実際には存在しない情報や間違った内容を出力する現象のことです。

多くの人は生成AIを使用した時、生成AIが出力した回答に以下のような箇所が含まれていることを体験したことがあるのではないでしょうか？

- 架空の論文や書籍が引用されている
- 実際にはない統計データを提示されている
- 技術的に間違った説明が記述されている

これらの現象の問題点は見かけ上はそれっぽいことを言っていることです。
専門知識を元々持っていて誤りに気付ける人や、一次情報を確認する習慣がある人であれば良いのですが、なまじ本当っぽいことを並べているために、十分に知識がない人や、十分に情報元を調べない人の場合には生成AIが出力した内容を信じてしまう恐れがあります。

仮にビジネスや研究などの場面でこれらの不確かな情報を公の場に出してしまえば、他者からの信用を損なう要因となります。

そんなわけで、事前にハルシネーションを起こさないように予防する必要がありますが、予防するためには、まずはなぜハルシネーションが発生するかの原因を知る必要があります。

一般的にハルシネーションが発生する原因としては、
- **曖昧なプロンプト**: 指示がぼんやりしているために、AIが勝手に推測してしまう
- **トレーニングデータの偏り**: 学習データが不完全な場合に誤解が生まれる
- **AIの傾向**: AIモデルによっては「わからない」より「何か答える」ということを重視してしまうことがある

といったものが存在します。

これらの原因に対して、具体的に対策としてはどのようなものが存在するかを次の章で見ていきましょう。

---

## ハルシネーションを防ぐプロンプト設計のコツ



### **1. 明確な指示とルールを設定する**

生成AIには、「これだけは守ってね！」というルールをはっきりと伝えることが大事です。
例えば、以下のように、
```text
あなたは信頼性の高い情報のみを提供するアシスタントです。
以下のルールに従ってください：
- 確実な情報のみを提供すること。
- 不明な場合は「わかりません」と回答すること。
- 出典がある場合は必ず明記すること。
```

といった内容をプロンプト内に記述することで、出典元が不明な不確かな情報を生成AIが出力する可能性は低くなります。


---

### **2. 出典や根拠を必ず求める**
1番目と似た内容になりますが、回答に「どこからその情報を持ってきたの？」という出典や根拠を含めるよう指示をすることでより明確な情報源を提示するようになります。

具体的には、
```text
回答には必ず以下を含めてください：
1. 情報源（出典）。
2. 回答内容が不確かな場合、その旨を明記。
3. 推測の場合は「推測」と記載。
```
といった形式です。
これらのような指定をすることで、出典としてリンクが指定されているが、実際にリンク先を確認すると存在しなかった、というような現象が発生する回数を減らすことができます。


### **3. 質問は段階的に進める**  
Anthropicの公式ガイド「Prompt Engineering Basics」では、複雑な質問を分解する「ステップバイステップ法」を推奨しています。
一度に多くの問いをプロンプトの中に含めるのではなく、一つずつ質問を進めていくという形式です。

具体的には、
```text
[ステップ1] 基本情報の取得：
「量子コンピューティングの基本原理を簡潔に説明してください」

[ステップ2] 具体例の要求：
「日本企業の実用例を3つ挙げてください」

[ステップ3] 信頼性検証：
「挙げた事例の情報源を提示してください」
```
といった形式で進めます。
こうすることで、一つ一つの問いに対して明確な回答が得られるようになるため、ハルシネーションを防ぐという観点からは有効となります。


### **4. コンテキストと条件を具体的に伝える**  
Anthropicの公式ドキュメント[Contextual Retrieval](https://www.anthropic.com/news/contextual-retrieval)では、プロンプトの生成テクニックとして、生成AIにコンテキスト(文脈)と条件をあらかじめ提示することが挙げられています。

具体例としては以下のような形式です。
```text
あなたは2025年度版の日本の個人情報保護法に精通したAIです。
以下の条件で回答してください：
- 現行法（2025年4月改正）の条文を厳守
- 具体例は総務省公式事例集からのみ引用
- 不明点は「法解釈が必要」と明記
```

この方法を活用することで、生成AI側が勝手に条件付けをして避けることができます。

---

### **5. 出力形式を指定する**  
先ほどと同様のAnthropicの公式ドキュメント[Contextual Retrieval](https://www.anthropic.com/news/contextual-retrieval)では、プロンプトの生成テクニックとして、以下のように出力形式をあらかじめ設定することでより明確な回答が得られることが記載されています。

具体的なプロンプトとしては、
```text
以下の回答フォーマットに従って回答を生成してください。
回答フォーマット：
【事実】○○が△△である
【根拠】××省2025年報告書p.12
【注意点】2026年施行の改正法に影響を受ける可能性
```

といったような記述をすることで出力形式を制御するだけではなく、ハルシネーションを防ぐような効果が期待できます。

## まとめ


今回参考にした公式ガイドラインを参照しながら、段階的なプロンプト設計を行うことで、ウェブベースのインタラクションでも効果的にハルシネーションを抑制できると思います。
ぜひ参考にしてみてください！

## 参考資料

- [OpenAI, ChatGPT FAQ](https://help.openai.com/en/collections/3742473-chatgpt)
- [OpenAI, Prompt engineering](https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions)
- [Anthropic, "Stop AI Hallucinations: A Developer's Guide to Prompt Engineering"](https://shelf.io/blog/stop-ai-hallucinations-a-developers-guide-to-prompt-engineering/)
- [Anthropic, "Trust and Safety"](https://docs.anthropic.com/claude/docs/trust-and-safety)
- [Anthropic, "Contextual Retrieval"](https://www.anthropic.com/news/contextual-retrieval)
- [PromptHub, "Three Prompt Engineering Methods to Reduce Hallucinations", PromptHub公式ブログ](https://prompthub.substack.com/p/prompt-engineering-methods-that-reduce)