ヒューマン化:なぜあなたのローカルLLMが情報を発明するのかおよびその仕組み limiter
AIのハルシネーションとは、誤った回答を、正しい回答であるかのように自信を持って提示することです。たとえば、でっち上げた日付、存在しない引用、架空のPython関数などです。ローカルLLMでも、クラウド上の大規模モデルと同じ現象が起こり、量子化のビット数が少ない場合には、より顕著になることもあります。このガイドでは、こうした架空の内容が生まれる理由を専門用語を使わずに説明し、それを減らすための具体的な設定、プロンプト、安全策を紹介します。そして何より、機械を決して信用してはいけないケースを取り上げます。
#ハルシネーションとは何か?
「ハルシネーション」とは、モデルが生成した主張のうち、誤っている、作り上げられている、または検証できないにもかかわらず、事実として提示されるものを指します。これはコンピューターのプログラム上のバグではありません。プログラムは正常に動作し、もっともらしい文章を生成しているのです。問題は、「もっともらしい」ことと「真実である」ことは同じではない、という点です。
具体的には、ハルシネーションにはいくつかの形があります。細かい数値まで示されているのに誤っている情報(「この都市の人口は47,312人です」)、存在しない出典(「Dupontらの2019年の研究によると」)、架空のAPIやコマンド(`ollama sync --cloud`)、あるいは事実に基づく要素を誤って組み合わせたものです。共通するのは、常に自信に満ちた口調であることです。
#モデルが事実を作り上げるのはなぜか
お使いのマシンで、プライベートかつ無料のChatGPTを1時間で構築 — LM Studio、Ollama、Open WebUI、ご自身のドキュメント、クラウド不要。
- 永久に利用できるオンラインスペース
- PDF + ファイル
- 30日間返金対応
LLMは、統計的にもっともらしい形でテキストの続きを補うという、一つのタスクのために訓練されています。何十億もの文を取り込み、そこから規則性を学びました。質問をすると、知識ベースを「参照」するのではなく、リクエストと訓練内容に照らして最も確率の高い続きを、1語ずつ生成します。
- 事実を正確に記憶する仕組みがない
- 知識はネットワークの重みに分散して記憶されており、データベースのように保存されていません。モデルは「傾向」を覚えており、正確な事実を覚えていません。具体的な詳細(日付、数字、稀な固有名詞)は最初に歪んでいきます。
- ある時点で止まった学習
- モデルは学習データの締め切り日より後のことを知りません。最近の出来事について尋ねても、「わかりません」とは答えず、知っている情報から推測を広げるため、事実ではない内容を作り出します。
- 回答しようとするバイアス
- LLMは、黙っているためではなく、回答するために最適化されています。答えを知らない質問に直面したとき、最も確率の高い続きは、知らないと認めることよりも、自信に満ちた回答になることがよくあります。
- 量子化の効果
- モデルをQ4_K_Mに圧縮するとVRAMを節約できますが、精度はわずかに低下します。専門的で厳密な事実を扱うタスクでは、量子化を強くかけると、Q8_0やFP16に比べて事実にない内容を生成する割合が高まる可能性があります。
- サンプリングのランダム性
- モデルは単語ごとに、確率の高い候補の中からランダムに選びます。この選択が「創造的」であるほど(温度が高いほど)、確率の低い続き、つまり誤った続きへと逸れる可能性が高くなります。
言い換えれば、ハルシネーションは偶発的な不具合ではありません。真実にアクセスできないまま、もっともらしい文章を生成するシステムの通常の動作です。完全になくすのではなく、減らし、制御するものです。
#作り話を見抜く
修正する前に、まず問題を見抜けるようになる必要があります。見かけたらすぐに警戒すべき兆候があります。
- 不自然なほど細かい数値や日付
- 単位の誤差、正確な日付、正確なパーセンテージ。専門分野の話題において、情報が正確でかつソースがないほど、信頼性は低いです。
- 引用とリンク
- 記事のタイトル、著者名、URL、ページ番号、法令の参照。LLMは、まるで本物のように見える出典を捏造します。モデルが生成した参照は、どれも検証せずに実在すると見なしてはいけません。
- 「存在するはず」のコード
- もっともらしいのに実在しない関数名やコマンドラインオプション名。モデルは、類似のAPIからの類推で補完します。
- 変動する回答
- 新しい会話で、まったく同じ質問をもう一度してください。事実に関する回答が毎回変わる場合、モデルは知識に基づいて答えているのではなく、推測しています。
#事実の捏造を抑える設定
生成パラメータは創造性と信頼性のバランスを決定します。事実、コード、情報抽出に関わる内容については、決定論的かつ慎重な出力が求められます。
- temperature
- 最も重要な調整パラメータです。0では、モデルは常に最も確率の高い単語を選び、安定した保守的な回答になります。創作では0.7〜1.0に上げ、事実に基づくタスクでは0.1〜0.3に下げてください。
- top_p
- 累積確率が指定した値に達する候補に、サンプリングの対象を限定します。低い値(0.1〜0.5)では、出力が逸脱する原因になりがちな、確率の低い単語群からなるロングテールを切り捨てます。
- top_k
- 各ステップで検討する候補数を制限します。top_kを低く設定すると(10~20)、モデルが的外れな生成をする余地を狭められます。
- seed
- シードを固定することで、生成が再現可能になります:設定が同じであれば、同じ出力が得られます。応答が安定しているか、ランダムであるかをテストする際に不可欠です。
- num_ctx
- コンテキストの長さです。短すぎると、モデルは冒頭を「忘れ」、情報の断片を誤って組み合わせることがあります。参照ドキュメントがコンテキストウィンドウ内に収まることを確認してください。
Ollamaでは、これらの設定をAPI呼び出しごとに指定することも、Modelfileに固定することもできます。以下は、ローカルデーモンに対して、事実に即した慎重な回答を求める呼び出しの例です。
これらの設定をモデルに恒久的に適用するには、Modelfileに記述し、事実に基づくタスク専用のバリアントを作成します:
#慎重な回答を促すプロンプト
依頼の伝え方によって、モデルが情報を捏造する割合は大きく変わります。ポイントは、わからないと答えることを明示的に認め、情報の捏造を禁止することです。
- わからないと答えることを認めること
- 「確信が持てない場合は、『わかりません』と答えてください。」こうした許可がなければ、モデルはわからない部分を作り話で埋めてしまいます。
- 回答に根拠を求める
- 「以下のテキストだけをもとに回答してください。外部の知識は一切使わないでください。」この指示で、モデルに参照する情報を与えられたコンテキストだけに限定させます。
- 文中に出典を示すよう求める
- 「それぞれの主張について、その根拠となる文書中の文を一字一句そのまま引用してください。」モデルが根拠を見つけられない場合、根拠がないことが目に見えるようになります。
- 事実と仮定を区別する
- 「既知の事実と、自分の仮定を区別してください。」この指示はモデルが自らの不確実性をラベル付けするように促します。
- 複雑なタスクを分解する
- 複数の手順を明示した質問は、大きな自由回答形式の質問よりも、モデルが即興で答える余地を減らします。
#自分の文書を回答の根拠にする
AIのハルシネーション対策として最も効果的な手法は、依然としてRAG(Retrieval-Augmented Generation、検索拡張生成)です。モデルに曖昧な内部記憶から情報を引き出させる代わりに、ご自身の文書から関連する箇所を提供し、それらだけに基づいて回答するよう求めます。モデルの役割は「情報源」から「読み手」へと変わります。
- 01ドキュメントのインデックス化ファイル(PDF、メモ、社内文書)は小さなまとまりに分割され、埋め込みモデルによってベクトルに変換され、ベクトルデータベースに保存されます。
- 02関連する文章の箇所を検索する各質問に対して、システムは問い合わせと意味的に最も近い部分を検索し、それらを取得します。
- 03コンテキストに注入する検索で見つかった文章の抜粋は、「これらの抜粋だけに基づいて回答すること」という厳格な指示とともに、プロンプトに貼り付けられます。
- 04引用を含めて生成モデルは提供された抜粋に基づいて回答を作成します。どの抜粋を根拠にしたかも示すのが理想的です。抜粋に答えが含まれていない場合は、そのことを伝えなければなりません。
Ollamaのデーモン(http://localhost:11434)に接続したOpen WebUIには、RAG機能が組み込まれています。ドキュメントをアップロードし、会話中に`#`を使って参照できます。独自の要件がある場合は、ベクトルデータベースと自作のパイプラインを使うことで、より細かく制御できます。
#常に確認する
どのような手法を使っても、LLM の信頼性を 100%にすることはできません。したがって、検証は任意ではなく、ワークフローの一つの工程です。検証の程度は、判断や用途の重大さに見合うものにする必要があります。
- 実際の情報源と照合する
- 利用する予定の事実情報(数値、日付、引用)は、すべて一次資料で確認してください。モデルは出発点であり、決して根拠として扱ってはいけません。
- コードを信用する前にテストする
- モデルが生成した内容を実行してください。存在しない関数は即座にエラーを発生させます。重要なコードをコピーする場合は、必ず実行してから行ってください。
- 2つの生成結果を比較する
- 別のシードを使うか、新しいセッションで、同じ質問をもう一度してください。変わらない内容はより信頼でき、変わる内容は疑わしいと考えられます。
- 別のモデルを使用
- あるモデルの回答を別のモデル(またはより大規模なバリエーション)にチェックさせると、明らかな矛盾が浮かび上がります。
- 人間の関与を維持する
- 健康、法律、お金、安全などに関わる、結果に重大な影響を及ぼす判断は、最終的に人間が確認する必要があります。例外はありません。
#決して信頼してはいけないケース
特に危険なハルシネーションが集中する分野があります。そうした分野では、モデルの出力はすべて未検証の下書きとして扱い、正しいと証明されるまでは誤りだとみなしてください。
- 健康と医薬品
- 用法・用量、薬の相互作用、診断。事実にない情報を生成すると危険な場合があります。モデルは医療専門職ではありません。
- 法務および税務
- 法律の条文、判例、申告義務。LLMは、本物と見間違えるほどもっともらしい法的な参照情報を捏造します。
- 正確な数字と統計
- 人口、比率、金額、正確な日付。数値的な詳細はモデルの構造的弱点です。
- 最近のイベント
- 学習データの対象期間が終わった後の情報すべて。モデルは、そのことを明示せずに推測で不足を補います。
- 引用と参考文献
- タイトル、著者、URL、ページ番号。再利用する前に、例外なく毎回確認すること。
- あまり知られていない人物や事実
- あまり知られていない人物の経歴や、広く知られていない細かな事実については、モデルが断片的な情報を組み合わせ、残りを作り上げます。
#さらに詳しく
ハルシネーションを減らすには、何よりも適切な設定と適切なグラウンディングを組み合わせることが大切です。以下のガイドがこのアプローチを補完します。
- 温度、top-p、top-k:パラメータ
- ここで取り上げたサンプリングの調整項目を詳しく理解し、創造性と信頼性のバランスを細かく調整するために。
- 量子化の選択(Q4、Q5、Q8、FP16)
- 圧縮が事実の正確性に与える影響を理解し、信頼性を優先する際に選択を判断するため。
- システムプロンプトの習得
- 慎重な回答を促すプロンプトについてさらに学び、事実を捏造しない動作をデフォルトとして定着させるために。
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。