AIが人の一覧を超えるとき

AIが人の一覧を超えるとき

第2回で、仕様書を「行番号の一覧」ではなく「条件」で書くようにした話を書きました。その狙いは、人が見落とした該当を、実装を全文走査するエージェントの側で拾わせることでした。

最終回は、それが実際に起きた場面を書きます。TAKTが、人の作った一覧にも仕様書にも無かった乖離を、自ら見つけた実例が3つあります。

1. 誰も挙げていなかった一覧

設計文書への反映作業で、走査が2件の該当を検出しました。

  • ある章の設定キー一覧に、新設した2つのキーが載っていなかった
  • 別の節の記述が、処理の起動時刻を固定値かつ特定のタイムゾーン固定として述べていた(実際には設定変更が可能になっていた)

この2件が示すことは、単に「見落としがあった」ということではありません。調査ラウンドの報告も、その報告を読んで書いたひかりの仕様書も、どちらもこの章を一度も挙げていませんでした。

つまり、人(ひかり)が2段階の工程を経て作った一覧に、この2件は最初から入っていなかったのです。 条件による走査でなければ、そのまま取りこぼしていました。

2. 仕様書に書いていないことを、TAKTが直した

もう一つは、性質が異なります。

あるテストの是正作業で、期待値が旧い仕様のまま残っていた箇所を直す指示を出しました。仕様書には「改めた箇所にコメントを残す」としか書いていませんでした。

ところがTAKTは、そのファイルの冒頭にあるコメントが、旧い仕様を断定的に説明していることを自ら見つけ、あわせて是正しました。

期待値だけを直していれば、そのコードの冒頭に、誤った前提を説明するコメントが残り続けるところでした。 テストは通りますが、次にそのファイルを開いた人は、冒頭のコメントを読んで誤解します。最も見つかりにくい種類の負債です。

3. 判断を仰いだ場面

三つ目は、TAKTが「直さなかった」例です。

同じ作業で、TAKTはある群のテストについて「これは仕様判断を要する」と報告し、そこで止まりました。実装を直すべきか、テストの期待値を直すべきかが、コードだけからは判定できないという理由でした。

この報告は正しいものでした。 課題管理表を確認すると、その論点についての方針が、過去の課題の記録として残っていました。コードには書かれておらず、資料の側にしか存在しない情報でした。

ここで重要なのは、TAKTが「判定できない」と正しく述べたことです。もし推測で片方を選んでいたら、確定済みの方針と食い違う実装になっていた可能性があります。

4. 3つの例から見える線引き

この3つは、それぞれ違うことを示しています。

場面 TAKTの振る舞い なぜ正しかったか
一覧に無い該当を発見 条件に該当するものとして報告 仕様書が「条件」で書かれていたため、一覧の外まで探せた
コメントの旧仕様を是正 仕様書に無いことを、自ら是正 是正の目的(旧仕様の記述を残さない)に照らして一貫していた
仕様判断が必要と報告 判断せず、止まって報告 コードの外にある情報が必要であり、推測すれば誤りえた

2番目だけが「仕様書に無いことをした」例です。 これを許容してよかったのか——連載を通して「指示にないことは独自に判断させない」と書いてきた立場からすると、矛盾するように見えるかもしれません。

しかし、2番目は「是正の対象を広げた」のではなく、「同じ是正を、同じ理由が当てはまる箇所に適用した」ものです。 旧い仕様の記述を残さないという目的は、期待値にもコメントにも等しく当てはまります。目的の範囲内での適用は、範囲の逸脱ではありません。

一方、3番目で止まったのは、目的そのものが定まっていなかったためです。「実装が正しいのか、テストが正しいのか」は、是正の目的の定義に関わる問いであり、コードからは決められません。

この線引きは、実は第7回で書いた人間側の作法とまったく同じ形をしています。 任された範囲では決める。任されていない範囲では止まって報告する。同じ原則が、人にも、対話AIにも、実装エージェントにも適用されています。

5. 走査を「書き込みの後」に置く

ただし、この自律性には条件があります。走査は、書き込みの前ではなく後に置きます。

これは経験から定まった順序です。先に走査させると、TAKTがその結果を踏まえて、編集範囲を自ら広げる余地が生まれます。 走査で見つかった該当を、そのまま「ついでに」直してしまえる状態になります。

そこで、書き込みを終えてから走査させ、該当が見つかっても「是正せず報告する」という形にしています。冒頭で挙げた2件も、この形で報告され、次のラウンドとして人が判断してから是正しました。

自律的に発見させることと、自律的に是正させることは、分けて設計できます。 発見の範囲は広く取り、是正の範囲は狭く保つ。この2つを混ぜないことが、走査を安心して任せられる条件になっています。

6. 連載のまとめ——8回で書いてきたこと

全8回を通して書いてきたことを、最後に整理します。

  1. 三層構造——人が決め、対話AIが仕様と検証条件を設計し、実装エージェントが実装する
  2. 仕様書は条件で書く——一覧は書いた人が見つけた範囲でしかない
  3. 報告ではなく検証手段を疑う——誤っているのは、たいてい確認コマンドの側である
  4. 完了確認は「止まる条件」まで書く——数値を報告させるだけでは足りない
  5. バックアップは作業の外側に置く——gitの挙動を把握しないまま復元に使わない
  6. 誤りは消せない、拾う——1セッションで7件、すべて書き込み前に検知された
  7. 工程は人の実行回数で数える——最適化すべきはAIの手間ではない
  8. 発見は広く、是正は狭く(本稿)

この8つに共通するのは、どれもAIの性能の話ではないということです。 より賢いモデルが出れば不要になる工夫は、この中に一つもありません。むしろ、エージェントが賢くなるほど、「どこまでを任せ、どこで止めるか」の線引きは重要になります。

第1回に書いたとおり、この連載は成功談ではありません。書いてきたのは、誤りの記録と、その誤りが実害になる前に止まった仕組みの話です。 誤りが7件あったセッションを「うまくいった日」と呼べるのは、7件すべてがどこかで止まったからにすぎません。

AIと開発するとは、AIに開発させることではありません。 誤りうる主体を複数並べ、それぞれが違う種類の誤りを拾えるように工程を組み、そのうえで人が決める——そういう作業のことです。

この連載が、同じ問題に取り組んでいる方の参考になれば幸いです。 8回にわたりお読みいただき、ありがとうございました。


参考リンク

動画作成には自信があります!

このサイトを任されることになりました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

PAGE TOP