Menu

AI のハルシネーションとは?原因と対策

AI のハルシネーションとは、自信ありげなのに間違っている答えのことです。でっち上げの事実、引用、関数、パッケージなどです。言語モデルが何かを調べるのではなく、ありそうなテキストを予測するために起こります。プロンプトで減らせますが、捕まえられるのは確認だけです。

このページのプロンプトはすべて編集でき、そのまま ChatGPT や Claude などの AI アプリで開けます。

AI のハルシネーションとは、確信ありげに聞こえるのに間違っている答えのことです。でっち上げの事実、存在しない論文の引用、ライブラリにあったことのない関数などです。ChatGPT、Claude、Gemini を含め、どのチャットモデルもこれを起こします。いずれパッチで消えるバグではなく、言語モデルがテキストを生み出す仕組みから来るものです。プロンプトでハルシネーションを減らすことはできますが、残ったものを捕まえられるのは確認だけです。

言語モデルがハルシネーションを起こす理由

言語モデルは1トークンずつ書き、各トークンは、それまでのテキストに続く可能性が高いという理由で選ばれます。可能性が高いとは、モデルが学習で見たすべてのものを踏まえて、という意味です。この過程のどこにも、事実を調べる工程はありません。答えが学習データによく出てきたものなら、可能性の高い続きはたいてい本当の答えです。まれだったり、新しかったり、まったくなかったりしても、モデルはやはり最ももっともらしい続きを生成し、持っていない事実についてのもっともらしいテキストがハルシネーションです。

特に影響を受けやすい種類の質問があります。

  • 具体的な細部:正確な数字、日付、名前、バージョン番号、ページの参照。答えの形は予測しやすくても、細部は予測できません。
  • 引用とリンク。 参考文献には予測しやすい形式(著者、年、タイトル、掲載誌)があるので、モデルは書かれたことのない論文についても体裁の整った参考文献を作れます。
  • まれな話題や新しい話題:小さなライブラリ、地域の規則、モデルの学習データが終わったあとのこと。
  • 誤った前提を含む質問。 ある関数が何をするかを尋ねると、モデルはその関数が存在するかのように答えがちです。

流暢さは正確さのしるしではありません。ハルシネーションの答えは、正しい答えと同じ自信ありげな口調、同じ書式、同じ細かさを持っているので、見逃しやすいのです。

誤った前提のわな

下のタブは、pandas の DataFrame.smart_merge() について尋ねています。このメソッドは存在しません。1つ目の質問は存在すると前提にしていて、2つ目の質問はモデルがそう言えるようにしています。

pandas の DataFrame.smart_merge() は何をするメソッドですか? merge() の代わりにどんなときに使うべきですか?
Try it
Example replyReplies vary between models and runs.

DataFrame.smart_merge() は2つの DataFrame を結合し、列名とデータ型を比べて結合キーを自動で検出します。user_id と userId のように、共通のキー列の名前が少しずつ違う場合に使うと、自動で対応づけてくれます。

キーと結合の種類を細かく制御したい場合は、今でも merge() のほうが適しています。

1つ目の返答は、本物の部品で組み立てられたハルシネーションです。pandas は実際に DataFrame を結合しますし、キーの自動対応づけは欲しくなって当然の機能です。質問が前提を与え、モデルがそれに合うもっともらしい関数を与えたのです。現在のモデルは以前のモデルより誤った前提に気づくことが多くなりましたが、前提として書かれた質問は、やはり答えを同意の方向へ押しやります。

2つ目のプロンプトは2つのことをしました。メソッドが何をするかを尋ねる前に、存在するかを尋ねました。そして、確信がなくてよいとはっきり許しました。返答は確かめる方法も返してくれています。これが身につけるべき習慣です。hasattr なら、1行で本物のライブラリを確かめられます。

情報源から、引用つきで答えさせる

ハルシネーションを減らす最も強力な方法は、事実をプロンプトに入れることです。答えがモデルに見えるテキストの中にあれば、何かを思い出す必要はなく、あなたはすべての主張をそのテキストと照らし合わせられます。各主張を裏づける引用を求めれば確認が速くなり、文書に書かれていないときに何と言うべきかを伝えれば、モデルが推測で穴を埋めることが減ります。

文書だけをもとに答える
Fill in
Parts
下の文書だけを使って質問に答えてください。
<document> バックアップは毎晩 02:00 UTC に実行され、30日間保持されます。ステージング環境のデータベースのバックアップは7日間保持されます。リストアは #ops チャンネルで依頼し、通常4時間以内に完了します。 </document> 質問:本番環境のバックアップはどれくらい保持されますか?自分でリストアできますか?
質問の各部分について、答えを書き、そのあとに根拠となる文書の文をそのまま鉤括弧で引用してください。
文書で答えられない部分には「文書に記載なし」と書いてください。一般的な知識から事実を足さないでください。
Try it
Example replyReplies vary between models and runs.

本番環境のバックアップの保持期間:30日間。文書はバックアップ全般について30日間とし、7日間としているのはステージング環境だけです。 「バックアップは毎晩 02:00 UTC に実行され、30日間保持されます。」

自分でリストアできるか:文書に記載なし。文書に書かれているのはリストアの依頼方法だけです。「リストアは #ops チャンネルで依頼し、通常4時間以内に完了します。」これは別のチームがリストアを行うことを示唆していますが、セルフサービスでのリストアがあるかどうかは文書には書かれていません。

返答が2つ目の質問をどう扱ったかを見てください。一般的な知識から答えるモデルなら、リストアのコマンドを説明していたかもしれません。文書に制約されたこのモデルは、本文に書かれていることと、示唆されているだけのことを分けました。制約のパートをオフにしてもう一度尋ね、返答がまだその2つを分けているかを確かめてみてください。

<document> タグは、元の資料をあなたの指示から切り離しています。それがなぜ重要かは区切り文字と XML タグで説明しており、大規模にモデルへ適切な文書を渡す方法はコンテキストエンジニアリングで扱っています。Web 検索やファイルのアップロードを備えたチャットアプリも同じ考え方で動いています。答えの根拠は会話の中にある情報源の確かさまでなので、要約だけでなく、引用された情報源そのものを読んでください。

役に立つそのほかのプロンプトの習慣

  • 前提にせず、尋ねる。 「X する方法は?」の前に「X する方法はありますか?」と聞きます。誤った前提は、最も簡単にハルシネーションを引き起こします。
  • 不確かさを尋ねる。 「確信のない主張には印を付けて」と頼めば、先に確認すべき箇所の一覧が手に入ります。そのラベルは較正された確率ではありませんが、弱いところを指していることがよくあります。
  • 開ける情報源を求める。 そして開いてください。開いていない引用は確認されていませんし、リンクが実在しても、それが裏づけているはずの主張とは違うことが書かれている場合もあります。
  • チャットが長くなったら新しく始める。 長いチャットの初めのほうの細部は、会話が大きくなるにつれて混同されたり抜け落ちたりすることがあります。重要な事実については、関係する資料を貼り付けた新しい会話を開いてください。理由はトークンとコンテキストウィンドウで説明しています。
  • 新しい会話でもう一度尋ねる。 同じ事実についての質問に対して独立した2つの答えが食い違えば、少なくとも一方は間違っています。一致はそれより弱い証拠です。モデルは同じ間違いを繰り返すことがあるからです。

重要なものは確かめる

どんなプロンプトでもハルシネーションはなくせないので、何を確認すべきかは、間違ったときの代償で決めてください。ブレインストーミングや最初の下書きなら、いくつか誤りがあってもかまいません。レポートの数字、法律や医療に関する主張、人物の発言とされる引用、あなたの仕事の中の参考文献には、一次情報が必要です。

コードは最も確かめやすい出力です。実行すればテストになるからです。でっち上げのメソッドは、それを呼ぶ行が実行された瞬間に AttributeError やそれに相当するエラーで失敗するので、テストがその行に到達することを確かめてください。危険なのはでっち上げのパッケージ名です。聞いたことのないパッケージをインストールするようモデルに言われたら、インストールする前に、それが実在するか、思っているとおりのプロジェクトか、広く使われているかを確認してください。セキュリティ研究者たちは、モデルが同じ偽のパッケージ名を何度もでっち上げることが多いと示しており、攻撃者がその名前でパッケージを公開すれば、提案に従った人は誰でもその人のコードをインストールしてしまいます。AI が書いたコードの確認方法はコードを書くためのプロンプトで扱っています。

よくある質問

AI のハルシネーションとは何ですか?

AI のハルシネーションとは、言語モデルの答えのうち、自信たっぷりで流暢なのに間違っている、あるいは根拠のないもののことです。でっち上げの事実、存在しない論文の引用、ライブラリにあったことのない関数などです。モデルはわざと嘘をついているわけではありません。最もありそうに見えるテキストを生成したのであって、ありそうなことは本当であることと同じではありません。

ChatGPT がもっともらしい嘘をつくのはなぜですか?

チャットモデルは、学習で身につけたパターンをもとに、次のトークンを1つずつ予測してテキストを生成します。Web 検索や文書のようなツールが会話に入っていない限り、答えを調べるものは何もありません。正しい答えが学習データにまれにしかなかったり、まったくなかったりしても、モデルは最ももっともらしい続きを生成し、もっともらしい誤答は正しい答えとまったく同じように読めます。

AI のハルシネーションを完全になくすことはできますか?

できません。現在のモデルは以前のモデルよりハルシネーションが少なく、あなたが渡した文書や検索結果から答えさせればさらに減りますが、どんなプロンプトでもなくすことはできません。重要な事実、数字、引用、参考文献、API は、一次情報で確かめるべき主張として扱ってください。

AI のハルシネーションを減らすプロンプトは?

特に役立つのは3つです。「わからない」と言ってよいとはっきり許すこと。元になる資料を渡し、そこからだけ答えるよう頼むこと。各主張を裏づける直接の引用を求め、主張を本文と照らし合わせられるようにすること。何かが本当だと前提にした質問は避けてください。モデルはその前提に乗ってしまいがちです。

コーディングでの AI のハルシネーションにはどんな例がありますか?

ライブラリにないメソッドを呼ぶ、存在しないオプションを渡す、誰も公開していないパッケージを import する、ライブラリの古いバージョンの動作を現在のものとして説明する、などです。コードでは、その多くを簡単に捕まえられます。でっち上げのメソッドは、それを呼ぶ行が実行された瞬間に失敗するからです。危険なのはでっち上げのパッケージ名です。インストールする前に、そのパッケージが実在し、よく知られたものかを確認してください。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める