# 記憶ありと記憶なしを比べる小さな評価キット

記事「その記憶、本当に役に立ってる？」で使った、標準ライブラリだけのPythonコードと生ログです。
架空の経理アシスタント業務（取引先ごとの請求条件を整理する）で、記憶の渡し方を6通り比べます。

## ファイル

| ファイル | 内容 |
|---|---|
| `world.py` | 取引先6社の正解ルール、過去ログ20件、評価用22課題、調整用8課題。正解はここから計算する |
| `common.py` | `claude -p` を隔離して呼ぶ関数と、日本語用の簡易BM25 |
| `build_memory.py` | 過去ログから要約S・経験抽出E・直した経験抽出E2を作る |
| `run.py` | 条件×課題×繰り返しを回して jsonl に追記する（途中から再開可） |
| `score.py` | 成功率、救済・悪化、符号検定、費用、グループ別を出す |
| `memory/` | 実際に作ったS・E・E2と、作成費用 |
| `results_haiku.jsonl` / `results_sonnet.jsonl` | 本番の生ログ（回答の生テキスト、トークン、費用つき） |
| `dev_haiku.jsonl` | 調整用8課題の生ログ |
| `pilot/pilot_haiku_v0.jsonl` | 最初のパイロット（採点の厳しすぎに気づく前の版。`score.py`で再採点すると結果が変わる） |

## 動かし方

```bash
python3 world.py                                   # 課題と正解の確認
python3 build_memory.py claude-sonnet-5-5          # S, E, E2 を作る（memory/ に保存）
python3 run.py claude-haiku-4-5-20251001 3 out.jsonl test N,F,R,S,E,E2
python3 score.py out.jsonl                         # 基準はN
```

`claude -p` を使うので、Claude Codeにログイン済みである必要があります。
各呼び出しは、空の一時フォルダ、ツールなし、設定ファイルなし、自動メモリ無効（`CLAUDE_CODE_DISABLE_AUTO_MEMORY=1`）、短い固定のsystem promptで走ります。

## 自分の業務に置き換えるとき

- `world.py` の `HISTORY`（過去ログ）、`TASKS`（評価用の依頼）、`gold()`（正解の出し方）を自分の業務のものに差し替える。
- 正解はモデルに見せない。評価用の依頼と似た過去ログが混ざっていないか確認する。
- 採点は機械的に書く。ただし、書いた採点が厳しすぎないか、出力を数件、目で読んで確認する。

## 注意

- 課題は私が作った架空の世界で、現実の業務の代表ではありません。
- 費用は `claude -p` が返す換算額（API単価換算）です。サブスクリプションの実請求ではありません。
- 実行環境の都合で、1回の呼び出しに内部の補助モデルの利用が少し混ざっています（`models` 欄）。
