自動テストケース生成機能 仕様書
概要
このドキュメントは、Knowledge Yard V2 の検索精度評価テストケースを自動生成する機能の仕様を定義します。
目的
背景
- 手動で作成したテストケースは100%合格でも、実際のユーザー入力では失敗することがある
- 「テストに穴がある」状態を可能な限り解消する
- システマチックにテストを網羅し、フィードバック前に問題を発見する
目標
- フィードバック激減: ユーザーからの「回答がおかしい」報告を最小化
- カバレッジ向上: 145件 → 1,000件以上のテストケース
- 自動化: 新しいドキュメント追加時も自動でテスト生成
アーキテクチャ
┌─────────────────────────────────────────────────────────────┐
│ generate_test_cases.py │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Keywords │───▶│ LLM API │───▶│ Test Cases │ │
│ │ (Predefined)│ │ (Variation) │ │ (YAML) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ Input: │
│ - ドキュメント×キーワード定義 │
│ - 質問パターンテンプレート │
│ │
│ Output: │
│ - tests/generated_cases.yaml │
│ │
└─────────────────────────────────────────────────────────────┘
質問パターン
| パターン |
説明 |
難易度 |
例 |
formal |
正式な質問 |
easy |
「有給休暇の規定について教えてください」 |
casual |
口語・カジュアル |
medium |
「有給ってどうなってるの?」 |
ultra_casual |
極端な口語 |
hard |
「ぶっちゃけ有給何日あんの?」 |
situation |
状況説明型 |
hard |
「来週休みたいんだけど」 |
short |
極端に短い |
hard |
「有給」 |
wrong_term |
間違った用語 |
medium |
「PTOは何日?」 |
negative |
否定疑問 |
hard |
「有給って取れないの?」 |
english_mix |
英語混じり |
medium |
「リーブの申請方法は?」 |
newbie |
新入社員視点 |
medium |
「入社したてで有給って使える?」 |
manager |
管理職視点 |
hard |
「部下に有給を取らせたいんだけど」 |
キーワード定義
構造
{
"ドキュメント名": [
{
"keyword": "メインキーワード",
"category": "カテゴリ",
"related": ["関連語1", "関連語2", ...]
},
...
]
}
対象ドキュメント
| ドキュメント |
キーワード数 |
カテゴリ |
| 就業規則 |
16 |
勤務時間, 休暇, 休職, 退職, 採用, 通勤, 服務規律, ハラスメント |
| 賃金規程 |
4 |
給与 |
| 出張旅費規程 |
2 |
出張 |
| 育児介護休業規程 |
3 |
育児介護 |
| コンプライアンス規程 |
2 |
コンプライアンス |
| 内部通報 |
2 |
内部通報 |
| 稟議規程 |
3 |
稟議 |
| 取締役会規程 |
2 |
取締役会 |
| 重大インシデント |
2 |
インシデント |
| 経理規程 |
3 |
経理 |
| 人事委員会 |
2 |
人事 |
| ISO9001 |
3 |
品質管理 |
合計: 44キーワード × 10パターン = 440テストケース(理論値)
使用方法
基本コマンド
# ドライラン(LLM呼び出しなし、構造確認のみ)
python tests/generate_test_cases.py --dry-run
# 全パターン生成
python tests/generate_test_cases.py
# 特定のドキュメントのみ
python tests/generate_test_cases.py --source "就業規則"
# 特定のパターンのみ
python tests/generate_test_cases.py --patterns casual ultra_casual situation
# 出力ファイル指定
python tests/generate_test_cases.py --output tests/new_cases.yaml
オプション
| オプション |
説明 |
デフォルト |
--dry-run |
LLM呼び出しなしでテスト |
false |
--output |
出力ファイルパス |
tests/generated_cases.yaml |
--source |
対象ドキュメントフィルタ |
全て |
--patterns |
生成するパターン |
全10パターン |
--api-url |
API URL(キーワード抽出用) |
http://localhost:7071/api |
出力形式
生成されるYAML
# 自動生成テストケース
# Generated: 2025-12-20T22:00:00
# Total: 440 cases
- id: gen-syuugyouki-yuukyuu-casual
question: "有給ってどうなってるの?"
expected_keywords:
- "有給休暇"
- "年休"
- "休み"
expected_source: "就業規則"
category: "休暇"
difficulty: medium
pattern: casual
base_keyword: "有給休暇"
メタデータ
| フィールド |
説明 |
id |
一意識別子(gen-{source}-{keyword}-{pattern}形式) |
question |
LLMが生成した質問文 |
expected_keywords |
回答に含まれるべきキーワード |
expected_source |
期待されるソースドキュメント |
category |
質問カテゴリ |
difficulty |
難易度(パターンから自動設定) |
pattern |
使用した質問パターン |
base_keyword |
ベースとなったキーワード |
運用フロー
初回生成
# 1. 全テストケースを生成
python tests/generate_test_cases.py --output tests/generated_cases.yaml
# 2. 既存テストとマージ(手動または自動)
# tests/eval_cases.yaml に追記
# 3. 評価実行
python tests/run_eval.py
# 4. 失敗ケースを分析・修正
定期更新
# 新しいドキュメント追加時
python tests/generate_test_cases.py --source "新ドキュメント名"
# 特定パターンの追加
python tests/generate_test_cases.py --patterns new_pattern
制限事項
カバーできないケース
| ケース |
理由 |
対策 |
| 文脈依存質問 |
「さっきの件」など |
ユーザーフィードバックで追加 |
| 複合質問 |
複数トピックの組み合わせ |
手動テスト追加 |
| 社内俗語 |
予測不能 |
フィードバックで追加 |
| 誤解に基づく質問 |
無限のパターン |
フィードバックで追加 |
推奨運用
- 自動生成で80%カバー → 基本的な質問パターンを網羅
- フィードバックで20%補完 → 予想外のケースを追加
- 定期的に再生成 → キーワード追加時に再実行
API コスト
Azure OpenAI 使用量(推定)
| 項目 |
数値 |
| キーワード数 |
44 |
| 1キーワードあたりトークン |
約1,000(入力+出力) |
| 合計トークン |
約44,000 |
| GPT-4o-mini コスト |
約$0.02 |
| GPT-4o コスト |
約$0.50 |
推奨: GPT-4o-mini を使用(コスト効率が良い)
今後の拡張予定
短期
- [ ] 既存テストケースとの重複チェック機能
- [ ] 生成結果のプレビュー機能
- [ ] バッチ実行モード
中期
- [ ] インデックスからの動的キーワード抽出
- [ ] ユーザーログからの質問パターン学習
- [ ] A/Bテスト用のバリエーション生成
長期
- [ ] CI/CDパイプラインへの統合
- [ ] 自動リグレッションテスト
関連ファイル
作成日: 2025-12-20