← 一覧へ
連載 Agentic OS:技術スタックを下から読む の一部です ―― 目次を見る →

Agentic OS 技術スタックを下から読む 第5回:過去のどこまでを見るか ―― 固定窓と、学習で選ぶ注意

この記事の読み方
前回は、長文脈の値段を決める KV キャッシュを、モデル構造の側から小さくする方法を見た。

前回は、長文脈の値段を決める KV キャッシュを、モデル構造の側から小さくする方法を見た。

一つは、保存するキーとバリューの種類を減らすことだった。もう一つは、保存する中身そのものを圧縮することだった。どちらも、見方をそろえれば「保存するもの」を小さくする話である。

今回は、同じ壁への別の入口を見る。

保存する量をそのままにしても、各トークンが過去のどこまでを実際に見にいくかを絞れば、読むべきキーとバリューは減る。つまり、問題は保存だけではない。参照にもある。

過去を全部持っていることと、毎回それを全部読むことは、別の問題である。

全部を見ることの代償

標準的な注意では、いま処理しているトークンは、それ以前のすべてのトークンを見にいく。

文章の先頭からここまでに、何が書かれていたか。どの単語が今の判断に関係するか。その候補を、過去全体から探す。これが注意の基本である。

この仕組みは強い。遠く離れた情報を直接つなげられるからである。文章の冒頭で置いた条件を、何千トークンも後ろで使える。会話の最初の制約を、後半の応答に反映できる。長いコードの前半にある定義を、後半の呼び出しで参照できる。

しかし、文脈が長くなるほど、この強さはそのまま重さになる。

過去が千トークンなら、いまのトークンは千個の相手を見る。過去が十万トークンなら、十万個の相手を見る。新しいトークンを一つ出すたびに、過去全体をなめることになる。

キーとバリューを保存しておくのは、同じ計算を毎回やり直さないためだった。だが、保存してあっても、それを読む量が大きければ、やはり重い。長文脈では、この「読む量」も無視できない。

だから、どこかで「全部見る」を緩めたくなる。

固定された窓で見る

いちばん素直な方法は、直近の決まった範囲だけを見ることである。

たとえば、いまの位置から手前へ数百トークン、あるいは数千トークンだけを見る。それより前は見ない。位置が一つ進めば、見る範囲も一つ進む。窓が文章の上を滑っていくように動く。

これを、滑る窓の注意と呼べる。

考え方は単純である。今の単語を理解するには、たいてい近くの文や段落が強く効く。直前の発話、直前のコードブロック、直前の箇条書き。多くの場合、近い情報ほど使われやすい。

ならば、毎回すべての過去を見るのではなく、近くの一定範囲だけを見ればよい。

この方法の利点は、計算の増え方が読みやすいことである。

文脈全体がどれだけ長くなっても、各トークンが見る相手の数は窓の大きさで止まる。窓を四千トークンに決めれば、十万トークンの文脈の中でも、一つのトークンが直接見るのは基本的に四千トークンである。

保存された KV が全体にあっても、参照する KV は窓の中だけになる。読む量が頭打ちになる。長い文脈を扱うとき、この差は大きい。

もちろん、これは魔法ではない。見ないと決めた場所は、本当に見えない。

だが、遠くも必要になる

すべての層を固定窓にしてしまうと、遠く離れた情報は直接届かなくなる。

文章の冒頭で「この議論では、コストとは推論時のメモリ帯域を指す」と決めたとする。ずっと後ろで「コストを下げる」と書かれたとき、本当はその前提を思い出したい。

あるいは、長い作業履歴の最初でユーザーが出した条件を、最後の計画に反映したいこともある。近くの文だけを見ていれば自然につながる内容もあるが、遠くの一点が重要になる場面もある。

固定窓だけでは、こうした情報を取りこぼす。

そこで実際には、すべてを窓にするのではなく、多くの層を窓にしつつ、少数の層だけは過去全体を見せる、という組み合わせが使われる。

近くの細部は、窓を持つ層が拾う。文法、直前の指示、現在の段落の流れ。こうした局所的な情報は、近くを見るだけでもかなり扱える。

一方で、遠くのつながりは、ときどき入る全体を見る層が橋渡しする。すべての層が遠くを見なくてもよい。要所で遠くが混ざれば、情報は後段の層へ伝わる。

ここで調整するつまみは二つある。

一つは、窓をどれだけ広くするか。広くすれば取りこぼしは減るが、読む量は増える。狭くすれば軽くなるが、局所の外にある情報を失いやすい。

もう一つは、どれだけの層を窓にするか。多くの層を窓にすれば軽くなる。全体を見る層を残せば、遠くの情報を拾いやすくなる。

固定窓は、単純なぶん、この調整が見えやすい。どこまで近くを信じるか。どれだけ遠くを見る余地を残すか。その設計で性格が決まる。

窓は決め打ちである

固定窓には、はっきりした前提がある。

「近いものを見る」という前提である。

これは多くの場合、悪くない。言語は局所性を持つ。隣の文、直前の段落、現在の話題は、たしかに重要である。だから固定窓は、単純な割に効きやすい。

しかし、今必要な過去が、いつも近いとは限らない。

長い文書の最初にだけ定義された用語がある。会話の序盤にだけ出てきた制約がある。コードの遠い場所にある型定義が、現在の行に効いている。こうした場合、距離だけで切ると、大事な手がかりが窓の外へ出てしまう。

では、位置で機械的に切るのではなく、今のトークンに関係しそうな過去を選べないか。

ここで出てくるのが、学習によって見る場所を選ぶ考え方である。

まず軽い仕組みで、過去の各トークンが今にどれくらい関係しそうかを見積もる。ここでは、本格的な注意をいきなり全体に向けるのではない。もっと粗い判定でよい。

そのうえで、関連が高そうな少数だけを選ぶ。そして、選ばれた相手にだけ、通常の重い注意を向ける。

固定窓が「近いものを見る」方法だとすれば、こちらは「関係ありそうなものを見る」方法である。位置ではなく、中身で絞る。あらかじめ人間が切り方を決めるのではなく、モデルが学習の中で、どこを見るべきかを身につける。

この方法では、遠くの情報でも、今に関係があると判断されれば拾える。逆に、近くにあっても関係が薄ければ見ないで済む。

見る範囲を疎にする、という点では固定窓と同じである。ただし、疎にする基準が違う。

固定窓と学習選択の違い

固定窓と学習選択は、どちらも KV の読みを減らすための方法である。

共通しているのは、過去を全部見ることをやめる点である。各トークンが参照する相手を減らせば、読むキーとバリューも減る。長文脈で毎回過去全体をなめるより、はるかに軽くできる。

違うのは、何を見ないことにするかである。

固定窓は、距離で決める。近いものを見る。遠いものは、原則として見ない。単純で、実装もしやすい。読む場所も予測しやすい。どれだけ軽くなるかも計算しやすい。

ただし、遠くの重要な情報は苦手である。そこは、全体を見る層を少し残すなど、別の仕組みで補う必要がある。

学習選択は、関係で決める。近いか遠いかではなく、今のトークンに必要そうかどうかで選ぶ。遠くても関係があれば拾える。文脈の中で本当に効く点を選べる可能性がある。

その代わり、選ぶための仕組みが必要になる。どの過去を候補にするか。どうやって軽く関連度を見積もるか。選ばれなかった情報をどう扱うか。固定窓より複雑になる。

どちらが上という話ではない。

固定窓は、決め打ちの単純さを取る。学習選択は、選ぶ柔軟さを取る。どちらも、全部見ることの代償を下げるための現実的なつまみである。

同じ壁へのつまみを整理する

ここまでで、長文脈の KV の壁に対して、二系統のつまみが見えてきた。

前回見たのは、保存するものを小さくする方法だった。

キーとバリューの種類を減らす。あるいは、中身を圧縮する。これは、キャッシュそのものを軽くする方向である。

今回見たのは、参照する範囲を絞る方法だった。

固定窓で、位置によって見る範囲を切る。学習選択で、関係のありそうな場所だけを見る。これは、キャッシュを持っていても、毎回読む量を減らす方向である。

保存を減らすのか。読む範囲を減らすのか。

この二つは競合するものではない。実際のモデルでは、層ごとに混ぜて使われることが多い。

ある層は、窓の中だけを見て局所の流れを拾う。別の層は、少し広く過去を見る。さらに別のところでは、保存される中身を小さくしておく。必要な場所だけを選んで、遠くの手がかりを拾うこともある。

長文脈の設計は、一つの大技で決まるというより、こうしたつまみの組み合わせで決まる。

Agentic OS への含意

長く走るエージェントでは、文脈はすぐに伸びる。

ユーザーの依頼、途中の調査、ツールの結果、失敗した試行、修正方針、最終的な判断。これらが作業履歴として積み上がる。エージェントが長い仕事をするほど、過去は増える。

そのたびに、毎トークンで過去すべてを読むのは高くつく。

だから、エージェントの基盤では「何を覚えるか」と同じくらい、「どこを見ないか」が重要になる。

近くの履歴だけを見ればよい場面は多い。直前の指示、今実行したコマンド、その結果。こうしたものは固定窓と相性がよい。

一方で、遠くにある最初の制約や、前に決めた設計方針が重要になる場面もある。そこでは、単に近いものだけを見る設計では足りない。関係のある過去を選ぶ仕組みが効いてくる。

長い文脈を安く扱うとは、過去を全部抱え込むことではない。必要なときに、必要な過去へ届くようにすることである。

そのためには、保存を小さくするだけでは足りない。読む範囲も設計しなければならない。

今回見た固定窓と学習選択は、そのための基本的な二つの考え方である。前者は、近さを信じて単純に切る。後者は、関係を学んで選ぶ。

次回は、ここからさらに一段進む。層をまたいで保存を使い回したり、注意の層の大半を、もっと軽い別の仕組みに置き換えたりする構造を見る。長文脈の壁は、キャッシュをどう持つかだけでなく、層全体をどう組み替えるかという話へ広がっていく。

← 一覧へ