# 返信案とFAQ更新の実験（架空の会社「Atlas Note」）

記事「AIで問い合わせの返信案を作る方法」の実験素材です。会社も製品も規程も顧客も、すべて架空です。

## 何をしたか

- **返信案の実験**（`run_reply.py`）：返金の問い合わせ8件（Q1〜Q8）に、資料の渡し方6通り（A〜F）で返信案を作らせた。モデルはClaude Sonnet 5.5とHaiku 4.5。8問×6条件×5回×2モデル＝480回。
- **FAQ更新の実験**（`run_faq.py`）：解決済みの対応6件（R1〜R6）から、FAQをどう更新するかを聞いた。「FAQを更新して」だけの条件Nと、判定・根拠・保留を求める条件S。6件×2条件×5回×2モデル＝120回。

| 条件 | 渡したもの |
|---|---|
| A | 過去の対応履歴だけ（規程なし） |
| B | 規程・旧規程・FAQ・履歴を、見出しなしで1つの山に |
| C | Bに「古い事例より最新の規程を優先してください」の一文 |
| D | 見出しで「規程」「FAQ」「過去の対応事例」に分け、規程には適用期間を付けた |
| E | Dに、status・適用条件・解決確認・exceptionのラベル、守ること、確認済み顧客属性を付けた |
| F | Eに「他の顧客への対応の有無・日付・理由は説明しない」の一行 |

Fは、A〜Eの結果を見たあとで足した条件です。同じ問い合わせで試したので、Q7への当てはまりは過大に出ます。

## 使い方

```bash
uv add claude-agent-sdk          # ローカルのClaude Codeログインで動く
uv run python run_reply.py claude-sonnet-5-5 5 out_sonnet.jsonl          # 全条件
uv run python run_reply.py claude-haiku-4-5-20251001 5 out_haiku.jsonl D  # 条件Dだけ
uv run python score_reply.py out_sonnet.jsonl out_haiku.jsonl            # scored_raw.json
uv run python judge_reply.py scored_raw.json judged.json                 # 期間は正規表現、特例・他顧客の事例はAI判定
python3 aggregate.py                                                     # 集計
uv run python run_faq.py claude-sonnet-5-5 5 faq_sonnet.jsonl
uv run python judge_faq.py faq_sonnet.jsonl judged_faq.json
```

ツールなし（`tools=[]`）、設定ファイルなし（`setting_sources=[]`）、空フォルダで実行しています。

## 結果ファイル

- `results-summary.json`：条件別の集計。
- `replies.jsonl`：返信案480件と、採点の結果。
- `faq-proposals.jsonl`：FAQ更新の出力120件と、採点の結果。

## 採点

- **区分が正しい**：Q1は「申請案内」、ほかは「申請案内」以外。
- **期間の版を取り違え**：購入日で決まる期間（2026-10-01以降は14日、2026-09-30までは7日）が書かれず、もう一方だけが書かれた返信。正規表現で判定。
- **規程にない可能性を示す**：「30日以内なら」「障害なら個別に検討」など、規程にない返金の可能性を顧客に示した返信。Sonnet 5.5が判定。法人個別契約について「契約書の内容を専任担当が確認する」と伝えるだけなら、ここには数えない。Q8は障害の確認依頼が自然なので、この検査は合格判定から除いた。
- **他顧客の事例を説明**：他の顧客への対応の日付・理由・承認の事実を顧客に説明した返信。Sonnet 5.5が判定。
- **合格**：区分が正しく、期間の版が合い、他顧客の事例を説明せず、（Q8以外で）規程にない可能性を示していない返信。

AI判定は、約40件を目で読んで確認しました。食い違いがあった期間の判定は直してあります。FAQの実験の「判定」もAIが読み取ったものです。
