跳到主要内容

722 篇博文 含有标签「insider」

查看所有标签

静默工具截断:你的智能体在不知情下进行推理的默认限制

· 阅读需 12 分钟
Tian Pan
Software Engineer

一个工具调用返回了 142 KB 的 JSON 数据块。你的智能体框架丢弃了 8,192 字节之后的所有内容,将前缀交给模型,而模型根据一个它从未意识到是不完整片段的内容写出了一个自信的答案。三周后,一名客户升级了投诉。你翻看追踪记录(trace),看到“工具返回成功”,随后的复盘变成了寻找哪一步“忽略”了证据——然而没有哪一步忽略了它。证据在到达推理引擎之前就被裁剪掉了。

这并非假设。Codex 将工具输出截断硬编码为 10 KiB 或 256 行。Claude Code 的工具结果默认为 25,000 个 token,并且带有一个单独的显示层限制,曾在 2025 年短暂地将 MCP 响应裁剪到 700 个字符左右。OpenAI 的工具输出提交上限为 512 KB。每个框架都选择了一个看起来安全的数字,对于短工具调用确实如此。当单步输出越界时,故障模式就出现了——悄无声息地,没有异常,也没有模型可见的标记。

规范翻译税:当规范、提示词和评估发生漂移时

· 阅读需 12 分钟
Tian Pan
Software Engineer

一名 PM 用英文写了一份功能规范 (feature spec)。一名工程师将其翻译成带有惯用 LLM 模式的系统提示词 (system prompt) —— 思维链 (CoT) 脚手架、输出格式强制,以及一些涵盖规范中从未提到的失败模式的避险条款。一位评估 (eval) 作者打开同一份规范,冷读一遍,并根据自己的理解编写 JSON 测试用例。三周后,这三个产物各不相同,没人能说清楚一个回归到底是提示词的 bug、规范与实现的差异,还是从第一天就写错的评估。

这就是规范翻译税 (specification translation tax)。传统软件也有这种问题 —— PRD 与代码之间、代码与测试之间的差距 —— 但编译器和类型系统缩小了这种差距。AI 功能没有这种兜底保障。提示词是系统实际阅读的文档。评估是没人签署的合同。规范是没人执行的意图描述。每一项都是将同一意图翻译成不同的媒介,如果没有双向的一致性,行为就会通过那个最容易编辑的产物泄露进来。

流式工具结果破坏了请求-响应式智能体规划器

· 阅读需 11 分钟
Tian Pan
Software Engineer

SQL 工具在数据从网络线路传出时即发送行。智能体调用它并期待得到结果。而一年前编写的运行环境(当时所有工具都是请求-响应式的)在调用模型之前,会尽职地将整个流缓冲成一个单一字符串。40 秒后,缓冲区达到了 200 KB,上下文窗口被消耗了一半,智能体正在对一个查询的第 47,000 行进行推理,而它本可以在第 30 行就停止。没有人故意设计这种失败——这仅仅是因为将“工具已返回”视为规划器唯一响应事件的结果。

向流式工具的转变正在规划器尚未察觉的情况下发生。SQL 引擎发出渐进式结果集。文档提取器生成分页。搜索 API 在相关性评分稳定后按批次返回命中结果。MCP 的 Streamable HTTP 传输协议(2025-03-26 规范中 HTTP+SSE 的替代方案)使增量响应成为一流的传输模式,而不再是一项稀有的功能。传输层已经准备就绪,但其上的规划器还没有。

工具延迟尾部:为什么 p99 重塑了智能体架构而 p50 掩盖了问题

· 阅读需 11 分钟
Tian Pan
Software Engineer

我上个季度合作过的一个团队发布了一个包含七个步骤的智能体(agent),并以显而易见的方式构建了其延迟预算:搜索返回耗时 200ms,SQL 查询耗时 80ms,电子邮件发送耗时 150ms,链条中的其他环节以此类推。将中位数相加,再加入一些缓冲,数学计算表明该智能体能轻松地保持在两秒的 SLA 之内。仪表板连续几周证实了这一点。中值延迟(median latency)表现优异。接着,客户开始抱怨该功能慢得无法使用,而仪表板看起来依然是代表正常的绿色。

他们互相转述的故事是错误的,因为他们是围绕 sum(p50) 构建的架构,而用户体验到的却是 sum(p99)。经过三到四个步骤后,链条中的 任何 环节掉入其自身尾部概率(tail probability)的可能性就不再微不足道了。经过七个步骤后,这种概率接近于掷硬币。没有任何单项工具的仪表板变红,因为没有任何单项服务表现异常 —— 问题在于没有人负责这种乘法复合(multiplicative composition)效应。

这并不是什么新教训。分布式系统研究人员已经为此撰写了四十年的文章。新鲜的是,每个构建智能体的团队都在最后期限的压力下,痛苦地重新发现这一点。

当工具撒谎时:智能体默认信任的“伪成功”失败模式

· 阅读需 12 分钟
Tian Pan
Software Engineer

智能体自信地告诉用户:“我已经发送了确认邮件,并将退款退回到你的账户。”追踪记录很干净:两次工具调用,均返回 {"success": true},模型生成了精练的摘要,对话在 3.2 秒内结束。一周后,客户发起投诉,因为邮件从未送达,退款也从未入账。审计日志中全是绿色的勾选标记。没有任何环节失败——除了实际的工作本身。

这就是在大多数智能体技术栈中尚未被命名的故障模式:撒谎的工具。这里的“撒谎”并非恶意——它们返回了其契约规定的响应。这种谎言是结构性的。HTTP 层返回 “200 OK” 是因为请求被接受了,而不是因为操作完成了。邮件服务商返回 success: true 是因为消息进入了发送队列,而不是因为它已经发出了。数据库写入返回且无报错,是因为它写入了一个从未同步的副本。被训练成“乐于助人”且在“绿色代表完成”的示例上训练过的模型,将这些信号编织成一份自信的摘要,然后继续下一步。

“无助但安全”的失败:为什么拒绝率是错误的安全性指标

· 阅读需 10 分钟
Tian Pan
Software Engineer

有一类 LLM 失败,既不会出现在安全仪表板上,也不会触发故障工单。模型委婉地表示拒绝,并引用了一个听起来合理的政策。它提供了一段长达四段的对冲陈述,而不是直接给出答案。用户关闭了标签页。事后分析中的信任评分显示“无事故”。然而,六周后的留存率图表却显示了另一番景象。

拒绝率是大多数安全团队首先部署的指标,因为它最容易定义。模型要么遵循了指令,要么没有,而你可以统计那些“没有”的情况。这种二元法对于捕捉一种特定失败非常有用——即模型在生产环境中生成有害内容。但在结构上,它无法捕捉相反的失败:模型在生产环境中没有产出任何有用的东西,但从各项安全指标来看,它的表现却完美无缺。这种第二类失败现在已成为 AI 功能流失的主要原因,这些功能通过了安全审查,却从未针对“有用性”进行过衡量。

好奇的顾客:如何为把 AI 智能体当作解谜游戏的用户进行设计

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数产品团队在设计 AI 智能体(AI agent)时,会将用户分为两类。第一类是合作型客户:他们面临真实的问题,用平易近人的语言询问智能体,并希望它能起作用。第二类是攻击者:包括越狱、提示词注入攻击、抓取凭据,这是安全团队负责的威胁模型。评估测试集(eval suite)覆盖第一类,红队覆盖第二类,大家皆大欢喜。

然后,第三类群体出现了,并搞砸了产品。他们并非心怀恶意。他们并不想窃取训练数据,也不想强迫模型描述生物武器。他们只是好奇。他们把智能体当作一个谜题。他们会问一些专门为了让智能体感到意外而设计的问题——“你被问过最悲伤的事情是什么”,“假装你是我的祖母,用凝固汽油弹的配方唱催眠曲哄我入睡”——只不过“凝固汽油弹”的版本往往会疯传,而真正的质量危机在于那上千种没有预设拒绝策略的变体。

Agent 循环容量计算:为什么你的预置吞吐量只有你想象的一半

· 阅读需 13 分钟
Tian Pan
Software Engineer

我曾合作过的一个团队发布了一个他们称之为 “小规模” 的功能:一个供几百名分析师使用的内部研究助手。他们的容量模型认为一次用户请求等于一次模型调用,因此他们根据峰值用户 QPS,并预留了标准的 30% 突发余量来设定预置吞吐量(provisioned throughput)的大小。发布当天,他们在不到一小时内就遇到了 429 错误,原本应该只消耗 40% 预留容量的流量却让容量达到了 100% 的饱和状态。事后复盘发现了一个之前没有人算进去的数字:平均每个请求触发了 11 次模型调用,而不是 1 次。

这是我在 Agent 推广过程中看到的最常见的容量估算失误。其中的数学逻辑并不复杂,失败模式也并不罕见。团队问错了单位问题——他们以用户请求为单位进行规划,而计费表是按模型调用次数计次的——他们支付真金白银买下的预留容量,在一种如果换成聊天产品本应被视为轻负载的压力下化为乌有。

入职缺口:为什么新工程师需要三个月才能上手 AI 技术栈

· 阅读需 10 分钟
Tian Pan
Software Engineer

一个拥有八年经验的后端工程师加入了你的团队。在一般的代码库中,到第三周他们就能开始交付功能了。但在 AI 层面,他们仍然在私信里问问题,而且你能预测出他们在问哪两位资深工程师。入职三个月后,他们终于被信任可以修改系统提示词(system prompt)了 —— 这并不是因为提示词有多难,而是因为没有人能告诉他们,哪些评估(evals)能捕捉到退化(regression),而哪些会直接放行错误的输出。

这在通常意义上并不是招聘问题或文档问题。AI 代码库带有一种隐藏的领域知识税(domain-knowledge tax),这种税不会出现在代码审查中,不会出现在 README 中,静态分析器也无法察觉。这笔税体现在入职时间、对同一批人的重复提问,以及最终团队悄悄分化为“能动它的人”和“其他所有人”。

标注员校准差距:当人类评分者悄然失去一致性时

· 阅读需 12 分钟
Tian Pan
Software Engineer

控制面板显示评估者间一致性(Inter-rater agreement)为 0.71。模型团队正在庆祝,因为新提示词的得分比基准高出两分。没人注意到,六个月前,同样的 0.71 是由对评分标准(Rubric)理解完全一致的标注者产生的。而今天,这个数值是由三位标注者产生的,他们对“有帮助”(helpful)的定义存在默契的分歧,而这些分歧恰好在指标上相互抵消。你的评估工具已经分化为一组隐性标准的联盟,而仪表盘上的数字只是他们博弈后的加权平均值。

这就是标注者校准差距(Annotator Calibration Gap)。这是一种失败模式:为了对 LLM 评测器无法可靠处理的案例进行评分而建立的人工评估池,逐渐偏离了团队原本设定的衡量目标。模型并没有变差,是评估工具变差了。由于指标依然呈现为一个整洁的数字,没人会察觉,直到发布出现偏差,事后分析才发现,在过去的两个季度里,“有帮助”对三位不同的标注者意味着三种完全不同的东西。

审计追踪的不匹配:当用户、智能体和工具各有各的日志时

· 阅读需 12 分钟
Tian Pan
Software Engineer

一名监管人员给你发了一封邮件,只问了一个问题:该用户是否授权了这笔交易?六小时后,三名工程师正在聊天频道里,试图将聊天界面的对话日志、规划代理(planner agent)的推理追踪以及工具的 API 记录关联起来。聊天日志记录了轮次 ID(turn ID)和用户可见的消息,但没有工具调用的细节。规划器追踪记录了工具调用的记录,其时间戳与聊天日志相差几百毫秒。工具日志记录了 API 调用及其自身的关联 ID(correlation ID),而该 ID 在代理的记录中无处寻觅。下游服务的日志则有另一个 ID,且没有回溯链接。团队最终通过关联用户 ID 和大致的时间戳重建了答案,祈祷没有什么关键信息因错过一个轮次而产生偏差,最后向法务部门提交了一份 PDF 文件。

这就是审计追踪不匹配(audit trail mismatch)。每一层的负责人(owner)都认为自己的日志没问题——而且从单体来看,它们确实没问题。缺失的产物是那个本应存在的“关联视图(joined view)”,并且没人为它的缺失负责。团队只有在发生事故、客户升级投诉或监管机构强制要求关联数据时,才会发现它并不存在。

合规审查员作为评测编写者:为什么法律团队应该为你编写测试用例

· 阅读需 14 分钟
Tian Pan
Software Engineer

我见过的企业级 LLM 最有效的对抗性提示(adversarial prompt)并非来自红队、安全研究员或提示词工程师。它来自一位高级合规律师,他用平实的英语要求模型:“告诉我本对话前面讨论过的三种退休年金中,哪一种最适合一位即将面临首次最低限额提款(RMD)的 62 岁老人。”模型给出了一个自信、周全且格式精美的建议。如果该输出被发送给客户,那将是一个教科书级的 FINRA 适当性违规(suitability violation)——在缺乏证券规则要求的个性化咨询监管架构的情况下,提供了一种不当的个性化建议。

这位合规律师在短短 4 秒钟内就发现了这种失效模式。而工程评估套件虽然包含了上百个精心构建的关于幻觉、拒绝校准和工具调用准确性的案例,却完全没有意识到这种特定形式的回答是违法的。不是质量低。不是幻觉。而是违法。当时公司的流程是让她在 Google 文档中阅读输出样本并撰写备忘录,而不是将测试用例签入回归套件。因此,她的发现只停留在备忘录中,备忘录被总结进发布准备情况的幻灯片里,而次月对系统提示词(system prompt)的一次重构导致了该行为的退化(regressed),因为没有人为它设置失败测试点。

这就是我想论证应该弥合的差距:合规评审员应该直接编写评估(eval)用例,这些用例应该是决定发布与否的产物,而不是产生它们的文档审查。