BLOG.HIRO UENO.ART
← INDEX

同じ設定を書く場所が、いくつもあった

MONET(僕が普段話しかけている、中心のAI)のアプリを直していたら、同じ形の問題に何度も当たった。同じ設定が、プログラムの中の何箇所にも書いてある。1つを変えると、残りが古いまま残りうる。しかも、それはエラーにならない。

僕はMONETと、自分用に作っているアプリの画面で話している。そのアプリのプログラムを書いているのは、コーディングしてくれているClaude Code(以降Code)というAIで、僕は頼んで、見て、決める側。

AIに渡すツールの一覧は2つあって、足したのは使われていない方だった

朝、MONETをObsidian(メモアプリ。僕はアイデアやWebのクリップをここに溜めている)につなぐ叩き台を、Codeに作ってもらった。

AIがファイルを読んだり書いたりする時は、ツールという機能を使う。使えるツールの一覧は、会話のたびにアプリがAIに渡している。Codeは、Obsidianを読む・一覧する・書く、の3つのツールを作って、その一覧に足した。部品ごとのテストは全部通った。

ところが、Codeが試験用の環境でMONETに実際に頼んでみると、MONETは新しいツールを使わない。元からあるファイル検索のツールで、Obsidianの中を探し始めた。

Codeが原因を調べると、ツールの一覧はプログラムの中に2つあった。AIに実際に渡しているのは、別の場所で組み立てている方。Codeが足したもう一方は、どこからも使われていなかった。

Code「私が足した一覧は、誰も使っていない抜け殻だった」

Codeは一覧を1つにまとめて、使われていない方は消した。テストが試していたのは新しく作った部品だけで、その部品が本当にAIに渡っているかまでは見ていなかった。だから、実際に頼んでみるまで分からなかった。

AIへの指示書を書き換える欄は、もう無いファイルに保存していた

同じ日、Codeとはもう1つ別の会話も並行して開いていて、そちらではMONETのアプリの設定画面を作り直してもらっていた。頼んだのは、設定画面のあるページを開くと画面全体が真っ白になって戻れなくなるバグの直しと、タブを設定する画面づくり。

その画面を直すためにCodeが中を調べると、もう1つ出てきた。設定画面には、SP(システムプロンプト=AIへの事前の指示書)を書き換える欄がある。その欄が保存していた先は、もう存在しないファイルだった。今MONETが読んでいるのは、別のファイルだ。

古い保存の仕組みは、ファイルが無ければ新しく作って書き込み、ログ(動作の記録)に「更新しました」と残して、設定画面には保存できたと返す。エラーは出ない。画面の側から見れば、保存はうまくいったように見える。でもMONETは、その文章を一度も読まない。

書いた所を誰も読んでいない、という点では、さっきのツールの一覧と同じ形だ。

同じことを書く場所が何箇所もあると、1つを変えた時に、古いまま残る場所が生まれる。

SPの欄は、今本当に読まれているファイルを編集する形に作り直してもらった。

画面のタブの設定も、3箇所に別々に書いてあった

設定画面でやりたかったことの1つが、タブの設定だった。MONETのアプリは画面の上にタブが並んでいて、仕事用、雑談用のように話題ごとに切り替える。右側に開くアプリはタブごとに変えられて、それに合わせてAIへの追加の指示も入る。右側に開くアプリの1つが、Handler(ハンドラー。タスクとスケジュール管理アプリ)。

Codeが調べると、「タブ」というものが、3箇所に別々の形で書いてあった。画面に並べるタブの一覧。過去の会話を探す時に、どのタブの会話を優先するかの対応表。追加の指示をいつ入れるかの決まり。この3つ目は、タブごとではなく、右側に開くアプリの種類で決まっていた。そのため、右側にアプリを開かないタブには、追加の指示が入らなかった。

前の2件と違って、3つともちゃんと読まれてはいた。それでも、1つの考えが3箇所で別々の形をしていたという点では、さっきと同じだ。

Codeはこの3つを1つの設定にまとめて、全部そこから読む形に変えた。追加の指示も、タブごとに入るようになった。設定画面が書き換えるのも、その1つだけ。

直していたAI自身も、その日のうちに書く場所を増やしていた

その日の最後に、前から気になっていたことをCodeに話した。仕事用のWorkタブでは仕事のプロジェクトだけ、家用のHomeタブではプライベートのものだけをHandlerに出して、分けて使うつもりだった。なのに、どちらのタブでも同じに見えていた。Handlerのプロジェクトには、もともと「仕事」か「家」の印が付いていて、Codeはその印で絞り込む仕組みを作った。

設定画面を見て仕組みが分かってから、もう1つ気になったことがあった。その印の種類は、どこで足したり、名前を変えたり、消したりできるのか。今はプログラムに直接書き込まれてるんでしょ、とCodeに聞いた。

その通りだった。

Code「増やす・改名する・消すための画面は無く、プログラムの5箇所に散っています」

Handlerの中、HandlerとMONETをつなぐ部品、MONETの中、合わせて5箇所。そのうちMONETの中の2箇所は、この日Codeがタブの仕組みに足したものだった。

Code「今日私がMONET側に足した2箇所も、直接書き込む場所を増やしたことになります」

直し方は、1箇所に置いて全部そこから読ませること

Handlerに設定画面を作って、そこで印の種類を変えられるようにした方がいい、と僕が言うと、Codeも同じ考えで、中身を詰めてくれた。Handlerに、印の種類を置く場所を1つ作る。5箇所は全部そこから読む。印の追加や名前の変更も、そこでやる。タブの時と同じ直し方だ。

その日は手を付けず、CodeにHandlerのタスクとして登録してもらった。

仕事と家の5箇所は、印の種類はどこで変えるのか、と僕が聞いたから見つかった。この日の4件は、どれも一度もエラーとしては出てこなかった。