深色模式
RAG 评测框架 RAGAS
摘要:RAG(检索增强生成)最难的是"答得对不对、有没有幻觉、检索准不准"。Ragas 用一组 0–1 区间的指标把这些抽象问题变成可比数字,并天然支持接入 CI 做回归门禁。本文讲清四个核心指标的关系、如何用 LLM-as-Judge + Embedding 计算,并给出可直接复制的生产配置。适用版本:Ragas(主分支,安装见下,
[版本相关:API 随版本演进,未实测固定版本号]);评测 LLM 默认 OpenAI,可替换为任意兼容后端。
核心概念
Ragas(RAG Assessment)面向 RAG 管道,把每次问答拆成四个要素:question(用户问)、contexts(检索到的片段)、answer(生成答案)、ground_truth(标准答案,唯一需人工标注的字段)。
它从一开始就是"参考无关(reference-free)"设计:除 context_recall 外,多数指标不需要人工标注,靠 LLM 在底层打分,因此快且便宜。
四个核心指标各管一段
- faithfulness(忠实度):答案的每一条 claim 是否都能从检索到的 context 推出 → 查幻觉。
- answer_relevancy(答案相关性):答案是否真的回应了原问题 → 查答非所问。
- context_precision(上下文精确度):检索到的内容里相关部分是否排在前面 → 调 chunk size / top-k。
- context_recall(上下文召回):检索是否覆盖了回答所需全部信息 → 查漏检(需 ground_truth)。
架构与指标关系
计算方式简述(来自 Ragas 文档与社区实现)
- faithfulness:从 answer 抽取 claims,逐条判断能否被 context 推断,得分 = 支持 claim 数 / 总 claim 数(∈[0,1])。
- answer_relevancy:由 LLM 基于 answer 反推若干问题,计算这些"假设问题"嵌入与原问题的余弦相似度均值(∈[0,1])。
- context_precision:基于 context 与 ground_truth 的相关性,按排名加权 Precision@k(∈[0,1])。
- context_recall:把 ground_truth 拆成 claims,判断能否从 contexts 归因,得分 = 可归因 claim / 总 claim(∈[0,1],需 ground_truth)。
安装
bash
pip install ragas
# 需要 datasets 承载评测数据
pip install datasets1
2
3
2
3
版本相关
Ragas 的 evaluate() 顶层 API 与 metrics 导入路径在不同版本有过调整(早期用 ragas.metrics,新版本有 ragas.llm_evaluate 等)。下文以"导入具体 metric 类 + evaluate()"的经典用法为准,[版本相关:请按所装版本 docs 校正导入路径]。
操作步骤:跑一次 Ragas 评测
准备数据与评测:
python
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import (
faithfulness,
answer_relevancy,
context_precision,
context_recall,
)
data = {
"question": ["RAG 是什么?", "它相比纯生成有什么优势?"],
"answer": [
"RAG 把检索与生成结合,用外部知识增强回答。",
"能减少幻觉,答案更可追溯。",
],
"contexts": [
["RAG(Retrieval Augmented Generation)结合检索与生成..."],
["RAG 的优势包括降低幻觉、可溯源..."],
],
# context_recall 需要 ground_truth;若只测前三项可省略
"ground_truth": [
"RAG 是一种结合外部检索与语言生成的技术。",
"主要优势是降低幻觉、提供引用来源。",
],
}
dataset = Dataset.from_dict(data)
result = evaluate(
dataset=dataset,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall],
)
print(result)
df = result.to_pandas() # 便于导出与门禁判断1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
judge 模型可替换,不必绑定 OpenAI
Ragas 默认用 OpenAI 作为 judge,但支持自定义 LLM 与 Embedding(如本地 vLLM、HuggingFace 模型)。生产环境建议用私有部署的 judge,避免评测数据出网,也控制成本。配置方式见 docs.ragas.io 的 customize_models 文档 [未实测具体代码,按官方文档校正]。
接入 CI 做回归门禁
目标:任何 prompt / 模型 / chunk size 变更导致 faithfulness 跌破阈值,就阻断合并。
yaml
# .github/workflows/rag-eval.yml (示意)
name: rag-eval
on: [pull_request]
jobs:
eval:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.11" }
- run: pip install ragas datasets
- name: Evaluate RAG
run: python evaluate.py --threshold-faithfulness 0.81
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
python
# evaluate.py 关键片段
results = evaluate(dataset, metrics=[faithfulness, answer_relevancy])
if results["faithfulness"] < 0.8:
sys.exit(1) # 低于基线阈值,阻断 CI 合并1
2
3
4
2
3
4
阈值应来自"历史基线":先跑一次稳定版本得到基线,后续以"相对基线下降不超过 10%"作为红flag。
验证
python
# 把结果落盘,便于趋势对比与回溯
import pandas as pd
df = result.to_pandas()
df.to_csv("ragas_results/$(date +%F).csv", index=False) # 实际请用 python 取日期
# 人工抽查:faithfulness 低但你认为答案对的样本,通常是 context 漏检而非真幻觉1
2
3
4
5
6
2
3
4
5
6
指标低≠模型差,先定位哪一段
- faithfulness 低 → 答案 claim 不在 context(真幻觉 or 检索漏)。
- answer_relevancy 低 → 答非所问(prompt/生成问题)。
- context_precision 低 → 检索噪声大(调 chunk size、top-k、reranker)。
- context_recall 低 → 该检索的没召回到(扩源 / 改切分)。
回滚 / 清理
- 评测是离线只读,不影响线上。风险在 judge 调用成本 与 缓存。
- Ragas 会对 LLM 调用做缓存,换数据集或 judge 时需清理避免误用旧缓存:
bash
rm -rf ~/.cache/ragas # TODO(verify): 实际缓存路径以版本为准1
故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 全部指标 NaN | 字段名拼错(如 contexts 写成 context) | 严格对齐 question/answer/contexts/ground_truth |
| faithfulness 异常高 | ground_truth/context 与问题不匹配 | 检查数据标注质量 |
| 调用 OpenAI 报错 401 | 未设 OPENAI_API_KEY | export OPENAI_API_KEY=... 或换私有 judge |
| 评测很慢/很贵 | 每条样本多次 judge 调用 | 用便宜 judge + 子集(subset)模式先筛 |
安全与合规
评测数据泄露
Ragas 需要把 contexts/answer(可能含生产真实检索内容)发给 judge 模型。若 judge 用公有云 API,生产上下文可能含 PII/机密,必须:① 评测用脱敏后的黄金集;② 或部署私有 judge 模型,数据不出内网。详见 dataset.md 脱敏与 online-monitor.md 的 PII 掩码。
成本 / 性能
- token 成本:每条样本对每个启用的指标都会触发若干次 LLM 调用(faithfulness 抽 claims + 校验,answer_relevancy 反推问题 + 嵌入等)。千条规模若全量跑四个指标,judge 调用量可观,
[未实测,取决于样本长度与 judge 模型]。 - 降本策略:子集(subset)模式先跑小样本;用更小的 judge 模型;对稳定的回归集用缓存;embedding 维度按需选小模型。
- 时延:评测是离线批处理,不计线上 SLA,但 CI 阶段会拉长流水线,建议只对变更分支跑受影响的指标子集。