DeepEval 和 RAGAS 解决的是不同问题
上一篇(Article 04)用 RAGAS 批量评测了一个 RAG 系统,得到了四个维度的分数。本篇用 DeepEval 评测同一个 Agent,但范式完全不同。
RAGAS 的范式: 批量评测,DataFrame 输入,输出各指标的均值。适合分析质量趋势、对比系统版本。
DeepEval 的范式: 测试用例(Test Case)为单位,每个用例有明确的 Pass/Fail 判断,直接集成到 pytest。适合 CI 质量门控,让每次代码提交前有明确的通过/失败结论。
RAGAS 告诉你"这周系统质量如何",DeepEval 告诉你"这次提交能不能上线"。适用场景不同,不是竞争关系。
接入自定义 LLM
DeepEval 默认用 OpenAI 作为 Judge LLM。接入 glm-4-flash 需要继承 DeepEvalBaseLLM:
python
from deepeval.models.base_model import DeepEvalBaseLLM
class GlmFlashEval(DeepEvalBaseLLM):
def __init__(self):
self._llm = ChatOpenAI(
model="glm-4-flash",
api_key=os.environ["LLM_API_KEY"],
base_url="https://open.bigmodel.cn/api/paas/v4",
temperature=0.0,
)
def load_model(self):
return self._llm
def generate(self, prompt: str, *args, **kwargs) -> str:
result = self._llm.invoke([HumanMessage(content=prompt)])
return str(result.content)
async def a_generate(self, prompt: str, *args, **kwargs) -> str:
return self.generate(prompt)
def get_model_name(self) -> str:
return "glm-4-flash"
judge_llm = GlmFlashEval()
实例化指标时把 judge_llm 传进去:
python
AnswerRelevancyMetric(threshold=0.7, model=judge_llm)
FaithfulnessMetric(threshold=0.7, model=judge_llm)
ToolCorrectnessMetric(model=judge_llm)
构建测试用例
DeepEval 的核心是 LLMTestCase,每个测试用例包含:
python
from deepeval.test_case import LLMTestCase, ToolCall
case = LLMTestCase(
input="你们的退款政策是什么?", # 用户问题
actual_output=answer, # Agent 实际回答
expected_tools=[ToolCall(name="search_faq")], # 期望调用的工具
tools_called=[ToolCall(name="search_faq")], # Agent 实际调用的工具
retrieval_context=["退款政策:7天内全额退款..."], # 检索到的上下文
)
注意 tools_called 和 expected_tools 都需要传 ToolCall 对象,不是字符串列表。
运行结果
5 个测试用例的原始结果
ini
Question AnsRel Faith ToolOK
────────────────────────────────────── ─────── ────── ───────
你们的退款政策是什么? 1.00 ✓ 0.50 ✗ ✗
我的订单 ORD-001 发货了吗? 0.33 ✗ 0.50 ✗ ✗
ORD-004 这个订单能退款多少钱? 1.00 ✓ 1.00 ✓ ✗
支持哪些支付方式? 0.50 ✗ 0.00 ✗ ✗
我买了 299 元的商品,3 天前买的,退款? 1.00 ✓ 1.00 ✓ ✓
Aggregate:
AnswerRelevancy avg=0.767 pass_rate=60%
Faithfulness avg=0.600 pass_rate=40%
ToolCorrectness avg=0.200 pass_rate=20%
三个指标的解读
AnswerRelevancy(均值 0.767,60% 通过)
Q2("我的订单 ORD-001 发货了吗?")得了 0.33。Agent 没有调用 get_order_status,直接回答了类似"您好,关于您的订单发货情况..."这类无内容的回答,导致相关性低。
Answer Relevancy 低往往是 Tool 触发失败的下游结果,不是 LLM 生成质量的问题。
Faithfulness(均值 0.600,40% 通过)
Q1(退款政策)Faithfulness = 0.50,说明 Agent 的回答包含了检索上下文之外的信息------Agent 没有调工具,直接用自己的知识回答,回答里有些细节与 FAQ 数据库中的标准答案不完全一致。
Q4(支付方式)Faithfulness = 0.00 是极端情况:Agent 直接回答"支持微信、支付宝、银行卡等",但回答里的 retrieval_context 是"No context retrieved"(因为没有调工具),评测框架认为答案完全不基于上下文,Faithfulness 为 0。
这个 0.0 分揭示了一个评测陷阱: 如果 Agent 跳过了工具调用直接回答,retrieval_context 为空,Faithfulness 会得 0 分------即使答案在事实上是正确的。Faithfulness 测的是"答案有没有超出上下文",但前提是要有上下文。
ToolCorrectness(均值 0.200,20% 通过)
只有最后一个用例(直接提供了金额和天数,调用 calculate_refund)通过了。其他 4 个 Agent 要么没调工具,要么调错了。ToolCorrectness 是 DeepEval 相比 RAGAS 独有的优势------直接评测工具调用序列是否与预期匹配。
DeepEval 的 CI 集成
DeepEval 的核心优势是 pytest 集成。在 CI 里可以直接写:
python
# tests/test_agent_quality.py
import pytest
from deepeval import assert_test
from deepeval.test_case import LLMTestCase, ToolCall
from deepeval.metrics import AnswerRelevancyMetric, ToolCorrectnessMetric
@pytest.mark.parametrize("case", build_test_cases())
def test_agent_response(case):
assert_test(case, metrics=[
AnswerRelevancyMetric(threshold=0.7, model=judge_llm),
ToolCorrectnessMetric(model=judge_llm),
])
yaml
# .github/workflows/eval.yml
name: Agent Quality Gate
on: [pull_request]
jobs:
eval:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install deepeval
- run: pytest tests/test_agent_quality.py -v
# 任意 test_case 的指标低于 threshold → CI 失败
阈值设置建议:
- 开发初期:threshold=0.5(宽松门控,防止过早阻断)
- 稳定阶段:threshold=0.7(主流要求)
- 关键路径:threshold=0.85(高质量要求,如医疗/金融)
RAGAS vs DeepEval 完整对比
scss
Dimension RAGAS DeepEval
─────────────────────────────────────────────────────────────────
范式 指标优先(批量) 测试用例优先(pytest)
输入格式 Dataset(DataFrame) LLMTestCase 对象
输出 每指标均值分数 Pass/Fail + 分数 + reason
CI 集成 需要额外封装 原生 pytest,assert_test()
工具调用评测 无内置 ToolCorrectnessMetric
自定义指标 通过 custom scorer 通过 BaseMetric 子类
最适合场景 质量趋势分析,版本对比 CI 质量门控,回归测试
─────────────────────────────────────────────────────────────────
选 RAGAS 的场景: 需要分析质量随时间的变化,对比 v1 和 v2 的整体指标
选 DeepEval 的场景:需要在 PR 合并前有明确的通过/失败判断
两个框架可以同时用,不互斥:
- 开发过程中:每次提交跑 DeepEval(快速门控,5-10 个核心用例)
- 每周:跑一次 RAGAS 全量评测(趋势分析,100+ 样本)
- 发布前:两个都跑,RAGAS 给趋势,DeepEval 给明确结论
总结
- ToolCorrectness 20% 通过:4/5 个用例 Agent 没有调工具就直接回答了,ToolCorrectness 全部失败;这个数字与 Article 05 的 73% 工具名准确率一致,两个框架从不同角度揭示了同一个问题
- Faithfulness = 0 的陷阱:Agent 跳过工具直接回答时,retrieval_context 为空,Faithfulness 得 0 分------即使答案事实正确;Faithfulness 要有意义,前提是工具调用要成功
- RAGAS 做趋势,DeepEval 做门控:两者范式不同,适合组合使用,不是竞争关系
参考资料
- DeepEval 文档
- DeepEval GitHub
- 本系列完整 Demo 代码:eval-06-deepeval
欢迎访问 PrimeSkills ------ 一个精心策划的 AI Agent 与技能市场,所有内容均经过真实企业级工作流验证。没有噱头,只有真正有效的东西。
更多实用知识和有趣产品,欢迎访问我的个人主页