# 領収書・請求書の一覧化実験

記事「領収書の写真と請求書PDFを、AIエージェントで一覧表に」の実験コードと結果です。データはすべて架空です（店名・会社名・番号・登録番号は実在しません）。

## 中身

| ファイル | 役割 |
|---|---|
| `build_corpus.py` | 架空の領収書・請求書 22ファイル（`corpus/`）と正解表（`truth.json`）、カード明細・申請済み一覧のCSVを作る（乱数seed固定） |
| `prompts.py` | 実験1のプロンプト（P0：一言版、PA：設計版） |
| `run_extract.py` | 実験1：`claude -p` に Read だけ渡して読み取らせる |
| `run_judge.py` | 実験2・3：重複の候補探し、カード明細・申請済み一覧との照合 |
| `score_extract.py` `summarize.py` | 実験1の採点・集計 |
| `rules_check.py` `score_judge.py` | AIが抽出した表に通常のコードの検査を当てる側と、実験2・3の採点 |
| `make_figures.py` | 記事の図版 |
| `results/raw/` | 全378回の生ログ（出力、使ったツール、トークン、換算費用） |

## 条件

- 22ファイル（写真15・PDF7のうち1つは壊れている）。正解表は22行（1ファイルに2通入ったPDFがあるため）。
- `claude -p --tools Read --strict-mcp-config --setting-sources "" --permission-mode bypassPermissions`。作業フォルダは試行ごとの空の一時フォルダで、ファイル名は `scan_01` のような連番。
- モデルのエイリアス `sonnet` / `haiku` / `opus` は、実行時に Sonnet 5.5 / Haiku 5.5 / Opus 5.5 を指した（`results/raw` の `model_usage` で確認できる）。
- 実験1：{Sonnet, Haiku} × {P0, PA} × {1ファイルずつ, まとめて, 壊れたPDFを除いてまとめて} × 3回、と Opus × PA × 1ファイルずつ × 3回。
- 実験2・3：{Sonnet, Haiku} × 4プロンプト × 3回。
- `total_cost_usd` はAPI料金に換算した額で、実際の請求額ではない。

## 再現

```sh
uv venv /tmp/rcvenv && uv pip install --python /tmp/rcvenv/bin/python pillow fpdf2 numpy
/tmp/rcvenv/bin/python build_corpus.py          # フォントはmacOSのものを使う
/tmp/rcvenv/bin/python run_extract.py sonnet-PA-each sonnet-PA-all
/tmp/rcvenv/bin/python run_judge.py sonnet
/tmp/rcvenv/bin/python summarize.py && /tmp/rcvenv/bin/python score_judge.py
```

`build_corpus.py` が使う日本語フォントのパスはこのMacのものです。別の環境では書き換えてください。
