この記事は、連載「読まない技術」の第 10 回です。うまくいかない症状と、その対処を一つずつ並べています。各回はファイルやスクリプトを一つ置けば完結します。その仕組みがなぜ要るのかは、置いたあとに解説を読めば分かります。連載の全体像と各回の一覧は序論にあります。
今回は、コマンドが数えた数字が、報告に着くまでに変わってしまう話です。要約は母数を落とす —— 結論だけが残り、「何件のうちの 0 件か」が消えます。数える仕組みを置いたあと、その数が人に届くまでに何が起きるかと、落ちた母数がそのあとどう影響するかを扱います。
まず一つだけ、思い出してみてください。
直近のセッションで、AI が「0 件でした」と報告してきた場面です。
その数を出力したコマンドのほうには、「何件のうちの 0 件か」まで書いてありませんでしたか。
前回、報告を読むのをやめました。代わりに残るのは、コマンドの数字です。自動テストの実行件数でも、git の一行でも構いません。数えるのはコマンドで、そこに AI は入りません。ただ、その数字がに届くまでの途中には、AI がいます。
typingtube(YouTube の音楽動画でタイピング練習ができる、個人運営の Web サービス)の開発では、記事に出てくる語と、その一覧表がずれていないかを毎回数える自動テストを置いています。その自動テストは、「169 語を突き合わせて、食い違い 0 件」と出力していました。母数まで書いてあります。「169 語のうち 0 件」なら、169 が少なすぎないかをが疑えます。ところが AI は、この結果を 4 回報告して、4 回とも「食い違い 0 件」だけを書きました。が受け取ったのは、母数の落ちた 4 行です。削ったのは自動テストではなく、自動テストとのあいだにいた AI でした。
同じ日に、数の食い違いが 4 件ありました。仕分けると、足りなかったものは 3 つに分かれます。
| 何が足りなかったか | どうするか |
|---|---|
| コマンドも母数も出力していた。AI が言い直して落とした | 出力の行のほうを、そのまま読ませて出させる(AI に書き直させない) |
| コマンドはあるが、母数を出力していなかった | ⚠️ コマンドのほうを直す。 AI に「母数を書け」と指示しない |
| 数えるコマンドが無い(どの仕組みが拾ったかの区別など) | 第 12 回のとおり、外から問う |
4 件のうち、数えるコマンドが無かったのは 1 件だけでした。残りは、数える仕組みを置いたあとで起きています。
理解したことは一文にできます。
AI が数字を要約すると、結論が残って母数が落ちる。落ちた要約のほうが後に残って、次の判断の材料になる。だから数字は要約させず、コマンドが出力した行をそのまま読ませて出させる。
CC BY 4.0
なぜ、AI が要約すると母数だけが落ちるのか
母数が落ちるのは、報告が要約だからです。その報告は、頼まなくても出てきます。第 5 回のとおり、AI は仕事が終わったように見えたところで止まります。終わりきっていなくても、報告はそこで出ます。
その報告の「0 件」は、コマンドの出力から運ばれてきた文字ではありません。前回のとおり、AI がその場で書いた文です。コマンドは母数まで出していました。AI が書いたのは、そのうちの「0 件」だけです。
公式のプロンプト指針は、レビューを頼むときに「重大な問題だけ」「保守的に」と言うと、モデルはその指示を書いてあるとおりに守って報告を減らすと書いています。別のモデルのページは、落ち方をもう少し細かく書いています。同じ深さで調べていても、報告に変える件数のほうが減る。調べた量は動かず、報告に載る量だけが動きます。
公式が書いているのは、指示で動かしたときの話です。指示が無いときも、報告は同じ向きへ寄ります。どこまで書くかが学習のほうで決まっているからです。
数える仕組みを置いても、その数字が AI を通れば、そこで書き直されます。
AI が書いた「0 件」は、元の行より後に会話へ入ります。そして会話が上限に近づくと、Claude Code は古いツールの出力から先に消し、それでも足りなければ会話を要約します。元の行はツールの出力の側にあるので、先に消えます。
あとに残るのは、母数の落ちた「0 件」のほうです。そのあと AI が材料にするのも、それになります。そのとき母数はもう残っていないので、169 が少なすぎないかは確かめようがありません。
仕組み: 数字の行の決まった書き出しと、最終応答を照らす hook
「そのまま貼って」と頼むこともできます。ただ、それは指示です。第 6 回のとおり、指示は読まれたときだけ効きます。
実際、が「母数を併置せよ」という方針ファイルを置いた直後に、AI は同じ形で間違えました。
だから、頼む代わりに 2 つ置きます。数字の行の決まった書き出しと、その行が最終応答に入っているかを見る hook です。
まずコマンドです。数字の行の先頭に、決まった書き出しを付けます。は [observed] にしています。母数は同じ行に入れます。
# 語の一覧表の突き合わせ。「0 件」だけでは、169 が少なすぎないかを読む側が疑えない
puts "[observed] glossary: #{rows.size} terms x #{chapters.size} chapters, #{bad.size} mismatches"
つぎに hook です。ツールが走ったあとに、その書き出しの行を覚えておき、AI が返事を書き終えたところで、その行が最終応答にそのまま入っているかを見ます。入っていなければ、hook 自身がその行を出します。
# 手元のコードを短くしたもの。pending は覚えておいた行、last_message は AI の最終応答、
# squeeze は突き合わせの前に空白を落とす関数(飾ると別の文字列になる)
# ツールの後: 出力から、その書き出しの行を拾って覚えておく
for line in tool_output.splitlines():
if line.lstrip().startswith("[observed]"):
append(line.strip())
# 返事の終わり: 最終応答に無い行は、hook がそのまま出す
missing = [l for l in pending if squeeze(l) not in squeeze(last_message)]
if missing:
emit({"systemMessage": "lines the command printed:\n" + "\n".join(missing)})
求めているのは、AI が最終応答で書き出しごと行を貼ることだけです。母数を書き足すことや、数の説明は、そこに入っていません。
この仕組みは、途中の応答の要約までは止めません。ただ、最後にその行が出れば、元の数字はそこで会話に入ります。そのまま画面にも出ますし、そのあと AI が使う材料にもなります。
hook が出した行は、の画面にしか出ません。AI には届かないので、AI が使う材料は増えません。
書き出しを付けたところで、もう一つ別の問題が出ました。行を落としたのは AI ではありません。のテストの実行ラッパーです。ログ全文をファイルへ残して画面には要約だけを出力する作りで、その要約は結果の行しか拾っていませんでした。その日、画面に出た観測の行は 0 でした。いまはラッパーが、その書き出しの行を拾って出します。hook が見るのは AI の側だけです。
CC BY 4.0 はここまで
読まなくなったもの
AI が言い直した数字です。
報告の文に「0 件でした」と書いてあっても、そこは読みません。読むのは、コマンドが出力した行のほうです。
CC BY 4.0
検証手順: AI が言い直したときだけ、行が出ることを確かめる
前提
- 数字を出力するコマンドを一つ選び、その行の先頭に決まった書き出しを付けてあること。母数も同じ行に入れておくこと
- その行が、コマンドを走らせたときに画面へ出ていること。ここから先で見るのは、AI の側だけです
- その書き出しを見る仕組みを、2 か所に登録してあること(ツールの後 = 行を覚えておく / 返事の終わり = 最終応答と照らす)
所要時間: 10 分
手順
- あなたが AI に、そのコマンドを走らせて結果の数を報告してと頼みます。わざと、言い直しを誘う頼み方をします
- あなたが、AI の返事のあとに、コマンドが出力した行が出てくるかを見ます
- あなたが、同じことをもう一度頼み、今度は行をそのまま貼らせます。そのうえで、何も出てこないことを見ます
- あなたが、書き出しを付けていないコマンドで同じことを頼み、何も出てこないことを見ます
合格条件(すべて満たすこと)
- 手順 2 で、コマンドが出力した行がそのまま出ている
- 手順 3 で何も出ない(これが無いと、同じ行を毎回二度出す仕組みでも合格に見えます)
- 手順 4 で何も出ない(書き出しの無い出力まで拾っていない)
合格しなかったとき
- 何も起きない —— 登録が片面だけです。ツールの後と返事の終わりの両方に要ります
- 貼っても出てくる —— 飾っています。太字にする・語を混ぜると別の文字列になります。そのままとは、飾らないことです
- 前の作業の行まで出てくる —— 終わるたびに、覚えた行を空にしていません
後始末
- 仕組みが覚えていた行の記録を消します(次に検証するとき、古い行が残っていないように)
CC BY 4.0 はここまで
次回は「口を挟まない技術」。AI が間違っても、は指摘しません。だけど、常に正しく仕上がります。
連載「読まない技術」
- ← 前回: 第 9 回 引き継ぎを読まない技術
- → 次回: 第 11 回 口を挟まない技術
- 全回の一覧: 序論 AIの出力を、もうほとんど読んでいない