深色模式
RAG 评测与效果调优
摘要:本文面向需要"证明 RAG 够好"的团队。没有评测,所有"效果提升了"都是玄学。我们用 Ragas 把质量拆成可量化指标,区分检索层(context_recall / context_precision)与生成层(faithfulness / answer_relevancy),给出评测集构建、无监督日常监控与按指标定位瓶颈的调优闭环。
评测驱动,而非感觉驱动
改 chunk 大小、换嵌入、加重排,每次都应回到同一份评测集看指标变化。Ragas 指标(0–1)让你能说"context_recall 从 0.62 到 0.81",而不是"感觉好点了"。本篇指标定义来自 Ragas/NVIDIA 官方文档,访问日期 2026-10-09。
核心概念
| 指标 | 层 | 需 ground_truth? | 含义 |
|---|---|---|---|
context_recall | 检索 | 是 | 参考答案中相关信息是否都被召回 |
context_precision | 检索 | 是 | 召回的块是否都相关、且排前面 |
faithfulness | 生成 | 否 | 答案是否忠实于 context(无幻觉) |
answer_relevancy | 生成 | 否 | 答案是否切题 |
context_entity_recall | 检索 | 是 | 关键实体召回率 |
noise_sensitivity | 检索 | 是 | 噪声块对答案的破坏程度(越低越好) |
架构与原理
Ragas 实践(v0.2.0+ API)
Ragas 0.2 API 已大改
ragas 0.2.0+ 中指标必须实例化带括号(Faithfulness() 而非 faithfulness),且 evaluate() 为异步,需用 asyncio.run。裸类名写法在 0.1.x 可用、0.2.x 会失败。以下示例按 0.2+ 写法[版本相关]。
python
# pip install ragas datasets langchain-openai
import asyncio
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import Faithfulness, AnswerRelevancy, ContextPrecision, ContextRecall
from ragas.llm import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
llm = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o-mini"))
emb = LangchainEmbeddingsWrapper(OpenAIEmbeddings())
data = {
"question": ["退换货政策中定制商品能否无理由退货?"],
"answer": ["定制商品不支持七天无理由退货。"],
"contexts": [["退换货政策第七条:定制商品不支持七天无理由退货。"]],
"ground_truth": ["定制商品不适用七天无理由退货规则。"],
}
dataset = Dataset.from_dict(data)
result = asyncio.run(evaluate(
dataset,
metrics=[Faithfulness(), AnswerRelevancy(), ContextPrecision(), ContextRecall()],
llm=llm, embeddings=emb,
))
print(result)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
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
评测集构建
生产监控用无监督,重大版本用有监督
日常难为每个问题维护 ground_truth,优先用 faithfulness + answer_relevancy(无需标注)做低成本监控;仅在重大架构变更时构建标注集,算全套需 ground_truth 的指标。标注集 50–200 条覆盖真实长尾即可起步。
bash
# 从生产日志采样真实 query,人工/LLM 辅助标注 ground_truth,存入评测集仓库
# 每次发版跑同一评测集,记录指标曲线, regression 超阈值则拦截1
2
2
按指标定位瓶颈
| 低指标 | 优先排查 | 典型修复 |
|---|---|---|
context_recall | 切分/嵌入/漏召 | 缩小 chunk、换嵌入、加混合检索(hybrid-search.md) |
context_precision | 噪声召回 | 加重排(rerank.md)、降 top-k |
faithfulness | 幻觉 | 引用约束、上下文压缩、证据不足拒答(generation.md) |
answer_relevancy | 跑题 | query 改写、提示优化 |
验证
bash
# 跑通后检查输出含四项分数;分数异常低先确认 judge 模型可用、无 API 限流
# 小样本先 dry-run,避免大批量被 OpenAI 限流(用 tenacity 退避)1
2
2
回滚与清理
评测集本身要版本化
评测集若随意增删,指标曲线不可比。把评测集纳入 git/对象存储并打版本,发版报告附"相对上一基线"的 delta,而非绝对值横跳。
故障排查
- faithfulness 虚高:judge 模型太弱/上下文被截断 → 升级 judge、确认 context 完整传入。
- context_recall 算不出:缺
ground_truth列 → 无监督指标不含它,需标注。 - evaluate 卡住:忘了
asyncio.run或用了 0.1.x 写法 → 按 0.2+ 改写。 - 批量被限流:>100 样本不设退避会被 OpenAI 限流 → 加 tenacity / 指数退避。
安全与合规
评测数据的合规
评测集若含真实用户 query 与知识片段,属生产数据,需脱敏与访问控制;judge 模型(如 GPT-4o-mini)会把 context/answer 发往供应商,敏感语料改用本地 judge 模型(如本地部署小模型做裁判)以避免出域。
成本与性能
量级参考,非实测报价。
- Ragas 每个样本消耗若干 judge LLM 调用(faithfulness/answer_relevancy 各需调用),跑全套 4 指标约 4× 调用量。
- 无监督两指标(faithfulness + answer_relevancy)最便宜,适合日常;有监督全套留到发版。
- 用
gpt-4o-mini等小 judge 可显著降本;大批量务必退避,避免限流重试放大成本。