当前位置: 首页 > news >正文

ragas precision计算的坑

最近在做RAG评测,用到了ragas框架。
在计算ContextPrecision时,发现计算结果跟我理解的不一样。

        sample = SingleTurnSample(user_input=user_input,reference=reference,retrieved_contexts=retrieved_contexts,)context_precision = LLMContextPrecisionWithReference(llm=self.evaluator_llm)precision = context_precision.single_turn_score(sample)

调用代码如上,ragas计算precision的原理是通过大模型判断参考答案(reference)与检索到的内容(retrieved_contexts)的相关性。比如检索到两个相关材料,一个相关,一个不相关,则结果为[1,0]。
然后通过如下的函数计算平均精度:

    def _calculate_average_precision(self, verifications: t.List[Verification]) -> float:score = np.nanverdict_list = [1 if ver.verdict else 0 for ver in verifications]denominator = sum(verdict_list) + 1e-10numerator = sum([(sum(verdict_list[: i + 1]) / (i + 1)) * verdict_list[i]for i in range(len(verdict_list))])score = numerator / denominatorif np.isnan(score):logger.warning("Invalid response format. Expected a list of dictionaries with keys 'verdict'")return score

这里的坑在于,对于第二个材料的结果0,这种计算方式会忽略这个结果。因为这个材料排在末尾,同时又不相关。对于排序或者全量召回环节,这样计算是没问题的。但是对于rag的检索,一般是从多个doc里检索出相关的几个,应该所有的结果都是正样本,不应该出现结果为0而不影响precision的情况。所以对这里代码做了下修正,修正后结果如下:

    def _calculate_average_precision_custom(self, verifications: t.List[Verification]) -> float:"""考虑负样本之后的平均精度计算。同时也考虑位置,比如[1,0]返回0.75,比如[0,1]返回结果0.25"""verdict_list = [1 if ver.verdict else 0 for ver in verifications]if not verdict_list:return 0.0cumulative_positives = 0sum_precision = 0total_samples = len(verdict_list)for i, verdict in enumerate(verdict_list):if verdict == 1:cumulative_positives += 1# 计算当前位置的精度,无论是正例还是负例current_precision = cumulative_positives / (i + 1)sum_precision += current_precision# 使用所有样本的平均精度return sum_precision / total_samples

有用到ragas计算精度的一定要注意这里的影响,尤其是检索结果只有两个的时候影响更为明显,会忽略掉最后一个样本为负时对精度的影响。

相关文章:

  • JavaScript计时器详解:setTimeout与setInterval的使用与注意事项
  • 初步认识HarmonyOS NEXT端云一体化开发
  • 活到老学到老-Spring参数校验注解Validated /Valid
  • 工单派单应用:5 大核心功能提升协作效率
  • Git 克隆子分支
  • linux安装JDK8
  • Elasticsearch面试题带答案
  • 软件架构之-论分布式架构设计及其实现
  • 制造业或跨境电商相关行业三种模式:OEM、ODM、OBM
  • 集成运算放大器知识汇总
  • 【高斯函数】
  • sqli-labs第十一关——‘POST联合查询
  • 【Bluedroid】蓝牙HID Device virtual_cable_unplug全流程源码解析
  • deepseek梳理java高级开发工程师es面试题
  • 【SFT监督微调总结】大模型SFT全解析:从原理到工具链,解锁AI微调的核心密码
  • 通过改进模型减少过拟合现象的技术文档
  • [luogu12543] [APIO2025] 转杆 - 构造 - 贪心
  • 面试之MySQL慢查询优化干货分享
  • Vue video播放视频流
  • 数据实时同步:inotify + rsync 实现数据实时同步
  • 美“金穹”反导系统增加外空作战手段,外交部:中方严重关切
  • 演员辛柏青发讣告:妻子朱媛媛患癌去世
  • 持续推动深入贯彻中央八项规定精神学习教育走深走实!上海市委党建工作领导小组会议举行
  • 离休干部周惠梅逝世,曾从事多年地下革命工作
  • 技术派|台军首次试射“海马斯”火箭炮,如何压制这种武器?
  • 中纪报:强化监督推动过紧日子要求落到实处