上一期我们在评测的时候,遇到一个情况,那就是在评测某些指标的时候,ragas输出的分数并不稳定。比如在评测answer_relevancy这个指标的时候。
user_input="法国在哪里?它的首都是什么?",
response="法国在西欧,首都是巴黎"
这样的问答对,相比下面的问答对理论上应该是分数更高的,因为前者完整且直接地解决了原始问题,而后者缺失了“首都”这一关键信息。:
user_input="法国在哪里?它的首都是什么?",
response="法国在西欧"
但在实际测试中偶尔出现相反的情况,主要是因为 Answer Relevance 指标的计算机制依赖于大语言模型(LLM)的语义相似度判断。其核心原理是:让 LLM 为生成的答案逆向生成多个“变体问题”,然后计算这些变体问题与用户原始问题之间的平均余弦相似度。 所以,出现这个问题主要有以下几种原因(重要性依次从高到低) 1、两个答案相似度太高了 两个答案,“法国在西欧,首都是巴黎”和“法国在西欧”的核心语义都高度集中在“法国”、“西欧”等关键词上。由于短文本的语义信息本身就比较有限,多出来的“首都是巴黎”这几个字,往往不足以将两个句子在多维向量空间中彻底拉开距离。 那同理,"法国的在哪里?首都是哪里?"和"法国的在哪里?"也是相似度很高的,当评估模型去计算它们与原始问题的余弦相似度时,两者的得分也会非常接近。 而且, answer_relevancy 这个指标主要侧重于衡量“回答是否切题”(即相关性),而不是衡量“回答是否完整”。 理论上来说,只要你的回答没有偏离主题、没有说无关的废话,它就能拿到很高的基础分。“法国在西欧”虽然不完整,但它完全没有偏题,所以它能拿到一个极高的基准分。 2. 评估模型的幻觉或不稳定性 LLM 的本质是基于概率预测下一个词,它在特定情况下可能会出现“幻觉”或表现出不稳定性。当作为“裁判”的评估模型自身状态波动时,其生成的逆向问题质量也会参差不齐,进而导致评分结果违背直觉。 所以,针对这两个原因,我们可以做一些特定的优化(有些手段上一期也讲了)。 1、扩大测试集规模并取平均值(必做) 前面其实为了演示,我们只用了一个问题,而这种小样本下的单次评估极易受偶然因素干扰。所以实际再做测评的时候,都会用测试集。一个测试集中会包含很多个问题,少则几十个,多则可能也有数百个。 随着数据集的增多,数据的多样性也会变得刚高,这样就能减少单个极端case(如我们的示例)带来的极端分数。 就像我们上一期讲的一种做法,把一个对照的case改为答案为法国的著名作家是雨果 。 2、更换更适合的评估模型(常用) 一般来说,参数量更大的模型,效果会越好。闭源模型可能会比开源模型的效果好。所以比较常见的做法是换一个模型,比如GPT 4不行,就换成GPT 5。 像我们之前视频那种情况,qwen3.7-max的评测效果反而不如qwen3.6-plus,这种情况发生的还是比较少的。这时候人工评估(标注)的作用就体现出来了,需要靠人工打标兜底,找一个合适的模型。 一般在大厂中,也会用经过微调的专门的裁判模型来做评测。 3、多次评估求平均 单次评估可能存在一定的随机性。所以,我们在评估时候,可以针对对同一组数据进行多次重复评估,最后取各项指标的平均值作为最终得分,从而大幅降低分数的波动幅度。 有的时候也可以结合上面的方案2,用多个模型多次评估,在通过投票或者取平均值的方式来减少波动。 但是这个方案有一定的成本,因为要多次调用。 4、调整模型参数(常用) 前面说过,因为裁判模型本身存在幻觉或随机性,评估分数就会极不稳定。所以我们可以通过调整参数来减少这种不稳定和随机性。 主要是设置temperature和seed。比如将裁判 LLM 的温度(Temperature)严格设为 0,以消除生成过程中的随机性。 把llm = llm_factory("qwen3.7-max", client=openai_client) 改为:
llm = llm_factory(
"qwen3.7-max",
client=openai_client,
temperature=0, # 降低温度使评估结果更稳定、确定
seed=42 # 固定随机种子以实现可复现的输出
)
针对之前的case,实测有效果。设置了这两个参数以后,确实结果会更加稳定了。 最后,人工兜底,很重要