我是怎么给结构化 LLM 输出搭一套能在 CI 里跑的评估框架的

Dev.to ML 2026-10-30T15:57:22.783768

大多数团队评估大语言模型(LLM)的方式,就是读几条输出,然后点点头。这种做法能撑一阵,但迟早会翻车。我做 llm-contract,就是因为想让自己的流水线能诚实回答一个问题:这次改动到底有没有让效果变好。

这套约定包含三块:

Schema 优先的抽取。 每次调用 LLM 都按固定 schema(数据结构约定)返回 JSON。模型一旦跑偏,流水线立刻报错,而不是悄悄产出垃圾。

校验失败回传重试。 schema 校验没过时,把具体的违规信息原样发回给模型,只给它一次重试机会。多数情况它自己能改对,剩下的标记出来交人工看。

CI 安全的评估框架。 录制好的用例(输入、期望输出、元数据)放在 pytest 里跑,测试期间不调任何 API,全部从录制回放。改 prompt 或换模型就是一次提交:要么全量用例通过,要么不合入。

我花了最久才想明白的一点:数据怎么切分,比用什么模型更重要。以前我随手按 80/20 随机切。可对带时间戳或按会话组织的数据,随机切分会让相邻帧漏进训练集,评估结果看着完美,上线却翻车。按整段会话留出,才是诚实的切法。按时间做验证,测出来的准确率通常会掉一大截,掉得让人不舒服——这种不舒服恰恰是重点。

只发权重,不发原始数据;只发指标,不写长篇解释;代码必须带测试。这就是我正在统一推行的做法。

完整仓库:https://github.com/Reaver1000/llm-contract

查看原文