バイブコーディングとは?AIにコードを任せるとき人がすべきこと
バイブコーディングを単に「言葉で頼めばAIが勝手に作ってくれるもの」と捉えるのではなく、人が要件と確認基準を決め、AIが作った結果を点検する作業方法として理解します。架空の家計簿CSV集計ツールを例に、入力・出力・してはいけないこと・確認方法を1ページのメモに整理します。
AIに「エラーが出ます」とだけ伝えるのではなく、同じ入力で問題を再現し、実際の例外メッセージを根拠に原因を絞ってから最小限の修正だけを依頼する流れを練習します。amountにカンマが入ったCSVを使ってValueErrorを実際にPythonで再現し、修正コードも再実行して確認します。
対象読者Claude Codeで作った小さなPythonツールでエラーが起きたとき、エラーメッセージを根拠に修正プロセスをコントロールしたい初心者
エラーが起きたときの最初の段階は推測ではなく再現です。今回の例では、amountの値を一つだけ文字列"1,450"に変えた仮想CSVを使います。CSVの規則上、値の中にカンマが入るため引用符で囲みますが、csvモジュールで読み込んだ後のrow['amount']には文字列'1,450'が入ります。既存コードがint(row['amount'])をそのまま呼ぶと、この文字列を整数に変換できません。
date,category,amount
2026-09-01,food,12000
2026-09-03,transport,"1,450"
2026-09-03,food,8500
2026-09-10,supplies,3200
2026-09-15,transport,1450
2026-10-02,food,9800import csv
import sys
from collections import defaultdict
path = sys.argv[1]
monthly = defaultdict(int)
with open(path, encoding="utf-8", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
month = row["date"][:7]
monthly[month] += int(row["amount"])
for month in sorted(monthly):
print(f"{month} = {monthly[month]}")このコードを`python summarize_buggy.py expenses_bad.csv`で実行すると、正常な合計を出力する前に変換段階で停止します。GPTチャットのPythonツールで同じコードを実際に実行し、例外文字列が以下の文言と正確に一致することを確認しました。
ValueError: invalid literal for int() with base 10: '1,450'このメッセージにはすでに重要な手掛かりがあります。失敗した関数はint()、失敗した値は'1,450'です。したがって「CSV全体が間違っている」や「月別集計ロジックが間違っている」と最初から仮定する必要はありません。問題範囲はamount文字列を整数へ変換する箇所まで絞れます。
| 観察 | 確認できた事実 | まだ推測してはいけないこと |
|---|---|---|
| 例外の種類 | ValueError | ファイル全体が壊れていると断定しない |
| 失敗した値 | '1,450' | 他のすべての行も間違っていると仮定しない |
| 失敗した処理 | int()変換 | 集計式そのものが間違っていると断定しない |
| 修正範囲 | amountのパース箇所を優先 | プログラム全体を書き直さない |
Claude Codeに助けを求めるときも、エラーメッセージ、再現コマンド、問題が起きた入力条件を一緒に渡します。そうすればAIの原因説明が実際の証拠につながっているか確認でき、問題と無関係な大規模修正が提案されたときも範囲を再び絞りやすくなります。
今回の修正要件は単純です。数値文字列内のカンマを削除してから整数に変換し、カンマを除いても数値でなければ、どの行のどの値で失敗したかが分かる明確なエラーを出す必要があります。月別集計方式と出力形式は変えません。
python summarize_buggy.py expenses_bad.csv を実行すると、以下のエラーが出ます。
ValueError: invalid literal for int() with base 10: '1,450'
まず原因を説明してください。
次にamount変換部分だけを最小限修正してください。
要件:
- カンマを含む数値文字列は、カンマを削除してから整数に変換
- それでも数値でなければ、行番号と元の値を含む明確なValueError
- 月別集計と出力形式はそのまま維持
- Python標準ライブラリだけを使用
- 修正後、どのコマンドで再実行するかも教えてください。ここでは「コード全体を書き直して」とは頼みません。失敗箇所がamount変換まで絞れているため、その部分だけを直すよう範囲を制限します。AIが別ファイルや集計ルールまで変えようとするなら、まず必要な理由を説明させ、根拠がなければ元の範囲へ戻します。
以下の修正版はamountのパースをparse_amount()へ分離します。まずカンマを削除してint()を試し、失敗したら入力行番号と元の文字列を含むValueErrorを再送出します。csv.DictReaderのヘッダーが1行目なので、データ行番号はenumerate(reader, start=2)で合わせます。
import csv
import sys
from collections import defaultdict
def parse_amount(text, line_number):
cleaned = text.replace(",", "")
try:
return int(cleaned)
except ValueError as exc:
raise ValueError(
f"line {line_number}: amount must be an integer, got {text!r}"
) from exc
path = sys.argv[1]
monthly = defaultdict(int)
with open(path, encoding="utf-8", newline="") as f:
reader = csv.DictReader(f)
for line_number, row in enumerate(reader, start=2):
month = row["date"][:7]
monthly[month] += parse_amount(row["amount"], line_number)
for month in sorted(monthly):
print(f"{month} = {monthly[month]}")この修正は通貨記号、小数点、括弧付き負数など、あらゆる金額表現を処理する汎用パーサーではありません。今回実際に再現した千単位のカンマ問題だけを解決します。入力ルールを広げる場合は、許可する形式を先に決めてから別の要件として追加する方が安全です。
修正後は、問題を起こしたそのファイルでもう一度実行します。GPTチャットのPythonツールで上の修正コードを`expenses_bad.csv`に対して実際に実行した結果、月別合計は2026-09 = 26600, 2026-10 = 9800になりました。これはシリーズの最初から定めた期待値と正確に一致します。
python summarize_fixed.py expenses_bad.csv
2026-09 = 26600
2026-10 = 9800エラーが消えたという事実だけで終わりにしません。カンマなしの1450とカンマありの"1,450"がどちらも同じ金額として解釈され、既存の正常結果を維持しているかを数値で確認することが再実行段階の要点です。
カンマ除去を追加したからといって、不正な値を0に変えたり無視したりしてはいけません。たとえば3行目のamountがabcなら、データエラーが隠れないよう失敗する必要があります。同じ修正コードを別の仮想入力で実際に実行し、`line 3`と元の値`'abc'`を含むValueErrorを確認しました。
date,category,amount
2026-09-01,food,12000
2026-09-03,transport,abcValueError: line 3: amount must be an integer, got 'abc'GPTチャットのPythonツールでPythonコードを実際に実行 · 仮想CSVだけを使用 · Claude Codeは実行していない
Pythonの実行検証はGPTチャットのPythonツールで行い、Claude Codeでテストしたとは主張しません。例のパーサーは千単位のカンマだけを処理し、通貨記号・小数点・地域別の数値形式まで一般化していません。