業務用スクリプトの依頼文に入力・出力・エラー処理のルールを入れる
「これを自動化して」を、実行可能な task description に変えます。sensitive data を含まない合成 sample と、手作業で確認した expected result を添えて、team ごとの work logs を集計する script request を完成させます。
AIチャットアシスタントは短い日々の業務記録を読みやすい週報にまとめられますが、合計作業時間や完了件数などの数値は別に確認する必要があります。小さな合成業務ログ、AIへの依頼文、Pythonの照合スクリプトを使って確認します。
この翻訳はAIで作成しました。コード、単位、数値は原文と併せて確認してください。各言語のネイティブ話者による校閲は、まだ完了していません。 English
対象読者短い日々の業務ログを記録しており、作業時間や完了件数を自分で確認しながらAIで週報を作成したい人向けです。
AIは短く断片的な業務記録を読みやすい文章に整理するのに役立ちますが、計算結果の基準として扱うべきではありません。週報の文章が自然でも、合計値が変わったり、同じ作業を二重に数えたり、予定中の作業を完了済みとして表現したりする可能性があります。より安全なのは、文章作成と数値照合を分ける方法です。
次の業務ログは合成データです。各行には1つの作業、その作業に使った時間、その週のうちに完了したかどうかが記録されています。このように項目を構造化しておくと、後で数値を照合しやすくなります。
| date | task | hours | status |
|---|---|---|---|
| 2026-09-14 | Clean customer CSV | 2.0 | completed |
| 2026-09-14 | Draft import script | 1.5 | completed |
| 2026-09-15 | Test import script | 2.5 | completed |
| 2026-09-16 | Investigate duplicate IDs | 1.0 | completed |
| 2026-09-17 | Update validation rules | 2.0 | completed |
| 2026-09-18 | Prepare user notes | 1.5 | in progress |
手計算では、作業時間は2.0 + 1.5 + 2.5 + 1.0 + 2.0 + 1.5 = 10.5時間です。6件の作業のうち5件がcompletedなので、完了作業数は5件です。最後の作業はまだin progressであり、完了として数えてはいけません。
業務ログをAIチャットアシスタントに貼り付け、与えたデータだけを整理するよう明確に制限します。後から確認できるように、AIが計算した合計作業時間と完了件数も書かせます。
AIへの依頼例: 下の業務ログだけを使って簡潔な週報を書いてください。完了した業務、進行中の業務、週間合計の3つに分けてください。記録にない成果や作業は追加しないでください。合計記録時間と完了した作業数を明記し、元の作業内容の意味は変えないでください。
一般的なAIの回答は次のようになります。今週は顧客データを整理し、インポートスクリプトを作成してテストし、重複IDを調査し、検証ルールを更新しました。ユーザー向けメモの作成は引き続き進行中です。合計記録時間は10.5時間で、完了した作業は5件です。
同じ合成例を、date、task、hours、status列を持つwork_log.csvとして保存します。照合スクリプトはAIが書いた文章から数値を取り出すのではなく、この元ファイルを直接読み取ります。
| 項目 | ログから求めた期待値 |
|---|---|
| 行数 | 6 |
| 合計作業時間 | 10.5 |
| 完了作業数 | 5 |
| 進行中の作業数 | 1 |
この分離が重要です。CSVは根拠データであり、週報はその根拠を読みやすく表現した成果物です。
次のPython 3.12スクリプトはwork_log.csvを読み、必須列を確認し、合計作業時間とステータス別件数を計算して、照合結果をoutputs/weekly_reconciliation.txtに保存します。既存のoutputsディレクトリは上書きしません。
from pathlib import Path
import csv
input_path = Path("work_log.csv")
output_dir = Path("outputs")
if output_dir.exists():
raise SystemExit("outputs already exists; remove or rename it before running again")
if not input_path.exists():
raise SystemExit("work_log.csv was not found")
required_fields = {"date", "task", "hours", "status"}
rows = []
with input_path.open("r", encoding="utf-8", newline="") as f:
reader = csv.DictReader(f)
if reader.fieldnames is None:
raise SystemExit("CSV has no header")
missing = required_fields - set(reader.fieldnames)
if missing:
raise SystemExit(f"Missing columns: {sorted(missing)}")
for line_number, row in enumerate(reader, start=2):
try:
hours = float(row["hours"])
except ValueError:
raise SystemExit(f"Invalid hours value on line {line_number}")
if hours < 0:
raise SystemExit(f"Negative hours on line {line_number}")
status = row["status"].strip().lower()
if status not in {"completed", "in progress"}:
raise SystemExit(f"Unexpected status on line {line_number}: {status}")
rows.append({
"date": row["date"].strip(),
"task": row["task"].strip(),
"hours": hours,
"status": status,
})
total_hours = sum(row["hours"] for row in rows)
completed_count = sum(row["status"] == "completed" for row in rows)
in_progress_count = sum(row["status"] == "in progress" for row in rows)
output_dir.mkdir()
report_path = output_dir / "weekly_reconciliation.txt"
report = (
f"Rows: {len(rows)}\n"
f"Total hours: {total_hours:.1f}\n"
f"Completed activities: {completed_count}\n"
f"In-progress activities: {in_progress_count}\n"
)
report_path.write_text(report, encoding="utf-8")
print(report, end="")
print(f"Saved: {report_path}")この例で独立して確認した値は、合計作業時間10.5時間、完了作業5件です。AIの下書きに含まれるすべての数値表現をこれらと比較します。
| 確認項目 | ログの結果 | AIの下書き | 判定 |
|---|---|---|---|
| 合計作業時間 | 10.5 | 10.5 | 一致 |
| 完了作業数 | 5 | 5 | 一致 |
| 進行中の作業数 | 1 | ユーザー向けメモは進行中 | 内容一致 |
この例ではCSVの1行を1つの数えられる作業として扱います。実際の組織では、チケット、成果物、プロジェクト、マイルストーンなどを基準に数える場合があるため、照合前に何を1件と数えるか定義する必要があります。また、このスクリプトで確認できるのは単純な時間合計とステータスだけであり、業務ログ自体が正しいか、業務の品質が十分だったかまでは判断できません。
2026-09-21 · hand-checked example · Python 3.12
説明と例は独自に作成しました。関連する動作や概念は、以下の公式資料で確認できます。