<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Evaluation on AI2CORE - AI技術ブログ</title>
    <link>https://www.ai2core.com/tags/evaluation/</link>
    <description>Recent content in Evaluation on AI2CORE - AI技術ブログ</description>
    <generator>Hugo -- 0.146.4</generator>
    <language>ja</language>
    <lastBuildDate>Sat, 28 Feb 2026 17:00:00 +0900</lastBuildDate>
    <atom:link href="https://www.ai2core.com/tags/evaluation/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>RAG評価基盤の作り方：精度・再現率・運用コストを同時に最適化する実践手順</title>
      <link>https://www.ai2core.com/posts/2026-02-28-rag-evaluation-pipeline-practical/</link>
      <pubDate>Sat, 28 Feb 2026 17:00:00 +0900</pubDate>
      <guid>https://www.ai2core.com/posts/2026-02-28-rag-evaluation-pipeline-practical/</guid>
      <description>RAGシステムの品質評価を自動化し、検索・生成・運用コストをバランスさせる評価パイプラインの実装方法を解説。</description>
      <content:encoded><![CDATA[<h1 id="rag評価基盤の作り方精度再現率運用コストを同時に最適化する実践手順">RAG評価基盤の作り方：精度・再現率・運用コストを同時に最適化する実践手順</h1>
<p>RAG（Retrieval Augmented Generation）は導入が進んでいますが、運用で最も難しいのは「改善したつもり」が頻発する点です。embedding モデルを変えた、chunk サイズを変えた、reranker を追加した。どれも良さそうに見えるのに、ユーザー満足は上がらない。このギャップを埋めるのが評価基盤です。</p>
<p>本記事では、RAG を継続改善するための評価パイプラインを、データセット設計から CI 統合まで具体的に解説します。</p>
<h2 id="rag評価で見るべき3層">RAG評価で見るべき3層</h2>
<p>RAG の品質は 1 指標では測れません。最低でも次の3層を分けて評価します。</p>
<ol>
<li><strong>Retrieval層</strong>: 正しい文書を取れているか</li>
<li><strong>Generation層</strong>: 回答が正確で有用か</li>
<li><strong>System層</strong>: レイテンシ・コスト・安定性</li>
</ol>
<p>この分離がないと、生成品質低下の原因が retrieval なのか prompt なのか判別できません。</p>
<h2 id="ステップ1評価データセットを設計する">ステップ1：評価データセットを設計する</h2>
<h3 id="1-1-問い合わせカテゴリを分割">1-1. 問い合わせカテゴリを分割</h3>
<p>例として次の5カテゴリに分けます。</p>
<ul>
<li>定義確認（用語説明）</li>
<li>手順質問（How-to）</li>
<li>例外対応（エラー解決）</li>
<li>比較検討（A vs B）</li>
<li>根拠提示（出典必須）</li>
</ul>
<p>カテゴリごとに難易度と重要度を持たせ、偏りを防ぎます。</p>
<h3 id="1-2-正解の持ち方">1-2. 正解の持ち方</h3>
<p>正解は「理想回答1つ」では不十分です。RAGでは表現揺れが自然なので、次を保存します。</p>
<ul>
<li>期待要素（必須ポイント）</li>
<li>禁止要素（誤情報、過剰断定）</li>
<li>参照すべき文書ID</li>
</ul>
<p>この形式にすると、自動評価と人手レビューを両立できます。</p>
<h2 id="ステップ2retrieval評価を自動化">ステップ2：Retrieval評価を自動化</h2>
<p>代表指標:</p>
<ul>
<li>Recall@k</li>
<li>MRR</li>
<li>nDCG</li>
</ul>
<p>例えば、正解文書IDを持つ場合は次のように計算します。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">recall_at_k</span>(retrieved_ids, gold_ids, k<span style="color:#f92672">=</span><span style="color:#ae81ff">5</span>):
</span></span><span style="display:flex;"><span>    topk <span style="color:#f92672">=</span> set(retrieved_ids[:k])
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">1.0</span> <span style="color:#66d9ef">if</span> len(topk<span style="color:#f92672">.</span>intersection(gold_ids)) <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> <span style="color:#66d9ef">else</span> <span style="color:#ae81ff">0.0</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>運用では平均値だけでなく、カテゴリ別分布を見ることが重要です。手順質問だけ recall が低い場合、chunk 戦略や見出し抽出に問題がある可能性が高いです。</p>
<h2 id="ステップ3generation評価の設計">ステップ3：Generation評価の設計</h2>
<p>自動評価では次を推奨します。</p>
<ul>
<li>Faithfulness（出典との整合）</li>
<li>Answer Relevance（質問への適合）</li>
<li>Completeness（必要要素網羅）</li>
<li>Safety（禁止事項違反）</li>
</ul>
<p>LLM-as-a-judge を使う場合、判定プロンプトを固定し、temperature=0 で再現性を確保します。さらに、週次で人手サンプル監査を入れて判定ドリフトを検出します。</p>
<h2 id="ステップ4system評価遅延コスト">ステップ4：System評価（遅延・コスト）</h2>
<p>品質改善がコスト爆増を招くと継続できません。次を同時に計測します。</p>
<ul>
<li>P50/P95 latency</li>
<li>平均 input/output token</li>
<li>1回答あたり推定コスト</li>
<li>timeout率、fallback率</li>
</ul>
<p>この4指標を CI レポートに含めると、精度改善の副作用を早期に発見できます。</p>
<h2 id="ステップ5ciへの組み込み">ステップ5：CIへの組み込み</h2>
<p>PR ごとに評価ジョブを実行し、閾値を満たさない変更をブロックします。</p>
<p>判定例:</p>
<ul>
<li>Recall@5: 0.82 以上</li>
<li>Faithfulness: 0.90 以上</li>
<li>P95 latency: 2500ms 以下</li>
<li>Cost/answer: $0.005 以下</li>
</ul>
<p>疑似フロー:</p>
<ol>
<li>変更ブランチでインデックス再構築</li>
<li>評価データセット100件で推論</li>
<li>指標を計算して前回基準と比較</li>
<li>差分レポートをPRコメントに投稿</li>
</ol>
<p>これで「なんとなく改善」を排除できます。</p>
<h2 id="ステップ6オンライン評価との接続">ステップ6：オンライン評価との接続</h2>
<p>オフライン評価だけでは実利用の多様性を拾えません。オンライン指標を接続します。</p>
<ul>
<li>ユーザー評価（👍/👎）</li>
<li>再質問率（同一セッションで再問い合わせ）</li>
<li>人間オペレータ転送率</li>
</ul>
<p>重要なのは trace_id でオフライン指標と紐づけることです。これにより「オフラインは良いのに本番満足が低い」差分を原因追跡できます。</p>
<h2 id="改善ループの実例">改善ループの実例</h2>
<p>ある社内ヘルプデスクRAGでの改善例:</p>
<ul>
<li>問題: 手順質問で誤回答が多い</li>
<li>原因: chunk が短すぎ、手順文脈が分断</li>
<li>対策: section-aware chunking + reranker導入</li>
</ul>
<p>結果:</p>
<ul>
<li>Recall@5: 0.74 → 0.88</li>
<li>Faithfulness: 0.81 → 0.93</li>
<li>P95 latency: +180ms（許容内）</li>
</ul>
<p>このように、どの変更がどの指標に効いたかを記録すると、次回改善の再現性が高まります。</p>
<h2 id="よくある失敗">よくある失敗</h2>
<ol>
<li><strong>評価データが少なすぎる</strong>
<ul>
<li>20件程度では統計的に不安定。最低100件、理想300件。</li>
</ul>
</li>
<li><strong>単一スコアで判定する</strong>
<ul>
<li>精度だけでコストを見ないと運用破綻。</li>
</ul>
</li>
<li><strong>判定プロンプトを頻繁に変える</strong>
<ul>
<li>指標比較の連続性が失われる。</li>
</ul>
</li>
<li><strong>失敗事例をデータセットへ反映しない</strong>
<ul>
<li>同じ不具合を繰り返す。</li>
</ul>
</li>
</ol>
<h2 id="90日ロードマップ">90日ロードマップ</h2>
<ul>
<li><strong>0-30日</strong>: 評価データセット整備、retrieval指標導入</li>
<li><strong>31-60日</strong>: generation指標 + CIゲート導入</li>
<li><strong>61-90日</strong>: オンライン評価統合、週次改善会の定着</li>
</ul>
<p>この順序なら、運用負荷を抑えつつ確実に品質を上げられます。</p>
<h2 id="まとめ">まとめ</h2>
<p>RAG の実力は、モデル選定より評価基盤で決まります。retrieval、generation、system の3層を分離し、CI に組み込むことで、改善の再現性が生まれます。</p>
<p>まずは小さく始めて、失敗ケースを評価データセットに反映し続けてください。評価が回り始めると、RAG は「当たるかどうかの賭け」から「制御可能なプロダクト」へ変わります。</p>
<h2 id="実装例評価結果をprコメントに自動投稿する">実装例：評価結果をPRコメントに自動投稿する</h2>
<p>運用で効くのは、評価結果を開発者が日常的に見る導線を作ることです。GitHub Actions で評価スクリプトを実行し、結果を PR コメントへ投稿します。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">name</span>: <span style="color:#ae81ff">rag-eval</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">on</span>: [<span style="color:#ae81ff">pull_request]</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">jobs</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">evaluate</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">ubuntu-latest</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">steps</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/checkout@v4</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">run</span>: <span style="color:#ae81ff">uv sync</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">run</span>: <span style="color:#ae81ff">uv run python scripts/run_rag_eval.py --dataset evalset_v3.json --out report.json</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">run</span>: <span style="color:#ae81ff">uv run python scripts/post_pr_comment.py report.json</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>この仕組みがあると、レビュー段階で「この変更は Faithfulness を 0.04 落とすが latency は改善」という会話ができ、意思決定が定量化されます。</p>
<h2 id="評価データセットの更新運用">評価データセットの更新運用</h2>
<p>評価セットを固定しすぎると、現実の問い合わせ変化に追従できません。次のルールを推奨します。</p>
<ul>
<li>月1回、実ユーザー失敗ケースを20件追加</li>
<li>四半期ごとに古いケースを棚卸し</li>
<li>重要カテゴリ比率を維持（例: 手順質問30%以上）</li>
</ul>
<p>この更新を怠ると、指標が良くても体感品質が落ちる「評価腐敗」が起きます。</p>
<h2 id="abテストとの接続">A/Bテストとの接続</h2>
<p>大きな変更（embedding刷新、reranker導入）は、オフライン評価だけでなくオンライン A/B を併用します。</p>
<ul>
<li>A群: 現行パイプライン</li>
<li>B群: 新パイプライン</li>
<li>比較指標: 👍率、再質問率、回答時間、コスト</li>
</ul>
<p>2週間程度の観測で統計差が出るケースが多く、主観ベースの議論を減らせます。</p>
<h2 id="まとめ定着のポイント">まとめ（定着のポイント）</h2>
<p>RAG 改善を継続する鍵は、評価を「一回の検証」ではなく「開発フローの標準」にすることです。CI コメント、データセット更新、A/B テストを回すことで、品質向上が偶然ではなく再現可能な活動になります。</p>
<h3 id="補足">補足</h3>
<p>評価結果は経営指標とも接続できます。問い合わせ解決率やサポート工数削減と紐づけることで、RAG 改善が事業価値にどう効いたかまで説明可能になります。</p>
]]></content:encoded>
      <category>Tech</category>
      <category>RAG</category>
      <category>LLM</category>
      <category>Evaluation</category>
      <category>MLOps</category>
    </item>
  </channel>
</rss>
