跳到主要内容

173 篇博文 含有标签「ai-agents」

查看所有标签

智能体凭据爆炸半径:你的 IAM 模型从未列举的主体类别

· 阅读需 12 分钟
Tian Pan
Software Engineer

安全部门花了十年时间才彻底终结了“全能服务账号”。分限令牌、短期凭据、JIT 访问、逐操作审计——这整套最小权限方案终于落地并稳固下来。然而,AI 团队接入了一个智能体,提示词要求提供工具目录,于是工程师请求了平台所能发放的最广泛的 OAuth 作用域。已被弃用的模式换了一身新衣服又回来了,而这次调用 API 的主体是一个没人确定该如何限定作用域的随机循环。

这个智能体拥有日历、文件存储、CRM 和部署流水线的读写权限,因为 API 表面无法预先枚举。令牌是长效的,因为没人接入刷新路径。审计日志记录的是持有者,而非具体操作。IAM 负责管理人类和服务的身份,平台团队负责工作负载身份,AI 团队负责智能体的实际权限,而这三方集合的交集却无人管辖。

智能体权限提示存在习惯化曲线,而你的安全叙事就建立在其斜率之上

· 阅读需 11 分钟
Tian Pan
Software Engineer

每个智能体产品的安全仪表盘上都应该有一个数字,但几乎没人追踪它:随时间推移的人均批准率。发布一个“我可以发送这封邮件吗”或“我可以针对生产环境运行此查询吗”的权限提示,其曲线每次都如出一辙。第一天,用户会犹豫、阅读,有时会点击“不”。到了第二周,这已经是本小时内的第五次提示,拒绝的代价是必须由你亲自完成工作,于是点击率会收敛到 95% 以上。团队的安全叙事仍然声称用户批准了每一项操作。但在任何实质性的认知层面上,用户并没有。

这不是一个可以通过更好的文案来修复的 UX 问题。这是使 Cookie 横幅、浏览器 SSL 警告和 Windows UAC 对话框失效的同一种习惯化现象,只是应用在了一个运行速度比以往快几个数量级的底座上。许可门槛是一种具有半衰期的安全控制。如果在发布时不衡量它的衰减速度,你发布的只是一个用户到第二周就会习惯性忽略的复选框 —— 以及一个依赖于不再具有任何意义的点击的合规叙事。

人类注意力预算是你的 HITL 系统在默默透支的约束条件

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的审核员今天早上做出的第 50 个决策与第 1 个决策的质量并不相同。架构图不会显示这一点。容量模型不会显示这一点。跟踪“每小时审批量”的仪表盘甚至在主动掩盖这一点。然而,你的人机回环(Human-in-the-loop,简称 HITL)系统的整个前提——即由人来捕捉模型产生的错误——从队列开始填充的那一刻起就在无形中退化。

大多数 HITL 设计将审核员的时间视为一种无限的、可互换的资源。团队设置一个置信度阈值,将所有低于该阈值的项路由到人工队列,并宣布系统是“安全”的。六周后,审批率已悄然升至 96%,队列深度是人员配置模型假设的两倍,抽样审计显示审核员正在对他们在第一天会标记出来的边缘案例点击“批准”。系统并没有崩溃,它只是通过“橡皮图章”式的盲目审批,让自己看起来运转良好。

分页是一项工具目录规范:为什么智能体在处理列表返回时会耗尽上下文

· 阅读需 12 分钟
Tian Pan
Software Engineer

在你的技术栈中,每一个设计良好的 HTTP API 都会返回分页结果。没有人会把一百万行数据加载进内存并祈祷一切顺利。然而,你的智能体(agent)所调用的工具却会返回整个列表,而智能体也会尽职尽责地阅读它,因为函数签名写的是 list_orders() -> Order[],且智能体不像人类用户那样拥有“滚动并加载更多”的协议。

智能体在原本可以跳过的行上浪费了 Token。拥有 50K 记录的长尾客户遇到了中等规模客户从未见过的上下文窗口失败。工具作者无法从追踪(trace)中判断智能体是需要所有这些行,还是仅仅因为无法请求更少的数据。而且,在你评估套件的某个地方,原本会标记这种退化的回归测试从未运行,因为每个测试固件(test fixture)的记录都少于 100 条。

分页不是一种 UI 交互功能。它是一种负载卸载(load-shedding)原语 —— 而在没有分页的情况下使用工具的智能体,正在重新犯下你们公司的 API 设计师们花了十年时间才学会避免的每一个 SELECT * FROM orders 错误。

智能体记忆漂移:为什么一致性对齐是你缺失的关键环

· 阅读需 12 分钟
Tian Pan
Software Engineer

你长期运行的智能体(agent)所做的最危险的事情,也是它做得最自信的事情:根据记忆回答。客户的地址在上周二更改了。智能体认为“开启”的工单在昨天被人工关闭了。智能体拥有整洁解释笔记的产品功能,其实际交付的形式与智能体三周前阅读的规范不同。在教科书定义上,这些都不属于幻觉——模型准确地召回了它存储的内容。只是在智能体看向别处时,世界已经发生了变化。

大多数团队将记忆视为一个写入问题:智能体应该记住什么、我们如何总结、嵌入(embedding)策略是什么、如何防止存储爆炸。这种思维方式产生的架构会随着错误程度的增加而变得更加自信。更难的问题——那个决定你的智能体在第三周后是否仍然有用的问题——是对账(reconciliation):这是一个明确的、持续的闭环,用于比较智能体认为真实的情况与底层系统当前显示的真实情况。

智能体流量不等同于人类流量:为两类调用者设计 API

· 阅读需 13 分钟
Tian Pan
Software Engineer

你两年前发布的 API 是为单一类别的调用者设计的:浏览器或移动客户端背后的人,点击一次,然后等待响应。现在,大约一半的关键端点上,这个假设都是错误的。另一半流量是智能体(Agents)——你自己的、你客户的,或者是将你的端点作为工具使用的第三方集成——它们具有不同的运行逻辑。它们会产生爆发式流量。它们会无限重试。它们会并行处理。它们会逐字解析错误字符串。它们代表人类行事,而当出现问题时,人类无法即时提供意图说明。

今年出现在复盘报告(postmortems)中的大多数生产环境异常,都可以追溯到一个架构错误:将这两类调用者视为同一种类别。为人类步调设置的频率限制(Rate limits)会被智能体的并行扇出瞬间击穿。为人类可读而设计的错误消息,会被一个在 400 错误上无限重试的智能体解析错误。人类默认会满足的幂等性假设,在智能体从恢复的检查点重试相同的负载时会被打破。身份验证日志失去了区分“用户执行了此操作”与“用户的智能体代表用户执行了此操作”的能力。

解决方法不是更智能的 WAF 或更大的频率限制桶。而是一种深思熟虑的 API 设计,它定义了两类调用者,将它们的流量视为不同的形态,并记录委托链,以便在间接层级中保持可追溯性。

Agent 撤销按钮是 Saga,而非栈

· 阅读需 11 分钟
Tian Pan
Software Engineer

用户点击了智能体操作的“撤销”按钮,而该操作之前已经分发(fan out)到了十二个工具调用中。智能体发送了两封电子邮件,创建了一个日历邀请,更新了一条 CRM 记录,扣除了信用卡费用,并在 Slack 频道中发布了消息。其中三个操作通过 API 是不可逆的。两个操作只能通过触发自身下游通知的反向操作来撤销。剩下的七个操作各自都有自己的幂等性(idempotency)定义,而规划器从未协调过这些定义。你发布的撤销按钮看起来令人安心,它大约 60 % 的时间静默成功,其余时间则静默失败。

这不是一个 UX(用户体验)漏洞。这是一个 Saga 模式问题,分布式系统工程师已经研究了三十年,而忽略这段历史是发现它最昂贵的方式。

Agent 工作流的碳计算:Token 预算现已成为 ESG 披露

· 阅读需 12 分钟
Tian Pan
Software Engineer

无状态的聊天补全(Stateless chat completion)耗电量极低。一次中等规模的 Gemini 文本提示耗电约为 0.24 Wh;一次简短的 GPT-4o 查询约为 0.3–0.4 Wh。这些数字微乎其微,甚至没人会把它们放进董事会演示文稿里。

智能体任务(Agent task)并非普通的聊天补全。一个典型的“研究该客户并起草回复”的工作流可以扇出(Fan out)到 30 多个工具调用、10–15 次模型调用,且上下文窗口随着每一步不断增长。能源成本随调用图(Call graph)呈复合增长。当智能体返回结果时,你消耗的不是一个推理单元,而是五十到两百个。突然之间,每个任务的碳足迹便与视频流达到了同一数量级。

这种算术题很快就会在工程部门之外产生影响。欧盟的 CSRD 使范围 3(Scope 3)排放披露成为受规制公司的强制要求,并要求从 2026 年起提交机器可读的 iXBRL 报告。尽管 SEC 在其最终规则中删除了范围 3,但任何在欧盟有业务的跨国公司仍然必须回答这个问题。采购团队已经开始在供应商调查问卷中加入“你的 AI 功能每个用户任务的碳足迹是多少?”这类问题。大多数工程团队无法回答,因为从来没有人测量(Instrumented)过它。

复合型 AI 系统中的内部结算账本

· 阅读需 11 分钟
Tian Pan
Software Engineer

当 CFO 第一次问“这个助手每月花掉我们多少钱”时,工程团队会给出一个数字。第二次问时,另一个团队会给出不同的数字。第三次问时,财务部门会给出第三个数字,然后有人会打开一个电子表格,尝试从 Span(跨度)中重新推算账单,因为没有人再相信之前的任何答案。就在这一刻,复合 AI 系统(Compound AI System)不再仅仅是一个架构问题,而变成了一个会计问题。

这种故障的形式是结构性的。一个简单的用户请求“总结我上季度的客户反馈”会触发由团队 A 拥有的智能体,它调用由团队 B 维护的检索工具,接着调用由供应商 X 托管的模型,然后通过团队 C 的重排序工具回传结果,而重排序工具又调用了由供应商 Y 提供的另一个模型。一次点击;五个所有者;两张相隔一个月到达的账单。标准的 FinOps 原语——成本中心、分配标签、账号级汇总——是为了切割那些已经拥有稳定所有者的基础设施而设计的。它们无法清晰地组合在一个每次请求都会跨越团队边界的内部调用图中。

《2026 年 FinOps 现状报告》指出,98% 的 FinOps 团队需要对 AI 支出负责,而同一份调查将“对 AI 成本的实时可见性”列为最大的工具缺口。这个缺口并不是“我们看不见账单”,而是“我们无法足够快地看清是账单的哪一部分是由谁产生的,以至于无法在账单寄到之前让任何人改变其行为”。

你的智能体有两条发布流水线,而非一条

· 阅读需 12 分钟
Tian Pan
Software Engineer

我合作过的一个团队在周三下午发布了一个“微小的提示词调整”。同一个 PR 还向智能体注册中心添加了一个新工具——一个对内部管理 API 的便利封装,提示词现在偶尔会调用它。评估套件通过了。金丝雀发布看起来也很正常。到周四早上,由于智能体处理了一个包含提示词注入攻击的支持工单,一名客户的计费记录被修改了。审计追踪显示,管理工具完全按照设计运行。值班工程师的第一反应——回滚提示词——毫无用处,因为凭证已经使用,数据行已经写入。

复盘报告将其定性为安全审查失败。其实不是。这是发布流水线的失败。团队通过相同的审查、相同的关卡和相同的回滚逻辑,发布了两个完全不同的资产类别——对模型的行为引导和授予智能体的新权限,就好像它们是同一种变更一样。它们并不是。一旦你将它们视为两个流水线,大多数关于“智能体治理”的争论就会变得清晰得多。

你审计日志中的幽灵员工:借用凭据的智能体正在瓦解 IAM

· 阅读需 11 分钟
Tian Pan
Software Engineer

调出你今天早上的 SSO 日志。每一条 Slack 消息、每一个 GitHub PR、每一项日历邀请、每一次 CI 运行、每一条 Jira 评论——它们都显示着与人类手动输入完全相同的信息:一个人的名字、一个会话令牌(session token)、一行绿色的“身份验证成功”。从审计的角度来看,你根本无法分辨哪些行为来自人类,哪些来自人类启动后便置之不理的智能体。这就是“幽灵员工”问题,而且过去 12 个月里上线了智能体的团队几乎都面临这个问题。

导致这一问题的捷径是结构性的,而非疏忽大意。当你将智能体接入工具时,最简单的凭证就是工程师环境中现有的那个——他们的个人访问令牌(personal access token)、OAuth 会话或绑定设备的 SSO Cookie。替代方案则是一项平台级工程:配置一级身份(first-class identity)、在每个下游服务中进行联邦认证、将其接入审计流水线、构建针对每个实例的撤销机制。这些工作无法在一个 Sprint 内完成,也不会出现在功能路线图中。因此,智能体选择了“借用”。

当你的 CLI 开始说英语:可提示基础设施的最小权限原则

· 阅读需 13 分钟
Tian Pan
Software Engineer

我本季度交流过的一个平台团队发布了一个封装了 kubectl 并支持英语指令的 Slack 机器人。一名工程师输入了 “清理 staging 中未使用的分支”。这个机器人非常“热心地”删除了 12 个命名空间——其中一个的名字匹配到了子字符串 “branch”,但它恰好托管了移动团队已经使用了一周的长期集成环境。没有任何异常被抛出。机器人发起的每一次调用都是它合法持有的权限。复盘报告无法指出任何违背的访问规则,因为确实没有规则被打破。该机器人完全按照其 IAM 策略允许的操作执行。

Unix 哲学是一种隐藏在审美偏好下的隔离策略。具有窄接口的小型工具意味着任何单个命令的爆炸半径都受到它所接受的谓词和标志 (flags) 的限制。rm -rf 极其危险,因为这是大家的共识;kubectl delete namespace 要求操作者完整输入命名空间名称,而这种手动输入就是一道关卡。最小特权原则之所以容易执行,是因为权限是词法化的:命令的形式告诉了你行动的形式。

随后,封装层开始接受英语。现在,“命令的形式”变成了 LLM 认为它是什么,它就是什么。