過去5GBのAI会話ログから『毎回繰り返す小言』を抽出してルール化した
半年以上、AI相手にほとんど同じ小言を吐き続けていた。「表示を自分で確認してから完了って言って」「勝手に範囲を縮めないで」「元の資料と数字を突き合わせて」。その場では直るのに、翌週にはまた同じことを言っている。今日はこの繰り返しに終止符を打つべく、過去の会話ログから自分の「キレポイント」を丸ごと機械抽出させて、ルール集に昇格させた。
なぜ過去ログを掘ることにしたか
きっかけは単純で、モデルが賢くなっても同じ失敗が消えないことに気づいたからだ。新しいモデルが出るたびに期待するのに、蓋を開けると「見た目を確認せずに完了報告する」「解釈が分かれる依頼を勝手な方向に走らせる」あたりは律儀に再発する。むしろ賢くなったぶん、もっともらしい嘘の完了報告が上手くなっている節すらある。
だったら記憶や印象で対策を書くのはやめようと思った。自分が実際に何回・どんな言葉でキレているかは、全部セッションログに残っている。印象論ではなく、過去ログを一次資料にしてルールを組む。 方針はそれだけ決めて、あとは抽出と選別をClaude Codeに投げた。
5GBのログから怒りだけを拾わせる
対象は Claude Code と Codex の全セッションログ。ざっと約4,600ファイル、5GB規模ある。これを人力で読み返すのは無理なので、走査から選別まで一気通貫でやらせた。
流れはこうだった。
- まずログ全体を走査して、自分の発言のうち不満・訂正・叱責っぽいものを機械抽出させる(1,200ファイル走査の途中経過で100件超がヒット)
- 抽出された候補は延べ2,327件。ただしこの生の数字はまったく信用していない
- 候補を10チャンクに割って、分析用のサブエージェントを10並列で派遣。各チャンクごとに「本物のキレか、それとも引用・議論・リトライ指示の文字列か」を判定させ、テーマ別に分類させた
抽出の粒度はここで一段階に分けた。第一段の走査はキーワードと発話パターンで機械的に広く拾う。ここで漏らすと後段で拾い直せないから、多少ノイズを飲んでも広めに網を張る。第二段でその網からノイズを落とす。粗く集めてから精緻に削る、という二段構えにしたおかげで、取りこぼしと過検出のどちらにも倒れずに済んだ。
10並列にしたのにも理由がある。250件級の判定を1体に通しで読ませると、後半になるほど判定基準がぶれて、最初と最後で「これはキレ」の線引きが変わってしまう。25件ずつ10体に配れば、各エージェントの中では基準が揃うし、単純に速い。
10並列は起動したはいいものの、全部が同時に返ってくるわけではない。1/10、2/10……と1件ずつ完了報告が上がってくるのを、起床予約プロンプトで待ち受ける形にした。3件目あたりで「未完なのに完了扱い」「ホバー依存のUI」みたいな強いテーマが顔を出し、6件目で「表示を自分で確認せず完了報告する」が複数チャンクにまたがって最多に収束していくのが見えた。待っている間にテーマの輪郭がじわじわ立ち上がってくるのは、なかなか気持ちのいい体験だった。
誤検出をどう弾いたか
今回いちばん神経を使ったのが、生の抽出数を鵜呑みにしないことだった。
単純な文字列一致で「キレ」を数えると、とんでもなく過大にカウントされる。自分が過去に「こういうエラーで落ちた」と調査ログに貼り付けた文字列、AIへのリトライ指示、そもそもルールを議論している最中の引用——こういう「怒っているわけではないのに怒りっぽく見える文字列」が山ほど混ざる。実際、2,327件の候補のうち、本物のキレと判定されたのは約250件まで削られた。9割近くがノイズだった計算になる。
だからサブエージェントには「文字列がヒットしたか」ではなく「これは筆者が実際に不満をぶつけている発話か」を1件ずつ判定させた。並列で分担させたのも、この判定に手間がかかるからだ。250件を1エージェントに通しで読ませるより、25件ずつ10体に配って判定精度を上げるほうが速いし、粒度も揃う。
出てきた「毎回キレていた」トップ5
選別後の250件をクラスタリングさせたら、頻度×強度で綺麗に順位がついた。上位5つを見て、正直ぐうの音も出なかった。
- 表示に触れたら、報告前に自分の目で描画を確認する(約70件・ぶっちぎりの最頻出)。UI・図・チャートを直したら、自分でレンダリング結果を見て、見切れや重なりがないのを確かめてから「完了」と言え、という話。「〜のはず」で報告するな、が全期間で一番多かった
- 解釈が分かれる依頼は着手前に確認し、訂正されたら前の解釈を捨てる(約55件)。出力先や形式が複数に取れるとき、勝手な方向に走って作り込む。しかも「違う」と言われても同じ方向で作り直すから、同じ小言を3回言わせる
- 数値・データは元資料と突き合わせてから出す(約34件)。転記した数字をソースと照合せずに出す。ソースにない値を「それっぽく」創作する
- 「ない・できない」と言う前に代替経路を試す(約29件)。「見つからない」と諦める前に別の取得手段を試せ、という話
- 範囲を勝手に縮めない・黙って省略しない(約28件)。「上位10件」と頼んだのに勝手にサンプル版に縮める
こうして並ぶと、自分が半年間ずっと同じ4〜5種類のことで怒っていたのがまるわかりで、笑うしかなかった。最終的にテーマは13本のルールに収束した。この5つの下に、内部用語の漏出、原本の無断改変、進捗報告の曖昧さといった常連が続く。
面白かったのは、上位に来たのがどれも「賢さ」ではなく「詰めの甘さ」で説明できるものだったことだ。難しい実装ミスで怒っている回はほとんどなくて、「最後に自分で見れば防げたのに見なかった」「一言確認すれば済んだのに走った」という、あと一歩の横着ばかりが並んだ。これはモデルを新しくしても消えないわけだ、と妙に納得した。
トップ5の下に続く「常連」も、言われてみればいちいち身に覚えがある。訂正したのに同種の他の箇所は直さず1箇所で満足する。統合作業で既存の説明や例をこっそり削る。判断を仰ぐときに専門用語を並べて、こちらが何を選べばいいのか分からない質問を投げてくる。どれも一発では大事故にならないぶん、毎回「まあいいか」で流していて、だから半年ずっと同じ小言を繰り返す羽目になっていた。件数として突きつけられて初めて、流していた自分の側の問題だと分かった。
ルールの置き場所でもうひと山
抽出結果は新規ルールファイル1本にまとめ、Claude Code 側と Codex 側の両方の設定に反映させた。証跡として、抽出の全記録(何件から何件に絞ったか、どう選別したか)は別途 memo に残した。ルールだけ残して根拠を捨てると、後で「この数字どこから来た?」となるからだ。
ところが反映後にステージングして差分を眺めていたら、Codex 側のルールファイルが git 管理の外にあることに気づいた。ホーム直下に置いてあって、エディタの差分パネルに一切出てこない。追跡できないと、せっかくルールを足しても改訂履歴が残らない。
そこで実体ファイルを git 管理下のディレクトリに移し、元の場所にはシンボリックリンクを張る構成に組み替えてもらった。Codex からは今までどおりのパスで読めるのに、差分はちゃんとリポジトリに出る。Windows でシンボリックリンクが張れるか(開発者モードが要る)を先にテストしてから移設した。最終的に、ルール13本・本体への追記・実体移設をまとめて意味のある粒度でコミットして、作業ツリーをクリーンにした。
やってみて思ったこと
一番の収穫は、自分の小言が「印象」から「数字と順位」に変わったことだ。「なんか毎回同じこと言ってる気がする」という曖昧な体感が、「70件・55件・34件」という具体的な件数になった瞬間、対策の優先順位が勝手に決まった。まず潰すべきは描画確認、次が依頼の解釈確認。迷う余地がない。
もうひとつは、生の抽出数を信じなかったのが効いた。2,327件をそのまま「2,300回キレました」と受け取っていたら、ノイズまみれの分析になっていた。9割をノイズとして弾く工程を並列エージェントに任せられたから、残った250件は本物だと胸を張れる。
途中、ふと「この作業、そもそも意味あるんだっけ」と手が止まった瞬間もあった。ログを掘って小言を数えるのは、コードを1行も進めない完全なメタ作業だ。だが上位5つが数字で並んだのを見て、迷いは消えた。これは「AIの改善」ではなく「自分がどこで妥協しているかの棚卸し」で、直すべきは半分こちら側にある。そう捉え直せただけで、掘った価値はあった。
そして、これは一度きりの棚卸しで終わらせる話ではない。過去ログという一次資料はこれからも溜まり続ける。同じ小言をまた言い始めたら、そのときはログを掘り直してルールに昇格させればいい。ルール自体にも「モデルが賢くなるほど、もっともらしい創作が上手くなるから上位モデルでも必ず適用する」と但し書きを付けておいた。AIに同じ失敗を繰り返させないための仕組みが、今日ひとつ手に入った。