kt-tech.blog

画像

【実装】RAGチャットボットの検索精度をAPI経由でE2Eテストする方法

Share
💡
RAGチャットボットの回答品質を、SSE streaming APIにcurlでリクエストして検証する手法を紹介します。ソースドキュメントとの突合で検索漏れや幻覚を検出します。

はじめに

RAGシステムを構築したら、「検索結果が正しいか」「LLMの回答がソースと一致しているか」を検証する必要があります。UIから手動で確認するだけでは限界があるため、APIに直接リクエストを送ってE2Eテストを行う手法をまとめました。

この記事でわかること

  • SSE(Server-Sent Events)streaming APIへのcurlテスト方法

  • RAGの回答をソースドキュメントと突合して精度を検証する方法

  • 検索漏れ(特定ドキュメントがヒットしない問題)の発見と調査アプローチ

  • 複数の検索モード(特定ドメイン指定 / AI自動選択)の比較テスト

対象読者

  • RAGチャットボットを開発・運用している方

  • 検索精度の自動テストを導入したい方

テスト構成の概要

RAGチャットボットは一般的に以下のフローで動作します:

  1. ユーザーの質問を受け取る

  2. Azure AI Searchでハイブリッド検索 → 関連ドキュメントを取得

  3. 検索結果をコンテキストとしてLLMに渡し、回答を生成

  4. 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: ソースドキュメントとの突合

回答内容を、元のナレッジベース(インデックスに登録したドキュメント)と比較します。チェックポイント:

  • 回答に含まれる関数名・クラス名がソースに存在するか

  • 処理の説明がソースコードの実装と一致するか

  • ソースに存在しない情報(ハルシネーション)が含まれていないか

🔴
実際のテストで発見した問題例: 汎用的な質問を投げると、LLMがソースにない一般知識で補完してしまう。「StateFlowManager」「DiagnosticManager」など存在しないクラス名が回答に含まれていた。具体的な質問(メソッド名や処理内容を指定)にすると正確な回答が得られた。

Step 4: 検索漏れの調査

特定のアプリケーションについて質問しても「情報が含まれていません」と返される場合、以下を確認します:

  1. インデックスにデータが存在するか — Azure Portal または SDK で直接確認

  2. top-kの設定 — 多数のアプリケーションが1つのインデックスに混在する場合、top=5では特定アプリのチャンクが上位に来ない可能性

  3. 検索クエリの表現 — アプリ名を含む具体的な質問にすると改善する場合がある

複数モードの比較テスト

RAGシステムに複数の検索モード(特定ドメイン指定 / AI自動選択)がある場合、同じ質問を両方のモードで投げて比較します。

  • ドメイン指定モード: 検索対象が限定されるため、精度が高い傾向

  • AI自動選択モード: 複数ドメインを横断検索するため、トークン消費が増大し、存在しないインデックスへの検索でも空のヘッダーが追加される問題が発生しうる

Tips

1️⃣
汎用的な質問より、メソッド名・処理内容を含む具体的な質問の方がハルシネーション検出に有効
2️⃣
SSEレスポンスの途中にある進捗メッセージ(「検索中…」)はフィルタして最終回答のみ検証する
3️⃣
テストケースは「正確に答えられるべき質問」「インデックスに情報がない質問」の両方を用意する

まとめ

  • RAGの回答品質はUIだけでなく、API経由のE2Eテストで体系的に検証すべき

  • 具体的な質問を投げることでハルシネーションを検出しやすくなる

  • 検索漏れが発生した場合は、インデックス内のデータ存在確認 → top-k設定 → クエリ表現の順に調査する