记录一下那天晚上的排查过程。deepeval 1.4,用 AnswerRelevancyMetric 跑 200 条问答,结果全是 NaN,单独跑一条却能出分,数据集是从 jsonl 读进来的。
刚开始盯着「并发评测触发 judge 模型限流,分数被吞」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。retrieval_context 字段没传,指标内部除零。还有一种是LLMTestCase 的 actual_output 是空串。
还有一种情况,阈值传成 None,聚合时跳过了统计。
先打印第一条用例的字段
python -c "import json;r=[json.loads(l) for l in open('ds.jsonl')][0];print(list(r.keys()))"
补上检索上下文再构造用例
python -c "from deepeval.test_case import LLMTestCase;t=LLMTestCase(input='q',actual_output='a',retrieval_context=['c']);print(t.retrieval_context)"
单条评测确认能出分
python -m deepeval test run test_one.py -v
末了统计空输出条数
python -c "import json;print(sum(1 for l in open('ds.jsonl') if not json.loads(l).get('answer')))"
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
怎么算真的好了,看的是同一批现象。200 条全部产出 0 到 1 之间的分数,NaN 数量为 0,平均分与单条抽测一致。
NaN 多半是必填字段缺失导致的除零,先看单条用例字段,再怀疑评测框架。这类问题最好一次改到位,反复小改反而容易把原因搅混。
