Orkas Orkas
ホーム ブログ アーキテクチャ
アーキテクチャ

コンテキスト圧縮は token 数で切っている。「何を忘れてよいか」とは無関係に

ほとんどの Agent は、コンテキストがウィンドウの一定割合に達したら圧縮を発火させ、古いものから捨てる。この閾値が知っているのは「もう入りきらない」ことだけで、「何を失っても安全か」については何も知らない。マイルストーン・マルコフ性がなぜ事実ではなく仮定なのか、そして圧縮がなぜ訓練よりはるかに厳しくそれを要求するのかを書く。

Agent のコンテキストがウィンドウの 8 割に達する。圧縮が発火し、古いターンから捨てられる。十分後、Agent はさっき読んだファイルをもう一度読み、さっき答えの出た問いをもう一度尋ねる。

閾値が知っていたのは「もう入りきらない」ことだけだった。何を失っても安全かについては、何も知らなかった。

これは長期タスク Agent 設計ノートの第三回である。きっかけは BEACON(浙江大学、arXiv:2605.06078)の精読だった。第一回は停滞検知、第二回はマイルストーン設計を扱った。

要点 圧縮で削るべきは、その実行がもう必要としないものです Orkas はタスクがまだ依存しているものを基準に圧縮します。トークン予算が尽きた位置ではありません。デスクトップアプリでその過程を確認できます。
Orkas をダウンロード — 無料

まず自分たちの実装から

Orkas はマルチ Agent のデスクトップクライアントで、長いタスクが当たり前の環境だ。だから圧縮は日常的に起きる。実装は token 閾値による発火で、コンテキストがウィンドウの 8 割程度に達したら圧縮する。これを書くまで、そこに問題があるとは誰も思っていなかった。

世の中でよく見る境界は三種類ある。ウィンドウ占有率、対話ターン数、あるいはモデルに要約を書かせて古い内容を置き換える方式。うちは一つ目だ。

最初の二つは内容をまったく見ない。三つ目は見るが、「何が重要か」の判断を丸ごとモデルに委ねている。

三つともいつ捨てなければならないかに答えている。しかし本当に知りたいのは何を捨ててよいかだ。閾値で切れば、捨てられるのは最も古い内容であって、最も重要でない内容ではない。

マイルストーンという境界と、その下にある仮定

前回のマイルストーンなら、この三つのどれよりも良い境界を与えられる。ただしここには落とし穴があり、前回はそこを少し滑らかに書きすぎた。

BEACON にはマイルストーン・マルコフ性という仮定がある。平たく言えば、あるマイルストーンに到達したあと、その先の展開は残りのサブゴールだけで決まり、そこまでどう辿り着いたかには依存しない。鍵を手に入れたあと重要なのはどの扉を開けるかであって、どうやって見つけたかではない。

これは圧縮の許可証のように聞こえる。マイルストーンを越えたら、その手前は畳んでよい、と。

だがこれは仮定であって事実ではない。論文が書いているのは ≈ であって = ではなく、著者はそれが崩れる場面についても議論している。

訓練には十分、圧縮には不十分

同じ仮定、二つの用途、厳しさは一桁違う。

訓練では統計的に成り立てばよい。数千の rollout のうち数十が違反しても、バイアスは平均されて消える。訓練にはさらに軌跡レベルの信号が下支えとして走っており、その層を外すと ALFWorld は 91.4 から 23.4 に落ちる。何もしないより大幅に悪い。

圧縮では各点で、目の前のこの一回について成り立たなければならない。一度でも間違ったものを捨てれば、そのタスクは終わりだ。平均する相手がいない。

だから論文がこの仮定に寄りかかっているからといって、それを圧縮に持ち込んでよいことにはならない。二つの用途がこの仮定に要求しているものは同じではない。

崩れる四つのケース

圧縮方針を考えるとき、私たちはこの四つをチェックリストとして使っている。

1. 途中で積み上がった暗黙の知見。どこかの手順で「この API はタイムスタンプを UTC で返す」と分かったとする。これはどのマイルストーンにも属さないが、その後のすべての手順が必要とする。

2. すでに消費したリソース。token 予算、呼び出し枠、残り時間。マイルストーンは予算を 6 割使ったとは記録しないが、その数字がリトライの可否を決める。

3. 経路依存の副作用。マイルストーンにはリファクタ完了とある。だがデバッグを始めた瞬間、実際にどの 5 ファイルを触ったのかが必要になる。

4. マイルストーン自体が underspecified。四つの中で最も厄介だ。論文のマイルストーンは環境が与える完全な状態で、鍵を持っているかいないか、曖昧さはない。一方、計画の一手順は自然言語の一文にすぎない。「データクレンジング完了」という一文では、その区間で何が起きたのかをまるで覆えない。

では何を持ち越すか

要約だけを残してはいけない。要約はモデルが書くもので、何が重要かを感覚で決めている。

人が決めた固定のフィールド群を残すこと。最低でも四種類。

  • ワークスペースの現状:どのファイルを触り、どういう状態にしたか。
  • 残りの枠:token、呼び出し回数、時間。
  • 確定した事実:あの UTC の件と、以後の判断を左右する同種の結論すべて。
  • 未解決の疑問:一度詰まって迂回したが、また当たるかもしれないもの。

上の四つの失敗ケースと突き合わせると、きれいに一対一で対応する。この対応関係こそ、圧縮方針が十分かどうかを判断する最も簡単な方法だ。

このうち半分はほぼタダで手に入る。前回書いたとおり、ホスト側はツール呼び出しのたびに決定的な事実を記録している。ファイルが本当に書き換わったか、コマンドが実際に走ったか。あのデータはマイルストーン検証のために集めたものだが、それはそのままワークスペースのスナップショットなので、モデルに要約し直させることなく圧縮時にそのまま持ち越せる。

難しいのは残り二つだ。確定した事実と未解決の疑問は、今のところモデルが書き残したときにしか存在しない。だからこそ圧縮で真っ先に失われる。

これは議論ではなく計測できる

圧縮のあと、Agent が圧縮で消えたファイルを読み直したり、すでに答えの出た問いを再び尋ねたりしたら、その時点でこの仮定はそのタスクで崩れており、証拠はそこにある。

計測は単純だ。圧縮点より後に読んだファイルパスと、圧縮点より前の記録との積集合を取ればよい。

この数字があれば、「どの種類のタスクなら積極的に圧縮してよく、どれがだめか」は設計段階の説得合戦ではなく、データを引くだけの話になる。シリーズ第一回と同じ筋道だ。まず測り、それから変える。

割り引くべきところ

この仕組みはまだリリースしていない。設計と計測の段階にある。

どのフィールドをどの粒度で残すかは、実際に何が読み直されているかのデータから決めるべきだ。今の時点で決め打ちすると、まず間違える。

そしてこれは数あるやり方の一つでしかない。境界をどこに引き、フィールドをどう定義するかは、プロダクトの形が変われば全く違う答えになりうる。持ち出せるのは四つのチェックリストであって、具体的な答えではない。

シリーズ最終回は自己反省を扱う。Agent がまとめる教訓がなぜ「もっと慎重に」のような空疎な言葉に落ち着いてしまうのか、そしてその入力に何が含まれ何が含まれていないかについての、かなり意外な発見について書く。