# 実験素材：数千件の自由記述をAIエージェントに任せる設計

記事「数千件の自由記述をAIエージェントに任せる設計」で使った素材一式です。実施日は2026年10月20日。
データはすべて**合成**です。実顧客の回答ではありません。

## 中身

| ファイル | 内容 |
|---|---|
| `gen_data.py` | 合成アンケート1000件と正解ラベルを作る(seed固定)。`responses.jsonl`と`truth.jsonl`が出る |
| `responses.jsonl` | 回答1000件(`response_id`と`text`)。命令文入りの回答20件、空欄20件を含む |
| `truth.jsonl` | 正解ラベル(筆者が決めたもの)。曖昧な行もある |
| `pipeline.py` | 分類パイプライン。台帳・バッチ分割・検問・再投入・再開・集計。標準ライブラリだけ |
| `test_pipeline.py` | AIを使わないテスト(スタブ)。再開・検問・二重計上を確かめる。`test_pipeline.log`が実行結果 |
| `exp.py` / `run_all.sh` | 規模別の実験ドライバ。`runs/`に1回目の出力だけを残す |
| `score.py` / `summarize.py` / `errors.py` | 採点と集計。`results.json`が結果 |
| `count_exp.py` | AIに1000件を渡して分類別件数を直接数えさせる実験。`count_results.json` |
| `agent_inject.py` | ファイルを読み書きできるエージェントに、命令文入りの回答ファイルを渡す実験 |
| `resume_demo.sh` | 実機での途中停止と再開。`resume_demo.log`と`resume_demo/` |

`runs/<モデル>_bs<バッチ件数>_<defended|naive>_r<回>/`の中身は次のとおりです。

- `accepted.jsonl`: 検問を通った行
- `attempts.jsonl`: 呼び出しごとの記録(却下した行と理由、欠落ID、余分な行、トークン数、時間)
- `raw/`: モデルの生の出力。Haikuに1000件を一括で渡した2回分だけ残しています

## 動かし方

`claude` コマンド(Claude Code)にログインした状態で、このフォルダで実行します。

```bash
python3 gen_data.py                 # データ再生成(同じ内容になる)
python3 test_pipeline.py            # AIなしのテスト
python3 pipeline.py responses.jsonl out --model claude-sonnet-5-5 --batch-size 50
```

`pipeline.py`は、止まっても同じコマンドをもう一度実行すれば続きから再開します。未処理のIDが残ると終了コード1で終わります。
各呼び出しは `claude -p` に、道具・設定・MCPを外して渡しています。価格や上限は変わるので、自分の環境で小さく試してから広げてください。

## 注意

- 合成データはテンプレートから作っているため、実際の回答より素直な文面です。精度の数字をそのまま実データに当てはめないでください。
- 正解ラベルは筆者が決めました。基準が曖昧な行(例:「権限の設定が細かくできて安心です」をPRIVACYの称賛とするか)があります。
- モデルは2つ(Claude Sonnet 5.5、Claude Haiku 4.5)、各条件2回です。回数が少ないので、差の大きさではなく傾向を見てください。
- `claude -p`は1回の呼び出しごとにClaude Code自身の固定の入力(約8,000トークン)を足します。換算額はこの分を含みます。
- エージェント実験(`agent_inject.py`)の作業フォルダは実験専用の空フォルダで、秘密はダミー文字列です。
