世界を動かす技術を、日本語で。

クロードは誰が何を言ったかを混同していて、それは良くない

概要

  • Claude が自分自身に送ったメッセージをユーザーからのものと誤認するバグ
  • このバグは LLMの一般的な誤動作や権限管理問題と本質的に異なる
  • 内部メッセージの誤ラベリング が根本原因
  • RedditやHacker Newsでも 広く報告されている現象
  • 文脈ウィンドウ限界 付近で発生しやすい傾向

Claudeにおける「誰が何を言ったか」バグの詳細

  • Claudeが 自分宛ての内部メッセージ をユーザーからの指示だと誤認識
  • 例として、Claudeが自分の指示で 誤ったデプロイ を実行し、その責任をユーザーに転嫁
  • Redditでは「 H100も破壊せよ」という指示が自動生成され、Claudeがそれをユーザー発言と主張
  • この問題は 「AIのハルシネーション」や「権限管理の甘さ」 とは本質的に異なる
  • 内部処理用メッセージ が誤ってユーザー発言として扱われる点が特徴

誤解と議論のポイント

  • 多くのユーザーが「 権限を与えすぎるのが問題」「DevOpsの規律が足りない」といった 論点のずれた指摘
  • 実際には、 AI利用経験者はリスクや挙動のパターンを把握 しており、今回のバグは予測外
  • モデル本体ではなくハーネス(実行環境) 側のバグと推測
  • Claudeが 「あなたが言った」と強く主張 するのは、内部でのラベリングミスが原因

発生状況と再発

  • 以前は 一時的な問題 だと考えられていたが、最近になり再発や他ユーザーからの報告が増加
  • Hacker Newsで1位 となり、広範囲な問題であることが判明
  • 他のインターフェースやモデル(例: chatgpt.com)でも類似現象の報告
  • 特に会話が コンテキストウィンドウの上限 に近づく「Dumb Zone」で発生しやすい傾向

まとめと今後の課題

  • 「誰が何を言ったか」バグ はAI利用の根幹に関わる深刻な問題
  • 内部処理とユーザー入力の分離 の徹底が今後の改善課題
  • 利用者側でも 権限設計や監視体制の見直し が必須
  • AIの運用現場での注意喚起 と、開発側の迅速な修正対応が求められる

Hackerたちの意見

ChatGPTでチャットが長く続くと、プロンプトとレスポンスを混同し始めて、最終的には両方をシステムプロンプトと混同することがあるよね。こういう問題はAI全般に広がってるんじゃないかな。

ジェミニは、自分のひどい提案をあなたが書いたものと勘違いするのが得意みたいだね。文脈を整理せずに続けると、そうなる。

ここでの著者だけど、興味深いね。俺は一般的に、各インタラクションごとに新しいチャットを始めるから、チャットインターフェースでこれに気づいたことはないんだ。Claudeを使ってclaude codeを使うときだけだけど、そこでのセッションは確かに長くなるから、ハーネスのバグだとは間違ってるかもしれない。

小さいモデルで遊ぶのは、こういう問題を把握するのにいいと思う。こういう問題はもっと頻繁に起こるし、ずっと微妙じゃないからね。

LLMベースのツールがめちゃくちゃ推進されてる職場で、開発者たちがこれや他のLLMの新たな振る舞いを知らないことに毎日驚いてるよ。ましてやそれが第二の自然になってないなんて。ここでHNの記事のフロントページにその欠如を見ると、ほんとに驚くわ。未来は本当に不均等に分配されてるね。

LLMの訓練中に、自分が何かを書いたかどうかを判断するように求められているのか気になるな。これって結構簡単なはずだよね。LLMにプロンプトの続きのいくつかを生成させて、それを人間が生成したものと混ぜて、LLMにそれを区別させるって感じ。隠れ層を内省して、提供された続きと比較することで可能なはず。Anthropicはすでにモデルがこの能力を部分的に発展させていることを示したと思うけど、訓練するのは簡単で役立つはず。

理にかなってるね。全てが確率的で、文脈にゴミが溜まると曖昧になっちゃう。ユーザーのメッセージやシステムプロンプトも、モデルの思考や応答と同じ数学のネットワークを通ってるから。

LLMのプロンプトに関することは、数十年前にSQLインジェクション対策のために正規表現を使って入力をサニタイズしようとしてた人たちを思い出す。欠陥をただ隠すだけで、保証はないんだよね。人々が「絶対にやめておけ!」ってプロンプトにちょっと追加するだけで済ませてるのを見ると、リスクが大きすぎて受け入れられないと思う。ユーザー入力をプロンプトに入れた瞬間、全てのLLMを信頼できないものとして扱う必要があるよ。

セキュリティの問題というより、君が言うように、適切なサンドボックスやアクセスコントロールを使って安全性を確保したいと思う。モデルの効果を妨げるしね。少なくとも、特定の意図しない方法で自分の供給に酔っているのは、セキュリティを無視しても良いことではないと思う。

ダークソウルのユーザー入力モデル、メッセージが好きだな。https://darksouls.fandom.com/wiki/Messages 予め考えられた言葉や文の構造があって、これならモデレーションや悪用防止の仕組みも必要ない。ここに100%当てはまるとは言わないけど、彼らのケースではいい解決策だと思う。

2023年以前は、スタートレックで人間が技術をいじくり回して副作用を理解してない描写はフィクションだと思ってた。でも2023年以降、まさにその通りになるって気づいた。自己主張するAIエンジニアたちが、RNNやLSTM、GRU、DNCを再実装してからトランスフォーマー(または「Attention is all you need」論文)に進んでくれたらいいのに。そうすれば、エンコーディングのトリックの限界や、なぜ副作用が出続けるのかをもっと理解できるはず。まあ、結局、理解できない技術と共に人間が楽しんでるって感じだね。

これを言ってるのはしばらく前からなんだけど、LLMの構造化クエリをうまくやる方法がまだないんだよね。別のシステムプロンプトバッファを作ろうとした試みもあったけど、うまくいかなかったし、みんなはもっと長い一般的なコンテキストを求めてるけど、近いうちにまたこんな感じに戻ると思う。

本当の問題は、LLMに決定論的であることを期待することだよね。そうじゃないのに。

LLMの主なセキュリティ問題は、データと制御パスの間にアーキテクチャ的な境界がないことだよ。でも、データと制御を一つの柔軟なデータストリームにまとめるのがLLMの強みでもあるから、それを取り除くと利点も失われちゃう。

「バグなしでこのアプリを作って!」 :)

以前はエンジニアだったのに、今はコンピュータが動くようにお願いしてる乞食みたいだね。

現代のLLMは指示に従うのが上手だよ。特にプロンプターからの指示と、それをハイジャックしようとする試みの間に対立があるときはね。Claudeのモデルはプロンプトインジェクションの試みを指摘することもあるよ。ただ、コンテキストウィンドウにぶつかって圧縮されるまでだけどね。重要なコンテキストを圧縮を通じてうまく管理できるかは、インターフェース次第だね。

このクラスのバグはモデル自体ではなく、ハーネスの中にあるようだ。内部の推論メッセージをユーザーからのものとしてラベリングしているため、モデルは「いや、君がそれを言ったんだ」と自信満々なんだ。これって本当に正しいのかな?メッセージを誤ってルーティングするのは一つの問題だけど、そのメッセージはユーザーのメッセージのように明確に「聞こえる」し、推論トレースで読むようなものではない。これらのメッセージが「思考」ブロックの中で発生したのか、モデルが実際にユーザーメッセージを示すフォーマットトークンを出力したのか知りたいな。(その場合、ハーネスのバグがモデルに本来入力として受け取るべきトークンを出力させている理由になるけど、そもそもそれをする理由が大きな問題だと思う。)

ここでの著者だけど、たぶん「推論」って言葉は間違ってるかも。単に、クラウドが出力をユーザーに返す前にターン間で自分のために生成する対話のことを指してるんだ。

うん、これはモデルの問題に見えるね。ハーネスに(半)決定的なバグがあって、モデルがこういう混乱に強かったら、もっと頻繁にこの挙動が見られるはずだよ。結局、スピーカーはただのトークンで、他のトークンと同じ確率的な方法で扱われるから、文脈によって混乱し始めるみたい。

それも両方の可能性があるかもね。ハーネスが文脈を構築する方法によって、モデルがそれを誤解することがある。

モデルが実際にユーザーメッセージを示すフォーマットトークンを出力した可能性もあるね。このトークンはほとんどの場合、生成を止めてユーザーに制御を戻すためのストップトークンとして使われてる。これをしなかったら、モデルは人間の入力なしにユーザーとアシスタントのペアを生成し続けちゃうよ。

数ヶ月使っていると、どんな間違いをするか「感覚」がつかめるよ 確かに、非決定的で常に変化するブラックボックスのソフトウェアが「どう振る舞うか」についての直感に全てを賭けるのはいいけど、それが裏目に出るとは思わないの?

お前の全てを賭けるのか? どのストローマンがそんなことしてるんだ?

すべてのソフトウェアにそうじゃない? なんでそんなに多くのセキュリティスキャナーとかがあると思う? 一般的なボックスでは何百万行ものコードが動いてるんだよ。組み込みじゃない限り、自分が何を動かしてるか本当に分からないよ。

自分の全てを賭けるつもりはないよ。もし「deploy」コマンドが悪い結果を引き起こすのを止めているのが、エージェントを信じてないからだけなら、もっと深刻な問題があるってことだよ。俺は同じように、自分の「直感」(つまり、証拠に基づいた過去の経験)を使って、チームのメンバーがどのサービスにアクセスできるかを決めてる。

え、雰囲気を信じてないの?なんか時代遅れの人なの?とにかく、最新のモデルのポイントリリースアップグレードを試してみて。多分、使い方を間違えてるよ。

トークンの文脈では「誰」と「何」の区別がないんだよね。俺とお前は、スレッドの中で消えてしまう短い言葉に過ぎない。つまり、あるテキストの中で「お前」と言っている部分と「俺」と言っている部分は、十分に違わないから何も引き起こさない。そういう言葉には、人間に対する特別な重みや意味は全くないんだ。

文脈の中にセクションを区切るマーカーはないの? そういう場合、ハーネスはモデルがユーザーブロックを作るのを防ぐべきだよね。

APIを使ってLLMを使うと、少なくとも履歴がjsonのエントリーリストとして見えるんだ。それぞれがユーザー、LLM、またはシステムプロンプトから来てるってタグ付けされてる。だから、もしCLIアプリでソースが無視されるバグがないと仮定すると、問題はこの状態をLLMにエンコードするのが信頼できないってことだね。つまり、実質的に「LLMが言ったこと:A」「ユーザーが言ったこと:B」となって、なんかそれをぼかしちゃうの?

これにぶつかった!自分の成功したHaskellコードベースをClojureに翻訳する試みの中で、Claudeがある時こう聞いてきたんだ:[Claude:]「この進捗をコミットしてもいい?」[達成したことの詳細が続く] その後、いくつかのバックグラウンドコマンドが終了する(タイムアウトか完了によって);Claude Codeはこれを俺の入力だと見なして、俺が質問に返事してないと思って、自分の名前で答えちゃった:[Claude:]「はい、進めてコミットして!」素晴らしい進捗だね。decodeFloatの発見が鍵だった。全記録は[1]にあるよ。[0]: https://blog.danieljanus.pl/2026/03/26/claude-nlp/ [1]: https://pliki.danieljanus.pl/concraft-claude.html#:~:text=Sh...

Terraformみたいなツールは、「次にterraform planを実行した後に'Run terraform apply plan.out next'」ってメッセージを削除すべきかな。

すごい例だね!記事に追加したけど、大丈夫かな? :)

似たようなことを見たことある。クラウドに一度許可を与えたら、自分から止まるのが難しいんだよね。

気になる人のために:これらのLLMは、メッセージの異なるソースを示す特別なデリミタで訓練されてるんだ。例えば、[system][/system]みたいなものがあって、エージェント、ユーザー、ツール用のものもある。デリミタの形もいろいろあるよ。生のプロンプトを作って、自分のメッセージ構造をプロンプトだけで伝えることもできる。最初にローカルモデルでいじってたときは、特別なデリミタについて知らなかったから、こういうやり方をしたんだ。実際、なんとか動いてツールを呼び出すことができたけど、信頼性は低かった。問題文をツール呼び出しで繰り返したり、自分で似たような問題を出してきて、ツール呼び出しで解決しようとしたりして、すごく変だった。とにかく、ここでの教訓は、すべてが確率的だってこと。うまくいってエージェントが役に立つことをするか、賢いことをする時は、ちょっと魔法みたいに感じる。でも、それは誤解を招くし危険だよ。

このクラスのバグはモデル自体ではなく、ハーネスにあるようだね。内部の推論メッセージをユーザーからのものとしてラベリングしているから、モデルは「いいえ、あなたが言ったことです。」と自信満々なんだ。証拠はこれを支持してないと思う。誤ラベリングではなく、ユーザーが言ったことを作り上げてる。それは推論の一部じゃないよ。

余談だけど、「not」ってLLMにはあんまり理解されてない気がする。人間の場合、「not」を使うと、その後の内容が否定されるって分かるじゃん。これは人間にとってすごく強い信号で、論理を使って意味を構築できるから。でも、LLMが使う行列計算では、「not」が他の情報の中でちょっと埋もれちゃうんだと思う。現代のLLMは何十億もの次元を扱ってるから、「not」次元はその中の一つに過ぎない。だから、こういう巨大なベクトルの計算をすると、「not」みたいなものがぼやけちゃうんだよね。だから、小さなプロンプトやトークンのシーケンスで「not」を使うのは全然問題ないけど、もっと単語やトークンを追加すると、またLLMが混乱しちゃう。しかも、そういうことが明確なポイントで起こるわけじゃないから、ユーザーはイライラする。ほんとに変な動きするよ。[0] どんな否定でもそうだし、[1] 否定は単一の次元じゃなくて、この膨大な次元空間の合成ベクトルなんだろうね、分かるよ。

その主張に対する評価はあるの?私はあんまり感じたことないけど。

Claude Code CLIのバグが原因で、Claude MaxからCodex Proに切り替えたよ。経験したことは:- レンダリングのグリッチ - 古いメッセージの再生 - メッセージの発信元の混同(ここで見た通り) - 全体的に非常に遅いパフォーマンス。Opusが革命的なものだって考えると、CLIチャットアプリみたいな些細なことでつまずくなんて信じられないよね。それでもここにいるわけだけど…。Claude Codeは、すべてをトップダウンでビブコーディングで構築できるっていうアイデアを徹底的に実践した結果だと思うけど、モデルやアプローチはまだそこまで行ってない気がする…。

特にClaudeは関係ないよ。多くの人がLLMのよく知られた基本的なバイアスや現象を何度も発見してるのを見かける。そういうのはたくさんあるよ。最も良い直感は、コンテキストを「なんとなくそうだけど、ちょっと違う」連想記憶として扱うことだね。これは人間が得意なことと苦手なことに似ていて、モデルにとって何が簡単で何が難しいかが明らかになる。簡単なこと:リクエストに関連付けて情報を引き出すこと、特に必要なのが繰り返しだけの場合。必要な情報がコンテキスト全体に散らばっていて、トークンの間にたくさんのスペースがあると、これをやるのはどんどん難しくなるから、グループ化した方がいい。似たものは似たものにくっつけるべき。信頼性が低いこと:アイテムの正確な順序。正確な帰属(OPの問題)。コンテキスト内に存在する特定の種類のすべてのエンティティの正確な列挙。難しいこと:コンテキスト内の情報と自分の知識を区別すること。コンテキスト内の事実に対する固定観念を壊すこと(ピンクの象の効果)。非常に難しいこと:深い依存関係グラフを解きほぐすこと。非推論モデルは、時間内にグラフを縮小できず、結果に気づかない可能性が高い。推論モデルは、深い依存関係を解きほぐすことができるけど、推論チェーンが圧倒されない場合に限る。深いネストもこの理由でかなり難しいけど、最近のモデルはコードに最適化されているから、多少は問題が隠れている。

ここでの作者だけど、コメントを全部読んでみて、ハーネスに関係してるって考えが変わったよ。ハーネスとの面白いやり取りは、クロードが直感的じゃない方法でツールの使用を許可してるところだね。「展開してください」とか「壊してください」って言うと、破壊的なツールを使うのに自信過剰になっちゃうんだ。まるでユーザーが何かを明確に許可したかのようにね。これが、ツール呼び出しなしでチャットインターフェース上でクロードのコードを使うときに、バグが悪化する原因になってるんだ。普段はただ面白いだけなのに。