跳到主要内容

39 篇博文 含有标签「testing」

查看所有标签

你的评测框架是单用户运行的,但你的智能体并非如此。

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的 Agent 通过了 92% 的评估测试集。你发布了它。在上线一小时的真实流量中,发生了一些从未在任何追踪(trace)中出现过的事情:Agent 在频率限制(rate-limit)重试风暴中停滞不前,一个客户在工具响应中看到了另一个客户的草稿邮件,你的模型供应商连接池处于 100% 的占用率,而 CPU 却处于闲置状态。这些失败没有一个源自模型。它们存在于你测试的方式与生产环境运行方式之间的鸿沟中。

这个鸿沟表现为同一种形式。你的评估工具(eval harness)在一个固定数据集上一次循环一个 Agent。而你的生产环境则在共享基础设施上同时运行许多 Agent。顺序评估隐藏了每一个前提条件为“两个事物接触同一个资源”的 Bug。在你将对抗性并发(adversarial concurrency)构建到评估工具本身之前,这些 Bug 只会以紧急运维(on-call)报警的形式出现。

评估通过,但工具全是 Mock 的:为什么你的 Agent 最棘手的生产故障从未进入测试框架

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的智能体在评估测试集上达到了 94% 的准确率。然而你的轮值告警却响个不停。房间里没人撒谎,这两个数字都是真实的。实际情况是,测试框架(harness)在测试提示词(prompt),而生产环境在测试智能体(agent),这是两个完全不同的产物,只是恰好共享了权重。

Mock 工具的评估通常是产生这种差距的原因。你用预设的 JSON 存根(stub)了 search_orderscharge_cardsend_email,给模型输入一个用户回合,并对最终响应进行断言。这种运行方式成本低、具有确定性且可复现——这些都是 CI 系统喜欢的特性。但它对工具选择、延迟、速率限制(rate limits)、部分失败和重试行为保持沉默,也就是说,它忽略了那些在事故回顾中占主导地位的失败因素。

Prompt 的语义差异分析:为什么 Git Diff 在提示词变更的影响上会误导你

· 阅读需 12 分钟
Tian Pan
Software Engineer

一位队友提交了一个 PR,将你 Agent 的系统提示词(System Prompt)从 420 行重写为 380 行。Diff 是一片红绿交错的“惨状”:删除了段落、移动了章节、精简了语言。你批准了它,因为这些清理看起来很合理。一周后,退款请求的准确率下降了 8 个百分点,却没人能说出到底是哪一行导致的。

另一位队友在一条指令中添加了“简洁”(concise)这个词。Diff 只有三个字符。没人仔细审查它,因为几乎没有什么可看的。但这次修改导致 22% 的查询在工具调用(Tool-call)行为上发生了变化。

AI 流水线的契约测试:组件间 Schema 校验的交接规范

· 阅读需 11 分钟
Tian Pan
Software Engineer

大多数 AI 流水线故障并非模型问题。模型运行正常,输出看起来也是 JSON,但下游阶段却悄然崩溃——原因可能是字段被重命名、类型发生变化,或者嵌套对象新增了一个下游阶段根本不知道如何处理的必填属性。流水线执行完毕并报告成功,而某个数据仓库里的数字已经悄悄出错。

这就是 AI 流水线的契约测试问题,也是生产 AI 系统中最被忽视的可靠性风险之一。根据近期基础设施基准数据,企业 AI 系统平均每月发生近五次流水线故障,每次解决耗时超过十二小时。主要原因并非模型质量差,而是数据质量和 Schema 契约违规:64% 的 AI 风险存在于 Schema 层。

生产分布差距:为什么内部测试人员找不到用户遇到的Bug

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的 AI 功能在内部测试中表现出色。工程师拍手叫好,产品经理竖起大拇指,评估套件在基准测试中显示了 94% 的准确率。然后你上线了,两周之内,用户就遇到了你从未见过的故障模式——错误的答案、混乱的输出,以及让模型显得极为糟糕的边缘情况。

这就是生产分布差距(production distribution gap)。这不是一个新问题,但对 AI 系统来说,它比确定性软件严重得多。理解其背后的原因——并制定具体的解决方案——是决定 AI 功能悄然侵蚀用户信任还是随着使用不断改进的关键分水岭。

测试检索-生成接缝:RAG 系统中的集成测试盲区

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的检索器在 94% 的情况下都能返回正确文档。你的 LLM 在给定良好上下文时能正确回答 96% 的问题。可以上线了。能出什么问题?

把这两个数字相乘:0.94 × 0.96 = 0.90。在不考虑任何边缘情况、提示词格式问题、token 截断,以及检索器与正确文档一起返回的干扰文档之前,你就已经损失了 10% 的查询。但更深层的问题不是这个算术——而是你的单元测试永远不会发现这一点。检索器在隔离测试中通过了。生成器在隔离测试中通过了。失败的是两者的组合,而大多数团队对此没有任何测试。

这就是检索-生成接缝:检索器交付内容与生成器实际能够使用的内容之间的接口。它是生产 RAG 系统中测试最不充分的边界,也是大多数故障的根源。

合成评估冷启动:在没有标注数据的情况下如何构建基准数据集

· 阅读需 11 分钟
Tian Pan
Software Engineer

常见的失败模式不是构建了不起作用的AI功能,而是在不知道功能是否有效的情况下就将其上线。团队跳过评估基础设施的原因不是懒惰——而是构建评估需要标注数据,而在第一天你根本没有。

这就是评估的冷启动问题。要获得有效信号,你需要系统在生产环境中运行。要有信心地部署,你首先需要评估基础设施。这种循环依赖是真实存在的,它导致团队做出三种选择之一:没有评估就上线,在生产环境中才发现故障;延迟上线,同时花数月时间手动标注数据;或者使用合成评估——并承担其中的所有风险。

本文讨论的是第三条路如何正确走通。合成评估冷启动是可行的,但前提是你要理解它无法检测什么,并从一开始就围绕这些盲点进行设计。

无需标注的评估:在拥有标准答案前衡量 LLM 质量

· 阅读需 13 分钟
Tian Pan
Software Engineer

大多数团队在发布 LLM 功能后,会花费数周时间争论该功能是否真的好用。由于构建标注数据集感觉像是一个独立的项目,评估问题往往被推迟。当你有了标准答案(ground truth)时,你也积累了两个月无法诊断的沉默回归。这本末倒置了。如果你知道该采用哪些技术以及每种技术的局限性,你可以在第一周——在完成任何标注之前——就获得有意义的质量信号。

这篇文章是无标注评估的实战指南:涵盖了有效的无引用方法、所需条件,以及如果不小心就会误导你的特定失败模式。

AI 应用的开发与生产环境一致性:预发布环境欺骗你的七种方式

· 阅读需 13 分钟
Tian Pan
Software Engineer

12 要素应用(12-Factor App)准则让开发/生产环境一致性(dev/prod parity)变得家喻户晓:尽可能保持开发、预发布和生产环境的相似。对于传统的 Web 服务,这基本是可以实现的。但对于 LLM 应用,这在结构上是不可能的 —— 且其中的差距远比大多数团队意识到的要大。

问题不在于开发者粗心大意。而是在于 LLM 应用依赖于一类特殊的基础设施(缓存计算、实时模型权重、不断演进的向量索引以及随机性生成),在这些设施中,预发布环境(staging)与生产环境之间的差异不仅是令人不便,而是本质上完全不同。一个看起来正确的预发布环境至少会在七个具体方面对你撒谎。

长尾覆盖问题:为什么你的AI系统在最关键的地方失败

· 阅读需 12 分钟
Tian Pan
Software Engineer

某医院部署的医疗AI在测试中达到了97%的准确率。它通过了所有内部审查,顺利上线,然后悄然失败——当寄生虫密度低于1%的细胞时,它无法检测出寄生虫感染,而这恰恰是早期干预最为关键的场景。直到一位医生注意到特定患者群体中异常高的漏诊率,问题才得以浮出水面。

这就是长尾覆盖问题。你的聚合指标看起来很好,但系统在最重要的输入上已经损坏。

AI 系统的影子流量:在上线前验证模型变更的最安全方式

· 阅读需 11 分钟
Tian Pan
Software Engineer

大多数团队上线 LLM 变更的方式,与 2005 年上线 Web 变更如出一辙——跑几个离线评估,说服自己数字看起来不错,然后直接推上去。意外总在周一早上到来:一个通过了所有基准测试的系统提示词调整,悄无声息地破坏了评估集之外 40% 的用户查询。

影子流量就是解决方案。思路很简单:将候选模型或提示词与生产系统并行运行,向其输入每一个真实请求,对比输出结果,同时只让用户接触当前版本。零用户暴露、真实生产数据、上线前的统计置信度。但将这一方法应用于 LLM,需要重新思考几乎所有实现细节——因为语言模型是非确定性的、推理成本高昂,且其输出无法通过简单 diff 进行比较。

LLM 本地开发循环:在不耗尽 API 预算的情况下实现快速迭代

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数构建 LLM 应用的团队在第三周左右都会发现同样的问题:每次有人运行测试套件时,它都会发起实时 API 调用,消耗真金白银,耗时 30 多秒,且每次运行返回的结果都不尽相同。在原型阶段感觉良好的“直接调用 API”方法,现在变成了迭代速度的沉重负担——而且是账单上的一项重要支出。一个工程团队审计了他们每月的 API 支出,发现 2,847 美元中有 1,240 美元(43%)是由于开发和测试流量不必要地访问实时端点而产生的纯粹浪费。

解决方案不是停止测试,而是从一开始就构建正确的开发循环——让快速路径既便宜又具有确定性,而将慢速路径(真实的 API 调用)留给真正需要的时刻。