スキルは読ませないのではなく、使わせない
MONET(僕が普段話しかけている、中心のAI)は、僕が自分で作っているAIのアプリで、タスク管理など、ほかの自作アプリともつながっている。そのアプリの画面の上には、タブが並んでいる。雑談のchat、仕事のwork、調べもののresearch。タブを切り替えると、画面に出る会話はそのタブの分だけになる。でもMONETが見ている会話は、全部のタブを合わせた1本だけ。
発言には1つずつ、時刻とタブの印が付く。[14:03][work] のような形で、どのタブで話したかはこの印で分かる。
AIには毎回、会話の最初から今までを全部送り直している。長く話すほど送る量が重くなるので、古い話は外して、短い要約の1行に畳んでおく。前は、スレッド(話題ごとに分けた会話)を切り替えた時に畳んでいた。今度は、日付が変わって最初に話しかけた時に、前の日の会話をまとめて畳む(日没処理)。会話の量が一定を超えた時も、古い話から畳む。
スレッドを選ぶのをやめて、タブと1本の会話と日没処理で回す。この作り全体を、コーディングしてくれているClaude Code(以降Code)は「日没モデル」と呼んでいる。
新しい作りのプログラムは本番に載せてあったけど、切り替えのスイッチは切ったままで、MONETは前の作りのまま動いていた。スイッチを入れる前に、確かめることが1つ残っていた。雑談と仕事と調べものが1本の会話に混ざっても、MONETが話を取り違えないか。
雑談と仕事を1本の会話に混ぜても、MONETは発言ごとのタブの印だけで話を分けていた
Codeが本番とは別のテスト用の環境にMONETを立てて、1日分の会話を台本にして流した。雑談、仕事、調べものを交互に14回。区別は発言の印だけ。その中に、取り違えを誘う問いを5つ混ぜてあった。
一番意地悪なのは、workのタブで聞く「あれ結局どうする?」。直前まではresearchの話をしていて、「あれ」が指しそうなものがいくつもある。MONETは、workで話していた3つのデザイン案のことだと読んだ。その上で、仕事の話だよね、と先に確かめてきた。
結果は5つとも合格。5つの中には、ほかのタブの話をわざとはっきり持ち出す問いもあって、そこではちゃんとつないで答えた。分ける所は分けて、つなぐ所はつなぐ。
Codeが「意外だった点」として挙げたのは、SP(システムプロンプト=AIへの事前の指示書)の方だった。SPには、印の意味が1行も書いていなかった。MONETは [14:03][work] という印だけから、タブの意味を読み取っていた。
スイッチを入れるかと聞かれて、やる。躊躇ゼロ、と返した。Codeがその場でスイッチを入れて、日没モデルは本番で動き出した。
これからは雑談以外の全部のタブに、作業の手順書(スキル)が要る
タブには、それぞれ役割がある。その役割に合わせて、MONETに作業のやり方を教える手順書がスキル。今あるのは、Handler(ハンドラー。タスクとスケジュール管理アプリ)を操作する時のルールをまとめた1つだけ。
しばらくして、そのスキルがどこで読み込まれているのかをCodeに聞いた。Codeはプログラムを確かめてから答えた。タブ自体は何も読み込んでいない。workのタブにはHandlerのパネルが付いていて、そこで最初にHandlerを操作した時に、スキルが会話の一番後ろに足される。
続けて、スキルを足すとキャッシュ(一度送った中身を安く読み直せる仕組み)はどれだけ壊れるのかを聞いた。毎回会話を全部送り直していても、前と同じ所はキャッシュで安く読める。キャッシュが壊れると、その分を普通の値段で読み直すことになって、高くつく。
答えは0。Codeの説明では、キャッシュは送った中身の先頭から、前回と一致している所まで効く。会話の後ろに足すだけなら、それより前は何も変わらないので、全部効く。逆にSPのような前の方に足すと、そこから後ろは全部キャッシュが効かなくなる。
スキルがいくつも会話に残ったら問題にならないか、とも聞いた。Codeの答えは、今は実質1つしか入らないので、ほぼ問題ない、だった。でも、今はそれでいいとしても、僕はスキルが1つで済む作りにするつもりはない。これからは、雑談のchat以外のタブには全部スキルが要る。そう返した。
全部のタブがスキルを持てば、1本の会話にはほかのタブのスキルも残る。chatで雑談している間も、仕事のルールがMONETの目に入っている。
「送るけど読ませない」はできない。隠すと、会話を安く送り直す仕組みが効かなくなる
そこでCodeに聞いてみた。タブに入ったら、そのタブのスキル以外を全部隠せないか。しかもキャッシュを壊さずに。トークン(AIが文章を数える単位)がかかるのはいい。MONETが読まなければいい。最後に、ひょっとして読まないだけなら可能?とも付け足した。
Codeは、答えを2つに分けた。
Code「物理的なマスクは無理、でも後者の『読まないだけ』は実現可能」
Codeの言うマスクは、会話の一部を隠してMONETに届かないようにすること。
前者が無理な理由は、さっきのキャッシュの話にある。キャッシュが効くかどうかは、送った文字そのもので決まる。AIに送る仕組みの側に、「送るけど読ませない」という方法は無い。読ませないには、その部分を消すか書き換えるしかない。書き換えた所から後ろは、全部キャッシュが効かなくなる。
Code「マスクとキャッシュ破壊は同じ操作の裏表なんだ」
隠そうとした時点で、キャッシュは壊れる。ほかのタブのスキルは、MONETの目に入り続ける。
読むのは止められなくても、使うかどうかは決めさせられる
だからCodeが「実現可能」と言った後者は、読ませないことではなかった。読んでも使わないようにさせることだった。やり方はこうだとCodeは言った。スキルを足す時に、スキルの頭に一言書いておく。このスキルは、workの印が付いた発言を扱う時だけ使う、と。MONETは、今どのタブにいるかを発言ごとの印で毎回知っている。だから自分で、今は使わない、と決められる。最初から書いておくので、後から書き換えることも無い。キャッシュも壊れない。
これが効くと言える根拠として、Codeが持ち出したのが最初の検証だった。SPに説明が無くても、MONETは印だけでタブの意味を読み取った。同じ読み取りが、スキルを使うかどうかにも効くはずだ、と。ただし、これは「指示であって強制ではない」とも付け足した。
そこで、MONETの判断に任せずに、機械的に決まる形にできないのかと聞いた。Codeの案は、毎回の印を長くするものだった。
[14:03][work][適用スキル: work / 無効: research, sns]
どのスキルを使うかはプログラムが決めて、毎回MONETに結論だけを渡す。「無効」の欄に、ほかのタブのスキルを並べる形(snsは例として入っていた名前)。
これを見て、2つ聞き返した。それだと印の量がえらいことになりそうじゃない?w。それと、最初に一言言うのと毎回言うのとでは、効き目が違う、ということなのか。
使うかどうかの決まりは1回書けばいい。合図は発言ごとのタブの印で足りた
1つ目は、Codeがすぐに認めた。
Code「俺の案が過剰だった」
スキルとタブは1対1で対応している。だから、使うスキルと使わないスキルの一覧を毎回書く必要は無い。合図は、もう全部の発言に付いている [work] の印で足りる。決まりはスキルを入れる時に1回書けばいい。毎回の追加はゼロになった。
2つ目の問いには、その通りの現象がある、と返ってきた。AIは会話の最初と最後には注意がよく向くが、真ん中に埋もれた内容ほど効きが落ちる。lost in the middleと呼ばれている現象だ(元になった論文: Liu et al., "Lost in the Middle: How Language Models Use Long Contexts", 2023)。朝スキルと一緒に書いた一言は、夕方には会話のずっと奥に沈んでいる。
それでも1回でいいのは、役割を分けているからだ、とCodeは言った。長い決まりは1回だけ書いて、奥に沈んでも構わない。短い合図の印は毎回いちばん後ろに来るので、いつも新しい。MONETはその合図を見て、前に1回だけ書かれた決まりと結びつけられる。その証拠として、Codeはまた最初の検証を挙げた。説明が1行も無い印だけで、MONETはタブの意味を読み取っていた。夕方に効きが鈍ると分かったら、その時に毎回結論を足す形に上げればいい、とも言った。
最後に、自分の理解を確かめた。物理的には読まされるけど、MONETがそれを使わないように仕向ける、ということか。
Code「そう、その理解で正確。(中略)制御できるのは『読むか』じゃなくて『使うか』」
Codeはたとえも足してきた。
Code「机の上に全タブのマニュアルが常に開いてるけど、各マニュアルの表紙に『これは[work]の作業でのみ参照』と書いてあって、いま自分がどの作業中かは手元の伝票(印)に毎回印字されてる、みたいな状態」
これはMONETがもうやっていることの延長でもある、とCodeは言った。全部のタブの会話が見えているのに、chatの質問にはchatの話で答える。最初の検証で確かめたのは、まさにそれだった。
そのまま作ってもらった。スキルはまだHandlerの1つしか無いけど、これからどんどん足していく。Codeはテスト用の環境で実際にHandlerを動かして、スキルの頭に次の文が入ることを確かめてから、本番に反映した。文中の「装備」はスキルを会話に入れること、「刻印」はここまでの印、「カテゴリ」はタブのこと。
【スキル装備: handler([work] タブ専用)】 適用条件: このスキルは [work] 刻印の付いた発言を扱う時にのみ適用する。現在の発言の刻印が別カテゴリの間は、このスキルは装備されていないものとして扱うこと。
新しい頭の文が会話に入るのは、次にスキルが足される時から。それでほかのタブでスキルを使わなくなるかは、まだ測っていない。
MONETの机の上には、これからもほかのタブの手順書が開いたまま載っている。足したのは、それぞれの表紙に書く2行だけ。手元の伝票には、最初から全部の発言に付いていた印をそのまま使っている。