はじめに
こんにちは!
Dirbatoの社内横断技術支援組織「Backbeat」に所属している繁田です。
前回のローカルRAGの話に続けて、今回はRAG評価方法について投稿してみたいと思います!
RAG、動いた。でも「良い」のか?
前回でRAG(Retrieval-Augmented Generation)を作りました。
- ドキュメントも入れた
- ベクトルDBも作った
- LLMも繋いだ
Q: 有給は何日ありますか?
A: 就業規則によると、有給休暇は付与されます。
おお、ちゃんと答えてる!
……で?
「RAGの精度どうですか?」という質問が一番つらい
ある日、こう聞かれた。
上司「このRAG、精度どれくらい?」
自分「……体感では、まあまあです」
上司「まあまあって何%?」
自分「……LLMが“それっぽく”言ってます」
❌ RAG評価あるある
- サンプルを数件見て「良さそう」
- 自分の知ってる質問だけ試す
- LLMに「正しいですか?」って聞く
- 「うん、問題なさそう」で出荷
👉 これ、全部ダメです
RAGの何を評価すべきなのか?
RAGは2段構えの地雷があります。
① Retrieval(検索)
② Generation(生成)
よくある事故
| 状況 | 原因 |
|---|---|
| それっぽい嘘をつく | 検索は正しいが生成が暴走 |
| 的外れな回答 | 検索がズレている |
| 回答が薄い | コンテキスト不足 |
| 自信満々で間違う | ハルシネーション |
👉 「回答が正しいか?」だけでは何も分からない
ここで登場、RAGAS
RAGASとは何者?
RAGAS = RAG評価のために生まれてきたOSSライブラリ。LLMを活用してRAGの品質を評価します
- 論文ベース
- Pythonライブラリ
- RAG特化
RAGASが何をしてくれるのか(ざっくり)
RAGASはこう言ってくる。
「RAGの評価、分解して考えようぜ」
RAGASの代表的な評価指標(ここ重要)
1. Context Precision
公式定義(要約)
取得したコンテキストのうち、質問に関連している情報の割合を測る指標。
何を測る?
- 検索結果に 無関係な文書(ノイズ)がどれくらい混ざっているか
高いと何が嬉しい?
- 検索が「無駄撃ちしていない」
いつ使う?
- Retrieverの設定調整
- chunkサイズ・top-k見直し時
✅ 具体例
質問
有給休暇は何日付与されますか?
取得したコンテキスト
- 有給休暇は入社6ヶ月後に10日付与される
- 有給休暇の繰越ルールについて
- 社員旅行は年1回実施される
👉 ③は質問に無関係な情報
👉 Context Precision は低下する
📎 公式
https://docs.ragas.io/en/latest/concepts/metrics/context_precision/
2. Context Recall
公式定義(要約)
正解を導くために必要な情報が、取得したコンテキストにどれだけ含まれているかを測る指標。
何を測る?
- 「必要な情報、ちゃんと取れてる?」問題
高いと何が嬉しい?
- 検索漏れが少ない
いつ使う?
- 「答えが薄い」「根拠不足」な時
✅ 具体例
質問
有給休暇は何日付与されますか?
取得したコンテキスト
- 有給休暇制度の概要について説明する
👉 日数(10日など)が含まれていない
👉 答えに必要な情報が欠けている
👉 Context Recall は低い
📎 公式
https://docs.ragas.io/en/latest/concepts/metrics/context_recall/
3. Context Entities Recall
公式定義(要約)
正解回答に含まれるエンティティ(人名・日付・数値など)が、コンテキスト内にどれだけ含まれているかを測る指標。
何を測る?
- 重要な固有情報を検索できているか
いつ使う?
- 規程・契約・FAQなど 正確性重視RAG
✅ 具体例
生成された回答
有給休暇は 入社6ヶ月後に10日 付与されます。
取得したコンテキスト
- 有給休暇は一定期間勤務後に付与される
👉 回答に含まれる
- 「6ヶ月」
- 「10日」
という 数値エンティティが含まれていない
👉 Context Entities Recall は低い
📎 公式
https://docs.ragas.io/en/latest/concepts/metrics/context_entities_recall/
4. Noise Sensitivity
公式定義(要約)
コンテキストにノイズが含まれた場合に、モデルの回答品質がどれだけ影響を受けるかを測る指標。
何を測る?
- 「ゴミ文書に引っ張られやすいRAGか?」
いつ使う?
- top-kが多い
- 大量ドキュメントRAG
✅ 具体例
取得したコンテキスト
- 有給休暇は10日付与される
- 社員旅行は年1回実施される
生成された回答(悪い例)
社員旅行は年1回実施されます。
👉 ノイズ(②)に引っ張られて回答が崩れた
👉 Noise Sensitivity が高い(=悪い)
生成された回答(良い例)
有給休暇は10日付与されます。
👉 ノイズがあっても影響を受けていない
👉 Noise Sensitivity が低い(=良い)
📎 公式
https://docs.ragas.io/en/latest/concepts/metrics/noise_sensitivity/
5. Response Relevancy
公式定義(要約)
生成された回答が、質問にどれだけ関連しているかを測る指標。
何を測る?
- 質問にちゃんと答えているか
いつ使う?
- 回答がズレている時
- プロンプト改善時
✅ 具体例
質問
リモートワークは可能ですか?
生成された回答(良い例)
条件付きでリモートワークが可能です。
👉 質問に直接答えている
👉 Response Relevancy:高い
生成された回答(悪い例)
働き方改革は企業にとって重要です。
👉 質問と意味的にズレている
👉 Response Relevancy:低い
📎 公式
https://docs.ragas.io/en/latest/concepts/metrics/answer_relevance/
6. Faithfulness
公式定義(要約)
生成された回答が、提供されたコンテキストにどれだけ忠実かを測る指標。
何を測る?
- ハルシネーション耐性
いつ使う?
- 嘘をつくRAGを止めたい時
- 法務・規程・医療系
✅ 具体例
取得したコンテキスト
- 有給休暇は入社6ヶ月後に10日付与される
生成された回答(良い例)
有給休暇は入社6ヶ月後に10日付与されます。
👉 コンテキストの範囲内
👉 Faithfulness:高い
生成された回答(悪い例)
有給休暇は法律上、最低20日付与されます。
👉 コンテキストに存在しない情報を追加
👉 Faithfulness:低い
📎 公式
https://docs.ragas.io/en/latest/concepts/metrics/faithfulness/
実際に使ってみる(最小構成)
インストール
pip install ragas
APIKEYの設定
RAGASの評価に使うLLMのAPIKEYを環境変数に設定します。
*商用利用の場合は利用規約や契約条件を確認してくださいね
データのセット(超重要)
RAGASには質問文や正解データをセットしてきます:
Hugging FaceのDatasetもしくはRagasのEvaluationDatasetで渡してください。
dataset = Dataset.from_dict({
"question": questions, # 質問文
"contexts": contexts, # LLMから取得したコンテキスト一覧
"answer": answers, # LLMからの回答文
"ground_truth": ground_truths, # 正解データ
})
LLMの評価
確認したい指標とデータをセットして、evaluateで複数データを評価します
from ragas import evaluate
from ragas.metrics import faithfulness, context_precision
evaluate(
dataset,
metrics=[faithfulness, context_precision, context_recall]
)
実行すると:
faithfulness: 0.42
context_precision: 0.58
context_recall: 0.62
📎 公式
https://docs.ragas.io/en/latest/references/evaluate/?h=evaluate#ragas.evaluation.evaluate
数字が出た!…で、どうする?
ここが一番大事。
例
| 指標 | スコア |
|---|---|
| Faithfulness | 0.42 |
| Context Precision | 0.58 |
| Context Recall | 0.62 |
読み方
- 質問には答えてる ✅
- でも
- 検索結果にないことを盛ってる ❌
- そもそも検索が足りてない ❌
👉 改善ポイントが明確になります
RAGASを使うと、会話が変わる
Before(地獄)
上司「精度どう?」
自分「まあまあです」
After(文明)
自分「Faithfulnessが0.4なので、生成が暴走してます」
上司「じゃあ検索改善しよう」
👉 話が技術になる
最後に: RAG評価はエンジニアの仕事
- 「LLMが動いた」はスタート地点
- 評価して具体的な改善サイクルにつなげましょう
そろそろローカルLLMのお題から外れてきたので、次回は新ネタを投稿します!