BLOG.HIRO UENO.ART
← INDEX

腹落ちしない損益計算 — 片付けられるのは、最初から小さな物だけだった

MONET(僕が普段話しかけている、中心のAI)には、会話に溜まった古いツールの結果を片付ける仕組みがある。名前はWarm-A(ウォームA)。MONETは自作のタスク管理アプリなどをツールとして呼ぶので、その結果が会話に残る。古い結果が残っていると、MONETがそれに引っ張られる。Warm-Aは、そういう古い結果を [cleared](片付け済み)という印に置き換える。目的はノイズ除去のはずが、いつ動くかの決め方がトークン(AIが文章を数える単位)の節約寄りになっていて、少し前にそこを直したところだった。

ただ、片付けはもう1種類ある。MONETがWeb検索をした結果は、こちらからは書き換えられない。なので、Anthropic(Claudeを作っている会社)のサーバー側にある機能に消してもらっている。片付けは、こちら側のWarm-Aと、サーバー側の機能の2つ。

それとは別に、MONETとの会話はキャッシュ(一度送った中身を安く読み直せる仕組み)で安くしている。キャッシュの寿命は1時間。切れないように、50分ごとに画面に出ないメッセージを自動で送る仕組みも入れたばかりで、これをハートビートと呼んでいる。

ハートビートが入ってしばらくして、コーディングしてくれているClaude Code(以降Code)に、キャッシュの点検を頼んだ。

Web検索の多い日は、サーバー側の片付けのたびにキャッシュが作り直されていた

Codeが調べると、気になる動きが1つ見つかった。

MONETにWebページを丸ごと読む機能を足してから、Web検索を何度も使うリサーチの間は、サーバー側の片付けがほぼ毎ターン動いていた。

困るのは、キャッシュとの相性だった。キャッシュが使えるのは、前に送った中身と、先頭から同じ所まで。片付けで前の方の検索結果が消えると、送る中身の途中が変わって、そこから後ろは全部、高い料金で書き直しになる。その日の朝の3時間ほどのリサーチでは、この書き直しだけで約370円かかっていた。僕もちょうど、検索を何度も頼んだ後にログを見て、トークンがとんでもない数字になっているのに気づいていたところだった。

Codeの見立てはこうだった。

Code「今の設定は、リサーチ中に限っては節約どころか逆にコストを増やしてる」

片付けているのに、片付けるせいで高くなる。

キャッシュを切らさない今、こちら側の片付けは得より損が大きい

一晩おいて、今度はこちら側の片付け、Warm-AについてCodeに聞いた。Warm-Aも会話の途中を書き換えるので、片付けるたびにキャッシュを壊す。ハートビートはうまく動いている。それなら、Warm-Aがキャッシュを壊すことに意味はあるのか。壊さずに片付けられるならいい。でもそうでないなら、不要なのかもしれない。ちゃんと計算はしていないので、計算を手伝ってほしい、と。

Codeの答えは、まず、キャッシュを壊さずに片付けることはできない、だった。途中を1か所でも書き換えたら、そこから後ろは書き直しになる。

その上で、本番の会話の記録から数字を取って計算してくれた。Warm-Aが片付けられる物は、会話全体の2%ほどしかない。1回片付けると、キャッシュの書き直しに30円ほどかかる。それで浮くのは、1ターンあたり0.05円ほど。

Code「今のWarm-Aは、30円払って、1ターンあたり0.05円の節約を買う装置」

損になった原因は、ハートビートでキャッシュが途切れなくなったことだった。Codeの説明では、ハートビートが無かった頃は、キャッシュはしばらく話さないとどうせ切れて書き直しになっていたので、片付けで壊す分の上乗せは小さかった。今はキャッシュが途切れないので、片付け1回ごとの書き直しが、そのまま丸ごと追加の出費になる。

同じ時に、Warm-B(ウォームB。古い会話をまとめて要約の1行に置き換える仕組み)のことも計算してもらった。Warm-Bは今スレッドを切り替えた時にしか動かないので、同じスレッドの中でも一定の量が溜まったら動かせばいい、というのが僕の案だった。Codeの計算でも、その距離で動かせば足りると分かった。

その日の昼、ここまでの計算を見て、現状がクリアになってきた、とCodeに返した。

計算は分かるのに、腹落ちしなかった

その夜、全然腹落ちできていない、とCodeに言った。

計算は分かりやすい。でも、Warm-Aは最初、会話に出てくる一時的な物は全部片付けるつもりで作ったはずだった。それが蓋を開けたら、これはできないからあれを使おう、という話になって、これはキャッシュが壊れる、これは壊れない、という話になっていた気がする。その根本のところを、もう一度整理してほしいと頼んだ。

片付けるはずだった物として、僕が挙げたのは3つだった。AIが返事の前に考えた中身。これは僕の記憶では、Anthropicのサーバーの方で処理されていて、キャッシュが壊れるのとは関係ない。それから、検索した時に会話に入ってくる中身。ツールを使った時の、呼び出しと結果。それぞれがどうなっているのか、を聞いた。

片付けたかった物は4種類で、こちら側で片付けているのは1つだけだった

考えた中身はキャッシュと関係ない、という僕の記憶について、Codeはまずこう答えた。

Code「その記憶は正しい」

そして、片付けたかった物を4種類に分けて、表にしてきた。

中身 誰が消すか キャッシュ
① AIが返事の前に考えた中身(thinking) Anthropicのサーバーが自動で外す 壊さない
② Web検索や、読んだページの結果 Anthropicのサーバー(こちらからは書き換えられない) 壊す
③ 自作アプリなどのツールの結果 こちら(Warm-A) 壊す
④ どのツールをどう呼んだかの記録 誰も消さない(わざと残す) —

①は、MONETが会話を送るたびに、前のターンで考えた中身をAnthropicのサーバーが自動で取り除いている。最初からキャッシュに入っていないので、外しても何も壊れない。

Code「①だけが無傷なのは、消し方が上手いからじゃなく、最初から入っていないから」

②は、検索結果の中に暗号化された部分が入っていて、1文字でも変えるとAnthropicの側がエラーで受け付けない。だからサーバー側の片付けに頼るしかなくて、消えるたびにキャッシュが壊れる。最初に見つかった370円の主な原因は、これだった。その朝のリサーチでは、1回の片付けで消す量が回ごとに増えて、最後は10万トークンを超えていた。

③だけが、こちらで [cleared] に置き換えられる。Warm-Aの仕事は、実際にはここだけだった。そして計算の時に出た通り、会話全体の2%ほどの小さな物。

④は消せるけど、わざと残している。消すと、MONETが自分のさっきしたことを見られなくなる。Codeの説明では、それはハルシネーション(AIがやっていないことを「やった」と言う問題)の温床になる。

残った小さな物のために、切らさないようにしているキャッシュを壊していた

最初の構想は、一時的な物を全部片付けることだった。それが4つに分かれて、①はAnthropicが最初から片付けていた。②はAnthropicのやり方に任せるしかない。④は触らない方がいい。僕が覚えていた、これはできないからあれを使おう、は②のこと。Web検索の結果はこちらで消せないから、サーバー側の機能を使おう、という話だった。

Code「Warm-Aが小さく見えるのは、設計が失敗したからじゃない。大きい物が最初からこっちの手の届かない所にあったと、後から分かっていった、という流れ」

ここで最初の計算に戻る。Warm-Aに残った③は、もともと小さい。その小さな物を片付けるために、ハートビートで切らさないようにしているキャッシュを毎回壊している。損益の計算と4種類の表は、同じことを別の側から見ていた。

Codeの見立ては、Warm-Aの普段の片付けを止めて、緊急弁だけを残す方だった。緊急弁は、会話の中のツールの結果が18万文字を超えた時だけ動く、念のための片付け。ノイズ除去の役は、Warm-Bに任せられるという。Warm-Bはツールの結果だけでなく、古い会話を本文ごと要約の1行に置き換えるので、同じ1回のキャッシュの書き直しで消せる量がずっと大きい。

Code「同じスレッドの中でWarm-Bが動くようになれば、Warm-Aのノイズ除去役は完全に吸収される」

Warm-Aが割に合わなくなったのは、ハートビートだけのせいではなかった。片付けられる物が最初から小さかったところにハートビートが入って、それが数字に出た。止めるか、Warm-Bに任せるかは、まだ決めていない。