- AI ⚙️
ハルシネーション対策のプロンプト集|根拠と出典を求める書き方
ハルシネーションをプロンプトで減らす基本は、「わからないときはわからないと答えてよい」と伝え、答えの根拠を資料からの引用として示させることです。 根拠が引用の形で出ていれば、人が資料と見比べて確かめられます。
この記事は、プロンプト設計全般ではなく誤情報を減らす指示だけに絞りました。Anthropic や OpenAI の公式ドキュメントに記載のある5つの手法を、用途・追加の手間・向かない場面つきの早見表にし、手法ごとにコピペできるテンプレートを載せています。最後に、出力の根拠を人が照合するための確認表と、引用が資料に実在するかを機械的に確かめる小さなスクリプトを付けました。
確認環境:各手法は Anthropic と OpenAI の公式ドキュメント(2026年10月5日に閲覧)の記載にもとづきます。テンプレートはこの記事で作成したもので、モデルの出力例は載せていません。引用の照合スクリプトは Python 3.11.15 で実行した結果を掲載しています。
なお、Anthropic の公式ドキュメントは、これらの手法について「ハルシネーションを大きく減らすが、完全になくすものではない。重要な情報は必ず検証すること」という趣旨で締めくくっています。プロンプトの工夫と、人による確認はセットで考えます。
ハルシネーション対策プロンプトの早見表
| 手法 | 何をさせるか | 向いている用途 | 追加の手間 | 向かない場面 |
|---|---|---|---|---|
| 1. わからないと答えてよいと伝える | 自信がないとき・資料に無いときに、決めた文言で答えさせる | すべての質問の土台 | 小(1〜2行足す) | アイデア出しなど、幅広い案がほしいとき |
| 2. 引用を先に抜き出させる | 回答の前に、資料から関係する箇所を一字一句そのまま抜き出させる | 長い資料の要約・調査・規程の確認 | 中(出力が長くなる) | 資料を渡していない質問 |
| 3. 主張ごとに引用を付けさせる | 文ごとに引用を対応させ、裏づけのない文は取り下げさせる | 報告書・回答文の下書きなど、後で人が確認する文章 | 中〜大(照合の作業が発生) | 短い雑談的な質問、資料の無い質問 |
| 4. 資料の範囲に限定する | 渡した資料だけを使い、モデルが元から持つ知識を使わないと決める | 社内規程・仕様書・マニュアルへの質問 | 小(1〜2行足す) | 資料に無い一般知識も補ってほしいとき |
| 5. 別の呼び出しで検証させる | 回答とは別の会話・別の呼び出しで、回答を資料と突き合わせさせる | 外部に出す文章、まとめて自動処理する場合 | 大(呼び出しが増える) | すぐ答えがほしい対話、資料の無い質問 |
迷ったら、1 と 4 を常に入れ、資料が長いときは 2、人が確認する文章には 3、外に出すものには 5 を足す、という重ね方が出発点になります。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「ハルシネーション対策のプロンプト集|根拠と出典を求める書き方」
5つの手法と公式ドキュメントの対応
| 手法 | Anthropic の公式ドキュメント | OpenAI の公式ドキュメント |
|---|---|---|
| 1. わからないと答えてよい | 「Reduce hallucinations」:わからないと認めてよいと明示的に許可する | 「GPT-4.1 Prompting Guide」:与えた文脈から答えがわからないときに返す文言を決めておく指示例 |
| 2. 引用を先に抜き出す | 「Reduce hallucinations」「Long context prompting tips」:長い資料では、作業の前に関係する箇所をそのまま引用させる | — |
| 3. 主張ごとに引用を付ける | 「Reduce hallucinations」:主張ごとに引用と出典を付けさせ、引用が見つからない主張は取り下げさせる | 「GPT-4.1 Prompting Guide」:参照した資料を名前とIDで示す引用の書式例 |
| 4. 資料の範囲に限定する | 「Reduce hallucinations」:渡した資料だけを使い、一般知識を使わないよう指示する | 「GPT-4.1 Prompting Guide」:与えた外部の文脈にある資料だけを使う指示例。「Prompt engineering」:応答を特定の資料に限定するために文脈を渡す |
| 5. 別の呼び出しで検証する | 「Reduce hallucinations」:出力を次のプロンプトの入力にして検証させる、同じプロンプトを複数回実行して比べる | Cookbook「Developing Hallucination Guardrails」:別のモデル呼び出しで、回答が知識ベースに沿っているかを判定する |
「—」は、今回参照したページに該当する記載が無い欄です。
まず押さえたい:誤情報が混ざりやすい頼み方
手法に入る前に、同じ質問でも頼み方で変わる点を整理します。
| 頼み方 | 起きやすいこと | 直した頼み方 |
|---|---|---|
| 資料を渡さずに、細かい数値や日付を尋ねる | もっともらしい値が返ることがある | 資料を貼り、その資料から答えるよう指定する |
| 「必ず答えて」「空欄は不可」と強く求める | 資料に無い内容でも埋めようとする | 「資料に無い項目は『記載なし』と書く」と逃げ道を用意する |
| 出典を「付けて」とだけ頼む | 実在しない文献名やURLが添えられることがある | 出典は「渡した資料の中の箇所」に限定し、一字一句の引用で示させる |
| 長い資料を貼って、いきなり結論を求める | 資料の一部だけを見て答える | 先に関係する箇所を抜き出させ、その引用だけをもとに答えさせる |
OpenAI のヘルプ記事「Does ChatGPT tell the truth?」も、誤った定義や日付、実在しない引用や文献が生成されることがあり、誤っていても自信のある書き方になる場合があると説明し、引用やデータは確かめるよう勧めています。
手法1:わからないと答えてよいと伝える
もっとも手軽で、ほかの手法の土台になります。ポイントは「わからないとき」の条件と、そのときに返す文言を具体的に決めておくことです。文言が決まっていると、後からその文言を検索して、答えられなかった項目だけを拾い出せます。
テンプレート
次の質問に答えてください。
# ルール
- 確信が持てない内容は、推測で埋めずに「わかりません」と書く。
- 「わかりません」と書いた項目には、何がわかれば答えられるかを1行で添える。
- 確かな部分と推測の部分が混ざるときは、文頭に【確実】【推測】を付けて分ける。
# 質問
{{質問}}
資料を渡す場合は、条件を「資料に書かれていないとき」に変えます。
<資料>
{{資料}}
</資料>
上の資料をもとに、次の質問に答えてください。
資料に答えが書かれていない場合、または資料だけでは判断できない場合は、
「資料からは判断できません」とだけ答え、足りない情報を箇条書きで挙げてください。
質問:{{質問}}
使いどころと副作用
| 観点 | 内容 |
|---|---|
| 効く場面 | 事実を尋ねる質問、資料に答えが無いかもしれない質問 |
| 副作用 | 答えられる質問にも「わかりません」が増えることがある |
| 副作用への対処 | 「資料に書かれていない場合に限る」と条件を狭める。【確実】【推測】の区別で、推測でも出してほしい部分を残す |
| 確かめ方 | 資料に答えが無い質問をわざと混ぜ、決めた文言が返るかを見る |
手法2:引用を先に抜き出させる
長い資料を扱うときに向く手法です。Anthropic の公式ドキュメントは、長い資料(目安として2万トークン超)を扱う作業では、先に一字一句そのままの引用を抜き出させ、その引用をもとに作業させると、応答が実際の文章に結び付くと説明しています。同じく長い資料は、質問や指示より上(プロンプトの先頭側)に置くことが勧められています。
テンプレート
<資料>
{{資料}}
</資料>
上の資料について、次の2段階で作業してください。
1. 質問に関係する箇所を、資料から一字一句そのまま抜き出し、[1] [2] のように番号を付けて
<引用> タグの中に並べる。言い換えや要約はしない。
関係する箇所が見つからない場合は「該当する記述なし」と書き、2 には進まない。
2. 1 で抜き出した引用だけをもとに、質問に答える。
答えの各文の末尾に、根拠にした引用の番号を [1] のように付ける。
引用に無い内容は書かない。
質問:{{質問}}
資料が複数あるときは、資料ごとにタグで囲み、出典の名前を添えておくと、どの資料からの引用かを答えさせやすくなります。
<documents>
<document index="1">
<source>備品予約システム 利用ルール 第3版</source>
<document_content>
{{資料1の本文}}
</document_content>
</document>
<document index="2">
<source>備品予約システム よくある問い合わせ</source>
<document_content>
{{資料2の本文}}
</document_content>
</document>
</documents>
この形は Anthropic の公式ドキュメントに載っている複数資料の構造です。OpenAI の「GPT-4.1 Prompting Guide」でも、多数の資料を渡すときの区切り方として XML 形式がよく機能したと書かれています。
使いどころと副作用
| 観点 | 内容 |
|---|---|
| 効く場面 | 長い規程・仕様書・議事録から、特定の点を確かめたいとき |
| 副作用 | 出力が長くなる。引用の段階で拾われなかった箇所は、回答にも使われない |
| 副作用への対処 | 「関係する箇所をもれなく」と書く。質問を1つずつに分ける |
| 確かめ方 | 抜き出された引用が資料に実在するかを、後述のスクリプトか検索で照合する |
手法3:主張ごとに引用を付けさせ、裏づけのない文は取り下げさせる
文章を書かせたうえで、書いた文の1つ1つに裏づけの引用を探させ、見つからない文は消させる手法です。Anthropic の公式ドキュメントでは、応答を後から確かめられるものにする方法として紹介され、例のプロンプトでは、取り下げた箇所に空の角かっこ [] を残させています。
テンプレート(下書きと見直しを1回で行う)
<資料>
{{資料}}
</資料>
上の資料だけを使って、{{書いてほしい文章の説明}}を書いてください。
書き終えたら、次の手順で見直してください。
1. 文章の中の主張(事実を述べている文)を1つずつ取り出す。
2. それぞれの主張について、裏づけになる箇所を資料から一字一句そのまま引用する。
3. 引用が見つからない主張は文章から取り下げ、その位置に [取り下げ] と書く。
4. 最後に、見直し後の文章と、下の形式の確認表を出力する。
| 番号 | 主張 | 引用箇所(資料の文そのまま) | 資料の場所 |
|---|---|---|---|
出力形式の指定例
確認表の形まで指定しておくと、後の照合がそのまま進められます。次は指定の例で、モデルの出力ではありません。
# 出力形式
## 見直し後の文章
(本文。取り下げた箇所は [取り下げ] と表示)
## 確認表
| 番号 | 主張 | 引用箇所(資料の文そのまま) | 資料の場所 |
|---|---|---|---|
| 1 | (本文中の主張を1文で) | (資料からの引用) | (章・項番・行など) |
## 取り下げた主張
- (取り下げた主張と、取り下げた理由を1行で)
使いどころと副作用
| 観点 | 内容 |
|---|---|
| 効く場面 | お知らせ文・回答文・報告書の下書きなど、資料にもとづく文章 |
| 副作用 | 文章が短く、硬くなる。つなぎの文やまとめの文まで取り下げられることがある |
| 副作用への対処 | 「事実を述べている文」だけを対象にすると明記する。あいさつや接続の文は対象外と書く |
| 確かめ方 | 確認表の引用が資料に実在するか、主張と引用の内容が合っているかを人が見る |
手法4:資料の範囲に限定する
モデルが学習で身につけた一般知識を使わず、渡した資料の中だけで答えさせる指示です。社内の規程や自分たちの仕様書のように、一般知識と食い違う可能性がある内容で特に役立ちます。
テンプレート(資料だけに限定する)
<資料>
{{資料}}
</資料>
# ルール
- 上の資料に書かれている内容だけを使って答える。
- 資料に無い一般知識や、ほかのシステムでの通例は使わない。
- 資料から答えがわからない場合は、利用者から重ねて求められても
「資料にはその情報がありません」と答える。
質問:{{質問}}
テンプレート(資料を優先し、一般知識も区別して使う)
資料だけでは説明が足りない場面のために、OpenAI の「GPT-4.1 Prompting Guide」には、資料を既定としつつ、確信のある基本的な知識は補ってよいとする指示例も載っています。その考え方で、出どころを区別させる形にしたものです。
<資料>
{{資料}}
</資料>
# ルール
- まず上の資料を使って答える。
- 資料に無いが説明に必要な基本的な知識は、確信がある場合に限って補ってよい。
- 補った文には文頭に【資料外】と付け、資料にもとづく文と区別する。
質問:{{質問}}
使いどころと副作用
| 観点 | 内容 |
|---|---|
| 効く場面 | 規程・仕様書・マニュアルなど、答えの出どころを1つに決めたい質問 |
| 副作用 | 資料に少しでも書かれていないと答えなくなる。用語の説明など、補足がほしい場面で不親切になる |
| 副作用への対処 | 2つ目のテンプレートに切り替え、【資料外】の印で区別する |
| 確かめ方 | 資料に無い内容をわざと尋ね、「資料にはその情報がありません」が返るかを見る |
OpenAI の同じガイドは、長い資料を渡すときは指示を資料の前と後の両方に置くとよく、1回だけ置くなら資料の前がよいとしています。一方、Anthropic のドキュメントは長い資料を上に置き、質問を末尾に置く形を勧めています。使うモデルの公式ガイドに合わせて、指示の位置を決めるのが確実です。
手法5:別の呼び出しで検証させる
回答を作ったのとは別の会話や別の呼び出しで、回答を資料と突き合わせる手法です。書いた本人ではなく、確認だけを役目にした呼び出しを用意すると考えると分かりやすくなります。
公式ドキュメントでは次の形が紹介されています。
| 形 | 内容 | 記載元 |
|---|---|---|
| 出力を次の入力にして確かめさせる | 回答を次のプロンプトに渡し、検証や補足をさせる | Anthropic「Reduce hallucinations」 |
| 同じプロンプトを複数回実行して比べる | 出力どうしの食い違いを、誤りの手がかりにする | Anthropic「Reduce hallucinations」 |
| 判定用の呼び出しを挟む | 別のモデル呼び出しが、回答が知識ベースに沿っているかを文ごとに判定する | OpenAI Cookbook「Developing Hallucination Guardrails」 |
テンプレート(検証役のプロンプト)
1回目の回答と資料を、新しい会話に貼って使います。
あなたの役目は、回答が資料に沿っているかを確認することです。
回答を書き直したり、良し悪しを評価したりする必要はありません。
<資料>
{{資料}}
</資料>
<回答>
{{1回目の回答}}
</回答>
手順
1. 回答を、事実を述べている文ごとに分ける。
2. 各文について、資料の中から裏づけになる箇所を一字一句そのまま引用する。
3. 次の3つのどれかで判定する。
- 一致:引用が文の内容を裏づけている
- 不一致:資料に、文の内容と食い違う記述がある(その箇所を引用する)
- 記載なし:資料に関係する記述が見つからない
4. 下の表の形で出力する。表のほかに文章は書かない。
| 番号 | 回答の文 | 資料からの引用 | 判定 |
|---|---|---|---|
テンプレート(同じ質問を複数回実行して比べる)
同じプロンプトを新しい会話で3回実行し、3つの回答を次のプロンプトに貼ります。
同じ質問に対する回答が3つあります。
<回答A>{{回答A}}</回答A>
<回答B>{{回答B}}</回答B>
<回答C>{{回答C}}</回答C>
3つの回答を比べ、次の表を作ってください。
- 数値・日付・固有名詞・手順の順番など、事実にあたる点を1行ずつ取り上げる。
- 3つとも同じなら「そろっている」、1つでも違えば「食い違い」と書く。
- どれが正しいかの判断はしない。
| 事実にあたる点 | 回答A | 回答B | 回答C | そろっているか |
|---|---|---|---|---|
「食い違い」になった行が、資料で確かめる優先度の高い箇所です。3つがそろっていても正しいとは限らないので、重要な点は資料で確認します。
使いどころと副作用
| 観点 | 内容 |
|---|---|
| 効く場面 | 社外に出す文章、まとめて大量に処理する場合の検査 |
| 副作用 | 呼び出しの回数と時間が増える。検証役の判定にも誤りが混ざりうる |
| 副作用への対処 | 検証役にも引用を出させ、判定の根拠を人が見られるようにする。全件ではなく、重要な文書に絞って使う |
| 確かめ方 | わざと誤りを1つ入れた回答を検証役に渡し、「不一致」や「記載なし」と判定されるかを見る |
5つをまとめたテンプレート
資料にもとづいて答えさせるときの、手法1〜4をまとめた形です。手法5は、この出力を検証役のプロンプトに渡して行います。
<資料>
{{資料}}
</資料>
あなたは、上の資料の内容を正確に伝える担当です。
# ルール
1. 資料に書かれている内容だけを使う。資料に無い知識は使わない。
2. 答える前に、質問に関係する箇所を資料から一字一句そのまま抜き出し、番号を付けて並べる。
3. 抜き出した引用だけをもとに答え、各文の末尾に引用の番号を付ける。
4. 引用で裏づけられない文は書かない。
5. 資料から判断できない点は「資料からは判断できません」と書き、足りない情報を挙げる。
# 出力形式
## 引用
[1] (資料の文そのまま)
[2] (資料の文そのまま)
## 回答
(各文の末尾に [1] のように番号を付ける)
## 資料から判断できなかった点
- (無ければ「なし」)
# 質問
{{質問}}
出力の根拠を人が照合する確認表
プロンプトで引用を出させても、引用そのものが資料と違っていたり、引用は正しくても主張と合っていなかったりすることがあります。最後は人が確かめます。確かめる点は3つです。
| 確かめる点 | 見るところ | 判定 |
|---|---|---|
| 1. 引用が実在するか | 引用箇所が、資料に一字一句そのまま載っているか | あり/なし |
| 2. 主張と引用が合っているか | 引用が、主張の内容(数値・条件・主語)を裏づけているか | 一致/不一致 |
| 3. 抜けが無いか | 引用の前後に、例外や条件の記述が無いか | 問題なし/条件あり |
確認表のひな形
| 番号 | 主張 | 引用箇所(資料の文そのまま) | 資料の場所 | 引用は実在するか | 主張と一致するか | 対応 |
|---|---|---|---|---|---|---|
| 1 | | | | あり/なし | 一致/不一致 | そのまま/修正/削除 |
| 2 | | | | | | |
| 3 | | | | | | |
表計算ソフトに貼る場合は、次のタブ区切りを使ってください。
番号 主張 引用箇所(資料の文そのまま) 資料の場所 引用は実在するか 主張と一致するか 対応
1
2
3
記入例
架空の「備品予約システム 利用ルール」を資料にした記入例です。主張と引用箇所は、照合の流れを示すためにこの記事で用意したものです。
資料(source.txt):
備品予約システム 利用ルール(第3版)
1. 予約は利用日の14日前から前日の17時まで受け付けます。
2. 1回の予約で借りられる備品は3点までです。
3. 貸出期間は最長5日間です。延長は1回だけ、2日間まで申請できます。
4. 返却は総務窓口で、平日の9時から18時まで受け付けます。
5. プロジェクターは社外への持ち出しに上長の承認が必要です。
| 番号 | 主張 | 引用箇所 | 資料の場所 | 引用は実在するか | 主張と一致するか | 対応 |
|---|---|---|---|---|---|---|
| 1 | 予約は利用日の14日前から受け付ける | 予約は利用日の14日前から前日の17時まで受け付けます。 | 項番1 | あり | 一致 | そのまま |
| 2 | 一度に借りられるのは3点まで | 1回の予約で借りられる備品は3点までです。 | 項番2 | あり | 一致 | そのまま |
| 3 | 貸出期間は最長7日間 | 貸出期間は最長7日間です。 | — | なし | — | 資料の「最長5日間」に修正 |
| 4 | 延長は2回まで申請できる | 延長は1回だけ、2日間まで申請できます。 | 項番3 | あり | 不一致 | 「1回だけ、2日間まで」に修正 |
| 5 | 返却は土日も受け付ける | (なし) | — | 引用なし | — | 削除(資料は平日のみ) |
3番は引用そのものが資料と違う例、4番は引用は実在するが主張と合っていない例です。4番のような行は、引用が付いているだけで安心すると見落とします。
引用が資料に実在するかを機械的に確かめる
確かめる点の1つ目(引用が実在するか)は、文字の照合なのでスクリプトに任せられます。主張と引用箇所をタブ区切り(claims.tsv)で保存し、資料のテキストと突き合わせます。
claims.tsv:
番号 主張 引用箇所
1 予約は利用日の14日前から受け付ける 予約は利用日の14日前から前日の17時まで受け付けます。
2 一度に借りられるのは3点まで 1回の予約で借りられる備品は3点までです。
3 貸出期間は最長7日間 貸出期間は最長7日間です。
4 延長は2回まで申請できる 延長は1回だけ、2日間まで申請できます。
5 返却は土日も受け付ける
check_quotes.py:
"""引用箇所が資料に一字一句そのまま載っているかを確かめる。
使い方: python3 check_quotes.py source.txt claims.tsv
claims.tsv は「番号 / 主張 / 引用箇所」のタブ区切り(1行目は見出し)。
"""
import csv
import re
import sys
def normalize(text):
# 空白と改行の違いは無視して比べる
return re.sub(r"\s+", "", text)
def find_line(lines, quote):
for number, line in enumerate(lines, start=1):
if normalize(quote) in normalize(line):
return number
return None
def main(source_path, claims_path):
with open(source_path, encoding="utf-8") as f:
source = f.read()
lines = source.splitlines()
with open(claims_path, encoding="utf-8", newline="") as f:
rows = list(csv.DictReader(f, delimiter="\t"))
print("| 番号 | 主張 | 引用箇所 | 資料にあるか | 資料の行 |")
print("|---|---|---|---|---|")
counts = {"あり": 0, "なし": 0, "引用なし": 0}
for row in rows:
quote = (row["引用箇所"] or "").strip()
if not quote:
result, where = "引用なし", "-"
elif normalize(quote) in normalize(source):
result, where = "あり", str(find_line(lines, quote) or "複数行")
else:
result, where = "なし", "-"
counts[result] += 1
print(f"| {row['番号']} | {row['主張']} | {quote or '(なし)'} | {result} | {where} |")
print()
print("集計:", "、".join(f"{k} {v}件" for k, v in counts.items()))
if __name__ == "__main__":
main(sys.argv[1], sys.argv[2])
実行結果(Python 3.11.15):
$ python3 check_quotes.py source.txt claims.tsv
| 番号 | 主張 | 引用箇所 | 資料にあるか | 資料の行 |
|---|---|---|---|---|
| 1 | 予約は利用日の14日前から受け付ける | 予約は利用日の14日前から前日の17時まで受け付けます。 | あり | 2 |
| 2 | 一度に借りられるのは3点まで | 1回の予約で借りられる備品は3点までです。 | あり | 3 |
| 3 | 貸出期間は最長7日間 | 貸出期間は最長7日間です。 | なし | - |
| 4 | 延長は2回まで申請できる | 延長は1回だけ、2日間まで申請できます。 | あり | 4 |
| 5 | 返却は土日も受け付ける | (なし) | 引用なし | - |
集計: あり 3件、なし 1件、引用なし 1件
3番と5番はスクリプトで見つかります。4番は「あり」と出ますが、主張とは合っていません。 スクリプトが見ているのは引用が資料にあるかどうかだけなので、「あり」になった行について、主張と引用が合っているかを人が読んで判定します。人が読む量を「あり」の行に絞れることが、このスクリプトの役目です。
場面別:どの手法を組み合わせるか
| 場面 | 入れる手法 | 理由 |
|---|---|---|
| 資料なしで事実を尋ねる | 1 | 引用のもとになる資料が無いので、わからないと言える状態にしておく。重要な点は自分で一次情報を確かめる |
| 社内の規程・マニュアルについて質問する | 1 + 4 | 出どころを資料に限定し、無い場合の文言を決める |
| 長い資料を要約・調査する | 1 + 2 + 4 | 先に引用を抜き出させ、引用にもとづいて書かせる |
| 資料をもとにお知らせ文や報告を書く | 1 + 3 + 4 | 主張ごとの引用と確認表で、人が照合できる形にする |
| 社外に出す文章・大量の自動処理 | 1 + 3 + 4 + 5 | 別の呼び出しで検証し、最後に人が確認表で見る |
| アイデア出し・文章の言い回しの相談 | なし(必要なら【推測】の印だけ) | 事実の正確さより幅がほしい場面では、制限が発想を狭める |
プロンプト以外で公式ドキュメントが挙げている方法
プロンプトの文面と併せて使える方法です。いずれも今回開いた公式ページに記載のあるものに限っています。
| 方法 | 内容 | 記載元 |
|---|---|---|
| 関連する資料を取り出してプロンプトに加える(RAG) | モデルが学習していないデータを使わせたり、応答を特定の資料に限定したりするために、文脈を渡す | OpenAI「Prompt engineering」 |
| 渡す文脈の質を整える | 関係のない文脈を渡しすぎると、必要な情報が埋もれてハルシネーションの原因になる | OpenAI「Optimizing LLM Accuracy」 |
| API の引用機能を使う | 資料のどの箇所を根拠にしたかを、構造化された形で受け取る(Anthropic の Citations、OpenAI の file search の file_citation) | Anthropic「Citations」、OpenAI「File search」 |
| ツールで確かめさせる | 不確かな点は推測せず、ツールでファイルを読んで情報を集めるよう指示する | OpenAI「GPT-5 prompting guide」 |
| 考えた過程を確認する | 答えが誤っているように見えるとき、要約された思考の内容を見て、前提や論理の誤りを探す | Anthropic「Reduce hallucinations」 |
| 人が確かめる | 引用・データ・技術的な情報・外部の文書への言及は必ず確認する | OpenAI ヘルプ「Does ChatGPT tell the truth?」 |
Anthropic の「Citations」のページは、API の引用機能について、プロンプトだけで引用させる方法と比べて、引用が渡した資料の実在する箇所を指すことが保証される点を利点に挙げています。API から使う場合は、手法2・3をプロンプトで書く代わりに、こうした機能を使う選択肢もあります。
よくある質問
Q. プロンプトを工夫すれば、ハルシネーションはなくせますか? A. 減らせますが、なくすことはできません。Anthropic の公式ドキュメントも、紹介している手法はハルシネーションを大きく減らすものの完全になくすものではなく、重要な情報は必ず検証するよう書いています。プロンプトで「確かめやすい形」にし、人が確認表で照合する、という分担で考えます。
Q. 「出典を付けて」と頼むだけでは足りませんか? A. 資料を渡さずに出典を求めると、実在しない文献やURLが添えられることがあります。出典は「渡した資料の中の箇所」に限定し、一字一句の引用で示させると、資料を検索するだけで実在を確かめられます。
Q. 「わからないと答えてよい」と書くと、答えてくれない場面が増えませんか? A. 増えることがあります。条件を「資料に書かれていない場合に限る」と狭め、推測でも出してほしい部分は【推測】の印を付けて出させると、答えの量と確かさの両方を保ちやすくなります。
Q. 引用が付いていれば、その文は正しいと考えてよいですか? A. 引用が資料に実在することと、主張が引用と合っていることは別です。記入例の4番のように、実在する引用が付いていても主張が食い違う場合があります。スクリプトで実在を確かめ、合っているかは人が読んで判定します。
まとめ
- 土台は「わからないと答えてよい」と伝えること。返す文言まで決めておくと、後から拾い出せる
- 長い資料では、先に一字一句の引用を抜き出させる。その引用だけをもとに答えさせる
- 文章を書かせるときは、主張ごとに引用を付けさせ、裏づけのない文は取り下げさせる
- 出どころを資料に限定する。補足がほしいときは【資料外】の印で区別させる
- 外に出す文章は、別の呼び出しで資料と突き合わせる。検証役にも引用を出させる
- 最後は人が確認表で照合する。引用の実在はスクリプトで、主張との一致は人が読んで判定する
- どの手法にも副作用がある。答えない場面が増える・文章が硬くなる・手間が増える点を見て、場面に合わせて重ねる
参考・出典
- Anthropic「Reduce hallucinations」「Long context prompting tips」「Citations」(platform.claude.com/docs)
- OpenAI「Prompt engineering」「Optimizing LLM Accuracy」「File search」(developers.openai.com/api/docs)
- OpenAI Cookbook「GPT-4.1 Prompting Guide」「GPT-5 prompting guide」「Developing Hallucination Guardrails」(developers.openai.com/cookbook)
- OpenAI Help Center「Does ChatGPT tell the truth?」(help.openai.com)
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「ハルシネーション対策のプロンプト集|根拠と出典を求める書き方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。