🫠

ClaudeとPythonを書いていたら、途中でAIがおかしくなった話

に公開

AIと一緒にコーディングすれば、Pythonなんて簡単に書ける。

最初の1時間は、本当にそう思っていた。

「このエラーって何?」と聞けば、すぐに原因を説明してくれる。

「もっとシンプルに書けない?」と頼めば、コードをきれいにしてくれる。

「初心者向けに説明して」と言えば、専門用語を減らして噛み砕いてくれる。

これは便利だ。もう一人でも何でも作れるのではないか。

そう思っていた。

しかし、2〜3時間ほど同じ会話を続けたあたりから、何かが少しずつズレ始めた。

症状1:前に決めたことを忘れる

たとえば、変数名は user_data のようなスネークケースに統一しようと決めたとする。

AIもそのルールに従ってコードを書いていた。

ところが1時間後、突然 userData とキャメルケースで書き始める。

「あれ、さっき決めたルールと違います」と指摘すると、

おっしゃる通りです。失礼しました。

と修正してくれる。

しかし、さらに会話を続けると、また別の命名規則が混ざってくる。

AIは前の会話を覚えているように見える。

ただし、会話中のすべての情報を、最後まで同じ重要度で扱い続けているとは限らない。

対話が長くなり、コードやエラーや修正案が増えるほど、最初に決めたルールが後続の情報に埋もれていく。

この記事では、この状態を便宜上「コンテキスト縮退」と呼ぶことにする。

正式な技術用語というより、長い対話の中で文脈の一貫性が崩れていく現象を表すための呼び方だ。

症状2:だんだん謝り始める

会話の序盤で、

このコード、動かないんですけど

と送ると、

原因は〇〇です。次のように修正してください。

と、比較的シャープな回答が返ってくる。

ところが対話が長引くと、回答が次のように変化していくことがある。

大変申し訳ありません。先ほどのコードに誤りがありました。こちらが正しいコードです。

修正版を動かす。

まだ動かない。

すると今度は、

誠に失礼しました。問題を正しく理解できていませんでした。

と、さらに丁寧に謝られる。

そして、また別のコードが出てくる。

それも動かない。

もちろん、AIが謝ったからといって、必ず文脈を見失っているわけではない。

ただし、原因の分析よりも謝罪と全面的な書き直しが増えてきたら、会話全体の整合性が崩れ始めている可能性がある。

私の中では「AIが謝り始めたら、いったん縮退を疑う」が目安になった。

謝罪の丁寧さと、コードの正しさは比例しない。

むしろ、謝罪文だけがどんどん洗練されていくことすらある。

症状3:矛盾したコードが出てくる

さらに進むと、前に出したコードと現在のコードが噛み合わなくなる。

  • 関数の引数が変わっている
  • 戻り値の型が変わっている
  • 変数名が統一されていない
  • 先ほど「不要」と言っていたライブラリを使い始める
  • 一部の関数だけ古い仕様のまま残っている

コードを部分的に修正し続けた結果、AIの中でも「現在の正しい状態」が曖昧になっているように見える。

こうなると、初心者にはかなり厳しい。

AIが出したコード同士が矛盾していても、どちらが正しいのか判断できないからだ。

そこでAIに、

結局、どちらが正しいんですか?

と聞く。

すると、また謝られる。

そして第三のコードが登場する。

登場人物が増えただけで、問題は解決していない。

なぜ起きるのか

大規模言語モデルは、会話やコードなどの入力を「コンテキスト」として処理する。

一度に処理できる量には上限があり、これをコンテキストウィンドウと呼ぶ。

ただし、単純に上限を超えた瞬間だけ問題が発生するわけではない。

会話の中に、次のような情報が大量に混在すると、上限以内でも重要な条件を正確に追い続けることが難しくなる。

  • 最初に決めた仕様
  • 途中で追加した要件
  • すでに失敗した修正案
  • 古いバージョンのコード
  • 新しいバージョンのコード
  • 複数のエラーメッセージ
  • ユーザーとAIの勘違い

AIにとっては、過去に提示された失敗コードも、現在動いているコードも、すべて会話中のテキストだ。

人間のように「これはもう捨てた案」「こちらが最新版」と常に明確に整理できるとは限らない。

料理でたとえるなら、出汁が薄まるというより、鍋の中に古い調味料と新しい調味料を継ぎ足し続けている状態に近い。

最初は味が整っていても、途中から何を入れたのか分からなくなる。

対処法1:セッションを分ける

1つの会話だけで、環境構築から実装、デバッグ、リファクタリングまで全部やろうとしない。

機能や作業単位で会話を分ける。

たとえば、次のように分割する。

  • 開発環境を作る会話
  • CSVを読み込む処理を書く会話
  • 集計処理を書く会話
  • エラーを調査する会話
  • 完成後にコードを整理する会話

新しい会話では、それまでのやり取りを丸ごと説明する必要はない。

現在動いているコードと、解決したい問題だけを渡せばよい。

過去の失敗を引き継がないことが重要だ。

対処法2:最初に仕様書を渡す

会話の最初に、守ってほしい条件を短くまとめて渡す。

以下の仕様でPythonコードを書いてください。

- Python 3.12を使用する
- 変数名はスネークケースに統一する
- CSVファイルを読み込んで集計する
- 外部ライブラリはpandasのみ使用する
- 初心者向けにコメントを付ける
- コード全体を変更する場合は、変更理由を説明する

長大な仕様書を作る必要はない。

「絶対に変えたくない条件」だけを書けばよい。

コードが複雑になる場合は、仕様を README.md やメモに残しておき、必要に応じて再度AIへ渡す。

会話の記憶に頼るより、明文化した情報を毎回読ませたほうが安定する。

対処法3:最新版のコードだけを渡す

デバッグを続けていると、会話の中に複数バージョンのコードが残る。

これが混乱の原因になる。

新しい会話を始めるときは、失敗したコードをすべて貼るのではなく、現在の最新版だけを渡す。

そのうえで、次の3点を明確にする。

現在のコード:
(コードを貼る)

期待する動作:
CSVのamount列をユーザーごとに合計したい

実際の動作:
KeyError: 'amount' が発生する

「何を期待しているか」と「実際に何が起きているか」を分けるだけでも、回答の精度はかなり変わる。

対処法4:謝り始めたらリセットを検討する

AIが一度謝っただけで、すぐに会話を捨てる必要はない。

ただし、次の状態が続いたらリセットしたほうが早い。

  • 修正するたびに別の場所が壊れる
  • 同じ間違いを何度も繰り返す
  • 過去の決定を毎回忘れる
  • 原因説明が返答ごとに変わる
  • 謝罪は増えるのに、問題が前進しない

その会話を無理に延命するより、新しい会話に次の情報だけを渡す。

  • 現在動いているコード
  • 発生しているエラー
  • 期待する動作
  • 守るべき仕様

壊れた会話を修復するより、必要な文脈だけで再起動したほうが速いことは多い。

AIにも再起動は効く。

対処法5:自分でも最低限コードを読めるようにする

AIにコードを書いてもらうとしても、完全に中身を理解しなくてよいわけではない。

少なくとも、次のことは読めるようにしておきたい。

  • どこで変数を定義しているか
  • どこで関数を呼んでいるか
  • 何を引数として渡しているか
  • 何を戻り値として返しているか
  • どこで繰り返し処理をしているか
  • どこでファイルを読み書きしているか

自分でゼロから書けなくてもよい。

ただし、AIが昨日と違うことを言っているときに、「何か変だ」と気づける程度には読めたほうがよい。

AIを使うために、すべてを暗記する必要はない。

しかし、AIの出力を確認する力は必要になる。

それでもAIとのコーディングは有効

ここまで縮退の話ばかり書いたが、AIとコーディングする恩恵は本物だ。

エラーメッセージを貼り付けて、

これは何が原因ですか?

と聞けば、調査の入口をすぐに作れる。

コードを渡して、

もっとシンプルにしてください
コメントを追加してください
初心者向けに説明してください
テストコードも作ってください

と頼むこともできる。

環境構築で詰まったときにも、何度でも質問できる。

人間相手なら少し聞きにくい初歩的な内容でも、遠慮する必要がない。

問題は、AIが使えないことではない。

AIが長い会話のすべてを、完全に一貫して管理してくれると思い込むことだ。

AIは、無限の記憶を持った熟練エンジニアではない。

渡された文脈をもとに、その都度もっともらしい回答を生成するシステムだ。

だからこそ、使う側が文脈を整理する必要がある。

まとめ

AIとのPythonコーディングでは、対話が長くなるほど文脈の一貫性が崩れることがある。

この記事では、その状態を「コンテキスト縮退」と呼んだ。

兆候は次の3つだ。

  • 前に決めたルールを忘れる
  • 原因分析より謝罪が増える
  • 過去のコードと矛盾するコードを出す

対処法はシンプルだ。

  • 作業単位でセッションを分ける
  • 最初に仕様を明文化する
  • 最新版のコードだけを渡す
  • 会話が混乱したら新しいセッションへ移る
  • AIの出力を最低限読めるようにする

AIとのコーディングは、長い会話を根性で続けるゲームではない。

必要な情報を整理し、短い単位で問いを渡すほうがうまくいく。

「なんだかAIの回答がおかしくなってきた」と感じたら、自分の理解力だけを疑わなくてよい。

会話の中に、古い仕様や失敗したコードが積み重なりすぎている可能性がある。

そんなときは、いったんリセットする。

動いているコードと現在の問題だけを持って、また始めればいい。

AIは最強の学習パートナーになり得る。

ただし、長話をさせすぎないことが、うまく付き合うコツなのだ。

Discussion