LLM 评估实战:Ragas + LangSmith 在政策 RAG 系统的落地
做 LLM 应用 1 年多,最痛的教训是:没有评估体系的 RAG 系统,就是一个不能 debug 的黑盒。
这篇文章复盘我们 Chatomni 政策 RAG 系统的评估体系搭建过程——从”拍脑袋觉得好”到”有数字、可对比、可回归”的演进。
一、痛点:我们怎么发现”评估”是必须的
Chatomni 上线第 2 周,产品经理提了个问题:”为什么用户问’增值税对小微企业的影响’,你给的答案里引用了 2023 年的文件?现在明明有 2025 年的新政策。”
开发小哥一脸懵——RAG 链路看起来没问题:query → embedding → 检索 → 拼 prompt → LLM 生成。但为什么引用错了?
排查了 3 天,最后发现:
- 检索阶段召回了 2023 年的文件(因为 query 和 2023 文件的 embedding 相似度更高)
- LLM 不知道为什么”忽略”了更新的 2025 文件(拼 prompt 时 2025 文件被排到了后面)
- 没有任何指标告诉我们”检索阶段召回了不该召的文档”
如果当时我们有评估体系:
- Context Recall(检索召回率) 指标会立刻报警
- 可以对比 “改 prompt 顺序” vs “改 embedding 模型” 的效果差异
- 可以回归测试每次 prompt 改动是否引入新问题
这件事让我意识到:LLM 应用必须有自己的 CI/CD 流程,而评估体系是这个流程的基石。
二、第一阶段:人工抽检(够用 1 个月)
最早期的”评估”很简单——每周抽 20 条对话,业务专家打分。
1 | ## 抽检表(每周 20 条) |
优点
- ✅ 零门槛,业务专家能上手
- ✅ 能发现业务侧的真问题(比如”漏掉 2025 新政”)
- ✅ 答案准确率高(人眼判断)
缺点
- ❌ 样本量太小:每周 20 条,覆盖率低
- ❌ 不可回归:每次改 prompt 都得重新抽检一遍
- ❌ 不可对比:A prompt vs B prompt 哪个好?只能靠”感觉”
- ❌ 耗人力:业务专家每周花 2 小时
跑了一个月后,我们要做 prompt 优化,但**没有指标告诉我们”优化后是否真的好了”**。于是开始搭建自动化评估体系。
三、第二阶段:Ragas 自动评估(RAG 黄金指标)
调研了一圈,最终选了 Ragas——专门为 RAG 系统设计的评估框架,核心指标:
| 指标 | 含义 | 我们关心吗 |
|---|---|---|
| Faithfulness | 答案是否忠实于检索到的上下文(无幻觉) | ⭐⭐⭐⭐⭐ |
| Context Precision | 检索的 top-k 中相关文档的比例 | ⭐⭐⭐⭐⭐ |
| Context Recall | ground truth 相关文档被召回了多少 | ⭐⭐⭐⭐⭐ |
| Answer Relevancy | 答案与问题的相关程度 | ⭐⭐⭐⭐ |
| Answer Correctness | 答案与 ground truth 的一致性 | ⭐⭐⭐⭐⭐ |
集成 Ragas
Ragas 是 Python 库,但我们的 Chatomni 主服务是 Node.js。跨语言集成的方案:
1 | Node.js 业务服务 ──HTTP POST──> Python 评估微服务 ──> Ragas 计算指标 |
Python 评估微服务核心代码
1 | from fastapi import FastAPI |
Node.js 业务侧集成
1 | // 每次对话结束后,异步发评估请求(不阻塞用户响应) |
Golden Dataset 的构建
评估体系要能跑起来,必须有 ground truth——业务专家标注的”标准答案”。
我们建了一个 200 条的 Golden Dataset:
| 字段 | 示例 |
|---|---|
| question | “增值税对小微企业的影响是什么?” |
| ground_truth_answer | “根据《财政部 税务总局 2025年第12号公告》…” |
| relevant_docs | [“doc_2025_001”, “doc_2023_045”] |
| difficulty | easy / medium / hard |
| scenario | 引用准确 / 漏引 / 多引 / 幻觉 |
关键经验:每周迭代 Golden Dataset——用户实际反馈的问题里,发现”评估体系没覆盖的场景”就补充进去。半年后 Golden Dataset 长到了 500 条,覆盖了 80% 的核心场景。
四、第三阶段:LangSmith 做 Trace + 回归测试
Ragas 给的是整体指标,但生产环境的失败往往是某一步的问题。LangSmith 解决了”trace + 回归”:
4.1 全链路 Trace
1 | import langsmith |
打开 LangSmith 看一次完整 trace:
1 | [00:00.000] chatomni.retrieve |
没有 trace 时这种问题排查要 1-2 天,有 trace 10 分钟。
4.2 回归测试套件
每次改 prompt / embedding / 切模型前,先跑 200 条 Golden Dataset 看指标变化:
1 | def regression_test(before_config, after_config): |
输出示例:
1 | Metric Before After Delta |
只要 delta 显著为负,prompt 改动就不上线。
五、LLM-as-a-Judge 的踩坑经验
5.1 Judge 不能评自己
最初我们用 Qwen-Turbo 生成答案,用 Qwen-Plus 做 Judge——后来发现 Judge 经常给”自己家兄弟”打高分。
后来改成:
- 主 Judge:Qwen-Plus(成本适中)
- 辅助 Judge:Claude Sonnet 4.6(复杂推理题评分更准,成本高 4-5 倍)
- 复杂任务用双 Judge 投票,减少单模型偏差
5.2 Cohen’s Kappa 校准
Judge LLM 评分和人工评分的一致性需要量化。我们每月抽 100 条对话,2 名业务专家独立打分,然后算 Cohen’s Kappa:
| 月份 | 业务专家间 IAA | Judge vs 人工 IAA |
|---|---|---|
| 2026-01 | 0.82 | 0.65 ⚠️ |
| 2026-02 | 0.84 | 0.71 ✅ |
| 2026-03 | 0.83 | 0.76 ✅ |
Kappa 偏低时,用 calibration set(已知人工分数的样本)微调 Judge prompt:
1 | # calibration_prompt_template = """ |
调完后 Kappa 从 0.65 提升到 0.76。
5.3 防 Prompt Injection
Judge LLM 绝不能接触用户原始 query——否则恶意用户可能通过 query 注入指令欺骗 Judge。
1 | # ❌ 错误做法:Judge 看到用户 query |
六、我们当前的评估架构
1 | ┌─────────────────────────────────────────────────────────────┐ |
七、踩过的坑(写给后来的同学)
坑 1:评估指标不要”贪多”
最初想一口气接入 Ragas 所有指标,结果发现:
- 有些指标计算慢(一次评估 30 秒+)
- 有些指标业务方看不懂
- 维护成本高
最终只保留 5 个核心指标:Faithfulness / Context Recall / Answer Correctness / Answer Relevancy / Context Precision。其他按需加。
坑 2:Golden Dataset 必须持续更新
半年前建的 Golden Dataset,**半年后覆盖率下降到 50%**——因为:
- 用户问的新场景 Dataset 里没有
- 业务规则变了(比如新出台的政策类型)
每周花 1 小时更新 Dataset——这是评估体系能持续有用的前提。
坑 3:评估不能只看总分
最初我们只盯 “Faithfulness 总分”,结果某次 prompt 优化后总分从 0.92 升到 0.93,但细分场景的”多文档引用”准确率反而下降了。
后来改成分场景出报告:
1 | Faithfulness 总体:0.92 → 0.93 (+0.01) |
总分掩盖了个别场景的恶化,必须分桶看。
坑 4:评估成本不要省
评估微服务每天跑 500+ 次 Ragas,月成本约 ¥300(用 Qwen-Plus 做 Judge)。
有同事说”太贵了,少跑点”。但省评估的钱,会以”线上事故”的形式 10 倍还回来。
- 一次漏掉”幻觉答案”导致客户投诉,处理事故的成本 > ¥5000
- 一次 prompt 改动没回归就上线,引发批量答案错误,损失 > ¥10000
评估是性价比最高的投入,千万别省。
八、工具推荐
| 场景 | 工具 | 备注 |
|---|---|---|
| RAG 指标 | Ragas | 黄金指标齐全 |
| Trace + 数据集 | LangSmith | LangChain 生态最好 |
| 开源 trace | LangFuse | 不想用 LangSmith 的替代 |
| 单元测试 prompt | PromptFoo | 像 pytest 一样测 prompt |
| 综合评估 | DeepEval | G-Eval 等高级方法 |
| 自实现 prefix cache | Redis + MD5 | 成本敏感场景 |
九、总结
LLM 评估体系不是”锦上添花”,是**”能不能上线”的最低门槛**。
核心原则:
- 没有 Golden Dataset,就没有评估——投入人力建 Dataset 是最值得的事
- Ragas + LangSmith 是黄金组合——一个给指标,一个给 trace
- 评估体系要持续更新——业务在变,Dataset 必须跟着变
- 评估不能只看总分——分桶看场景才能发现问题
- Judge LLM 要校准 + 防注入——别让 Judge 评自己 / 被 prompt 欺骗
最后一句话:把”prompt 优化”当成”代码优化”对待——先写测试,再改代码,最后跑回归。
十、参考资料
作者:魏远标,贝斯平 AI 架构师。技术博客:javai.tech
如果你也在搭建 LLM 评估体系,欢迎留言交流~