跳到主要内容

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

查看所有标签

你的智能体需要的是监督者,而不是重试循环

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的 Agent 在一个包含十二个步骤的任务的第七步挂掉了。框架捕获了异常,经过指数退避(exponential backoff)后进行了重试。它重试了该步骤 —— 但使用的是同样的上下文窗口(context window),其中已经堆积了三次失败的工具调用、一段解析了一半的错误消息,以及一个模型已经放弃的计划。当然,重试也失败了,因为重试是一场赌注,赌的是世界发生了变化,而那个 Agent 的世界没有任何改变。需要改变的是 Agent 的状态 —— 而任何 Agent 框架中的重试策略都不会做出这种决定。

Erlang 的 OTP 库在三十年前就为必须运行数十年的电话交换机制定了这项决策。主管树(supervisor trees)背后的洞察力从来不是“在崩溃时重启”。而是“如何恢复”是一个与“执行工作”完全解耦的关注点,它由一个独立的进程负责,并排列在一个层级结构中,每一层都对恢复的含义有更深一点的理解。现如今的大多数 Agent 框架将重试强加到单个调用上,这就像在电话交换机的每一行代码周围都套上 try/catch 一样。它们真正需要的是这种层级结构。

你的智能体读了页面。没人看到广告。

· 阅读需 11 分钟
Tian Pan
Software Engineer

互联网经济建立在一个极其古老以至于无人明说的假设之上:加载页面的那个东西长着眼睛。当人类到来,广告曝光触发,联盟营销 Cookie 植入,分析事件记录访问——这一连串微小的变现事件支撑着内容的产出。现在,这条链条的每一个环节都在同时断裂,因为你网站的读者中,机器人的比例正日益增长。它们是 Agent,而 Agent 是看不见广告的。它提取答案,将其交给别处的用户,除了日志行之外什么也没留下。

这并非一个你可以作为工程师在旁观望的遥远出版商问题。如果你正在构建任何基于检索(Retrieval)的东西——无论是 RAG 管道、浏览网页的 Agent,还是总结网络内容的产品——你正处于一个市场的需求侧,而该市场的供给侧刚刚发现自己一直在免费赠送库存。修正正在进行中,它背后有基础设施和标准支撑,并且它将作为一项新的成本支出和新的失败模式降临在你的架构上:上个季度还免费开放的上游资源,这个季度就变得需要付费、授权或直接关闭了。

你的智能体很廉价,但维护者的注意力并不便宜。

· 阅读需 11 分钟
Tian Pan
Software Engineer

2026 年 1 月,curl 关闭了其漏洞赏金项目。六年的时间,86,000 美元的支出,以及源源不断的真实漏洞 —— 计划的结束并非因为资金耗尽,而是因为有效信号消失了。从历史上看,超过 15% 的提交最终被确认为真实的漏洞。但到了 2025 年底,这一比例降至接近三十分之一,而提交量却激增至正常水平的八倍。队列中充满了冗长、自信、却完全编造的报告 —— 其中一份报告甚至附带了 GDB 会话和寄存器转储,引用了一个在 curl 中根本不存在的函数。

令人不安的事实是:产生这些垃圾信息的人并不是恶棍。他们中的许多人是像你一样的工程师,运行着像你一样的智能体,对准了你的产品所依赖的代码库。AI 将“产出”一项贡献的成本压缩到了接近于零,但它对“审核”贡献的成本却毫无助益。任何具有这种形态的经济系统 —— 发射成本极低,吸收成本极高 —— 最终都会演变成垃圾信息问题,而吸收端则是那些在你那不知疲倦的智能体出现之前,就已经在义务工作的志愿者。

你的智能体内存需要垃圾回收机制

· 阅读需 11 分钟
Tian Pan
Software Engineer

持久化记忆是每个人都会给自己的智能体添加、但几乎没人维护的功能。这个提议令人无法抗拒:智能体会记住你的模式、你的偏好、上周二的决定,并且每一次会话都比上一次更聪明。而失败模式则更加隐蔽:默认情况下,记忆呈单调增长,而一个关于不断变化的世界的“仅追加”事实存储库,无异于一种缓慢的投毒。被迁移的 API、被重组的团队、被推翻的架构决策 —— 所有这些都与新鲜事实并排存在于存储库中,以同样的权威性被检索,并以同样的自信心被注入到上下文中。

无状态的智能体会犯下孤立的错误。而配备了记忆的智能体可以将一个错误变成重复性的错误,因为它存储了该错误,随后又将其作为证据检索出来。一个被自信写下的错误记忆 —— “支付服务拥有退款逻辑” —— 会污染未来每一个召回它的运行过程,而每一个基于它执行的运行过程又可能写下源自它的新记忆。这不仅仅是一个存储问题。这是一个垃圾回收问题,而大多数智能体记忆系统在发布时都没有配备回收器。

你的智能体记忆需要两个时钟

· 阅读需 12 分钟
Tian Pan
Software Engineer

在你的智能体记忆库的某个角落,存放着一个事实,比如“计费 API 返回 XML”。它读起来像是永恒的真理。但它实际上是焊接在一起的两个断言:该 API 在过去的某个窗口期返回了 XML,而你的智能体在某个时刻观察到了这一点——这可能是一个不同的窗口期,也可能是在迁移到 JSON 之后很久。记忆记录没有保留这两个时间戳。当智能体根据这一事实采取行动并导致故障时,你会在事故回顾(post-incident review)中问一个唯一重要的问题:智能体在行动的那一刻相信了什么? 而你的记忆层由于将两个时间轴压缩成了一个扁平的字符串,无法回答这个问题。

数据库工程师在几十年前就解决了这个问题,并给它起了一个平淡无奇的名字:双时态建模(bitemporal modeling)。每个事实都带有两个独立的时钟——它在现实世界中何时为真(有效时间,valid time)以及系统何时获知它(事务时间,transaction time)。金融系统、保险账本和审计级数据库多年来一直依靠这种区分来运行。智能体记忆系统几乎普遍忽略了这一点。这种疏忽现在成了导致一系列故障的根本原因,而我们却一直将其误诊为“幻觉”。

你的上下文是有质量的:数据重力与“计算向数据移动”的回归

· 阅读需 11 分钟
Tian Pan
Software Engineer

Hadoop 时代的一代人彻底学会了一个教训,以至于它成了一种本能:移动数据是昂贵的,所以要把计算移动到数据所在的地方。每一个 MapReduce 调度器、每一个 HDFS 块放置决策、每一个“数据本地化”(data locality)仪表盘的存在都是为了服务于这一原则。然后,在托管模型 API 的兴起和智能体(agent)热潮之间的某个时刻,我们悄然颠倒了这一原则——而且没有人重新评估这一决策的成本。

看看现代智能体循环(agent loop)实际上在做什么。它从向量数据库中检索一堆文档,从对象存储中提取代码库快照,从六个内部服务中收集工具执行结果,将所有这些内容拼接进一个上下文窗口,然后将整个负载发送到通常位于不同 VPC、不同区域、甚至不同云平台的模型端点。然后在下一轮对话中重复这一过程。周而复始。你的上下文具有质量,而你正在为每一次跳转支付运费。

你的工具 Schema 验证的是类型,而非单位

· 阅读需 13 分钟
Tian Pan
Software Engineer

一个退款智能体正在处理一笔 42 美元的客户请求。它发出的工具调用是 refund(amount: 4200) —— 等等,这正确吗?如果后端以“分”为单位存储金额,那它完全正确。如果后端以“美元”为单位存储,那么客户刚刚得到了 4,200 美元的退款。两次调用在语法上都是完美的。两者都在微秒级内通过了 JSON Schema 验证。Schema 规定 amount 是一个数字,而 4200 毫无疑问是一个数字。

这是一类单元测试、Schema 验证器和大多数智能体评估(Agent evals)都会忽略的错误:工具调用边界处的单位混淆。模型会根据其训练数据进行数值模式匹配 —— 以美元计价的货币、以秒计价的时间、由周围文本暗示的重量单位 —— 而你的工具则期望的是分、毫秒或公斤。类型系统不会提出任何异议。发票金额只是偏差了 100 倍。

在你的智能体能够自我重试之前,精确一次性处理(Exactly-Once)曾是一件难事

· 阅读需 10 分钟
Tian Pan
Software Engineer

我们花了二十年的时间来教导服务如何安全地进行重试。这个方案已经非常成熟了:客户端生成一个唯一的幂等键 (idempotency key),将其附加到请求中,服务器在执行工作的同一个事务中记录该键及其结果。掉线、超时、500 错误 —— 客户端使用相同的键进行重试,服务器识别出该键,并返回记录的结果,而不是再次扣款。Stripe 多年前就推出了这种模式,它已成为任何涉及资金业务的 API 的基本要求。

整个设计都基于一个无人提及的假设:调用者会逐字节地重复其请求。 重试携带相同的键,是因为重试是同一段代码路径使用相同的变量重新执行。一旦打破这个假设,整个方案就会悄无声息地失效。

当时钟成为工具:Agent、时区以及那个只在午夜发生的 Bug

· 阅读需 10 分钟
Tian Pan
Software Engineer

询问大型语言模型现在几点,你得到的回答虽然语气自信,但几乎肯定是不准确的。这并非因为模型坏了,而是因为它的内部没有时钟。Transformer 是一种无状态的文本补全引擎:它将 token 映射到 token。在整个流水线中,没有任何地方会接收到“现在是 14:32 UTC”这样的信号。模型感知不到当前时刻 —— 这是你必须在每一轮对话中主动提供给它的东西,否则它就会从陈旧的训练数据中臆造一个时间。

这种无声的失败往往在最糟糕的时刻浮出面。你的智能体认为现在是星期一,因为会话是在星期一开启的,于是它在星期二、星期三依然坚信这一点,直到它为一个已经过去的日子设定了“明天早上”的提醒。它利用数小时前就已冻结的 now 来分析“过去 24 小时”的日志。它在转换跨时区的会议时间时,因为误判了夏令时的边界而导致一小时的偏差。这些在传统意义上都不像是“幻觉”。其输出流畅、合理且逻辑自洽,只是它锚定在了一个不再存在的时刻。

康威定律正在影响你的智能体集群

· 阅读需 11 分钟
Tian Pan
Software Engineer

打开你多智能体系统的架构图。然后再打开你的组织架构图。如果你眯起眼睛看,它们其实是同一张图。“研究智能体”对应着负责搜索的团队。“账单智能体”的硬边界恰恰就在财务部门停止与产品部门沟通的地方。那个将工作分发给五位专家的编排器,看起来极其像是一个带着五名直属下属的工程经理。你并非有意如此设计。是康威定律(Conway's Law)为你做了决定。

Melvin Conway 在 1967 年的观察是:任何系统设计都会反映出设计该系统的组织的沟通结构。六十年来,这始终是一个关于微服务和单体架构的故事。但智能体集群是我见过的对该定律最字面意义上的展示:智能体本身 就是 沟通结构。智能体边界是一个进程将消息传递给另一个进程并等待的地方。当你为了匹配团队而不是为了解决问题而划定这些边界时,你不仅继承了组织架构的形态,还继承了它的功能障碍,并以机器速度运行它。

赔偿缺口:当你的智能体执行了不可逆操作,谁的预算来买单?

· 阅读需 10 分钟
Tian Pan
Software Engineer

你的智能体刚刚向错误的账户发放了 40,000 美元的退款,重新路由了一份触发加急运费的货运订单,或者推送了一个导致客户生产环境宕机六小时的配置更改。操作已经完成。它是不可逆的,或者代价大到接近不可逆。现在唯一重要的问题是那个在你上线产品前没人问过的问题:谁的预算来买单?

大多数团队都是通过惨痛的教训才发现答案的。在三天后的会议室里,供应商的客户经理在免提电话里向他们回读赔偿限额条款。限额是年度订阅费。而损失是这个金额的 40 倍。对话很快就结束了。

站会在撒谎:当智能体集群整夜运行,如何协调工作

· 阅读需 11 分钟
Tian Pan
Software Engineer

“你昨天做了什么?”是每一场站会的第一个问题。对于一个通宵运行智能体集群(agent fleets)的团队来说,这已经变成了一个无法如实回答的问题。字面上的答案是:我写了三个提示词(prompts),然后回家睡觉,醒来发现有 11 个 PR,其中 4 个我还没看。那个正在陈述进展的人并不是故意撒谎。是这种仪式在替他们撒谎,因为它建立在一个不再成立的假设之上——即工作单元是一个人类在办公时间内串行地、一次只做一件事。

这个假设是起到承重墙作用的。它支撑着燃尽图、Sprint 承诺、速率值、“受阻 / 进行中 / 已完成”列,以及“谁在什么时候告诉谁什么”的整个协作流程。抽掉这个假设,这些产物并不会优雅降级。它们会继续产生看似权威但毫无意义的数字。一个团队可以拥有漂亮的燃尽图和绿色的 Sprint 状态,而其实际吞吐量有一半发生在午夜到凌晨 6 点之间,这些工作不归属于任何人,没人审计,也没有体现在任何仪式中。