AI

AIは眠らない

  • AI
  • エージェント
  • メモリ
  • コンテキスト
  • 睡眠
  • 運用

Claude Code のメモリ機能を無効にしています。セキュリティが理由ではありません。書き足すほうだけが自動で起きて、片付けるほうは自分が意識してやらない限り起きないためです。

{
  "env": { "CLAUDE_CODE_DISABLE_AUTO_MEMORY": "1" },
  "autoMemoryEnabled": false
}

私の利用量では割に合わなかった、という話です。一般的な使われかたなら結論は変わります。人間の睡眠が記憶に対して何をしているのかを一次資料で確かめたうえで、エージェント側に何が入っていないのかを並べます。

溜まること自体は構わない

メモリ機能は、こちらが何も指示しなくてもエージェントが自分用の覚書を残していく仕組みです。公式ドキュメントによると、保存先はリポジトリごとのディレクトリで、MEMORY.md が索引、詳しい内容は話題ごとのファイルに分かれます。セッションの最初に読み込まれるのは MEMORY.md の先頭 200行、または 25KB までです。

勝手に溜まること自体は構いません。書いた覚えのないものが増えていくのは、むしろこの機能の狙いどおりです。困るのは、溜まったものを選り分ける工程が付いていないことのほうでした。

Claude Code にも削る側の動きはあります。同じドキュメントに、MEMORY.md が読み込みの上限に近づくと「1項目1行にする、詳しい内容は話題別のファイルへ移す、古くなった項目は統合するか落とす」と促し、上限を超えたら索引を書き直せというエラーを返す、と書かれています。

ただし、この促しが見ているのは行数とファイルサイズです。中身が古いかどうかも、他の項目と食い違っているかどうかも見ていません。溢れそうだから削れ、と言っているだけです。

捨てる側は揃っていない

エージェントに記憶を持たせる仕組みは、ここ2年で選択肢が増えました。捨てる側だけを見比べると、実装ごとにばらついています。

Anthropic の Managed Agents のメモリストアには、1ストアあたり 2,000件 という上限があります。この数に達すると新しい書き込みが失敗します。既にあるものは読み書きできますが、新しく覚えることはできなくなります。公式ドキュメントの推奨欄にはこう書かれています。

Condense or prune before the store fills up. Delete stale or redundant memories with memories.delete.

古くなったものや重複したものを消せ、というのは人間への依頼です。同じ箇所では、記事の後半で扱う Dreams(ドキュメント上は dreaming session)を使う手も案内されています。ただしストアそのものに、何が古くなったのかを自動で判定する仕組みは付いていません。

Letta のアーカイブメモリは逆方向に振り切っています。売り文句が「Unlimited storage」と「Agent-immutable」で、実用上のサイズ上限がありません。開発者が SDK 経由で消す道はありますが、エージェントが自分の判断で捨てる経路は用意されていません。

捨てる仕組みを持っているものもあります。Mem0 は、新しい情報と食い違う記憶に対して DELETE を選びます。Zep は消さずに、いつまで有効だったかの時刻を打って両方を残します。同じ捨てるでも、消してしまうのと、無効の印を付けて残すのとでは、後から見えるものが違います。

分野としての現在地は、エージェントのメモリを扱ったサーベイの結びがそのまま示しています。未解決の課題として、learned forgetting(学習される忘却)が名指しで挙がっています。

睡眠では、残すことと減らすことが同じ工程になっている

眠っているあいだに記憶が固まる、という話は広く知られています。1994年に Wilson と McNaughton が、動物が特定の場所にいたときに一緒に発火した細胞は、その後の睡眠中にも一緒に発火しやすくなることを Science に報告しました。リプレイの発見です。

この20年で見えてきたのは、そのリプレイが同時に何を減らしているかのほうでした。

Tononi と Cirelli は、睡眠は脳が可塑性のために払う代償だと提唱しています。起きているあいだ結合を強め続けると、エネルギーと材料の消費が増え、信号と雑音の比が悪くなり、学習が頭打ちになります。眠っているあいだの自発的な活動が、シナプスの強さ全体を元の水準まで戻して、細胞の状態を整えます。これがシナプス恒常性仮説(SHY)です。

2017年、de Vivo らがマウスの運動野と感覚野で6,920個のシナプスを三次元電子顕微鏡で測り、軸索とスパインが接する面積が睡眠後に約 18% 小さくなっていたことを示しました。この論文で効くのは減りかたより、その次の一文です。

Scaling was selective, sparing synapses that were large and lacked recycling endosomes.

減った量は大きさに比例していて、縮む割合そのものは一律です。ただし、そこから免れているものがあります。大きくて、なおかつリサイクリングエンドソームを持たないシナプスです。

6本の棒が個々のシナプスの大きさを表す。薄い部分が睡眠前、濃い部分が睡眠後。左は免れるものが無い場合で、大きいものも小さいものも例外なく縮む。右は論文が報告した形で、減りかたは同じ割合のまま、大きくエンドソームを持たないシナプスだけが免れてほとんど縮まずに残る。棒の値は説明のために置いたもので、実測値をそのまま打った図ではない

2018年の Norimoto らの結果は、もう一歩踏み込んでいます。海馬のシャープウェーブ・リップルを徐波睡眠のあいだ止めると、シナプスの重みが自然に下がる動きが起きなくなり、新しい記憶を学習する力が落ちました。著者たちはこの働きを、直前の記憶と関係のない神経活動を減らして記憶の痕跡を研ぎ澄ますもの、と位置づけています。

上段が通常の状態で、徐波睡眠のリップルがシナプスの重みを下げ、それと同時に新しい記憶を学習できている。下段はリップルを止めた場合で、重みが下がらなくなり、新しい記憶の学習も落ちる

減らす工程を止めると、溜めるほうも落ちます。

忘れること自体が専用の回路を持っていることも分かっています。Izawa らは、レム睡眠中に活動する視床下部のニューロン群を働かせると海馬に依存する記憶が悪くなり、抑えると逆に良くなったと報告しました。忘れる回路を止めると記憶が良くなる。忘却は劣化ではなく、既定で動いている機能です。

ここで言い過ぎないようにしたい点が2つあります。

1つは、睡眠は捨てるほうが主だ、とは書けないことです。SHY を出した本人たちが、反論への応答のなかで、睡眠中に一部のシナプスが強まる可能性は最初から織り込んでいた、全体として減っていればよい、と書いています。Frank による批判も同じ2012年に出ています。弱まったという証拠なら何でも理論の支持に使えてしまう形をしていて、具体的な仕組みが1つに定まっていない、というものです。de Vivo らと Norimoto らの実測は、その批判より後です。

いまの主流は、Klinzing・Niethard・Born が Nature Neuroscience の総説に書いた1行に集約されます。睡眠中の長期記憶づくりを、シナプス全体が弱まっていく流れの中で起きる過程として捉える、というものです。固めることと減らすことは別々の工程ではなく、同じ流れの表と裏です。

もう1つは、選り分けの基準を安易に言えないことです。「睡眠は将来使う記憶を選んで残す」という主張は2011年に報告されましたが、2021年の追試では再現しませんでした。否定されたのは将来使うかどうかという基準のほうで、睡眠が記憶を助けること自体は両方の実験で再現されています。

一次資料で確実に言えるのは2つだけです。強さそのものが基準になっていること。そして、直前の記憶と関係のない活動が減らされること。

忘れることが計算の上でどう効いているかは、Richards と Frankland が Neuron の総説で脳と計算の両側から書いています。古い情報に引きずられるのを減らして身動きを取りやすくし、過去の出来事に合わせすぎるのを防いで一般化を助ける。記憶の目的は情報を時間を越えて運ぶことではなく、判断を良くすることにあります。だから忘れることは、覚えていることと同じだけ効いています。

コンパクションは捨てているが、選んではいない

エージェントの側にも捨てる工程はあります。コンテキストが溢れる前に、古い部分を要約したり消したりする処理です。工程があるかどうかではなく、何を基準に選んでいるかのほうが問題でした。

Anthropic の compaction のドキュメントには、要約の既定プロンプトがそのまま載っています。

The purpose of this summary is to provide continuity so you can continue to make progress towards solving the task in a future context, where the raw history above may not be accessible and will be replaced with this summary. Write down anything that would be helpful, including the state, next steps, learnings etc.

要約の目的は、作業を先へ進められるようにすることです。役に立ちそうなものは何でも書けと言い、例として挙がっているのは状態と次の手順と学びの3つです。基準はそこまでで、安全に関わるかどうかも、方針として効いているかどうかも、ここには出てきません。

context editing のほうはモデルの判断すら使いません。古いツール結果から順に消していきます。消えた場所には、消したことを示す文言が残ります。守りたいものがあれば exclude_tools にツール名を書いておけと案内されていて、これは人が先に名指ししたものだけが助かる作りです。

この基準で何が落ちるかは測られています。COMPINT という評価スイートを作った Lost in Compaction は、セッションのあいだずっと効かせたい指示、たとえば「確認するまでメールを削除しないで」のようなものを紛れ込ませて、圧縮後にどれだけ残るかを調べました。

Current compactors retain only 17% of injected SCs on average, and most perform worse than running the same task without compaction.

平均で 17%。しかも圧縮した場合のほうが、圧縮せずに同じ作業をさせたときより成績が悪いものが大半でした。著者たちは、この落ちかたが実装・プロンプト・文脈の長さ・言い回し・置いた位置によって大きく変わることから、特定の設定に紐づいたものではなく仕組みそのものに由来すると結論づけています。

左に睡眠、右にコンパクションを並べた対比図。睡眠は起きているあいだに強まった結合を入力とし、痕跡の強さと既にある知識への馴染みかたを基準に選り分けて、馴染んだものを残し、細部で馴染んでいないものを弱める。コンパクションは会話とツール結果の履歴を入力とし、トークンの予算と作業を続けられるかを基準に選り分けて、続きに要るものを残し、それ以外を落とす

捨てる工程はどちらにもあります。違うのは基準のほうです。

眠るという言い方は、もう使われている

「AIは眠らない」と書き出しましたが、AI に睡眠を持ち込む議論はすでにあります。先に、この記事の立ち位置をはっきりさせておきます。

Letta と UC Berkeley の sleep-time compute は、質問が来る前にオフラインで文脈について考えさせる手法です。ユーザーが何を聞きそうかを先回りして計算しておくと、応答時の計算量が減ります。同じ精度を出すのに要る計算を約5分の1にしたと報告されています。

Google の Language Models Need Sleep は、人の学習過程を手本にした「睡眠」の枠組みを提案しています。短期の壊れやすい記憶をリプレイで安定した長期の知識へ蒸留し、夢を見る段階で自分を作り直していく構成です。

査読誌に載ったものもあります。Tadros らは、人工ニューラルネットワークに睡眠に似た段階を挟むと破滅的忘却が和らぐことを Nature Communications で示しました。教師なしの局所的な学習則とノイズ入力によるオフラインの学習で、忘れられていた古い課題が戻っています。

理論の橋も2016年に架かっています。Kumaran・Hassabis・McClelland は、知的なエージェントには、構造をゆっくり身につける学習系と、個々の出来事を素早く覚える学習系の2つが要る、と Trends in Cognitive Sciences に書き、リプレイが目的に応じて経験の重みを変えられることを指摘しました。

並べてみると、どれも固める側にあります。先に考えておく、蒸留する、リプレイで取り戻す。捨てる工程を主題にしたものは、この系譜にありません。sleep-time compute を出した Letta のアーカイブメモリに、エージェントが自分で捨てる経路が無いのは、その意味で筋が通っています。

眠っていないのではなく、眠ると呼ばれているものが全部、溜める側なのです。

文脈ファイルも腐る

メモリ機能を無効にしても CLAUDE.md は残ります。こちらは人が書くので腐り方も違うだろうと思っていました。実測はそうなっていません。

1,925のリポジトリから2,303個のエージェント用の文脈ファイルを集めた調査があります。結論の一文がそのままです。

these files are not static documentation but complex, difficult-to-read artifacts that evolve like configuration code through frequent, small additions

静的なドキュメントではなく、頻繁で小さな書き足しを重ねて設定ファイルのように育っていく、複雑で読みにくいファイル。削除の話は出てきません。中身の内訳も出ていて、テスト手順が75.9%、実装の詳細が70.8%、アーキテクチャが68.1%あるのに対し、セキュリティは14.8%、性能は14.5%でした。

腐る現象のほうは、Treude と Baltes が context rot と名付けています。README や wiki の整合性を見る既存のツールを356リポジトリに当てたところ、23.0% で、もう存在しないコード要素への参照が見つかりました。著者たち自身が、これは context rot そのものを測ったものではなく、手がかりの域を出ないと断っています。

同じグループの2022年の調査に、なぜこうなるのかの説明があります。ドキュメントがこれほど簡単にずれていく理由の1つは、自分のコード変更がいつドキュメントを腐らせたのかに開発者が気づいていないことだ、と。3,000を超える GitHub のプロジェクトを調べて、その大半が履歴のどこかで、少なくとも1件の古い参照を抱えていました。

コードなら型検査とテストが落ちます。ドキュメントは落ちません。落ちるようにするには、FSE 2026 に採録された CASCADE のように、ドキュメントからテストを作って実行するところまで組む必要があります。わざわざ組まないと落ちない、というのが今の状態です。CLAUDE.md にはそれすらありません。

前提を1つ、先に差し引いておきます。ETH Zurich らの評価は、文脈ファイルを与えても作業の成功率は上がらず、推論のコストが平均2割以上増えたと報告しています。役に立つものが腐る、ではなく、役に立つかどうかも怪しいものが、その上さらに腐っていく、と書くほうが正確です。

そして Claude Code の公式ドキュメントは、CLAUDE.md についてもこう書いています。

Review your CLAUDE.md files, nested CLAUDE.md files in subdirectories, and .claude/rules/ periodically to remove outdated or conflicting instructions.

定期的に見直して、古いものと食い違うものを取り除け。メモリストアのときと同じ依頼です。Anthropic は両方で、片付けを始めるところを人に頼んでいます。

書いたものが後から効かなくなる件は、以前に別の角度から書きました。

ブログ規約は、規約について嘘をつくエージェントに読ませる規約が、実際の挙動と食い違ったまま残っていました。参照ファイルを読めと明示的に書いた指示が、その通りには動いていなかった件を起点に、規約そのものを検査した記録です。

この利用量だと、腐るのが早まる

ここからは私の環境の話です。会社の合計ではなく、私一人が Claude Code で使った直近1か月分の概数です。

種別直近1か月
キャッシュ読み出し約440億トークン
キャッシュ書き込み約9.6億トークン
出力約1.3億トークン
キャッシュに乗らない素の入力約250万トークン

※ 記録が残っている環境・測定可能な環境のみ、Codexなど他エージェントは含めない

比較の目安として、Anthropic がコスト管理のドキュメントに利用額の目安を出しています。企業導入全体で、使った日1日あたり1人13ドル前後、月150〜250ドル、90%のユーザーは使った日1日あたり30ドル未満に収まる、というものです。単位が違うので手元のトークン数とは直接並べられませんが、想定されている使われかたの幅は掴めます。

この速度で作り続けていると、書き足された内容が腐るのも同じ速度になります。ライブラリが上がり、設定が変わり、先週まで正しかった手順が通らなくなる。書き足すほうは全部のセッションで起きて、片付けるほうは私が思い出したときにしか起きません。

裏返すと、一般的な利用量であれば話は変わります。書き足される速度も、腐る速度も、片付けを思い出す間隔に対して十分に遅くなります。その領域なら、メモリ機能は素直に効くはずです。私が無効にしているのは機能の出来が悪いからではなく、私の側の量が目安から外れているからです。プロンプトキャッシュの読み出しが十分に安くなれば、その見積もりもまた変わるかもしれません。

疑っても遅くはならない

要約して持っておくことの危うさは、測られています。

Useful Memories Become Faulty When Continuously Updated by LLMs は、LLM に記憶を更新させ続けると何が起きるかを調べました。更新が進むにつれ、記憶の役立ちかたはまず上がり、次に落ち、記憶なしの水準を下回ることもある。正解の解法から作った場合ですら、記憶を持たせなければ解けていた ARC-AGI の問題の 54% を、GPT-5.4 は落としました。

横軸が要約と書き換えを重ねた回数、縦軸が記憶の役立ちかた。はじめは上がるが途中で頭打ちになって下がりはじめ、ある地点から記憶を持たない場合の水準を下回る。論文が述べている推移をなぞった模式図で、実測値をそのまま打った図ではないため軸に目盛りは付けていない

犯人が特定されている点が効きます。原因は元になった経験ではなく、要約して書き換える工程のほうでした。同じ記録でも更新の頻度が違えば質の違う記憶ができ、記録をそのまま持っておくだけの対照群が、試したどの方式とも互角のままでした。著者たちの結論は、生の記録のほうを根拠に据え、要約は毎回自動で走らせず、走らせる前にゲートを置け、というものです。

自分の記憶を疑える人のほうが、結果として速く進みます。間違った仮定を抱えたまま先へ行かないからです。エージェントは逆をやりがちで、この記事を書いている最中にも同じことが起きました。以前に自分が書いた記述を、一次資料として引いてしまったのです。過去の記録にそう書いてあるという事実は、それが正しいことの根拠になりません。指摘を受けて3回直しましたが、3回とも直っていませんでした。直したのは文面で、直すべきだったのは、その文面がどこから来たかを確かめていなかったことのほうでした。

確かめるのにかかるのは数秒です。原典を1本開く、コマンドを1回叩く、それだけです。確かめずに進んで間違っていたときに戻る時間は、時間単位になります。

LLM に判定をさせたときの過信を調べた研究では、モデルが自分で申告する確信度が実際の正答率を大きく上回りました。黙って通した判定と、根拠を確かめた判定は、出力の見た目では区別が付きません。

ブログ沈黙は語らない「誰も何も言わない」を問題なしと読む運用が、エージェントを入れたあとで最初に壊れました。沈黙がそのまま通っていたのは、読み手がコストを払っていたからではなく、払ったと信じられる与信が相手に積まれていたからだった、という整理です。

手元で睡眠の役をやっているもの

メモリ機能を無効にしている代わりに、片付ける工程は別のところに置いてあります。

1つは週に1度の走査です。エージェントに定期的にリポジトリを見せて、古くなった記述と実装のずれを拾わせています。もう1つは、決めたこと自体を撤回する運用です。過去の判断を書き換えるのではなく、撤回したと分かる形で残します。

ブログ見つけさせて、直させないPRのレビューで担保しきれずに漏れるものを拾うため、週次でコードベースを走査するだけのサブエージェントを立てています。修正はさせず検知と報告に限り、報告はレビュー側で裏を取る運用を1か月ほど回した記録です。 ブログその決定、出自不明につき設計判断をADRとして積む運用で、サブエージェントが「ユーザー決定」と書いて自分で起票したADRが混ざりました。本文を書き換えず撤回ADRを足して取り消し、ADRには誰が決めたかを書かせる規約を足した話です。

メモリへの書き足し、CLAUDE.mdへの書き足し、セッション記録の蓄積という3本の経路から、作業のたびに中身が増えていく。減らす経路は、人が始める整理の1本しかない。仕組みの側にある削除は容量を見るものだけで、行数とファイルサイズしか見ていない

どちらも動いてはいますが、共通する弱点があります。人が始めています。週に1度、あるいは気づいたときです。増えるほうは作業のたびに起きて、減らすほうは、こちらが動いたときだけです。この釣り合いの悪さが、そのまま残っています。

グルーミングが仕組みの側に入っていれば、話が変わる

その釣り合いを仕組みの内側に入れようとしている実装が、すでにあります。

Anthropic の Dreams は、メモリストアと過去のセッション記録を読んで、組み直した新しいストアを出力します。公式ドキュメントの説明はこうです。

Agents write to their memory stores as they work, but these writes are local and incremental: over many sessions a memory store accumulates duplicates, contradictions, and stale entries.

重複と食い違いと古くなった項目が溜まる。これに対して Dreams は、重複をまとめ、古いものや食い違うものを最新の値に置き換え、新しい気づきを拾い上げます。過去の記録を読み直してまとめるという形は、睡眠中のリプレイとそのまま重なります。名前が「夢」なのも偶然ではないはずです。

既存のメモリストアと、1件から100件までの過去のセッション記録を入力として dream が読み、組み直した別のメモリストアを出力する。入力側のストアは変更されないため、出てきたものを見てから採るか捨てるかを人が決められる

入力側のストアが変更されないところが効きます。出力は別のストアとして出てくるので、中身を見てから採るか捨てるかを決められます。これは Useful Memories Become Faulty の結論と揃っていて、要約を毎回自動で走らせず、手前にゲートを置く形になっています。

メモリ機能の側にこれが付いているなら、話はかなり変わります。書き足しは今までどおり自動で起きて、溜まったものを定期的に組み直す工程が同じ仕組みの中にあり、組み直した結果を採るかどうかだけが独立している。その形なら、私の利用量でも有効に働きそうです。

ところが Dreams は Managed Agents の API 機能です。POST /v1/dreams を叩くもので、Claude Code のメモリ機能とは別系統になっています。リサーチプレビューのため使うには申請が要り、非同期のジョブを自分で作る必要もあります。手元の Claude Code から呼べるものではありません。

だから今は無効にしたほうがマシ、という程度の結論です。機能の設計として間違っているという話ではなく、グルーミングの工程が同じ仕組みの中に来るまでは、私の使いかたでは持たないほうが安い、というだけです。付いたら戻します。