Ragas 0.4 实战:搭一套能把检索问题和生成问题分开的评测流程
助手每道题都答得流利,却没人能追回原文;检索取错了段落和模型忽略了正确段落,在日志里长得一模一样,于是团队争论提示词,真正的 bug 躺在切分里。
💡 你将学到
助手每道题都答得流利,却没人能追回原文;检索取错了段落和模型忽略了正确段落,在日志里长得一模一样,于是团队争论提示词,真正的 bug 躺在切分里。
RAG 系统最大的麻烦不是不会答,而是答得很流利却错了。这时候你分不清是检索取错了段落,还是模型拿到对的段落却自己编。两种病在外面看起来一样:一段顺滑、却追不回原文的话。Ragas 的作用就是把这个症状拆成能看的数字,而 0.4 版的调用方式跟老教程已经不一样了。
现在箱子里有什么
PyPI 上的 ragas 0.4.3,Python 3.9 起。仓库已经搬到 vibrantlabsai 名下,老地址 explodinggradients 还能跳转,所以网上大量教程链接的是旧名。包里同时存在两套 API:新的是 ragas.metrics.collections,每个指标先构造再 await metric.ascore();批量那套仍在顶层导出,evaluate、aevaluate、EvaluationDataset 都还能用。另有命令行 ragas quickstart rag_eval 可以直接生成一个完整评测项目骨架。
四个数字对应四类 bug
选指标的标准是:每个指标只可能因为一个原因变差。这样看板才有用。
上下文召回(ContextRecall)低,是检索的锅:切分、向量、或者用户那句话本身有问题,改提示词没用。上下文精确率(ContextPrecision)低而召回高,说明对的段落在里面但被埋在噪音下面,这也是长上下文模型答得比窗口暗示的更差的原因。忠实度(Faithfulness)低而召回高,是最贵的失败:资料在手边,模型自己编了。答案相关性(AnswerRelevancy)低,是答非所问,把隔壁问题的答案写得很漂亮。
参数别猜,直接核
0.4.3 的签名是这样:Faithfulness 要 user_input、response、retrieved_contexts;AnswerRelevancy 只要 user_input 和 response;ContextRecall 要 user_input、retrieved_contexts 和 reference;ContextPrecision 要 user_input、reference、retrieved_contexts,后两个顺序和召回相反。评审模型用 llm_factory 造,返回的是带结构化输出的 instructor 模型,collections 里的指标只认这个,塞老式 LangChain 包装会直接报错,而不是悄悄给个垃圾分。
评测集从自己的日志里来
用文档自动生成的合成问题,系统性地比真实用户问的简单。真要找 bug,用生产流量。最省事也最重要的一条:检索到的段落要在提问当时就存下来,别在评测时重新跑检索。重新跑等于在测另一个系统,索引悄悄一变,看起来就像模型退化。
二三十到五十条真实问题就能看出方向,前提是每条都真。给每行打上文档族标签,分数掉下来时能定位到语料的哪一段,而不是笼统地说 RAG 不行。
批量跑,别一条一条来
用 asyncio.gather 并发,加一个信号量限制到四路。并发开太大,一半的行会以报错返回,而这种报错看起来像模型坏了。四路对托管 API 比较友好,也能让超时和限流区分得开。
把分数变成闸门
没人看的看板等于没做。两个阈值放进 CI 就够起步:召回低于 0.70 开检索工单,别碰提示词;召回高于 0.80 而忠实度低于 0.85,开生成工单。阈值要从自己的基线来,先跑一遍记下分数,然后以掉五个点作为回归信号。绝对分数跨语料不可比,照抄别人的阈值只会追一个没有意义的口子。
忠实度一次要花多少调用
它不是每题一次调用:先把答案拆成原子陈述,再逐条做 NLI 判断。一条十二个论断的答案大约十三次调用。五十条这样的答案,单这一个指标就是六百多次,这也是很多团队跑了几周就悄悄停掉评测的原因。给评审结果加缓存,全量放夜里跑,提交前只跑十条冒烟。
四个让数字失真的坑
评审模型比被测系统弱,低分往往说明评审没读懂,不是答案编了;把整理过的段落喂进去,召回虚高,切分的 bug 就查不出来了;评审温度不设零,同一行两次分数不一样,团队就会得出「这指标是噪音」的结论;把这些分数当真值,其实它是带误差的模型判断,自己标二十条、算一下一致率,一致率低于八成先修评测再信看板。
箱子里没有的规则,用 DiscreteMetric:给它一个提示和允许的标签集合,返回标签加理由,像「有没有引用正确的政策编号」这种就适合。自定义指标要小而具体,什么都想评的指标最后只会评文风。
什么时候还用批量接口
已经有 question、answer、contexts 三列的数据表时,EvaluationDataset 加 evaluate 是最短路径,适合出报表。想单独看某个数、或者要定位到底哪一步坏,就用逐指标的异步调用,因为批量跑到第三十七行失败,什么原因也看不出来。
把检索和生成分开之后,下一个常见故障往往不是质量而是编排,见 LangGraph 主管那篇;而检索分数低有时根本不是检索的错,是灌进去的文档本身烂,见 PDF 转 Markdown 那套流程。
本站文章由编辑人工撰写,收录的工具均经过实测或公开资料核验。文中链接指向工具官网或 GitHub 仓库,仅作信息参考,不构成付费推广。
