LLM 评测 & 护栏
DeepEval / Promptfoo / Ragas / Opik / Guardrails AI — 上线前给每次 prompt 改动打分,提前抓退化。
这个 pack 装了什么
这个包收齐了 LLM 功能上线后、「这周模型变差了」不再能糊弄的团队最终都会用上的 五个开源工具。工具分两半:上线前评测(每次 prompt 改动都打分)和运行时护栏(约束模型实际输出)。
| # | 资产 | 阶段 | 强在哪 |
|---|---|---|---|
| 1 | DeepEval | 上线前 | pytest 风格 LLM 输出单元测试(G-Eval / Faithfulness / 幻觉指标) |
| 2 | Promptfoo | 上线前 | 跨模型 A/B prompt 对比 + 红队扫描 |
| 3 | Ragas | 上线前 | RAG 专用指标:context 精度 / 忠实度 / 回答相关性 |
| 4 | Opik | 可观测 | 生产链路追踪、每个请求的评测分、数据集策展 |
| 5 | Guardrails AI | 运行时 | 验证输出 schema 与策略,自带重试与重问 |
这个分工很关键。上线前评测在客户看到之前抓退化;运行时护栏抓你没预测到的退化。两个都要 —— 只评测漏掉没采样到的对抗输入,只护栏不知道是哪次 prompt 改动引起漂移。
为什么评测现在是入场券
三个推力让评测变成「能上线 vs 卡住」的分水岭:
- 模型升级按厂商节奏发。Anthropic 出 Sonnet 4.7,你在 4.6 上跑通的 prompt 在 4.7 上行为可能微妙不同。没评测套件,你从客服工单里发现;有 Promptfoo,跑一条
promptfoo eval -c promptfooconfig.yaml --providers anthropic:claude-4.7,anthropic:claude-4.630 秒看到 diff。 - Prompt 没有编译错误。代码里打错字会抛异常;prompt 里打错字产生看起来合理但更差的输出,然后上线。评测是 prompt 从来没有的编译步。
- RAG 质量悄悄退化。新加进来的 doc 被检索到但其实不相关,回答质量降但没有任何报错。Ragas 给每个查询出 context 精度和忠实度分,让你在退化累积之前发现。
一条命令装齐
# 把整个 pack 装进当前项目
tokrepo install pack/llm-eval-guardrails
# 或只装单个
tokrepo install promptfoo
tokrepo install ragas
TokRepo CLI 装好 evals/ 目录(带样例测试用例)、promptfooconfig.yaml、Ragas notebook(已接你检索器)、Guardrails AI rail 文件模板。CI 片段按评测套件通过率把 merge。
常见踩坑
- LLM-as-judge 没接地。DeepEval 和 Ragas 用 judge 模型给答案打分,但 judge 跟被测系统是同一个模型时分会乐观偏。用不同家族当 judge,或固定更强模型(例如打 GPT 输出时用 Claude judge)。
- 评测集才 5 条。手挑的 5 个样例覆盖不了长尾。目标 50-200 条,从真实生产日志衍生(Opik 让这步简单 —— 采样坏输出、打标签、提升进评测集)。
- 把 Guardrails 当魔法过滤。Guardrails 做 结构(合法 JSON / 无脏话 / 符合 schema)—— 抓不到「事实错但格式对」的答案。要叠 Ragas 忠实度检查。
- 对生产流量跑评测烧钱。每次都重打分的话评测套件能让 LLM 账单乘 5-10。embedding 缓存、夜跑采样、judge 用便宜模型。
- 非文本输出没评测。Agent 输出工具调用,要用结构化断言评测 工具调用形态,不只是最终文本。Promptfoo 通过自定义
transform和assert钩子支持。
这套不够用的时候
要超出 Opik 的完整 生产可观测(延迟分位 / 按用户成本 / 模型路由分析),看 LangSmith 或 Arize Phoenix —— 都没放进 pack 因为它们更偏编排不是评测。要 安全分类器(越狱检测 / prompt 注入打分),加 Llama Guard 或 NVIDIA NeMo Guardrails —— Guardrails AI 重在输出验证不是对抗输入检测。要做 人工标注 大规模评测,Argilla 或 Label Studio 接 Opik 数据集格式。
5 个资产打包就绪
常见问题
整套全跑下来收费吗?
五个工具都是宽松开源(Apache 2.0 或 MIT)。计算开销是变量:每次评测调用一次 LLM,200 条 × 4 个 prompt 变体 × 2 模型 = 一次跑 1600 次 LLM 调用。激进缓存、夜跑采样、发版才全跑。Ragas 和 DeepEval 支持 LLM-as-judge 用便宜模型(Haiku / gpt-4o-mini)压低 judge 成本。
比 LangSmith / Braintrust 怎么样?
LangSmith 和 Braintrust 是托管平台,把评测、可观测、数据集策展放一个 UI。这个 pack 给你 80% 功能 0 成本 + 完全自建。代价:组件自己接(Promptfoo 评测 / Opik 追踪 / Guardrails 运行时)而不是一个仪表盘搞定。否则团队完全不会做评测就选托管;工程时间比席位费便宜就选这个 pack。
Claude Code / Cursor 能用吗?
能。Claude Code 可以从功能规格生成 Promptfoo 配置和 DeepEval 测试用例 —— 给它规格 + 几个 prompt 样例,它生成 evals/test_*.py 和 promptfooconfig.yaml。TokRepo 资产页带把这接到 prompt-eval 斜杠命令的 subagent prompt。Cursor 走自定义规则。
Promptfoo 跟 DeepEval 区别?
Promptfoo 配置驱动(YAML),强项在跨厂商 / 模型 A/B 对比 —— 「应该从 GPT 切 Claude 吗」这种问题专治。DeepEval 代码驱动(pytest),强项在单 prompt 的单元测试式断言 —— 「这个回答必须提 X 不能有 Y」。多数团队两个都跑:Promptfoo 选模型,DeepEval 抓 prompt 退化。
加 Guardrails AI 的运维坑?
Guardrails 重问会乘延迟和成本 —— 每次验证失败触发一次新的 LLM 调用修输出。设最大重试 1-2 次,在 Opik 监控 reask 率(>5% 说明 prompt 本身错了不是输出错了),底层模型支持时(Claude / GPT-4o / Gemini 都支持)优先用结构化输出(JSON schema)而不是重问。