
【実装】RAGチャットボットの検索精度をAPI経由でE2Eテストする方法
はじめに
RAGシステムを構築したら、「検索結果が正しいか」「LLMの回答がソースと一致しているか」を検証する必要があります。UIから手動で確認するだけでは限界があるため、APIに直接リクエストを送ってE2Eテストを行う手法をまとめました。
この記事でわかること
-
SSE(Server-Sent Events)streaming APIへのcurlテスト方法
-
RAGの回答をソースドキュメントと突合して精度を検証する方法
-
検索漏れ(特定ドキュメントがヒットしない問題)の発見と調査アプローチ
-
複数の検索モード(特定ドメイン指定 / AI自動選択)の比較テスト
対象読者
-
RAGチャットボットを開発・運用している方
-
検索精度の自動テストを導入したい方
テスト構成の概要
RAGチャットボットは一般的に以下のフローで動作します:
-
ユーザーの質問を受け取る
-
Azure AI Searchでハイブリッド検索 → 関連ドキュメントを取得
-
検索結果をコンテキストとしてLLMに渡し、回答を生成
-
SSE(Server-Sent Events)でストリーミング返却
E2Eテストでは、APIに直接質問を投げ、返ってきた回答をソースドキュメントと突合します。
Step 1: セッション作成とAPIリクエスト
多くのRAGチャットボットはセッション管理があります。まずセッションを作成し、そのIDを使って質問を送信します。
# セッション作成
SESSION_ID=$(curl -s -X POST http://localhost:8000/api/search/sessions \
-H 'Content-Type: application/json' \
-d '{"title": "E2E Test"}' | jq -r '.id')
# 質問を送信(SSEレスポンス)
curl -N -X POST "http://localhost:8000/api/search/${SESSION_ID}/messages/ask" \
-H 'Content-Type: application/json' \
-d '{
"question": "SystemManagerのon_errorメソッドはどのような処理を行いますか?",
"agent": "AD"
}'
Step 2: SSEレスポンスの解析
SSEレスポンスはdata:プレフィックスで各イベントが送られます。進捗メッセージ(検索中、生成中)と最終回答が混在するため、JSONとしてパースして内容を抽出します。
# SSEレスポンスの例
data: {"content": "データベースから関係情報を検索中・・・"}
data: {"content": "AIを使用して回答を生成中・・・"}
data: {"content": "SystemManagerのon_errorメソッドは、..."}
data: {"references": [{"file_name": "system_manager.md", "page": "1"}]}
data: [DONE]
Step 3: ソースドキュメントとの突合
回答内容を、元のナレッジベース(インデックスに登録したドキュメント)と比較します。チェックポイント:
-
回答に含まれる関数名・クラス名がソースに存在するか
-
処理の説明がソースコードの実装と一致するか
-
ソースに存在しない情報(ハルシネーション)が含まれていないか
Step 4: 検索漏れの調査
特定のアプリケーションについて質問しても「情報が含まれていません」と返される場合、以下を確認します:
-
インデックスにデータが存在するか — Azure Portal または SDK で直接確認
-
top-kの設定 — 多数のアプリケーションが1つのインデックスに混在する場合、top=5では特定アプリのチャンクが上位に来ない可能性
-
検索クエリの表現 — アプリ名を含む具体的な質問にすると改善する場合がある
複数モードの比較テスト
RAGシステムに複数の検索モード(特定ドメイン指定 / AI自動選択)がある場合、同じ質問を両方のモードで投げて比較します。
-
ドメイン指定モード: 検索対象が限定されるため、精度が高い傾向
-
AI自動選択モード: 複数ドメインを横断検索するため、トークン消費が増大し、存在しないインデックスへの検索でも空のヘッダーが追加される問題が発生しうる
Tips
まとめ
-
RAGの回答品質はUIだけでなく、API経由のE2Eテストで体系的に検証すべき
-
具体的な質問を投げることでハルシネーションを検出しやすくなる
-
検索漏れが発生した場合は、インデックス内のデータ存在確認 → top-k設定 → クエリ表現の順に調査する
最新記事
- 【設定・環境構築】OpenNext でNext.js SSGサイトをCloudflare Workersにデプロイする完全ガイド
2026/3/19
- 【実装】Notion calloutブロックをNext.jsでカラフルなUIコンポーネントとして表示する
2026/3/19
- 【トラブルシューティング】Cloudflare Pages → Workers 移行で遭遇したEdge Runtime問題集
2026/3/19
- 【実践】Next.js 13→16メジャーアップグレードの全記録 — 破壊的変更と対応策
2026/3/19
- 【自動化】Gemini Imagen APIでブログのeyecatch画像を自動生成してR2にアップロードする
2026/3/19
- 【実装】Notion APIでブログシステムを構築する(Next.js 13 App Router × SDK v5)
2026/3/19
- 【移行ガイド】microCMSからNotion APIへブログCMSを完全移行する
2026/3/19
- 【トラブルシューティング】本番デプロイで遭遇した問題と解決策まとめ
2026/3/15
- 【環境構築】Next.js × Cloudflare Workers の本番環境を一から構築する
2026/3/15
- 【設定・環境構築】Neon → Prisma Postgres 移行とローカル開発環境の構築
2026/2/26


