BLOG.HIRO UENO.ART
← INDEX

ノイズ除去のつもりが、緊急弁だった

MONET(僕が普段話しかけている、中心のAI)には、古くなったツールの結果を片付ける仕組みがある。名前はWarm-A(ウォームA。僕のコンテクスト管理システムCMSの一部)。長く会話を続けても、MONETが古い情報に引っ張られないようにするためのもの。

ただ、これが普段の会話では動いていなかった。動くのは、1つの会話の中に溜まったツールの結果が18万文字を超えた時だけ。1日中話し続けても、そこまでは届かない。この18万文字をどこまで下げればいいか、が僕とCode(コーディングしてくれているClaude Code)の宿題になっていた。

古い一覧は、会話に残って古いことを言い続ける

MONETは会話の途中で、自作のタスク管理アプリなどをツールとして呼ぶ。今日のタスクは?と聞けば、裏でアプリが呼ばれて、タスクの一覧が返ってくる。その一覧は会話の中に残る。MONETは返事をするたびに、それまでの会話を丸ごと読み直している。なので会話に残ったものは、古くなっても毎回MONETの目に入る。

少し前の一覧では「未完了」だったタスクが、今はもう完了している。それでも古い一覧は会話の中に残って、「未完了」と言い続ける。これがノイズになる。Warm-Aは、そういう古い結果を [cleared](片付け済み)という印に置き換える。

数字をいくつに下げても、量で数える限り、古さには反応しない

これについてCodeに前提を1つ確かめた。Warm-Aの主目的は、トークン(AIが文章を数える単位)の節約じゃなくて、長く会話を続けるためのノイズ除去。今のWarm-Aって、それに沿ってる?

Code「半分だけ沿ってる」

「何を消すか」(古いツールの結果)は、ノイズ除去に沿っている。でも「いつ消すか」(18万文字を超えたら)は、トークン節約の考え方だった。ノイズの正体は古さで、量とは関係が無い。「未完了」と言い続ける一覧は、短い会話の中でも普通に起きる。つまり今のWarm-Aは、会話が溢れそうな時だけ動く緊急弁でしかなかった。

数字をいくつに下げても、量で数えている限り、古さには反応しない。

話題の区切りを数えれば、古さで片付けられる

直し方は、「いつ消すか」を量から古さに替えること。

ただ、毎回こまめに消せばいい、という話でもない。一度送った会話は、次から安く読み直せる(キャッシュ)。途中を書き換えると、そこから後ろは高い料金で読み直しになる。だから少しずつでなく、ある程度溜めてまとめて消したい。

MONETの会話は、裏で話題ごとのひと区切りに自動で分けられている。そのうちツールを呼んだ区切りだけを数え、4つ終わったら、最新の区切り1つ分を残して、それより前のツールの結果をまとめて片付ける。区切りを数えるので古さで動くし、まとめて片付けるので高い読み直しは稀で済む。 Codeと相談し、これを実装することに決めた。

18万文字の条件は、念のための保険として消さずに残した。

Web検索の結果は別の穴で、こちらからは消せなかった

もう1つ、脇で見つかった穴がある。MONETへ実際に送った中身を覗ける画面で会話を眺めていたら、Web検索の結果がまるごと残っていて、すごい量に見えた。測ると、Web検索をした1つの会話だけで約7万2千字。普通のツールの結果は、全部の会話を足しても5,700字だった。

しかもこれは、Warm-Aの18万文字の数にも入っていなかったし、Warm-Aでは消せもしない。実はWeb検索はAnthropic(Claudeを作っている会社)のサーバー側で行われていて、その結果は、会話を毎回送り直す時にも受け取ったまま送る決まりになっている、とのこと。[cleared] に置き換えて送ると、エラーで弾かれる。CodeはこれをWarm-Aの網では獲れない鯨にたとえた。

そして鯨用の銛はサーバー側にあった。Anthropicのサーバーに、Web検索の結果を消す機能があるとのこと。会話が5万トークンを超えると発動するらしい。 きちんと調べないとわからないことが本当に多い・・・。

18万文字には、決めた理由が無かった

実装直後に、ふと気になってCodeに聞いた。18万文字とかそういう数字は、誰が決めたの?僕なの?全然覚えてない。

Codeは仕様書と過去の記録を遡って、「ヒロじゃない」と答えた。以前のCodeが仕様書に暫定の値として置いたもので、「使い始めてから実測で調整する」と添えてあった。なぜこの桁なのかは、どこにも残っていなかった。

それでも今回の直しで、この数字の居場所はできた。普段の片付けの合図としては外れていたが、滅多に動かないのは、緊急弁ならむしろ正しい性質になる。日常のノイズ除去は区切りに任せて、18万文字は1つの区切りの中でツールの結果が一気に膨れ上がった時のために、後ろに控えている。