跳到主要内容

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

查看所有标签

后台智能体与通知预算:为什么主动 AI 在用户注意力面前会遭遇硬上限

· 阅读需 11 分钟
Tian Pan
Software Engineer

第一代 AI 助手表现得很礼貌。你输入,它们回答。第二代则不再等待。它会观察你的日历、扫描你的收件箱、阅读你的代码库活动,并在你提出任何要求之前就抛出“你应该知道这个”之类的打扰。这种宣传极具吸引力,演示也令人着迷。但一旦这些功能上线,留存曲线却并不理想。

发布会幻灯片上没人会放这样一个数字:用户对来自所有渠道的未经请求的 AI 更新有一个每日上限,总和大约只有三到五个。如果一个主动式智能体在一周内发出了第十条通知,那么用户在周五就会将其静音,并在下个月将其卸载。这不仅是一个 UX 打磨问题,更是整个主动式 AI 领域的架构盲区,它值得拥有一个名字:通知预算(notification budget)。

MCP 能力披露税:当每个连接的服务都在消耗你的上下文窗口

· 阅读需 13 分钟
Tian Pan
Software Engineer

只要为你的智能体连接一个 GitHub MCP 服务端,在用户输入一个字之前,你可能就已经消耗了 1.2 万到 4 万个 token。连接一个文件系统服务端、一个日历、一个数据库、一个内部 CRM 以及一个第三方工具目录,据测算,一个重型桌面配置的纯工具披露 (tool disclosure) 就会产生 6.6 万个 token —— 这几乎占了 Claude Sonnet 200K 上下文窗口的三分之一,而且在每一个规划轮次 (planning turn) 都要付费。智能体还没开始干活,用户还没开始提问,账单就已经开始计费了。

这就是“披露税” (disclosure tax),它是目前交付的智能体系统中定价最低估的条目。团队添加 MCP 服务端的方式就像曾经添加微服务一样 —— 每一个集成看起来都像是一个免费的组合原语 (composition primitive),采购理由也顺理成章(“更多工具 = 更多能力”)。而单位经济效益仪表盘 (unit economics dashboard) 从未反映出每个服务端的成本,因为成本隐藏在 token 桶里,没有人将其归因于连接器。结果是,每当有人添加另一个集成时,智能体就会变得更慢、更笨、更贵,而团队却通过重新调整提示词 (prompt) 和催促模型厂商发布新版本来解释这种退化。

Agent 烙印:当市场部负责命名,而工程部支付运维账单时

· 阅读需 11 分钟
Tian Pan
Software Engineer

一名产品市场经理 (PMM) 在发布简报中写下了“AI 智能体 (AI agent)”。新闻稿发布后,将其描述为具备自主决策能力。六周后,工程团队正盯着 Jira 看板上满满的“智能体可观测性”工单,而这些是他们从未针对一个本质上只是“单个提示词后接硬编码工具调度”的系统所规划的。没人撒谎。没人犯技术错误。团队只是意识到,“智能体”这个词并非一种描述——它是一个戳记 (stamp),而这个戳记带有的运维影响,无论实现方式是否合理,工程团队都必须承接。

这就是 Gartner 如今所谓的“智能体洗白 (agent washing)”的内部版本。外部版本——供应商为了追赶炒作周期将聊天机器人重新包装为智能体——往往会获得媒体关注。而内部版本则更加隐蔽且昂贵,因为这笔账落在了那些在术语被批准时无法反驳的人身上。

Agent 分支覆盖率:你的评测仅命中了 Happy Path,而非 Planner 的 If-Else 逻辑

· 阅读需 9 分钟
Tian Pan
Software Engineer

我上季度合作的一个团队针对其支持智能体(support agent)运行了一套包含 240 个案例的评估集。连续六个月,测试结果全线飘绿。接着,他们更换了规划器提示词(planner prompt)中的一个句子——仅仅是一次语气调整——结果第二天生产环境的人工接管请求激增了 3 倍。而评估分数却纹丝不动。人工接管分支仅仅是开始在以往能在线解决的临界案例上触发,而评估集中没有一个案例属于这种临界类型。该分支存在于提示词中,存在于生产环境中,唯独不存在于评估集中。

这就是我想命名的失败模式:智能体分支覆盖率 (agent branch coverage)。代码覆盖率工具在过去的 40 年里一直是调试的基础,但智能体系统具有运行时控制流——规划器分支会选择工具、限定回复条件、升级到人工、拒绝执行、或尝试不同的策略重试——而评估集仅触及团队想到的那些案例。规划器 80% 的决策分支从未在测试下执行,于是,一份“全绿”的评估报告就成了一场披着回归测试外衣的冒烟测试。

智能体临时目录:无人盘点的无主文件系统 PII 暴露面

· 阅读需 11 分钟
Tian Pan
Software Engineer

一位监管人员走进你的办公室,提出了安全团队反复演练过的那个问题:“请展示客户数据存放的每一个地方。” 你的数据团队拿出了清单。主数据库在上面。分析型数据仓库在上面。对象存储、队列、搜索索引、备份目的地——统统都在上面,附带着分类标签、保留政策、加密详情和负责人姓名。接着,房间里有人提到了 Agent 工作线程池,而清单上却对此只字未提。这个线程池已经运行了九个月。每个工作线程都有一个本地磁盘。这些线程上的 Agent 一直在解析 PDF、转录音频、下载邮件附件,并在工具调用之间缓存中间 JSON,而这一切从未停止过。却没有人将这些内容放入资产登记表。

这就是“临时目录问题”(scratch directory problem)。每一个长期运行的 Agent 工作线程都会积累一个临时文件系统,随着新工具的加入而有机增长——PDF 解析器提取的文本、Whisper 步骤转录的音频、Gmail 工具下载的附件、浏览器使用步骤的截图、为下一轮对话缓存的向量搜索片段、Agent 在两次工具调用之间生成的中间 JSON(以便第二次调用不必重新推导)。与数据库、队列和存储桶不同,这个表面没有保留政策,没有静态加密标准,没有 DLP 扫描器过滤,也没有出现在数据分类电子表格中。平台团队认为 “Agent 状态”指的是推理提供商的上下文窗口。SRE 团队认为 “Agent 状态”指的是持久化数据库。而工作线程的 /tmp/agent-workspace-${session_id}/ 目录则是客户数据的第三份副本,且处于无人管理的状态。

延迟预算博弈:如何告诉产品经理“实时性”是有能力代价的

· 阅读需 13 分钟
Tian Pan
Software Engineer

一位产品经理走进规划会议,提出了一个只有一行的需求:“响应时间低于两秒,就像 ChatGPT 那样。”讨论中的智能体 (agent) 需要调用六次工具,检索两个索引,运行一个带有思考预算 (thinking budget) 的推理模型,并由第二个评审模型验证其输出。目前端到端的 p50 延迟是 9 秒。工程团队有三个选择:答应下来并悄悄地把智能体削弱成更糟糕的东西;拒绝并眼睁睁看着产品经理去寻找那些在演示视频中吹得天花乱坠的供应商;或者做一件入职培训中没人教的事 —— 开启一场结构化谈判,将每一秒的延迟都转化为智能体放弃的一项能力。

大多数团队会选择第一种。智能体上线后延迟确实到了 2 秒,但准确率下降了 12 个百分点,发布会仍被视为成功,因为达到了标题上的延迟指标。三个月后,团队开始与质量退化作斗争,却没人能将其归因于某项改动,因为退化本身就是那次发布。延迟目标从未被定价,它仅仅是从一份将速度视为免费午餐的产品规格说明书中继承而来的。

提示词注入漏洞赏金:当“损坏”没有明确定义时,如何划定程序范围

· 阅读需 14 分钟
Tian Pan
Software Engineer

你的安全团队运行着一个行之有效的漏洞赏金计划。CSRF 得到了奖金,XSS 得到了奖金,IDOR 也得到了奖金。交战规则明确,严重程度标准符合行业规范,分拣队列有序移动,该计划产出了源源不断的已修复漏洞。接着,你的 AI 团队在上个季度发布了一个功能 —— 一个聊天界面、一个调用工具的智能体(agent),或是一个从客户数据中提取信息的 RAG 流水线 —— 摆在安全团队桌面上的问题变成了:“这个东西的赏金范围是什么?”没人能回答。

没人能回答的原因是,标准的漏洞赏金准则是围绕行为确定的系统构建的。登录端点要么身份验证正确,要么不正确。访问控制检查要么生效,要么失效。你刚发布的 AI 功能没有等效的基准事实(ground truth):其规定的行为是“对用户输入做出有帮助的响应”,而一个让它做出无用响应的研究员并不一定发现了漏洞 —— 他们可能只是发现了模型一直以来都在做的事情,只是没人知道,你不确定是否能修复,而且在第二次尝试时可能无法复现。

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

· 阅读需 11 分钟
Tian Pan
Software Engineer

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

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

工具行为漂移:Schema 没变,语义却变了

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的契约测试通过了。Schema 校验器显示正常。工具返回的数据结构与上个季度完全一致。然而,面向用户的回答已经悄无声息地错了六个星期。

这就是契约测试从未设计用来捕捉的故障模式。契约测试验证的是传输格式没有改变——比如 search() 是否仍然返回 { results: [{ id, title, score }] }create_event 是否仍然接受 ISO 8601 字符串,地理编码器是否仍然输出 { lat, lng }。它们无法捕捉到的是:搜索端点开始按新近度而非相关性排序的时刻;日历 API 在欧盟地区静默地将你 14:07 的开始时间吸附到 14:00;地理编码器在同一个模糊的多边形内选择了一个不同的点;或者作为工具的 LLM 分类器在稳定的端点后升级到了新模型,导致你的评估集从未采样过的某个类别中误报率上升了四个百分点。Schema 没变,但行为变了。你的智能体继续读取着代表通过的绿色勾选,并产生了没有任何错误日志捕捉到的退化答案。

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

· 阅读需 11 分钟
Tian Pan
Software Engineer

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

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

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

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

· 阅读需 12 分钟
Tian Pan
Software Engineer

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

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

智能体状态差异对比 (Agent State Diff):为什么肉眼对比两条追踪路径无法规模化

· 阅读需 11 分钟
Tian Pan
Software Engineer

一个回归错误流入了生产环境。团队选取了导致失败的输入,针对上周的提示词进行回放,却得到了不同的输出。现在他们必须查明原因——而答案埋藏在 3 MB 大小的文本差异、分歧的工具调用序列以及被打乱的检索块中,人类根本无法有效地进行比对(diff)。于是,他们将两份记录粘贴到左右分栏的查看器中,滚动查看了二十分钟,得出结论“模型今天感觉不太一样”,然后发布了一个并没有解决根本原因的热修复,因为他们从未找到真正的原因。

这就是 Agent 状态差异问题,也是通用工程工具在处理 Agent 系统时失效的首要环节。传统的回归二分查找(bisect)针对的是确定性代码:相同的输入产生相同的输出,git bisect 遍历历史记录,直到你找到破坏代码的提交。但 Agent 的运行不是确定性的,输入也不仅仅是一个字符串,其“历史”是一个多轴的包(envelope)——模型快照、采样配置、检索到的上下文、工具目录、框架标志——其中任何一个变量都可以独立地改变行为。