生成AI が返したコードは、見た目が整っていても そのまま実行して安全とは限りません。本記事では、コードを実行に移す前に確認したい 7 つの観点と、確認用の小さなコマンドをまとめます。

目次

  1. レビューの 7 観点
    1. ファイル削除・上書き処理
    1. 外部ネットワーク接続
    1. API キー・トークンの直書き
    1. 想定外の依存追加
    1. 既存ファイルの黙った変更
    1. 環境変数 / OS 設定の書き換え
    1. 無限ループ・重い計算
  2. レビューチェックリスト(コピペ用)
  3. 「読まずにそのまま動かす」が一番のリスク
  4. サンドボックスを活用する

レビューの 7 観点

最低限チェックしたい観点は次の 7 つです。

  1. ファイル/ディレクトリを 削除・上書きする処理 がないか
  2. 外部ネットワークに 意図せず接続する処理 がないか
  3. API キー・トークン がコードに直接書き込まれていないか
  4. 新しい依存ライブラリ が想定外に追加されていないか
  5. 既存ファイルを 黙って変更する処理 がないか
  6. 環境変数 / OS 設定の書き換え が含まれていないか
  7. 無限ループ / 重い計算 が紛れていないか

順に詳細を見ていきます。

1. ファイル削除・上書き処理

os.remove / shutil.rmtree / pathlib.Path.unlink / open(..., "w") などは、書きかけのデータを 静かに上書き することがあります。

# 警戒したい例
import shutil
shutil.rmtree("output") # output ディレクトリごと消す
open("config.yaml", "w").write(... ) # 既存ファイルの上書き

確認するコマンド例:

Terminal window
grep -nE "rmtree|os\.remove|unlink|open\(.*['\"]w['\"]" your_script.py

ファイル書き込みが必要な場面でも、書き込み先のパス が想定通りかを目視確認します。

2. 外部ネットワーク接続

requests / urllib / httpx / socket などのライブラリで外部に接続している場合、URL が信頼できるかを確認します。

# 警戒したい例
import requests
res = requests.get("https://example.com/log", json={"data": df.to_dict()})

データを送信するコードが紛れていると、ローカルのデータが外部に漏れます。確認するコマンド例:

Terminal window
grep -nE "requests\.|urlopen|httpx\.|socket\." your_script.py

3. API キー・トークンの直書き

API キーやトークンが文字列としてコードに残っていないかを確認します。生成AI に依頼するときに自分で貼ってしまった トークンが、修正版のコードにも残ることがあります。

# NG: 直書き
API_KEY = "abcd1234...your-api-key..."
# OK: 環境変数経由
import os
API_KEY = os.environ["JQUANTS_API_KEY"]

確認するコマンド例:

Terminal window
grep -nE "(token|api_key|secret)\s*=\s*['\"]" your_script.py

J-Quants の API キーのような認証情報が直書きされていないか確認します。1 つでも見つかれば、即削除して環境変数経由に直します。

4. 想定外の依存追加

生成AI が問題を解くために、自分の知らないライブラリ を導入してくるケースがあります。

# 警戒: 突然 numba や ta が追加される
import numba
import ta

確認するコマンド例:

Terminal window
grep -E "^import |^from " your_script.py

リストアップした上で、本当に必要かを判断します。便利そうでも、メンテナンス停止しているライブラリや、依存ツリーが大きいライブラリは慎重に扱います。

5. 既存ファイルの黙った変更

requirements.txt / pyproject.toml / .env / 既存の Python ファイルを 生成AI が静かに書き換える ことがあります。コーディングエージェント型のツールを使うときは特に注意します。

Terminal window
# 変更を可視化する
git status
git diff

修正依頼を出した後は、必ず git diff意図した範囲だけが変わっているか を確認します。差分が大きすぎる場合は、git checkout -- <file> で一旦戻し、依頼内容を絞り直します。

6. 環境変数 / OS 設定の書き換え

os.environ[...] = ...subprocess.run(["sudo", ...]) のような行は、現在のセッションや OS の設定に影響します。

# 警戒したい例
import os
os.environ["AWS_ACCESS_KEY_ID"] = "..." # 環境変数の上書き
import subprocess
subprocess.run(["pip", "install", "-U", "pip"]) # OS 側に影響

確認するコマンド例:

Terminal window
grep -nE "os\.environ\[|subprocess\.run|os\.system" your_script.py

学習用スクリプトでは、これらは基本的に不要です。理由が説明できないなら削除します。

7. 無限ループ・重い計算

while True: / 巨大な二重ループ / 全銘柄 × 全期間の総当たりなど、想定より遥かに重い計算が紛れていることがあります。

# 警戒: tickers × dates の総当たり
for t in tickers:
for d in dates:
for w in range(5, 200):
...

実行前に 件数規模 を概算します。1 億回ループになるなら、itertoolspandas のベクトル演算に置き換える依頼を返します。

レビューチェックリスト(コピペ用)

実行前に通すチェックリストを 1 つにまとめます。

[ ] ファイル削除・上書き処理がないか
[ ] 外部ネットワーク呼び出しの URL が想定どおりか
[ ] API キー・トークンが直書きされていないか
[ ] 追加された import が必要なものか
[ ] git diff で変更範囲が想定どおりか
[ ] 環境変数や OS への書き換えが必要か説明できるか
[ ] 無限ループ・巨大な総当たりが含まれていないか

すべてに目を通せば、生成AI が返したコードの 足を踏み外しやすい部分 をひと通り見たことになります。

「読まずにそのまま動かす」が一番のリスク

技術的なチェックよりも、根本的にリスクが高いのは コードを読まないこと です。読まないと、どこを直せば良いかが永遠に分からないままになります。

レビューには、次のようなプロンプトで生成AI 自身に補助させることもできます。

次のコードについて、危険または不要な処理を観点別にリストアップしてください。
観点:
- ファイル削除・上書き
- 外部ネットワーク呼び出し
- API キーの直書き
- 想定外の依存ライブラリ
- 環境変数・OS 設定の書き換え
- 重い計算・無限ループ
【コード】
(対象コード)

人間が読み、生成AI にも別観点で読ませることで、見落としが減ります。

サンドボックスを活用する

そもそも危険な処理が動かない環境で実行するのも有効です。

  • venv の中で実行する(他プロジェクトを汚染しない、#2-3「venv で仮想環境を作る」)
  • 個人の本データではなく サンプルデータ で先に流す
  • ファイル書き込みは 専用ディレクトリ に閉じ込める
  • ネットワークは VPN や Firewall で制限する(本格的な場合)

学習用途では、最初の 2 つだけでも事故率が大きく下がります。

まとめ

  • レビューの 7 観点: 削除・通信・キー直書き・依存追加・既存変更・環境変更・重い計算
  • git diffgrep を活用して変更範囲を可視化する
  • API キーは必ず環境変数経由にする
  • 読まずに動かさない。生成AI 自身に観点別レビューを依頼するのも有効
  • venv とサンプルデータで実行範囲を絞ると事故率が下がる