AI 评测系列(06):DeepEval 实战——企业级 Agent 评测套件

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_calledexpected_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 给明确结论

总结

  1. ToolCorrectness 20% 通过:4/5 个用例 Agent 没有调工具就直接回答了,ToolCorrectness 全部失败;这个数字与 Article 05 的 73% 工具名准确率一致,两个框架从不同角度揭示了同一个问题
  2. Faithfulness = 0 的陷阱:Agent 跳过工具直接回答时,retrieval_context 为空,Faithfulness 得 0 分------即使答案事实正确;Faithfulness 要有意义,前提是工具调用要成功
  3. RAGAS 做趋势,DeepEval 做门控:两者范式不同,适合组合使用,不是竞争关系

参考资料


欢迎访问 PrimeSkills ------ 一个精心策划的 AI Agent 与技能市场,所有内容均经过真实企业级工作流验证。没有噱头,只有真正有效的东西。

更多实用知识和有趣产品,欢迎访问我的个人主页

相关推荐
冬奇Lab1 小时前
开源项目第166期:worldmonitor — 实时全球情报仪表盘,73k Star 的 AI 驱动地缘政治监控平台
人工智能·开源·资讯
AI探索先锋1 小时前
AMD 2nm 芯片炸裂、欧洲首家人形机器人独角兽诞生、AI Agent 互联标准打响:10 条信号看懂产业变局|今日科技 AI 机器人快讯
大数据·人工智能·深度学习·搜索引擎·机器人
ARM|X86+FPGA工业主板厂家1 小时前
RK3588+FPGA+EtherCAT异构架构解析|工业场景如何同时保住AI算力与微秒级运动实时性
人工智能·fpga开发·架构
玖妍呐1 小时前
2026实测|3款一键AI求职证件照生成工具,适配简历网申(无水印/免费)
人工智能
tedcloud1231 小时前
OmniRoute怎么部署?开源AI模型路由平台Linux部署教程
linux·服务器·人工智能·开源·音视频
动物园猫2 小时前
人体部位目标检测数据集:5类别、7,000张图像 | 目标检测
人工智能·目标检测·计算机视觉
sramdram2 小时前
离线语音识别芯片_低功耗智能语音识别IC解决方案
人工智能·语音识别·语音识别芯片·离线语音识别芯片
小码哥哥2 小时前
四大企业AI知识库技术架构深度对比:从设计哲学到实现差异
人工智能·架构
聚焦前沿2 小时前
涡街流量计用户如何判断厂家是否靠谱
大数据·人工智能