第1部:AI駆動開発の深化 Step 4 / 36

AIの出力を検証する

AIは強力なツールですが、間違えることもあります。AIの出力を鵜呑みにせず、適切に検証することで、高品質なコードを維持できます。

AIが間違えやすいパターン

1. 存在しないAPIやライブラリの使用

AIは学習データに基づいて予測するため、実際には存在しない関数やメソッドを提案することがあります。

# 実際には存在しないメソッドを提案することがある
response = requests.get(url).json_auto_parse()  # ← 存在しない
確認方法: 公式ドキュメントで関数名を検索、または実際に実行して確認

2. バージョン違いによる非互換コード

古いバージョンの書き方や、まだリリースされていない新機能を使うことがあります。

# Next.js 12 の書き方を Next.js 14 で提案することも
export async function getServerSideProps() { }  # App Router では非推奨
確認方法: 使用中のバージョンを明示的に伝える、公式のマイグレーションガイドを確認

3. セキュリティ上の問題

SQLインジェクション、XSS、機密情報のハードコードなど、セキュリティ的に問題のあるコードを生成することがあります。

# 危険なパターン
query = f"SELECT * FROM users WHERE id = {user_input}"  # SQLインジェクション
API_KEY = "sk-xxxxxxxxxxxx"  # ハードコードされた機密情報
確認方法: OWASP Top 10を意識、環境変数の使用、パラメータ化クエリの使用

4. エッジケースの見落とし

null/undefined、空配列、境界値などの処理が抜けていることがあります。

# 配列が空の場合を考慮していない
const average = items.reduce((a, b) => a + b) / items.length  # items が空だとエラー
確認方法: 「空の場合は?」「nullの場合は?」と追加で質問

5. パフォーマンスの問題

N+1クエリ、不要な再レンダリング、メモリリークなど、動作はするが効率が悪いコードを生成することがあります。

# N+1 クエリ問題
for user in users:
    posts = db.query(Post).filter(Post.user_id == user.id).all()  # ループ内でクエリ
確認方法: 「パフォーマンスの観点で問題はありますか?」と質問

検証のチェックリスト

基本チェック

  • コードが実際に動作するか(実行してエラーがないか)
  • インポートしているライブラリは存在するか
  • 使用している関数・メソッドは実在するか
  • 既存コードとの整合性は取れているか

セキュリティチェック

  • ユーザー入力を直接SQLに埋め込んでいないか
  • 機密情報(APIキー等)がハードコードされていないか
  • 認証・認可のチェックは適切か
  • XSS対策(エスケープ処理)はされているか

品質チェック

  • エラーハンドリングは適切か
  • null/undefined の処理は考慮されているか
  • 既存のコーディング規約に従っているか
  • 不要なコードや冗長な処理はないか

AIに自己検証を依頼する

AIが生成したコードに対して、AI自身にレビューを依頼することで、問題を発見できることがあります。

セルフレビューを依頼

今書いてくれたコードについて、以下の観点でレビューしてください:

1. セキュリティ上の問題はありますか?
2. エラーハンドリングは十分ですか?
3. エッジケース(null、空配列など)は考慮されていますか?
4. パフォーマンス上の問題はありますか?
5. 改善できる点はありますか?

特定の観点でチェックを依頼

このコードにSQLインジェクションの脆弱性はありますか?
問題がある場合は、安全なコードに修正してください。

注意:AIの自己レビューは万能ではありません。最終的な判断は人間が行い、特に重要なセキュリティ面は専門家のレビューも検討してください。

テストで検証する

AIが生成したコードにテストを書いてもらい、動作を検証します。

テストコードの生成を依頼

今作成した関数のテストを書いてください。
以下のケースを含めてください:

1. 正常系:期待通りの入力で期待通りの出力が得られる
2. 異常系:不正な入力でエラーが発生する
3. 境界値:0、空文字列、空配列などの境界ケース
4. エッジケース:null、undefined、特殊文字など

テストの実行例

# バックエンド(Python / pytest)
pytest tests/ -v

# フロントエンド(Jest)
npm test

# E2Eテスト(Playwright)
npx playwright test

実践的な検証フロー

1

コード生成

AIにコードを生成してもらう

2

目視確認

明らかなおかしい点がないか、ざっと確認

3

実行テスト

実際に動かしてエラーが出ないか確認

4

セルフレビュー依頼

「このコードに問題はありますか?」とAIに聞く

5

テストコード生成・実行

自動テストで動作を検証

6

問題があれば修正依頼

発見した問題を伝えて修正してもらう

まとめ

  • AIは間違える - 存在しないAPI、バージョン違い、セキュリティ問題など
  • チェックリストを使う - 基本、セキュリティ、品質の観点で確認
  • AIに自己レビューさせる - 「問題はありますか?」と聞く
  • テストで検証 - 自動テストで動作を確認
  • 最終判断は人間 - 特にセキュリティは慎重に
複雑なタスクの分解術 次へ:AIに設計を相談する