Ragas 0.4 实战:搭一套能把检索问题和生成问题分开的评测流程

2026-10-24 约 23 分钟阅读

助手每道题都答得流利,却没人能追回原文;检索取错了段落和模型忽略了正确段落,在日志里长得一模一样,于是团队争论提示词,真正的 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 那套流程。

相关文章
2026-10-20
2026哈利法克斯AI外勤服务软件:跨港调度与HST开票怎么测
2026-10-22
Docker跑Ollama配GPU:compose写法、环境变量默认值,和悄悄掉回CPU的显存账
2026-10-23
在 Linux 服务器上跑本地大模型:systemd 托管、GPU 实测,和 vLLM 与 llama.cpp 的分岔口
2026-10-23
建 RAG 之前先把 PDF 转对照:Docling、Marker、MinerU 和一个能打分的对比脚本
2026-10-19
2026商业地产AI租约提取软件:该比的是条款覆盖,不是字段数量
2026-10-21
2026波兹南AI开票软件:KSeF期限、23%增值税与两人工作室怎么选

本站文章由编辑人工撰写,收录的工具均经过实测或公开资料核验。文中链接指向工具官网或 GitHub 仓库,仅作信息参考,不构成付费推广。

💬 评论 (0)

暂无评论,来说两句吧~

登录后评论