前回の記事では、AIレビューで見つかった指摘を一件ずつ潰すのではなく、
- 同じ原因の問題をまとめて探す
- 修正した内容そのものも再レビューする
- 同じ種類の問題が繰り返し出るなら構造から見直す
といった形で、レビュー後の動きを AGENTS.md に持たせた話を書きました。
その過程で、もう一つ整理したことがあります。
レビューで見つかったものを、全部その場で直す必要はない。
人間がレビューする場合なら当たり前の話ですが、AIにある程度自律的に作業を続けさせようとすると、この判断を明示しておかないと、レビュー指摘によって作業範囲がどんどん広がっていきます。
今回は、
今回直さないレビュー指摘をどう扱うか
から始まり、
その判断や知見を次の作業にも使えないか
と考えてKnowledge Baseまで作ろうとし、最終的に撤回したところまでを書きます。
TL;DR
レビュー指摘を、次の4つに分けられるようにしました。
| 判定 | 扱い |
|---|---|
Accept now |
今回対応する |
Reject |
採用しない |
Defer |
今は対応せず、条件が来たら再考する |
Observe |
判断材料が足りないため経過を見る |
すると今度は、Defer や Observe にしたものを「あとで考えられる状態」でどこかに残しておく必要が出てきます。
まず workbench/ に非authoritativeな形で保持する仕組みを作りました。
さらに、レビューから得た知見そのものをKnowledge Baseとして蓄積し、別の作業でも再利用できないか試しました。
実際、過去の知見を与えるとAIの調査が深くなるケースは確認できました。
ただし、その影響はレビューの補助に留まりませんでした。過去の知見をもとに、現在の設計上のownershipやarchitectureまで変更する方向に推論が広がりました。
知識は役に立つ。でも、その知識にどこまで設計へ口を出す権限があるのか。
そこを安全に決められず、Knowledge Baseは採用を見送りました。
最終的に残ったのは、
「知識を全部覚えさせる」より、「あとで扱う仕事を適切に残す」方が先ではないか
という感覚でした。
レビュー指摘を全部その場で直すのをやめた
AIレビューを繰り返していると、指摘にはいろいろあります。
たとえば、
- 今回の実装に直接必要な修正
- 今回とは別の改善案
- 将来的には良さそうだが今は不要なもの
- 本当に問題になるか、まだ判断材料が足りないもの
です。
これらを全部「レビューで見つかったから直す」と扱うと、レビューをするたびに作業範囲が広がります。
そこで、レビューやフィードバックを受け取ったときに、まず扱いを分けるようにしました。
| 判定 | 意味 |
|---|---|
Accept now |
今回の作業として対応する |
Reject |
意図的に採用しない |
Defer |
今はやらないが、条件が揃えば再考する |
Observe |
現時点では判断せず、状況を見る |
この仕組みを入れたのが次の変更です。
- PR #30
https://github.com/joyrswd/AIDDSkeleton/pull/30 - commit
08ded669
https://github.com/joyrswd/AIDDSkeleton/commit/08ded669da3b45629c0601c9f8fe8ba81e99fd26
ここでやりたかったのは、単にレビュー指摘を先送りできるようにすることではありません。
レビュー結果が、そのまま現在の作業範囲を拡張しないようにすることでした。
でも「あとで考える」は、どこに置くのか
Defer を作ると、すぐ次の問題が出ました。
あとで考える
と言ったものを、本当にあとで考えられるのか。
会話の中だけに残していたら、別のセッションでは簡単に埋もれます。かといってIssueとして全部管理するほどでもないし、採用済みの要件や設計を置く場所に入れてしまえば、今度は正式に採用されたもののように見えてしまいます。
そこで使ったのが workbench/ でした。
当時の workbench/ は、まだ採用していない検討材料や調査結果などを扱う場所でした。
ここに、
- なぜ今は対応しないのか
- どの状況になったら再考するのか
- 現時点ではどの程度重要なのか
といった情報と一緒に、Defer や Observe の内容を残せるようにしました。
重要なのは、
残したからといって、採用されたわけではない
ということです。
workbench/ にあるものは、あくまで再評価可能な材料です。TODOリストでもなければ、将来必ず実装する約束でもありません。
そこで思った。「レビューの知識そのものを残せないか?」
ここまでは、個別のレビュー指摘を残す話です。
でもレビューを続けていると、もう少し欲が出てきます。
たとえば、ある作業で永続化まわりの失敗経路をレビューし、
正常系だけではなく、途中失敗や復旧経路も見ないと危ない
という知見を得たとします。
別の作業でも似た構造が出てきたとき、またゼロから同じことを考えるより、
過去にこういう失敗パターンがあった
という知識をAIが持っていた方が、レビューが深くなるのではないか。
つまり、
レビュー結果ではなく、レビューから得た知見を再利用したい
と考えました。
そこで一度、Knowledge Baseを作る方向に進みました。
この実験を含んでいたのがPR #31です。
- PR #31
https://github.com/joyrswd/AIDDSkeleton/pull/31 - commit
0611d61
https://github.com/joyrswd/AIDDSkeleton/commit/0611d61bc0a73c0b6caf66add181386a11155a0f
Knowledge Baseは、ちゃんと効いた
Knowledge Baseのアイデア自体が、まったく役に立たなかったわけではありません。
AIDD Skeletonを適用した実プロジェクト側(Consumer)で、過去の知見を与えた場合と与えない場合を比較しました。
すると、過去の知見がある方では、
- 類似する失敗経路まで調べる
- より広い永続化リスクを考える
- 単発の修正だけでなく、共通する構造まで踏み込む
といった形で、推論が深くなるケースが確認できました。
つまり、
過去のレビュー知識は、次のレビューにちゃんと影響する。
ここまでは狙い通りです。
むしろ、問題はその先でした。
Knowledge Baseが設計にまで口を出し始めた
Knowledge Baseありのセッションでは、想定どおり永続化リスクをより広く追いました。
ところが、その影響はレビューの深掘りに留まりませんでした。
実験では、過去の知見を持った側が safe-log のownershipを変更し、さらにcollector/control architectureを追加する方向にまで踏み込みました。
推論が深くなったこと自体は成功です。
でも、その知見には、
現在の設計そのものを変更するauthorityを与えた覚えはありません。
ここで困りました。
過去のレビューで得た知見は、あくまで「こういう失敗パターンがあった」という参考情報のつもりでした。
ところがAIにとっては、それが現在の設計を変える根拠にもなり得ます。
ある作業で得た知見が、別の作業ではarchitectureを変更する理由として使われる。
するとKnowledge Baseに保存した情報が、事実上、設計authorityの一部を持ち始めます。
「参考情報なので従わなくていい」では解決しない
AIDD Skeletonでは、それまでにも責務の境界をかなり意識していました。
たとえば、
- Requirements
- Design
- Testing
- 実装
- レビュー結果
は、それぞれ同じものではありません。
そこへKnowledge Baseを追加して、
Knowledge Baseは参考情報です。
正式な設計ではありません。
と書けば解決するかというと、そう単純でもありません。
AIはKnowledge Baseを読んだ時点で、その情報を推論の材料にできます。
「authorityはない」と書いても、
この過去の失敗を避けるなら、今回も構造を変えた方がよい
という推論そのものを止めるわけではありません。
逆に影響を弱くしすぎれば、今度はKnowledge Baseを持つ意味が薄くなります。
「いつ使ってよい知識か」を決められなかった
Knowledge Baseを本当に成立させるなら、少なくとも次のようなことを決める必要があります。
- どの知識を保存するのか
- どの範囲の作業で再利用できるのか
- いつ読み込むのか
- どのauthorityより弱いのか
- 現在のSoTと食い違ったらどうするのか
- 別プロジェクトへ持ち込んでよいのか
- いつ古い知識として捨てるのか
だんだん、単なる「レビュー知見のメモ」ではなくなってきました。
かなり大きな仕組みです。
そしてConsumerでの比較では、Knowledge Baseによって推論が深くなる効果と同時に、現在の設計や責務境界へ与える影響も確認できました。
効果がないからやめたのではありません。
効果はある。でも、その効果の範囲を安全に境界づけられなかった。
そこでKnowledge Baseの導入は取りやめました。
最後のコミットがこれです。
- commit
94d163b
https://github.com/joyrswd/AIDDSkeleton/commit/94d163b8a00bad1a4c3af5770a7af3a4303108af
docs: remove knowledge base governance
名前の通り、一度作ったKnowledge Base governanceを削除しています。
それでも「あとで考える場所」は必要だった
Knowledge Baseはやめました。
ただし、
Deferしたものをあとで再考したい
という最初の問題まで消えたわけではありません。
むしろKnowledge Baseを試したことで、必要なものの輪郭が少し見えてきました。
欲しかったのは、
過去の知識を何でも蓄積する場所
ではなく、
今はやらないが、条件が来たら再び扱うものを残しておく場所
だったのかもしれません。
知識そのものを蓄積するより、
あとで扱う仕事
として残した方が自然なのではないか。
そう考え始めると、今度は別の違和感が出てきました。
その置き場として使っていたディレクトリの名前です。
workbench/
「作業台」。
確かに最初はそんな場所でした。
でも、レビューで先送りしたものや、再開条件を持つものまで置くようになると、
もう単なるworkbenchではないのでは?
という話になっていきます。
そしてここから、AIDD Skeletonのディレクトリ構成そのものを見直すことになりました。
それは次の記事で書こうと思います。
関連リンク
AIDD Skeleton:
今回触れた主な変更:
- PR #30: Feedback triage / review recall
https://github.com/joyrswd/AIDDSkeleton/pull/30 - commit
08ded669:docs: govern feedback triage and review recall
https://github.com/joyrswd/AIDDSkeleton/commit/08ded669da3b45629c0601c9f8fe8ba81e99fd26 - PR #31: Recursive adversarial self-review / Knowledge Base experiment
https://github.com/joyrswd/AIDDSkeleton/pull/31 - commit
0611d61:docs: shift review learning into adversarial self-review
https://github.com/joyrswd/AIDDSkeleton/commit/0611d61bc0a73c0b6caf66add181386a11155a0f - commit
94d163b:docs: remove knowledge base governance
https://github.com/joyrswd/AIDDSkeleton/commit/94d163b8a00bad1a4c3af5770a7af3a4303108af
※この記事は筆者自身の開発経験・判断・問題意識をもとに、生成AI(ChatGPT)との対話を通じて構成・文章化しています。