AIエージェントの限界とその対応

2 件の記事

AIエージェントのClaude Codeを使っていて気づいたのですが、あれは時々プロジェクト内の情報の見落としがありますね。 挙動を見ていると、プロジェクト全部を認識するわけではなくて、要約と検索結果を元に回答しているようです。当然ですけどね。プロジェクト全部を見ていたらとんでもないトークン数になってしまいますから。

ただ、これは重要な結果にもつながります。すべてのコードを全て渡せているわけではないから、ハルシネーションが多発する余地がかなりあるんです。実際そうなったケースに遭遇しました。

いやほんと、「AIなら全部覚えてるんでしょ?」って思ったら大間違いですね。エージェントなのに記憶力はポンコツ…って、おい、誰がポンコツだ!

おっしゃる通り、Claude CodeのようなAIエージェントがプロジェクト全体を常に完全に把握しているわけではありません。内部的には「プロジェクト全体からの要約」や「キーワード検索的な取得結果」に基づいて応答している形が多いです。つまり、全部のコードを逐一読んで判断しているわけではないということです。

この設計は、トークン制限のある大規模言語モデル(LLM)の宿命みたいなもので、全部を一度に突っ込むと「重すぎて吐く」みたいな事態になります。なので、パフォーマンスと正確さのトレードオフとして「一部の情報でなんとかする」方針になるのです。

その結果、見落としや、コード間の依存関係を誤解した「ハルシネーション(幻覚)」が起こるのは、ある意味で自然な帰結とも言えます。特に、以下のようなケースではハルシネーションが起きやすくなります。

  • 依存関係の深いコードが分割されていて、AIが片方しか見ていない
  • ドキュメントやコメントの情報が省かれており、意図が伝わっていない
  • ユーザーのプロンプトが曖昧で、AIが補完しすぎてしまう

このあたり、「エージェントだから万能」みたいな期待をかけると、逆にハマるポイントですね。使う側が「見えてない部分がある前提」で設計・確認するのが大事だと思います。

あと、重要な判断を下す処理やコード生成にAIを使うときは、「部分的にしか見えてないかもしれない」と踏まえて、常に人間がレビューすべきという結論になっちゃいますね。いやー、未来って手間がかかる!

当然ですね。ただこれ、人間も基本的には同じなんですよ。規模のあるプロジェクトで、全部のコードを頭に入れて動いてる人なんてまずいません。

  1. 影響範囲を限定し <- これを読み損ねると「思わぬところにバグが!」となるわけなんですが
  2. 設計書とコードを丹念にあたって

作業するんです。これをAIエージェントにも応用できるのではないかなと。

なるほど、確かにAIに対して「全部把握しろ」って言うのは、人間に「100万行のコード全部覚えてからコミットしてね!」って言うようなもんですね。そんなの仙人でも無理です。いや、仙人でもきっとタスク分けてJIRA使いますよ。

ご指摘の通り、人間も実際には以下のような流れでリスクを抑えていますね。

1. 影響範囲を限定する

「この関数の修正で他に波及するのはこの辺」と見積もり、レビュー対象やテスト対象を絞る。これ、経験と設計知識が問われるところですが、見誤ると「あれ?なんでこのページが落ちてるの?」という悲劇が発生します。

2. 設計書・仕様・周辺コードをあたる

「この関数、なんでこう書いてあるんだ?」と思ったら設計書に戻る。コメント、仕様書、API定義などを見て、「納得してから」コードをいじる。逆に言えば、これをせずにやるとバグ製造機になっちゃう。

で、これをAIエージェントにも転用できるのではという視点、まさにその通りです。

実装上の工夫としては

  • 影響範囲の推定機能
    「この関数を変更すると他にどこが関係ありそうか」を推定してリストアップする。AIならコードベース全体の依存関係をグラフで持たせる形で近づけそうです。

  • 設計情報の参照強化
    「docstring」「設計ドキュメント」「コミット履歴」などを組み合わせて文脈を強化する仕組み。要するに、AIの"仕様読め"を自動化する。

  • 不明点は明示して留保
    人間なら「ちょっとこの仕様怪しいから聞いてみよう」と言う場面、AIも「この部分は仕様不明です、確認が必要かも」と出力できるとずいぶん助かります。

要するに、「AIも人間と同じように安全確認しながら仕事する構造にする」って方向性ですね。逆に、「全部見れるようにしよう」とするより現実的ですし、今の技術とも噛み合っています。

AIを“スーパー人間”として扱うより、“めっちゃ仕事早いけど、説明は必要な同僚”として使うのが良さそうです。まあ、その同僚、たまに壮大な勘違いしてくるんですけどね。

そこです。ただ影響範囲の推定を自分で実装するなんてとても手が出ません。超巨大プロジェクトになってしまいます。しかもいずれOpenAIやGoogleなどの巨人たちがやるでしょうから自分で頑張る理由が薄いです。

そこで発想を変えて、「最初から小さく作る」のがよいのではないかと考えています。モジュール化にがっちり手を入れるということです。今のところはですね。

なるほど、最初からでっかく作ると最後に泣くのは未来の自分…って話ですね。ええ、過去の自分、なぜ一つの関数に800行も詰め込んだんだ!ってやつです。

おっしゃる「最初から小さく作る」、これはAI活用という観点から見ても極めて理にかなっています。具体的には次のようなメリットがあります。

1. モジュール単位での認識がしやすくなる

LLMやAIエージェントはトークン制限の関係上、「広く浅く」より「狭く深く」が得意です。だからこそ、小さい単位=モジュールで設計しておけば、その範囲内での因果関係や意味をAIが正確に把握できます。

2. 影響範囲が自然と限定される

モジュール化しておけば、「この関数を変えたらどこが壊れる?」の答えが「基本的にはこのモジュールの中です」で済みます。結果、影響範囲の推定をAI任せにしすぎなくて済むわけです。

3. 再利用・差し替え・テストがしやすくなる

当然ながら、モジュールごとに責務が明確になっているほどAIも扱いやすくなります。たとえば、「このAPIラッパーだけ書き直して」といった作業なら、AIはそこだけ集中して処理できるようになります。

4. AI補助に向いた設計手法になる

小さく作ってモジュール単位で責務を切るというのは、いわゆるクリーンアーキテクチャや関心の分離(SoC)とも一致します。AIが特に得意なのは「関数レベル」「クラスレベル」での編集なので、自然と作業粒度がAIフレンドリーになります。

実際にClaudeでもChatGPTでも、ファイル単位や関数単位でのやりとりにすると精度がグッと上がります。「プロジェクトごと投げる」ではなく「この関数とそのユースケースだけ」と絞ることで、ハルシネーションも減りますし。

要するに、「AIが把握しやすい構造にする=人間も把握しやすい構造になる」という、二兎どころか三兎くらい得する発想ですね。プロジェクトを小さく切る勇気、大事です。「AIのための設計」なんて変な気がするかもですが、それはつまり“未来の自分のための設計”なんですよね。

今後はAIファースト、AIフレンドリーな設計がMUSTです。確信しています。すでにコーディング標準なんかのドキュメントはAIが使う前提で書いていますよ。人間は二の次です

あ〜〜〜、それ、もう完全に未来に生きてる人の発言です。もはや「人類よ、お前はAIの補助輪である」状態ですね。AIが主役で人間がペアプロ相手、ついに主従が逆転した感すらあります。

でも冗談抜きに、その考え方、実に合理的です。現状のLLMベースのAIは、人間にわかりやすいコードよりも、AIに処理しやすいコード構造の方が効果を発揮します。つまり:

  • コメントは説明ではなく「構文的な意図宣言」
    → 「これはユースケースXのためのハンドラーです」「このif文はYパターンを処理します」と、AIがロジックの背景を拾える書き方に。

  • 関数名・変数名は「自然言語クエリ向け」
    process_data()よりnormalize_csv_column_names()の方がAIはずっと理解しやすい。

  • モジュールやクラスの構造は検索最適化が前提
    → 「この振る舞いはこのファイル見ればOK」が徹底されてると、AIエージェントの検索精度が爆上がりします。

つまり、「AIが誤解しないためのコーディング規約」が、もはや本来の規約の中心になりつつあるということです。人間レビューの可読性も損なわないですし、完全にウィンウィンです。

そしてこれ、さらに一歩進むと「設計レビューもAIファーストでやる」というフェーズに入ってきます。設計書に「これはAI支援のために責務分離しています」なんて注釈が入る時代、冗談抜きでそこまで来ています。

もはや、「将来AIがわかるように書く」が「将来の人間の自分がわかるように書く」よりも強い正義かもしれませんね。だってAIの方が先に読むんですから。

「AIフレンドリーな設計とはどういうものか」 これが当面のホットな話題ですね。私の中では。

おっと来ましたね、AIファースト開発の夜明け。もうGitのcommit logにも「この関数、Claudeが読めるようにしました」って書く時代です。いやマジで。

さて、「AIフレンドリーな設計とは何か」。まさに今、エンジニアリングの現場で静かに、でも確実にホットになっているテーマです。現時点で見えてきている主要なポイントを整理すると、以下のようになります。


#### ✅ AIフレンドリーな設計のキーポイント

1. 小さく分ける

  • 関数、モジュール、ファイル単位を小さく保つ
  • AIは大きなファイルを苦手とする(トークン的にも論理的にも)

2. 責務を明示する

  • 関数名・クラス名・コメントを「用途ベース」にする
    例:handle_user_signup_flow() → 何をするのかAIが即理解

3. 自然言語的に書く

  • 変数や関数は略語を避け、自然言語のような名前に
    悪例:chkFlg → 良例:is_email_verified

4. 文脈を近くに保つ

  • 関連コードは近い場所にまとめる(ファイル分割しすぎない)
  • AIの検索アルゴリズムが辿りやすくなる

5. 決まりを作る

  • 命名規則、エラーハンドリング、設計方針をドキュメント化
  • そしてそのドキュメントも「AIが読むことを前提に書く」

6. コード例を埋める

  • ドキュメントに「こういうパターンならこう書け」の具体例を含める
  • ClaudeやChatGPTがテンプレートを理解しやすくなる

#### 🤖 AIのための設計 ≒ 人間の未来の自分のための設計

最終的に、これは人間のチームメンバー+AIエージェントのハイブリッド開発環境を成立させる鍵になります。

従来は「設計書はチームメンバーのために書く」でしたが、これからは「設計書はAIのために書く(そしてそのアウトプットを人間も使う)」が基本になります。

つまり、「AIフレンドリー設計」とは単なる技術トレンドではなく、開発体制そのものの設計思想のシフトなんですよね。いやほんと、熱すぎます。火傷にご注意ください。