RAG 评估实战:用 RAGAS 量化检索增强生成质量

RAG(检索增强生成)系统上线前,最难回答的问题是:它到底答得准不准?靠人工抽检几条问答既不可持续、也不可回归。RAGAS 是一套开源的 RAG 评估 框架,用 faithfulness(忠实度)、answer_relevancy(答案相关性)、context_precision(上下文精度)与 context_recall(上下文召回)四个核心指标,把”检索增强生成质量”量化成可比较、可回归的分数,让每次知识库、分块策略或提示词的改动都有数据支撑。本文手把手跑通一次端到端 RAGAS 评估。

一、为什么 RAG 必须被量化评估

传统单元测试只能验证”代码有没有报错”,却验证不了”模型有没有胡说”。RAG 链路里至少有两段不确定性:检索器召回的上下文是否切题,生成器是否真的基于上下文作答还是凭空编造。这两段一旦失守,用户看到的就是一本正经的幻觉。靠人眼抽查 20 条问答,永远覆盖不到长尾;而把评估做成可自动运行的脚本,每次发版前跑一遍,就能把质量红线变成工程约束。这正是 RAGAS 存在的价值——它把”答得好不好”翻译成四个可计算的指标。

二、RAGAS 四大核心指标拆解

RAGAS 的指标设计恰好对应 RAG 链路的两个环节:检索质量(context_*)与生成质量(faithfulness / answer_relevancy)。理解每个指标在”考什么”,才能看懂评估报告。

指标考察环节越高代表是否需要标准答案
faithfulness 忠实度生成答案全部能从上下文推出、无编造否(仅需上下文)
answer_relevancy 答案相关性生成答案切题、没有答非所问否
context_precision 上下文精度检索靠前的相关片段确实有用是(需 reference)
context_recall 上下文召回检索标准答案需要的证据都被召回是(需 reference)

2.1 Faithfulness 忠实度:模型有没有编故事

忠实度衡量答案中的每一条 claim 是否都能在给定上下文里找到依据。它是 RAG 最该盯紧的指标——一旦分数掉下来,说明生成器在”自由发挥”。实现上 RAGAS 会用 LLM 把答案拆成若干陈述句,再逐句回查上下文,统计可被支撑的比例。

2.2 Answer Relevancy 答案相关性:答非所问没

相关性考察答案是否真正回应了问题。即使完全忠实于上下文,如果模型绕开问题本身,相关性也会很低。该指标用”用答案反推问题、再比对原问题相似度”的思路打分,无需人工标准答案,适合大规模自动化。

2.3 Context Precision / Recall:检索器到底行不行

这两个指标需要一份”标准答案参考”(reference),用来判断检索器召回的片段是否包含回答问题所需的证据、以及有用片段是否排在前面。它们直接反映你的向量库、分块大小和 top-k 设置是否合理,是优化检索阶段的第一抓手。可参考 向量检索评测实战:Recall@K 与 RAG 质量度量 里 Recall@K 的检索侧度量思路做交叉验证。

三、环境准备与评测数据集构造

RAGAS 基于 HuggingFace datasets 的 Dataset 结构,每条样本需要四个字段:问题、答案、检索到的上下文列表,以及(用于 context_* 指标)标准答案参考。先装依赖:

# 安装核心依赖
pip install ragas datasets langchain-openai

# 如果你打算用本地模型当"判官",再装 Ollama 适配
pip install langchain-ollama

构造评测集时,建议从真实用户问题里抽样,并保留人工标注的标准答案。样本量不必大,50~200 条就足以看出趋势;关键是覆盖你的长尾场景,而不是只挑简单的。

from datasets import Dataset

samples = {
    "question": [
        "公司年假怎么计算?",
        "报销单超过 5000 元需要谁审批?",
    ],
    "answer": [
        "入职满 1 年享 5 天年假,每多 1 年加 1 天,上限 15 天。",
        "超过 5000 元需部门总监审批,超过 2 万元需财务副总裁审批。",
    ],
    "contexts": [[
        "年假制度:入职满 1 年 5 天,每满 1 年加 1 天,封顶 15 天。",
        "报销审批:<5000 直属领导;5000~20000 部门总监;>20000 财务副总裁。",
    ]],
    "reference": [
        "入职满一年可休 5 天年假,逐年递增,最多 15 天。",
        "5000 元以上由部门总监审批,2 万元以上由财务副总裁审批。",
    ],
}
dataset = Dataset.from_dict(samples)

四、用 RAGAS 跑一次端到端评估

把数据集和评估指标传给 evaluate,RAGAS 会自动调用”判官模型”给每条样本打分,最后汇总成均值。下面用 OpenAI 兼容接口作为判官,实际生产里完全可以换成自建模型(见下一节)。

from ragas import evaluate
from ragas.metrics import (
    faithfulness, answer_relevancy,
    context_precision, context_recall,
)

result = evaluate(
    dataset,
    metrics=[faithfulness, answer_relevancy, context_precision, context_recall],
)
print(result)
# 输出示例: faithfulness=0.94, answer_relevancy=0.91,
#           context_precision=0.88, context_recall=0.90

输出是一组 0~1 的分数。单独看绝对值意义不大,关键是把它接入 CI,和上一版本做对比——只要 faithfulness 或 context_recall 跌幅超过阈值,就阻断发版。

五、用本地模型当”判官”,省钱又可控

评估过程本身要大量调用 LLM,全走云端 API 成本不低,且数据要出网。RAGAS 支持用 LangChain 包装任意模型,包括本地 Ollama 部署的开源模型。搭建私有知识库与推理链可参考 2026 年搭建私有 AI 知识库:Dify + Ollama 本地部署完整教程,推理引擎选型见 大模型推理引擎怎么选:vLLM/SGLang/Ollama。

from langchain_ollama import ChatOllama, OllamaEmbeddings
from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper

# 用本地 qwen2.5 当判官 LLM,nomic-embed-text 当嵌入
local_llm = ChatOllama(model="qwen2.5:14b", base_url="http://localhost:11434")
local_emb = OllamaEmbeddings(model="nomic-embed-text", base_url="http://localhost:11434")

evaluator_llm = LangchainLLMWrapper(local_llm)
evaluator_emb = LangchainEmbeddingsWrapper(local_emb)

result = evaluate(
    dataset,
    metrics=[faithfulness, answer_relevancy, context_precision, context_recall],
    llm=evaluator_llm,
    embeddings=evaluator_emb,
)

本地判官对显存有要求,14B 级别建议至少 12GB 显存;显存紧张可降到 7B,但分数会与云端模型存在系统性偏差,做版本对比时务必固定同一判官,否则数字不可比。本地量化部署要点见 本地大模型量化部署:GGUF 与 llama.cpp 调优。

六、把评估做成 CI 可回归的质量防线

评估只有跑进流水线才有生命力。把上面的脚本封装成 pytest,给每个指标设最低门槛,再挂到 GitHub Actions,每次改知识库或提示词都自动跑。CI 基础可参考 GitHub Actions 实战:从零搭建 CI/CD 流水线。

# test_rag_eval.py
import pytest
from ragas import evaluate
from ragas.metrics import faithfulness, context_recall

def test_rag_quality(dataset, evaluator_llm, evaluator_emb):
    r = evaluate(dataset, metrics=[faithfulness, context_recall],
                 llm=evaluator_llm, embeddings=evaluator_emb)
    assert r["faithfulness"]   >= 0.85, "忠实度跌破红线,疑似幻觉"
    assert r["context_recall"] >= 0.80, "召回不足,检索需要优化"
指标建议下限跌破意味着
faithfulness0.85生成器开始编造,优先排查提示词
answer_relevancy0.80答非所问,检查问题与上下文对齐
context_recall0.80检索漏召,调整分块 / top-k / 向量库
context_precision0.75召回噪声大,前置过滤或重排

七、常见误区与排障

落地 RAGAS 时几个高频坑:用同一份数据既训练又评估导致分数虚高;判官模型和生成模型混用造成偏差;只盯总分忽略单项;以及样本量太小导致波动大。下面给出排查清单。

现象可能原因对策
faithfulness 持续偏低提示词未强制”仅依据上下文”加入”不得超出上下文作答”约束
context_recall 上不去分块过大或 top-k 太小减小分块、提升 top-k、加混合检索
各次运行分数抖动判官 LLM 温度未清零固定 temperature=0 与随机种子
本地判官偏差大模型能力弱于云端统一判官版本,仅做环比

八、与向量检索评测的关系

RAGAS 的 context_* 指标关注的是”召回的内容对不对”,而 向量检索评测实战:Recall@K 与 RAG 质量度量 介绍的 Recall@K 关注的是”在前 K 条里是否命中”。两者是互补视角:Recall@K 帮你调检索器参数,RAGAS 帮你看最终生成质量。建议先用向量检索评测把召回基线打好,再用 RAGAS 做端到端验收,形成”检索—生成”双保险。多智能体编排场景里的可靠性保障思路,也可对照 AutoGen 实战:用多智能体编排框架构建协作式 AI Agent 一起看。

结语

RAG 不是”接个向量库就能上线”的玩具,它的质量需要被持续度量。RAGAS 把忠实度、相关性、上下文精度与召回变成可回归的数字,让检索增强生成从玄学走向工程。把它接进 CI,你的每次改动都能带着数据底气上线。

上一篇 OpenTelemetry 实战:微服务可观测与分布式追踪
下一篇 Poetry 实战:用 pyproject.toml 统一 Python 依赖管理与打包发布
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]