这个坑值得记一笔。deepeval 2.0 在 pytest 里跑 assert_test,AnswerRelevancy 只有 0.31,阈值写的 0.7,测试结果仍然是 passed,命令行退出码是 0。

刚开始盯着「断言包在 try 里,异常被吞掉」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。指标方向不同,阈值判断写反了;pytest 插件没有安装,用例被当普通函数;结果命中了上一次的缓存。

先把指标的分数和阈值打印出来

python -c "print(metric.score, metric.threshold)"

再往下改用 assert_metric 并确认插件已装

pip install deepeval && pytest -q tests/test_rag.py

去掉 try except,让异常正常抛出

pytest -q -x tests/test_rag.py

剩下的就是关闭缓存后重跑一次

deepeval test run tests/test_rag.py --no-cache

同一份数据我导出了两份,一份留底,一份拿来试。

这类问题以前遇到过,但这次的触发条件和上次不一样。

别只看报错消失,验证要多做一步。分数低于阈值时用例失败,pytest 退出码为 1,CI 能拦住这次变更。

提醒一点。评测框架的断言依赖插件注册,脱离 pytest 直接调用很容易静默通过,CI 里要专门验证一次失败用例能不能真的变红。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189