生成AI が返したコードは、見た目が整っていても そのまま実行して安全とは限りません。本記事では、コードを実行に移す前に確認したい 7 つの観点と、確認用の小さなコマンドをまとめます。
目次
- レビューの 7 観点
-
- ファイル削除・上書き処理
-
- 外部ネットワーク接続
-
- API キー・トークンの直書き
-
- 想定外の依存追加
-
- 既存ファイルの黙った変更
-
- 環境変数 / OS 設定の書き換え
-
- 無限ループ・重い計算
- レビューチェックリスト(コピペ用)
- 「読まずにそのまま動かす」が一番のリスク
- サンドボックスを活用する
レビューの 7 観点
最低限チェックしたい観点は次の 7 つです。
- ファイル/ディレクトリを 削除・上書きする処理 がないか
- 外部ネットワークに 意図せず接続する処理 がないか
- API キー・トークン がコードに直接書き込まれていないか
- 新しい依存ライブラリ が想定外に追加されていないか
- 既存ファイルを 黙って変更する処理 がないか
- 環境変数 / OS 設定の書き換え が含まれていないか
- 無限ループ / 重い計算 が紛れていないか
順に詳細を見ていきます。
1. ファイル削除・上書き処理
os.remove / shutil.rmtree / pathlib.Path.unlink / open(..., "w") などは、書きかけのデータを 静かに上書き することがあります。
# 警戒したい例import shutilshutil.rmtree("output") # output ディレクトリごと消すopen("config.yaml", "w").write(... ) # 既存ファイルの上書き確認するコマンド例:
grep -nE "rmtree|os\.remove|unlink|open\(.*['\"]w['\"]" your_script.pyファイル書き込みが必要な場面でも、書き込み先のパス が想定通りかを目視確認します。
2. 外部ネットワーク接続
requests / urllib / httpx / socket などのライブラリで外部に接続している場合、URL が信頼できるかを確認します。
# 警戒したい例import requestsres = requests.get("https://example.com/log", json={"data": df.to_dict()})データを送信するコードが紛れていると、ローカルのデータが外部に漏れます。確認するコマンド例:
grep -nE "requests\.|urlopen|httpx\.|socket\." your_script.py3. API キー・トークンの直書き
API キーやトークンが文字列としてコードに残っていないかを確認します。生成AI に依頼するときに自分で貼ってしまった トークンが、修正版のコードにも残ることがあります。
# NG: 直書きAPI_KEY = "abcd1234...your-api-key..."
# OK: 環境変数経由import osAPI_KEY = os.environ["JQUANTS_API_KEY"]確認するコマンド例:
grep -nE "(token|api_key|secret)\s*=\s*['\"]" your_script.pyJ-Quants の API キーのような認証情報が直書きされていないか確認します。1 つでも見つかれば、即削除して環境変数経由に直します。
4. 想定外の依存追加
生成AI が問題を解くために、自分の知らないライブラリ を導入してくるケースがあります。
# 警戒: 突然 numba や ta が追加されるimport numbaimport ta確認するコマンド例:
grep -E "^import |^from " your_script.pyリストアップした上で、本当に必要かを判断します。便利そうでも、メンテナンス停止しているライブラリや、依存ツリーが大きいライブラリは慎重に扱います。
5. 既存ファイルの黙った変更
requirements.txt / pyproject.toml / .env / 既存の Python ファイルを 生成AI が静かに書き換える ことがあります。コーディングエージェント型のツールを使うときは特に注意します。
# 変更を可視化するgit statusgit diff修正依頼を出した後は、必ず git diff で 意図した範囲だけが変わっているか を確認します。差分が大きすぎる場合は、git checkout -- <file> で一旦戻し、依頼内容を絞り直します。
6. 環境変数 / OS 設定の書き換え
os.environ[...] = ... や subprocess.run(["sudo", ...]) のような行は、現在のセッションや OS の設定に影響します。
# 警戒したい例import osos.environ["AWS_ACCESS_KEY_ID"] = "..." # 環境変数の上書き
import subprocesssubprocess.run(["pip", "install", "-U", "pip"]) # OS 側に影響確認するコマンド例:
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 億回ループになるなら、itertools や pandas のベクトル演算に置き換える依頼を返します。
レビューチェックリスト(コピペ用)
実行前に通すチェックリストを 1 つにまとめます。
[ ] ファイル削除・上書き処理がないか[ ] 外部ネットワーク呼び出しの URL が想定どおりか[ ] API キー・トークンが直書きされていないか[ ] 追加された import が必要なものか[ ] git diff で変更範囲が想定どおりか[ ] 環境変数や OS への書き換えが必要か説明できるか[ ] 無限ループ・巨大な総当たりが含まれていないかすべてに目を通せば、生成AI が返したコードの 足を踏み外しやすい部分 をひと通り見たことになります。
「読まずにそのまま動かす」が一番のリスク
技術的なチェックよりも、根本的にリスクが高いのは コードを読まないこと です。読まないと、どこを直せば良いかが永遠に分からないままになります。
レビューには、次のようなプロンプトで生成AI 自身に補助させることもできます。
次のコードについて、危険または不要な処理を観点別にリストアップしてください。
観点:- ファイル削除・上書き- 外部ネットワーク呼び出し- API キーの直書き- 想定外の依存ライブラリ- 環境変数・OS 設定の書き換え- 重い計算・無限ループ
【コード】(対象コード)人間が読み、生成AI にも別観点で読ませることで、見落としが減ります。
サンドボックスを活用する
そもそも危険な処理が動かない環境で実行するのも有効です。
venvの中で実行する(他プロジェクトを汚染しない、#2-3「venv で仮想環境を作る」)- 個人の本データではなく サンプルデータ で先に流す
- ファイル書き込みは 専用ディレクトリ に閉じ込める
- ネットワークは VPN や Firewall で制限する(本格的な場合)
学習用途では、最初の 2 つだけでも事故率が大きく下がります。
まとめ
- レビューの 7 観点: 削除・通信・キー直書き・依存追加・既存変更・環境変更・重い計算
git diffとgrepを活用して変更範囲を可視化する- API キーは必ず環境変数経由にする
- 読まずに動かさない。生成AI 自身に観点別レビューを依頼するのも有効
- venv とサンプルデータで実行範囲を絞ると事故率が下がる