AIの業務活用

AIが書いたコードをチェックリストでレビューする方法

AI生成コードは完成して見えても、入力、境界条件、依存関係、エラー処理に隠れた前提がある場合があります。小さな合成CSV例を使って、実際に使う前にコードを体系的に確認する方法を説明します。

目次を表示

この翻訳はAIで作成しました。コード、単位、数値は原文と併せて確認してください。各言語のネイティブ話者による校閲は、まだ完了していません。 English

対象読者AIチャットアシスタントで小さなPythonスクリプトを作成し、実データに使う前に再現可能な方法で確認したい人向けです。

準備するもの
  • Python 3.12
  • Pythonスクリプトの実行とCSVファイルの基本構造に関する基礎知識

01AIが書いたコードもレビューが必要な理由

AIチャットアシスタントは、構文上もっともらしいコードをすばやく生成できます。しかし、もっともらしく見えることと正しいことは同じではありません。すべての入力行が完全であると仮定したり、列を誤って解釈したり、既存の結果を上書きしたり、手元にないパッケージへ依存したり、特殊な値を受け取ったときだけ失敗したりする可能性があります。そのため、コードが自然に見えるかだけでなく、コードが置いている前提を一つずつ確認する必要があります。

簡単なレビューは5つの質問で整理できます。どのような入力を想定しているか。境界値や例外的な値ではどう動くか。エラーをどう処理するか。どの依存関係が必要か。誤った結果を見つけるにはどのテストが必要か。計算自体が正しくても既存ファイルを上書きするなら安全ではないため、出力方法も確認します。

02まず小さな合成例を使う

合成ファイル orders.csv があるとします。列は order_id、quantity、unit_price の3つです。データ行は A001,2,10.00、A002,3,5.50、A003,1,8.00 です。期待される売上は手計算できます。2 × 10.00 = 20.00、3 × 5.50 = 16.50、1 × 8.00 = 8.00 なので、合計数量は6、合計売上は44.50になるはずです。

最初の例を小さくすることには意味があります。AIが作ったスクリプトが44.50を出力した場合、自分で計算した値と比較できます。最初から50,000行の実務ファイルを使うと、もっともらしい結果の中に読み取りや計算の誤りが隠れる可能性があります。

order_idquantityunit_price期待売上
A001210.0020.00
A00235.5016.50
A00318.008.00
合計644.50

03入力と出力のルールを明示して依頼する

単に売上を集計するスクリプトを依頼するのではなく、ファイル形式、計算内容、失敗時の動作、出力ポリシーまで指定すると確認しやすくなります。

  1. orders.csv に order_id、quantity、unit_price が必要だと明記します。
  2. 欠損値や不正な数値を推測せず、エラーとして扱うよう依頼します。
  3. 合計数量と合計売上を計算するよう依頼します。
  4. Python 3.12 の標準ライブラリだけを使うよう指定します。
  5. 結果は outputs フォルダへ保存し、対象の出力ファイルがすでに存在する場合は上書きせず停止するよう指定します。

04一般的なAI回答を確認する

妥当な回答では、CSVの読み取りに csv.DictReader、金額計算に Decimal、パス処理に pathlib を使い、入力を明示的に検証することがあります。コードがきれいに見えても、実装が依頼内容と一致していると決めつけず、各分岐を確認します。

python
from csv import DictReader
from decimal import Decimal, InvalidOperation
from pathlib import Path

INPUT_FILE = Path("orders.csv")
OUTPUT_DIR = Path("outputs")
OUTPUT_FILE = OUTPUT_DIR / "order_summary.txt"
REQUIRED_COLUMNS = {"order_id", "quantity", "unit_price"}


def main():
    if not INPUT_FILE.is_file():
        raise SystemExit(f"Input file not found: {INPUT_FILE}")

    if OUTPUT_FILE.exists():
        raise SystemExit(f"Output already exists: {OUTPUT_FILE}")

    total_quantity = 0
    total_revenue = Decimal("0")

    with INPUT_FILE.open("r", encoding="utf-8", newline="") as file:
        reader = DictReader(file)

        if reader.fieldnames is None:
            raise SystemExit("Input file has no header row.")

        missing_columns = REQUIRED_COLUMNS - set(reader.fieldnames)
        if missing_columns:
            names = ", ".join(sorted(missing_columns))
            raise SystemExit(f"Missing required columns: {names}")

        for line_number, row in enumerate(reader, start=2):
            order_id = row["order_id"].strip()
            quantity_text = row["quantity"].strip()
            price_text = row["unit_price"].strip()

            if not order_id or not quantity_text or not price_text:
                raise SystemExit(f"Missing value on line {line_number}.")

            try:
                quantity = int(quantity_text)
                unit_price = Decimal(price_text)
            except (ValueError, InvalidOperation):
                raise SystemExit(f"Invalid numeric value on line {line_number}.")

            if quantity < 0 or unit_price < 0:
                raise SystemExit(f"Negative value on line {line_number}.")

            total_quantity += quantity
            total_revenue += quantity * unit_price

    OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
    result = (
        f"total_quantity={total_quantity}\n"
        f"total_revenue={total_revenue:.2f}\n"
    )
    OUTPUT_FILE.write_text(result, encoding="utf-8")
    print(f"Wrote: {OUTPUT_FILE}")


if __name__ == "__main__":
    main()

05入力、境界値、エラー、依存関係を確認する

確認項目確認する質問この例での動作
入力ファイル名、列名、文字コード、データ型が明確か。orders.csv と指定された3列を要求し、UTF-8のCSVとして開きます。
境界値ヘッダー欠損、空欄、0、負の値ではどうなるか。必須値の欠損と負の値は拒否し、0は許可します。
エラー処理不正入力で誤った結果を計算し続けず、明確に停止するか。値の欠損や不正な数値がある場合、該当行番号を含むメッセージで停止します。
依存関係説明されていない外部パッケージや特定バージョンを必要とするか。Python 3.12の標準ライブラリだけを使います。
出力の安全性既存結果を上書きする可能性があるか。outputs/order_summary.txt が存在する場合は停止します。
テスト小さな例について結果を事前に予測できるか。合成例では合計数量6、合計売上44.50になるはずです。

構文だけでは見えにくい前提も確認します。たとえば、このスクリプトは quantity と unit_price が負の場合だけ拒否するため、0は許可します。数量や価格が0でもよいかどうかはPythonの問題ではなく、業務ルールの問題です。実データへ適用する前に、そのルールが目的に合っているかレビューする必要があります。

06実ファイルを使う前にテストケースを設計する

正常ケースだけをテストしてはいけません。意図的に異なる入力を少数用意すると、スクリプトの挙動をよりよく確認できます。

  • 正常ケース: 3つの合成行で total_quantity=6、total_revenue=44.50 になることを確認します。
  • 列欠損: unit_price を price に変更し、計算前に停止することを確認します。
  • 空欄: quantity の1つを空にし、該当行でエラーになることを確認します。
  • 不正な数値: 5 の代わりに five を入れ、拒否されることを確認します。
  • 負の値: quantity または unit_price に -1 を入れ、停止することを確認します。
  • 0の値: quantity に0を入れ、その許可が意図した業務ルールと一致するか判断します。
  • 既存出力: outputs/order_summary.txt を先に作成し、上書きせず停止する設計になっているか確認します。
  • ヘッダーだけの空データ: 合計数量0、合計売上0.00を許可するか、データのないファイルを拒否するか決めます。

07このチェックリストだけでは証明できないこと

このチェックリストは一般的な実装ミスを見つけるのに役立ちますが、元の要件自体が正しいことまでは証明できません。返品を負の値として扱うべきか、quantity が0でもよいか、価格に税が含まれるか、重複した order_id を許可するかは、ルールを明示しない限りスクリプト自身では判断できません。

より大規模または高リスクなスクリプトでは、セキュリティ、権限、プライバシー、並行実行、数値精度、性能、ログ、自動テストまでレビュー範囲を広げます。また、パス操作、シェルコマンド、ネットワーク要求、認証情報、破壊的なファイル操作を扱うコードは、小さなローカルCSV計算より慎重に確認する必要があります。

実務では、入力条件を定義し、小さな例を独立して計算し、各失敗経路を確認し、依存関係を特定し、出力を保護し、境界値をテストするという順序で進められます。AIは実装の下書き作成には使えますが、そのコードが実際の要件に合っているかを判断するのはレビューする側です。

実行・検証の記録

2026-09-21 · hand-checked example · Python 3.12

  • 合成例の計算は手作業で確認しました: 2 × 10.00 = 20.00、3 × 5.50 = 16.50、1 × 8.00 = 8.00。
  • 期待される合計数量は手作業で確認しました: 2 + 3 + 1 = 6。
  • 期待される合計売上は手作業で確認しました: 20.00 + 16.50 + 8.00 = 44.50。
  • 例のコードは、入力、検証、依存関係、上書き防止の要件に照らして手作業でレビューしました。
  • コードは csv、decimal、pathlib などPython標準ライブラリだけを使用します。
検証範囲の限界
  • この記事のPythonコードは実行していません。記載した動作は手作業によるコードレビューに基づいています。
  • この例では、重複した order_id、数量0、返品、税、通貨換算、非常に大きなファイルに関する業務ルールを定義していません。
  • これらの確認を通過しても、別のデータセットや本番環境におけるスクリプトの安全性や正確性が保証されるわけではありません。

サイト全体の執筆・検証方針

参考資料

説明と例は独自に作成しました。関連する動作や概念は、以下の公式資料で確認できます。