/note/tech

AIエージェントに影響調査と概算見積もりの一次請けを任せる ── 精度ではなく「見落とし」を潰す

要約:

■ 1. 背景と課題

  • 取り組みの概要:
    • ZOZOTOWNのカート・決済・注文作成領域の一次調査を、AIエージェントのDevinに一次請けとして任せた
    • 決済ドメインではミスが金銭的な事故や障害に直結するため、エージェントを任せられる状態にする工夫が主題となる
    • 精度を左右したのはDevin本体よりも、ナレッジベースとプレイブックという2つの準備だった
    • まだPoC段階であり、効果測定は今後実施するため具体的な数値はない
  • 調査待ちによる意思決定の停滞:
    • 改修のたびに影響範囲の洗い出し、実現可能性の判断、概算見積もりが必要で、毎回時間がかかる
    • その間、問い合わせ元の他部門は次に進めず、調査速度が他部門の意思決定速度を決めていた
  • エンジニアが向き合う問い:
    • 自部門と他部門のどちらの管轄か
    • 実現可能か、既存の設計と矛盾しないか
    • どこに影響が及ぶか(抜け漏れなく)
    • ざっくりどれくらいの工数か
  • 横断調査の重さ:
    • カート決済領域は複数のマイクロサービスに分かれている
    • 小さな改修でも、領域内のサービスをすべて網羅しないと影響が抜け落ちる

■ 2. 設計の出発点

  • 誤りの2分類:
    • 許容できる誤りは、余計な指摘(偽陽性)
    • 許容できない誤りは、影響範囲の見落とし(偽陰性)
    • 見落としは実現可能と判断して進んだ後に発覚し、手戻りにつながる
  • 精度を主目的から外す判断:
    • ある程度の雑さは受け入れ、設計は見落としを潰すことだけに寄せた
    • 一次調査で見積もりが大きくズレる支配的な要因は、見えていない影響の後からの発見だった
    • 狙うのは個々の精度ではなく影響範囲の網羅であり、以降の設計判断はほぼすべてここから導かれる
  • 一次調査の範囲:
    • スコープ判定、影響範囲の洗い出し、実現可能性の判断、概算見積もりまでを指す
    • 目的はエンジニアの調査コストを下げ、意思決定の入口で待たせないこと
  • エージェントに渡すものの線引き:
    • 見せるのはリポジトリのソースコードだけで、本番環境や顧客データには触れさせない
  • この仕組みの危険箇所:
    • 危ないのは調査を走らせることではなく、返ってきた結論が誤っている場合
    • 誤った結論はレビューで止めない限り下流に残り、いずれ障害につながるため、人によるレビューが要となる
  • Devinを選んだ理由:
    • 複数リポジトリを跨いで調べられ、アクセスとcloneを代行するためローカルの準備が不要
    • コマンド実行がサンドボックス内で完結する
    • ここまでは他のコーディングエージェントでも実現でき、内容はDevin固有の機能に依存しない
    • 決め手は社内にすでに導入済みで、横断調査用の環境を自前で用意・運用せずに始められたこと

■ 3. 準備1: ナレッジベース

  • 要望をそのまま投げるだけでは不十分:
    • 単一リポジトリで完結する調査なら、Devinはそのままでも十分に働く
    • 領域を跨ぐ調査では、どこまで探せば足りたのかをエージェント自身が判断できない
  • 登録基準:
    • コードから読めるものは登録せず、1つのリポジトリを読むだけでは分からない知識だけを登録する
    • 実装の詳細を書き写しても調査の質は上がらず、リプレイスが進む領域ではすぐ古びて足を引っ張る
  • 登録する5つの知識:
    • 共通点は、実装はコードにあるのに意味づけがどこにも書かれていないこと
    • 領域の範囲とリポジトリ一覧は、「この領域は全部でこれだけ」がどこにも書かれていない
    • スコープの境界は、管轄が書かれておらず、取り違えると要望が誰にも拾われず宙に浮く
    • 横断の波及は、呼び出し関係が呼ぶ側にしか書かれていない
    • 本番の前提は、機能フラグの本番値が設定側にあり、実際の分岐が分からない
    • 守るべき設計意図は、「あえてリトライしない」理由が二重処理防止だとは書かれていない
  • 5つの知識の依存関係:
    • 領域の範囲とスコープの境界が土台となり、その上に残り3つが乗る
    • 範囲が決まっていないと、エージェントは手元のリポジトリだけを調べて完了だと報告する
    • 波及先の全体像がなければ、逆引きの表を書きようがない
  • 波及の逆引き登録:
    • 波及は呼び出しだけでなく、データ連携を通じて別サービスやその先のキャッシュまで届く
    • 「この種の変更はどこへ波及するか」を逆引きできる形で登録する
    • 「メール文面の変更だけ」に見える要望が、裏で別システムの改修を呼ぶような隠れた依存をあぶり出す
    • 同じリポジトリ内はまず見落とさず、危ないのはその一歩外である
  • 分かっていないことの登録:
    • 答えではなく問いの形で残す
    • 残っているのは、調べれば分かるが優先順位を付けて後回しにしたものばかり
    • 書いておかないと、調べていないことと調べて問題がなかったことを区別できない
    • 答えはすぐ変わるが、問いはほとんど変わらない
  • 登録しないもの:
    • テーブル一覧やクエリ全文などの実装詳細は、所在を指すポインタと辿り方の手順だけを残す
    • 決済手段の種別や機能フラグの現在値などの流動的な値は、どの設定ファイルにあるかだけを残す
    • 工数の人日は何も残さず、算出はプレイブックの仕事とする
  • 書き写しの弊害:
    • 二重管理になり、コードが変わるとナレッジが取り残される
    • 整った古い一覧は、かえって誤った安心を与える
    • 古い設定値が残っていると、Devinが古い前提のまま「影響なし」と誤判断しかねない
  • 登録方法の振り分け:
    • どの経路でも何かは登録し、違いは中身を書くか、所在だけ書くか、問いとして書くかである

■ 4. 確度タグ

  • 導入の理由:
    • 本来は全内容を実装で裏取りするか、チームで合意してから登録すべきだが、全部は確認しきれなかった
    • 本番でどちらの分岐を通るかなど、実装からは確定できないものもある
  • 代表的なタグ:
    • [実装確認]は、コードを直接読んで確認した事実
    • [推測]は、論理的に推論したが実装は未確認のもの
    • [要確認]は、人間の確認が必要な不明点
    • 実際は設定ファイル由来か、人間と合意した知識かなど、根拠の出所に応じてさらに細分化している
  • 記述の形式:
    • 1行が1つの事実で、行ごとにタグを付ける
    • 確定した事実と未解明のことを、節を分けず同じ粒度でリストに並べ、タグだけで区別する
    • 「未確認事項」という別の節にまとめると読み飛ばされる
  • 推測の潰し込み:
    • 残った推測を一件ずつ実装で裏取りした
    • 確認できたものは[実装確認]へ格上げし、確認しきれなければ[要確認]へ格下げした
    • この潰し込みで、推測はほとんど残らなくなった
  • ナレッジベースの役割:
    • タグ導入前は推測と事実が平坦な文章で並び、レビューで何度かヒヤッとした
    • 渡した知識の確からしさを、そのままDevinの回答に引き継がせる
    • 出力そのものの言い切りを抑えるのは、プレイブックの仕事である

■ 5. 準備2: プレイブック

  • プレイブックの構成:
    • 調査の進め方と出力フォーマットをテンプレート化し、Devinに毎回守らせる
    • 影響調査用と見積もり用の2本に分けた
    • 調査の途中で工数の話が混ざると、影響範囲の洗い出しが雑になるため
  • 自己反証を強制する指示:
    • 最終判断はエンジニアが行い、Devinは判断せず材料を網羅的に提示する
    • 「見ていない範囲」を必ず明示させ、誤った安心を与えない
    • レポートへの反証を2つ、最も危うい見落としを1つ挙げさせる
    • 工数は単一値ではなく、楽観〜悲観のレンジで出させる
  • 禁則事項:
    • 「〜せよ」より「〜するな」の方が、守られたかを後から確認しやすい
    • 推測で埋めず、不明点は「不明」「要確認」と明記させる
    • 見ていない範囲やトレードオフ、技術的リスクを隠させない
    • 致命傷の見落としリスクがある領域を「問題なし」と断定させない
    • 最も恐れているのは「影響なし」という出力であり、断定の禁止が最重要
  • 固定チェックリスト:
    • 汎用の自己反証だけでは、どこを重点的に疑うべきかがエージェント任せになる
    • シニアエンジニアが暗黙にもつ「毎回見る」観点を、固定のチェックリストとして毎回通過させる
    • 金銭計算への影響として、税や割引の適用順序が変わらないかを確認する
    • 二重処理を防ぐ条件や状態遷移を壊していないかを確認する
    • コンプライアンス上のスコープに触れていないかを確認する
    • システム間の境界を越えて波及しないかを確認する
  • 探索の3観点を並列実行:
    • 呼び出し元トレースは、直接・間接の呼び出し元、インタフェース実装、DI経由、イベントハンドラを追う
    • 類似コード検出は、同じロジックのコピーや変数名だけ違う類似実装を探す
    • データフロー下流は、DB操作、キャッシュ、イベントの下流消費者を追う
    • 類似コード検出は地味だが、コピーされた実装の片方だけを直す事故を防げる
  • 二段構えの効果:
    • ナレッジベースに登録した勘所を、プレイブック側で毎回強制的に再確認させる
    • 理解の浅いエージェントや、ドメインに不慣れなレビュアーでもベテランの確認観点を受け取れる
  • 出力の型:
    • スコープ判定、実現可能性、影響範囲、リスク、工数の手がかり、覆り条件、見ていない範囲の順に固定する
    • Devin自身に調査の穴を開示させ、推測を言い切らせないための型である

■ 6. 運用フロー

  • 一次調査はDevin、最終判断は人間:
    • 要望や検討テーマを受け取る(他部門発でも自部門発でもよい)
    • Devinが一次調査し、確度タグ、覆り条件、見ていない範囲を付けて出力する
    • エンジニアが見落としや不確実な点を補って検証する
    • 「可能」か「条件付き可能」なら回答して意思決定を速め、「不可」なら早期に足切りする
  • エンジニアの仕事の変化:
    • 各機能の担当への個別の問い合わせをDevinがまとめて肩代わりし、特定の人を介さず調査が回る
    • エンジニアの仕事は初動調査から、たたき台のレビューに変わる
    • 人手がまるごと消えるわけではなく、浮くのは初動である
    • ゼロから全リポジトリを読む代わりに、Devinが挙げた候補の検証に集中できる
  • 出力例のポイント:
    • 施策の対象条件変更の例では、割引が税計算より前段のため課税対象額が変わる点まで挙がる
    • どの項目にも確度タグが付き、最後に覆り条件と見ていない範囲が必ず添えられる
    • 見ていない範囲は調査の観点ごとに書かせ、まとめると書きやすい観点だけで終わる
    • エンジニアは[要確認]と見ていない範囲を起点に検証へ入れるため、当たりを付けやすい
  • 自己申告のタグへの注意:
    • 出力のタグにはナレッジ由来のものと、Devinが自分の調査結果へ付けた自己申告が混じる
    • そのためレビューでは、特に[実装確認]の裏取りを優先する

■ 7. 工数見積もりの扱い

  • 単一の人日を出させない:
    • Devinはチームの生産性を把握しておらず、1点で当てにいけば構造的に外れる
    • それ以上に、整った数字がそのまま事業の期日として約束されることが危うい
  • レンジでの算出:
    • 工数を左右する要素を分解させ、工程ごとの重みとバッファを掛けて楽観・標準・悲観のレンジを出させる
    • 狙いは精度ではなく、実装以外の工程を毎回思い出させること
    • テストとレビューは抜けにくいが、リリース準備、関連チームとの調整、運用手順の更新は抜け落ちがち
  • 見積もり例:
    • 単位は人日ではなく、実装を1.0とした相対的な作業量とする
    • 実装3に対して標準は10.9となり、実装は全体の3割にも届かない
    • 悲観が跳ね上がるのは覆り条件を1つ積んだためで、その差分が先に潰すべき不確実性の大きさを示す
    • 数字を実際の期日に落とすのはエンジニアの仕事である
  • 案の選択は人間:
    • 複数案から選ぶのは人間の仕事で、エージェントには推奨する一案だけを深掘りさせる
    • 採用理由、トレードオフ、固有のリスクまで調べさせる
    • 当初は複数案を出させていたが、一案に絞った方が深く掘れるため外した
    • プレイブックも、盛り込みすぎると現場で回らなくなる

■ 8. 効果指標と自動化の線引き

  • 指標は仕組みを作る前に決める:
    • 後から決めると、都合のよい数字を選んでしまう
    • 判定反転率は、エンジニアの検証でDevinの結論が覆った割合を測る
    • 規模感レンジ命中率は、実績がDevin起点の見積もりレンジに収まった割合を測る
    • 初動リードタイムは、要望の受領から一次回答までの日数を測る
  • 主指標は判定反転率:
    • 偽陽性はエンジニアが切るだけで済むが、偽陰性は実装後に障害化する致命的な誤り
    • スコープ判定や実現可能性を覆す主因はほぼ見落としであり、反転率の高さは見落としの多さを映す
    • 反転率を十分に低く保てるかが、本格導入の判断ラインとなる
  • 見落とし率による振り返り:
    • レビューで追加発見した影響点を全影響点で割り、案件ごとに反転の原因を振り返る
    • 全影響点は本来観測できず、エンジニアのレビューを正解とみなした近似にすぎない
    • Devinとエンジニアがそろって見落とした影響点は分母に入らず、実際より小さめに出る
  • リスク階層による自動化:
    • 自部門と判定したスコープ判定は、おおむね低リスクでDevin主導でよい
    • 対象外と判定したスコープ判定は、取りこぼしになりうるため人間が確認する
    • 一般的な影響調査は、判定反転率が安定したら委譲を広げる
    • 高リスク領域の影響調査は、結果によらず人間の検証を必須にする
  • レビューが精度の生命線:
    • 構造化された調査結果には独特の説得力があり、そのまま信じると探索範囲がDevinの枠組みに縛られる
    • するとDevinの見落とし箇所を人間も一緒に見落としかねない
    • Devinの出力は確定した結論ではなく「裏取りすべき手がかり」として扱う
    • レビューを省いた瞬間に、仕組みはむしろ危ういものになる

■ 9. 導入の順番とコスト

  • ナレッジベースが必要な領域:
    • 単一リポジトリで完結する領域ならほぼ不要で、プレイブックに禁則事項を数行足すだけで足りる
    • 価値が出るのは、リポジトリを跨ぐ波及があり、本番の挙動がコードから確定できない領域
  • 推奨する整備順:
    • まず領域の範囲と関係リポジトリの一覧を作り、これがないとエージェントは「全部見た」と言えない
    • 次に他部門との紛らわしい境目の判定表を作り、管轄の取り違えという最悪の見落としを減らす
    • 最後に横断の波及マップを作り、これが一番重く一番効果的である
    • 最初の2つは土台であり、それだけでも仕組みは回り始める
    • 波及マップは継続的な更新が要るため、誰が維持するかを決めてから着手する
  • 構築コスト:
    • ドメインに詳しいエンジニアの約3人日をかけた
    • 対象リポジトリは15本、ナレッジベースは14ファイル4,107行、プレイブックは2本481行
    • 下書きをエージェントに任せ、人間の時間は確度タグ付けと実装での裏取りに充てた
  • 実行コスト:
    • 一次調査1件は依頼から出力まで5分前後で、消費は1〜2ACU程度
    • 準備の3人日と比べ、1件あたりの利用料は桁違いに小さい

■ 10. ナレッジの維持

  • 古いナレッジの危険性:
    • いま一番の課題はナレッジの更新である
    • 古いナレッジはナレッジがない状態より悪く、空欄なら人は調べるが、それらしい記述があれば信じる
    • コードは壊れればテストが落ちるが、ナレッジは古くなっても何も起きず、劣化が目立たない
  • 定期見直しの失敗:
    • 棚卸しの予定を決めても、日々の案件に押されて後回しになり機能しなかった
  • 検討中の対策:
    • Devinが古い記述に引きずられて間違えたら、棚卸しを待たずその場でナレッジを直す
    • 判定反転率の増加は、Devinの問題ではなくナレッジ陳腐化のサインとして検知に使う
  • 維持できる量に絞る:
    • 量を絞ることが、維持する努力より先に来る
    • 登録基準は抜け漏れ防止と同時に、量を抑えて維持コストを下げる線引きでもある
    • 書き写さず、値ではなく所在を残し、答えではなく問いで書く形は、更新しなくても腐りにくい
  • 人の問題:
    • 作った人が異動したら止まる状態のままなら、いずれ誰も信じないドキュメントになる

■ 11. まとめ

  • 効果の源泉:
    • 効果的だったのはエージェントの性能そのものより、それを取り囲む準備と運用モデルである
    • 目指すのは入口の判断で他部門を待たせないことであり、調査の効率化はその手段である
  • 要点:
    • 知識に付けた確度タグで、確からしさを出力へ引き継ぐ
    • プレイブックで自己反証を強制し、断定が独り歩きしないようにする
    • 主指標は判定反転率とし、人間の検証を前提にリスク階層ごとに少しずつ自動化する
  • 運用上の教訓:
    • 整った出力に人間が引きずられ、Devinの見落としを見逃しかけたことが一度ではなかった
    • レビューを軽く見た瞬間に崩れる仕組みである
  • 今後の展望:
    • 現在は自部門だけの取り組みである
    • 同じ枠組みを共通フォーマットとして他部門に広げれば、部門を跨いだ影響調査も見えてくる
    • 各部門がばらばらの形式で作ると境界で連携できず、横展開の成否はフォーマット統一にかかっている