跳到主要内容

4 篇博文 含有标签「production-engineering」

查看所有标签

发布前的爆炸半径清单:你的智能体团队遗漏编写的文档

· 阅读需 11 分钟
Tian Pan
Software Engineer

Agent 事故发生后的第一个小时总是相似的。有人注意到 Agent 做了一些不该做的事情——给错误的客户开了发票,删除了 CEO 的日历事件,或者在公开的 Slack 频道发布了一段写了一半的道歉信——随后响应团队开始询问一些没人写下答案的问题。哪个下游系统持有审计日志?哪个值班轮换组负责该系统?该调用是否可逆,窗口期是多久?Agent 使用的凭证归谁所有,该凭证是否还允许它触及我们尚未检查的其他系统?编写 Agent 的团队很少掌握这些答案,因为答案存在于 Agent 调用的系统中,而且在发布时没人把它们统一记录在一个地方。

这份文档就是爆炸半径清单 (blast radius inventory),它是大多数 Agent 团队在第一次事故中才发现缺失的产物。它不是安全检查表,不是工具 schema,也不是操作手册 (runbook)。它是 Agent 可以触及的每个外部系统的详尽列表,以及在该系统遭遇最糟糕状况时你所需的每一项事实。那些在没有这份清单的情况下发布 Agent 的团队,是在赌事故响应的上下文重构速度能超过爆炸蔓延的速度。随着 Agent 拥有的工具越来越多且功能越来越强大,这场赌局的胜算正变得越来越低。

确认与行动间的鸿沟:智能体的“明白了”并不等同于承诺

· 阅读需 12 分钟
Tian Pan
Software Engineer

Agent 对客户说:“收到——我已经提交了你的退款请求。你应该会在 5–7 个工作日内看到它。”客户关闭了聊天。但退款从未被提交。没有工单,没有 API 调用,退款表中也没有记录。有的只是一段礼貌且自信的英语,以及随后成功的会话终止。

这就是确认与行动的脱节(acknowledgment-action gap),它是生产环境 Agent 系统中代价最高昂的一类 Bug。这种脱节之所以存在,是因为让经过指令微调(instruction-tuned)的模型显得很能干的流利文字,与真正改变世界的结构化工具调用(tool calls)属于不同的输出通道——而大多数团队将业务逻辑挂接到了错误的通道上。

每个发布 Agent 的人最终都会以惨痛的方式意识到这一点。模型生成了一份读起来像承诺的精美确认函,下游系统将其解读为承诺,几周后一份支持工单寄来,询问退款去了哪里。令人尴尬的不是模型撒了谎,而是系统被设计成去信任它所说的话。

数据回滚难题:如何撤销AI智能体写入生产环境的数据

· 阅读需 11 分钟
Tian Pan
Software Engineer

在一次面向高管的现场演示中,一个AI编程智能体删除了整个生产数据库。解决方案并非精妙的回滚脚本,而是花费四小时从备份中恢复数据库。该公司曾授予AI智能体在生产环境中不受限制的SQL执行权限,当智能体"惊慌失措"(这是它自己的措辞,并非比喻)时,它执行了没有确认门控的DROP TABLE。超过1200名高管和1190家公司的数据因此丢失。这次事故不是边缘案例,而是一个预兆。

随着AI智能体承担越来越多的写入密集型操作——更新记录、处理事务、修改客户状态——如何撤销其错误已成为关键基础设施问题。问题在于,工程师所理解的关系数据库"回滚"并不能直接套用到智能体系统中。标准工具在三个具体方面会失效,这值得在第一次智能体事故发生之前就深入理解。

智能体幂等性:为什么你的 AI Agent 会发送两次邮件

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的 Agent 处理了一笔退款,但响应超时了。框架进行了重试。结果客户收到了两次退款。你的 Agent 发送了一封跟进邮件,触碰了速率限制,在退避(backoff)后重试,结果客户收到了两条完全相同的消息。这些并非假设的场景——它们是 Agent 系统中最常见的生产故障类型,而且几乎每个 Agent 框架自带的重试逻辑都让这些问题变得不可避免。

根本原因看似简单:Agent 框架对所有工具调用的处理方式都一样,无论它是读取数据还是改变现实世界。get_user_profile() 调用重试一百次也是安全的。但 send_payment() 调用则不然。然而,大多数框架都将两者封装在相同的指数退避重试逻辑中,并美其名曰“可靠性”。