ANTIGRAVITY LABEN
記事一覧/AIツール
AIツール/2026-06-12上級

RAG の「それっぽいのに違う」回答を減らす — Gemma 4 × Antigravity で組む検索品質の評価ハーネス

RAG の回答が時々ズレる問題を数値に置き換える評価ハーネスの作り方。30問のゴールデンデータセット、recall@5・MRR・nDCG の実装、Gemma 4 による忠実性審査、pytest の回帰テストまで、ローカル環境の実測値と共に共有します。

antigravity340gemma-420rag8local-llm15evaluation2

プレミアム記事

2026年の春、個人開発している壁紙アプリ群のサポート返信ナレッジを Gemma 4 の RAG で引けるようにしていたときのことです。「Android 版でテーマを切り替えると画面が真っ白になる」という問い合わせに対して、検索が根拠として拾ってきたのは iOS 版の購入復元手順でした。生成された回答は文章としてはきれいにまとまっていて、ぱっと読むと正しそうに見えます。けれど中身は、その質問にまったく答えていませんでした。

この「それっぽいのに違う」回答が厄介なのは、目立つエラーを出さないことです。検索が外れても、言語モデルは手元に来たチャンクをなんとか繋いで流暢な文章を返してきます。結果として検索段階の失敗が生成の流暢さに覆い隠され、品質の劣化に気づくのが遅れます。私の場合、誤回答のログを後から精査したところ、原因のおよそ 70% は生成ではなく、検索の段階で正解文書を取り逃がしていたことにありました。

そこで大掛かりな評価基盤を導入する代わりに、30問のゴールデンデータセットと数十行の Python だけで回る小さな評価ハーネスを組みました。recall@5 は当初の 0.63 から、前処理とチャンク設計の見直しで 0.86 まで改善し、何より「変更を入れるたびに数値で確認する」という習慣が手に入りました。ここからは、その評価ハーネスの設計と実装を、Gemma 4 のローカル環境を例に順を追って共有します。なお、RAG パイプラインそのものの組み立ては Gemma 4 で RAG パイプラインを構築する — ローカルLLMで自分だけの検索AIを作る で扱っているため、本編は「すでに動いている RAG をどう測り、どう改善するか」に絞ります。

生成の流暢さが検索の失敗を隠す — 品質劣化の構造

RAG の品質問題は、検索と生成のどちらに原因があるかを切り分けないと、改善が空回りします。私が最初に犯した失敗がまさにこれでした。誤回答を見てプロンプトを念入りに直し続けたのですが、一向に良くなりません。検索ログを並べて初めて、そもそも正解チャンクが上位5件に入っていないケースが大半だと分かりました。プロンプトの改善は、検索が当たっていることを前提にした最後の仕上げです。順番を間違えると時間だけが溶けていきます。

それぞれの段階で起きる典型的な失敗は性質が異なります。

  • 検索起因の失敗: 質問の言い換えに弱い、日本語特有の表記ゆれ(全角半角・カタカナ語・送り仮名)を吸収できない、ナレッジに存在しない質問に対して「一番近いだけ」のチャンクを返してしまう
  • 生成起因の失敗: 正しいチャンクが渡っているのに要約の過程で条件や但し書きを落とす、複数チャンクの内容を混ぜて存在しない手順を作ってしまう

この2つは対処がまったく違うので、評価も二層に分けます。検索段階は「正解チャンクが上位に入ったか」という機械的な指標で、生成段階は「根拠に忠実な回答か」という審査で測ります。この分離が、ここから先の作業の骨格になります。

なお、切り分けの実務では「検索ログを人間が読める形で残す」だけでも一歩前進します。質問・上位5件のチャンク ID・スコア・採用された回答を1行の JSON で記録しておくと、誤回答の報告を受けてから原因の層を特定するまでが数分で済みます。評価ハーネスはこのログの延長線上にある仕組みで、特別なものではありません。

社内ナレッジ系の RAG 構成を扱った Antigravity で構築する RAG パイプライン — ベクトル検索 × LLM で社内ナレッジを即座に活用する でも触れられているとおり、ベクトル検索は導入自体は簡単です。難しさは導入後、「検索がどの程度当たっているのか誰も知らない」まま運用が続いてしまう点にあります。

ゴールデンデータセットは30問から始める

評価と聞くと数百問のベンチマークを想像しがちですが、個人開発の RAG なら、まず30問で十分に機能します。大切なのは問題数ではなく、質問タイプの内訳です。私は次の4タイプに分けて作っています。

  1. 事実参照型(12問): 「広告なし版の価格はいくらですか」のように、特定のチャンクに答えがそのまま書いてあるもの
  2. 手順型(8問): 「購入の復元はどう操作しますか」のように、複数ステップの説明を要するもの
  3. 否定・制約型(5問): 「ウィジェットには対応していますか」のように、対応していない事実を正しく答えてほしいもの
  4. 範囲外型(5問): ナレッジのどこにも答えがなく、「この情報ではお答えできません」と返すのが正解のもの

データ形式は JSONL にしています。1行1問で、後からタイプ別に集計しやすい構造です。

{"id": "q001", "type": "factual", "question": "広告なし版の価格はいくらですか", "relevant_chunks": ["pricing-adfree-001"], "answerable": true}
{"id": "q013", "type": "procedural", "question": "機種変更後に購入を復元するにはどうすればいいですか", "relevant_chunks": ["restore-purchase-001", "restore-purchase-002"], "answerable": true}
{"id": "q021", "type": "negative", "question": "ロック画面ウィジェットには対応していますか", "relevant_chunks": ["feature-scope-003"], "answerable": true}
{"id": "q026", "type": "out_of_scope", "question": "他社アプリの壁紙を取り込めますか", "relevant_chunks": [], "answerable": false}

質問は実ユーザーの言い回しから拾う

質問文を自分で発明しないことが、このデータセットの価値を決めます。私の場合、App Store と Google Play のレビュー返信や問い合わせメールの文面が一次ソースでした。実ユーザーの言い回しには、作り手が想定しない言い換えが含まれます。「画面が真っ白になる」は、実際には「白くなる」「画面が消える」「固まって何も出ない」とも表現されていました。この多様性がそのまま、検索の弱点を突くテストケースになります。

正解チャンクには安定した ID を振る

relevant_chunks に入れる ID は、インデックスを再構築しても変わらない安定 ID にしてください。チャンクの連番をそのまま使うと、分割設定を変えた瞬間に全問の正解ラベルが無効になります。私は「文書スラッグ + 見出しスラッグ」をつなげた文字列(例: restore-purchase-001)を使い、チャンク分割を変えても文書と見出しの対応からラベルを引き直せるようにしています。

範囲外型を必ず入れる

RAG は構造的に「何かを返す」方向へ倒れやすく、答えないべき質問への失敗は平均スコアに表れにくい性質があります。範囲外型の5問は、件数としては少なくても、ハルシネーションの検知器として働く大切な枠です。後述する審査プロンプトとの組み合わせで効いてきます。

データセットは月に数問ずつ育てる

30問は出発点で、完成形ではありません。私は月に2〜3問のペースで、新しく届いた問い合わせのうち「検索が外しそうな言い回し」を選んで追加しています。追加の際は既存の質問と内容が重複していないかを確認し、重複する場合は言い換えバリエーションとして同じ relevant_chunks を共有させます。データセット自体は git で管理し、質問を追加・修正したコミットと評価スコアの変動を対応づけられるようにしておくと、「スコアが下がったのは RAG の劣化ではなく、データセットを難しくしたことが原因」という切り分けが後から一目でつきます。この運用を3ヶ月続けた現在は42問になっていて、検知器としての信頼度は当初より明らかに上がりました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
「回答がときどきズレる」という感覚的な不安を、recall@5・MRR・nDCG という追跡できる数値に置き換えられるようになります
30問のゴールデンデータセットと依存ライブラリ最小の Python ハーネスを、手元の Gemma 4 環境にそのまま組み込めます
チャンク設計や埋め込みの変更を回帰テストで判断し、検索品質の低下をリリース前に検知する運用を作れます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

AIツール2026-05-10
Gemma 4 を Antigravity で動かすとき、Q4 と Q5 のどちらを選ぶか — M2 Mac で実測した3軸の結果
Gemma 4 を Antigravity でローカル運用するときに迷う Q4_K_M / Q5_K_M / Q8_0 / fp16 の選び方を、M2 Mac 16GB の実機で速度・メモリ・出力品質の3軸で測った結果から解説します。
AIツール2026-04-19
Gemma 4 × Antigravity でローカルLLMを本番環境で動かす——セットアップから安定運用まで
Gemma 4をAntigravityと組み合わせてローカル環境で本番運用するための完全ガイド。Ollamaセットアップ・パフォーマンスチューニング・API連携・よくあるトラブルまで実装例つきで解説。
AIツール2026-04-22
Gemma 4 の複数 LoRA を組み合わせて使う — マージ技法と動的スイッチングで『1モデルで何でもこなす』を本番で実現する
要約・翻訳・コード生成など複数タスクに LoRA を学習させたとき、どう本番で組み合わせるか。重み付きマージ、TIES、動的スイッチングまで、個人開発者が実際に詰まった箇所を Antigravity と一緒にほどいていく実装ノートです。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →