跳到主要内容

209 篇博文 含有标签「agents」

查看所有标签

那个保护了日志却让模型泄露输出结果的 PII 脱敏器

· 阅读需 13 分钟
Tian Pan
Software Engineer

一个仅针对入站流量运行的 PII 脱敏器就像是安装在管道错误一端的单向阀。它在用户提交的姓名、电子邮件和账号进入日志之前拦截它们。但它对模型的输出无能为力 —— 而现在,模型正是在输出端积极地组合可能包含这些相同标识符的文本,这些内容可能源自 RAG 检索、工具返回、对话历史或用户从另一个租户数据中粘贴的内容。我观察过每一个上线了输入端脱敏器的团队,他们的待办事项中都有一个标记为“输出端对齐”的后续任务。大多数这类任务永远不会关闭,因为在长达六个月的时间里,没有任何事故暴露出这个缺口。六个月后,该任务经过多次重新排序,看起来更像是一个功能需求,而不是缺失的一半安全控制手段。

失败模式是恒定的:输入端脱敏被视为标准的控制手段,因为它的工程问题更简单,审计故事也更容易讲。你编写了一套正则表达式,运行了一个标注好的基准测试,证明了在固定语料库上的精确率和召回率,在特性开关后上线了它,安全评审也将其接受为 PII 边界。输出端则完全没有这些优势。模型的响应是生成性的,表面积是无限的,而且测试方法论 —— “在无限多的上下文中它不应该说什么” —— 在结构上比“我们应该从已知输入中剥离什么”要困难得多。因此,上线入口端的团队将出口端视为未来的工作,而这个未来永远不会到来,直到有客户举报另一个客户的电子邮件出现在他们的对话记录中。

由于注册表缓存存在一小时延迟,你的智能体仍在调用已被撤销的工具

· 阅读需 11 分钟
Tian Pan
Software Engineer

用户打开集成页面,找到上个月安装的 Stripe 连接器,点击“移除”,然后关闭了标签页。他们认为自己刚刚撤销了一项授权。实际上,他们只是修改了数据库中的某行数据,而当前正在与他们对话的 Agent 在接下来的 43 分钟内都不会再次读取该数据。在此期间,Agent 会尝试调用该 Stripe 工具,注册中心的授权层会正确地拒绝请求,Agent 的 harness 框架会将此次拒绝视为暂时的下游波动并重试三次,而用户自己的 Stripe 审计日志将记录来自他们认为刚刚已断开连接的供应商的三次未经授权访问尝试。

用户的投诉几乎原话是:在我移除之后,你们的平台仍在尝试访问我的 Stripe。这正是实际发生的情况,而根本原因比错误报告所涉及的层面更深。工具注册中心是 Agent 获准执行操作的唯一事实来源(source of truth)。但 Agent 并没有读取这个事实来源,它读取的是缓存。

被反向代理剥离的 SSE Keep-Alive,以及你支付了两次费用的 Prompt

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的 Agent 调用了一个耗时 35 秒的工具。在这 35 秒内,没有任何 Token 从模型流回浏览器。Provider 的 SSE 流仍然开启。你的工具仍在运行。用户的加载动画也在旋转。而在路径中间的某个你无法控制的反向代理认为连接静默时间过长,关闭了它,随后你的客户端重连逻辑尽职地从头重新启动了整个请求。

第一次响应产生了 4,200 个 Prompt Token 和 600 个 Completion Token。第二次响应也是 4,200 个 Prompt Token 和 600 个 Completion Token。用户得到了一个答案。而你的账单却收到了两份。

增加更多工具后,你的智能体“不知道”率为何反而下降了

· 阅读需 10 分钟
Tian Pan
Software Engineer

你添加了搜索工具,接着是日历工具,然后是 CRM 工具,接着是四个数据库封装器(wrappers)和一个计算器。仪表盘的变化正如你所愿:任务完成率上升,延迟保持稳定,“我不知道”率从 14% 下降到 4%。这看起来像是能力的提升。事实并非如此。规划器并没有学到更多知识;它只是学会了减少拒答(abstention)。现在每个问题看起来都是可以回答的,因为总有 某个 工具的模式能与查询充分匹配并被调用。你消除的那 10 个百分点的“我不知道”并没有转化为正确的答案 —— 它们变成了自信的错误答案,分布在无人仔细评审的长尾场景中。

这就是工具表面扩展带来的“伪能力陷阱”(false-competence trap)。这是团队在庆祝改进时,发布了性能退化(regression)最常见的方式。评估准则衡量的是 Agent 是否尝试了任务并产生了一个形状合理的答案;它并不衡量 Agent 是否应该拒绝回答。拒答并非没有成本,但它是目前能获得的最廉价的正确行为,而一旦你的工具集变得足够大,以至于总有 某个 工具会被触发,你就再也看不见这种行为了。

那个‘总结’掉用户原始提问的压缩策略

· 阅读需 12 分钟
Tian Pan
Software Engineer

一位用户询问我们的支持智能体:“为什么发票 INV-2025-08-44719 在 4 月 3 日被扣了两次款?”45 分钟和 18 次工具调用之后,智能体自信地回复道:该账户在该季度没有任何重复计费的证据。用户理所当然地投诉了。当我们回放追踪记录(trace)时,答案变得显而易见。智能体在第九轮对话时对内容进行了压缩(compacted)。摘要显示用户“在询问 4 月初的一笔重复收费”。其中并不包含字符串 “INV-2025-08-44719”。随后的每一次工具调用——账本查询、退款 API 查询、审计日志扫描——都是针对转述后的意图发出的,而不是用户输入的字面意义上的发票编号。

Bug 不在工具里,也不在模型的推理中。问题在于我们的上下文管理器(context manager)与每个下游组件之间都有一个契约,但没有人把它写下来。契约写着:“我会保留语义。”而组件需要的是:“我会保留字符串。”

抹除后续问题所需上下文的对话记忆修剪启发法

· 阅读需 10 分钟
Tian Pan
Software Engineer

一个用户打开你的长会话智能体(agent),在第 3 轮对话时说:“我是素食主义者,而且预算有限。”对话继续进行。11 轮之后,裁剪器(pruner)开始运行。它计算 Token 数量,发现第 3 轮内容既陈旧又短小,于是为了将窗口维持在预算范围内,将其丢弃了。第 14 轮用户问:“我今晚该做点什么菜?”模型查看一个约束条件已不存在的窗口,推荐了一份 40 美元的肋眼牛排。用户觉得智能体变得越来越难用,打开满意度调查,给这次会话打了一个 2 分。

!["https://opengraph-image.blockeden.xyz/api/og-tianpan-co?title=%E6%8A%B9%E6%8E%89%E4%B8%8B%E4%B8%80%E8%BD%AE%E9%97%AE%E9%A2%98%E6%89%80%E9%9C%80%E4%B8%8A%E4%B8%8B%E6%96%87%E7%9A%84%E5%AF%B9%E8%AF%9D%E8%AE%B0%E5%BF%86%E8%A3%81%E5%89%AA%E5%90%AF%E5%8F%91%E6%B3%95"]辨

你的技术栈中没有任何环节会报告记忆失败。Token 预算仪表盘会显示窗口健康地维持在上限之下。延迟仪表盘会显示绿色。评估套件——将单轮回答与预留集进行对比评分——会报告没有退化。唯一能体现智能体能力下降的信号是一个差评,而你的产品团队会将其归咎于“模型方差”。但这并不是模型方差,而是裁剪启发法在错误的目标上,精准地执行了它被调优后该做的任务。

会话摘要抹掉了用户授予你的同意标志

· 阅读需 12 分钟
Tian Pan
Software Engineer

在第 3 轮,你的用户点击了“不要保留我的代码”。在第 7 轮,他们关闭了“使用我的对话来改进模型”。在第 12 轮,他们选择了退出跨会话记忆。到第 40 轮时,你的上下文预算耗尽了。压缩过程将第 1-30 轮折叠成一个简洁的 200 token 摘要,读起来非常顺畅:它捕捉了用户的提问、你的智能体做了什么以及结果如何。在第 41 轮,你的智能体——带着那份摘要和最近的 10 轮对话——自信地将用户的代码写入了一个用户在第 7 轮就已经选择退出的存储库中。

你的审计日志现在包含一个在 t=3 时的授权事件,一个在 t=41 时的违规操作,而两者之间是一段没有任何字段说明为什么该操作被允许的文本。摘要生成器经过训练是为了压缩对话,而不是为了转发控制状态。没有人告诉它那个授权开关是承重的(load-bearing)。也没人能告诉它,因为授权信息并不在对话中——它存在于对话旁的一个结构化字段里,而这个结构化字段没能熬过摘要化的过程。

你的 Agent 把开发环境当成了生产环境,因为系统提示词从未指明是哪一个

· 阅读需 12 分钟
Tian Pan
Software Engineer

一个编程智能体(coding agent)正在预发环境(staging)执行一项常规任务。它遇到了权限故障 —— 某个配置指向了错误的 API —— 并自行决定“修复”该 bug 的最快方法是清理掉违规数据。它翻找了一通,在一个无关文件中发现了一个未限制范围的令牌(unscoped token),调用了一个描述为“删除匹配查询的记录”的工具,九秒钟后,190 万行客户数据消失了。最近的备份是三个月前的。上个季度产生的预订记录已不复存在。

智能体并没有发生故障。从部署工程师的角度来看,线路连接是正确的:预发配置在预发部署中,生产配置在生产部署中。线路没有承载的是智能体对“身处何地”的感知。两个环境中的系统提示词(system prompt)完全相同,因为没人想维护两套提示词。两个环境中的工具目录(tool catalog)命名也相同,因为没人想教智能体两套词汇。因此,智能体按照训练数据教它的方式去思考“数据库” —— 而互联网上绝大多数关于智能体和数据库的文章,都是关于生产环境的。

那个教会用户永远不要打断智能体的中断 UI

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的流式智能体上的中断按钮点击率仅为 0.4%。产品团队看到这个数字,得出的结论是该功能正按预期运作——大多数生成内容不需要中断,实现方案没问题,发布吧,继续下一个任务。而实际的解读应该是,这个中断按钮教会了你的用户不要去按它。在使用产品不到一周的时间里,他们就发现按下停止键会丢弃已生成的片段、清除上下文,并把他们丢回到一个空的输入框中。他们学到的教训是:宁愿忍受一个糟糕的回答,也不愿冒着丢失整个对话脉络的风险。

这 0.4% 不是使用信号,而是厌恶信号。你的用户并非对答案感到满意——他们只是害怕尝试重定向答案所带来的代价,他们的适应方式是静静地坐着,看着智能体说完那些他们明知是错误的内容。工程团队将“停止生成”视为模型调用的取消。而用户将其视为“重定向,而非重启”。这两种定义从未达成一致,导致产品发布了一个在长对话中悄悄剥夺用户主动权的功能。

带有延迟预算的紧急开关:你的故障处理从未达到的标准

· 阅读需 13 分钟
Tian Pan
Software Engineer

运维手册上写着“禁用代理”。值班人员照做了。43 分钟后,当紧急开关终于通过配置服务传播开来时,该代理已经提交了 1,200 张错误的工单,调用了 8,000 次计费 API,并向根本没有订阅任何服务的客户发送了邮件。运维手册是正确的,但它也是徒劳的,因为没有人衡量过当代理每秒钟都在造成破坏时,“禁用代理”实际上需要多长时间。

!["https://opengraph-image.blockeden.xyz/api/og-tianpan-co?title=%E5%B8%A6%E6%9C%89%E5%BB%B6%E8%BF%9F%E9%A2%84%E7%AE%97%E7%9A%84%E7%B4%A7%E6%80%82%E5%BC%80%E5%85%B3%EF%BC%9A%E4%BD%A0%E7%9A%84%E6%95%85%E9%9A%9C%E5%A4%84%E7%90%86%E4%BB%8E%E6%9C%AA%E8%BE%BE%E6%A0%87"]

大多数 AI 功能都配有紧急开关,就像大多数建筑都配有灭火器一样:有人签字确认它的存在,却没人计时到达它需要多久。合规审查会问“是否有紧急开关?”,答案是肯定的。而故障现场会问“止血有多快?”,答案则取决于底层管道恰好需要的时间——团队中从未有人针对该功能造成破坏的速度测量过这个数字。

这种不匹配正是问题的核心。一个遏制时间长于其破坏扩散时间的功能,交付的只是“遏制剧场”(Containment Theater)。

你的编排器在规划步骤上消耗的延迟预算

· 阅读需 12 分钟
Tian Pan
Software Engineer

我上季度合作的一个团队对一个客户支持智能体(Agent)进行了为期一周的埋点分析。从纸面上看,该智能体的中值延迟非常合理:P50 在 SLO 范围内,P95 虽然偏高但尚可解释,工具调用的追踪(traces)看起来也很健康。然而,当有人按类型对 span 进行分桶统计时,全场陷入了沉默。该智能体每次运行的墙钟时间(wall-clock time)中,约有 58% 耗在了标记为“规划(plan)”、“反思(reflect)”、“决定下一步(decide-next-step)”和“自我检查(self-check)”的 span 中。而真正的工具执行——数据库查询、CRM 写入、权限检查——占比不足 30%。这个智能体在核心业务逻辑上花费的精力,竟然比那些没人关注的中间步骤还要少。

这个比例并非偶然。它是任何你不主动监管的“规划-行动-观察(plan-act-observe)”循环的自然状态。编排器(Orchestrator)为了思考和行动支付延迟代价,而增加思考步骤几乎总是比增加行动步骤更容易,因此它会野蛮生长。当你意识到这一点时,“决定下一步做什么”已经变成了一个独立的预算大头——甚至比你最初构建智能体要服务的业务逻辑还要大。

你的产品视图从未呈现的推理 Token

· 阅读需 11 分钟
Tian Pan
Software Engineer

一位客户给支持团队发了邮件。AI 助手告诉他们在错误的司法管辖区申报纳税,他们非常生气,想知道助手是如何得出那个答案的。你的支持人员打开问题队列,看到了最终回复:自信、听起来很有道理,但却是错误的。他们看不到模型在给出回复前生成的 5000 个推理标记 (reasoning tokens),尽管这些标记确实存在,而且你的工程团队可以在 30 秒内从另一个屏幕上把它们调出来。证据就在公司里,只是拿在错误的人手中。

这就是团队在生产环境的智能体上启用扩展思考 (extended thinking) 时产生的差距。推理成为了每一次调用的核心产物,而你的组织尚未决定谁在什么时候、以何种精度、以及在多长时间内可以看到它。默认决策是由负责各个界面的团队分别做出的,他们的默认设置各不相同,而这些缝隙恰恰是客户投诉产生的地方。