这些年大家都在追AI Agent。大模型本身已经够能打了,为什么搭出来的Agent还是动不动就崩、跑两步就偏、一换场景就废?我早年做自动化设备的,天天跟PID控制器打交道,说实话刚转到AI工程时压根没把这两件事想到一块儿去。直到被几个Agent项目的可靠性问题折磨到失眠,才想起来:这玩意儿本质上不就是个被控对象吗?温度能控,转速能控,凭什么任务执行质量不能控?
这篇文章不卖概念,只讲我怎么把经典控制理论里的PID和自抗扰控制,一点点翻译成Agent系统里能落地的“镇定方案”。从最初的反馈闭环思路,到后来用扩张状态观测器去识别那些说不清道不明的模型扰动,整套思路实测下来,比单纯堆提示词、加校验逻辑要稳得多。适合正在做Agent工程化、被“脆弱的聪明”伤过的朋友,也适合对控制论好奇但一直不知道怎么入门的AI开发者。
1. 首先得说清楚:Agent的“脆弱的聪明”到底是怎么回事
1.1 三个让人崩溃的典型现象
先说结论:目前绝大多数Agent系统的问题,不是“模型不够聪明”,而是“系统没有反馈”。我接手过好几个项目,现象翻来覆去就那么几类。
第一种是任务漂移。一个多步骤任务,前面两三步执行得挺好,到第四五步就开始跑偏,最后给出的结果跟最初目标之间隔了十万八千里。你去看日志,每一步单独拎出来都挑不出大毛病,但连起来就是不对。
第二种是随机波动。同样的输入,同样的配置,这次跑通了下一次就翻车。不是偶发,是常态。做技术方案时想复现一个稳定结果,简直像开盲盒。
第三种是工具调用失控。Agent在几个工具之间来回试探,反复重试,甚至陷入死循环。你说它有明确意图吧,好像也没有,更像是“不知道该干嘛但又不想停下来”。
这些问题的共同点是什么?整个执行链路里没有任何一个环节在持续监控“当前状态和目标状态的偏差”,更没有人根据偏差去主动调节下一步动作。模型只是在一个开放空间里自由发挥,发挥得好是运气,发挥得差是常态。
1.2 为什么堆提示词和加校验解决不了根本问题
很多团队的第一反应是加提示词约束,比如“请严格按照步骤执行”“如果失败了就换个方式重试”。这种做法的确能缓解一部分问题,但本质上还是在依赖模型自身的自觉性。模型没有持久的状态概念,没有对历史偏差的累积记忆,也没有对变化趋势的感知能力。提示词只是增加了文本层面的引导,并没有真正形成闭环。
还有人会上不少校验逻辑,每一步检查输出格式、检查字段完整性。这类硬校验确实能拦截一部分低级错误,但它拦截不了质量问题——格式全对但内容已经跑偏,这是校验规则发现不了的。而且校验规则写多了,系统会变得越来越僵化,稍微换个场景就要改一堆配置。
这两种思路的共同缺陷是:它们都在开环控制。开环的意思是,系统只按照预设指令执行,不关心实际输出和目标值之间的偏差。而控制论从诞生那天起就在解决另一件事——如何利用反馈来主动纠正偏差。
1.3 控制论给的钥匙:把Agent当成一台需要稳定的设备
我在自动化领域待过几年,对控制理论的核心思想特别有感情。控制论处理问题的套路其实很朴素:明确被控量,测量当前值,和目标值做比较,然后根据偏差决定怎么调。
把这个套路翻译到Agent系统里,被控量就是“任务执行质量”或“与目标的一致性”,测量值就是每一步执行后的结果评估,目标值是预先定义好的任务验收标准,而调节动作就是改变下一步的策略——比如切换工具、调整推理方式、重新规划子任务,甚至触发人工介入。
这么一想,Agent的很多问题就变得可解了。任务漂移本质上就是系统持续存在累积偏差且无人纠正;随机波动就是系统对外部扰动没有任何抑制能力;工具调用失控就是系统在偏差信号过大时没有触发保护机制。这些在控制理论里都是成熟得不能再成熟的课题。工业上控温控压控转速几十年了,原理都是相通的。
2. 回到老本行:PID为什么在工业现场几十年不衰
2.1 把P、I、D三个字母拆开看
PID控制器可能是控制领域最广为人知的存在。搞嵌入式的人没有不知道PID的,温度控制、电机调速、平衡小车、四轴飞行器,到处都在用。它没有复杂的数学模型,没有花哨的算法结构,就是三个环节的线性组合,却解决了一大票工程问题。
P是比例环节,看当前偏差。偏差大就使劲调,偏差小就轻轻调。对应到Agent系统里,如果当前这一步的执行结果离目标偏差很大,立刻采取激进一点的纠正动作。比如任务已经明显偏离主线了,马上停止当前路径,回到最近的一个可靠状态重新规划。
I是积分环节,累积历史偏差。如果系统存在持续的、方向一致的偏差,说明有某种固定因素在干扰。对Agent来说,如果连续好几步都在同类问题上栽跟头,单纯靠当步的纠偏是不够的,需要把这个系统性偏差记住,在后续策略里做补偿。
D是微分环节,看偏差的变化趋势。如果偏差正在快速扩大,哪怕当前绝对值还不大,也要提前动手。Agent执行过程中,有时候当前这一步看起来还凑合,但趋势已经不对了,这时候等偏差真大到肉眼可见再干预就晚了,必须趁早踩刹车。
2.2 工业现场是这么用的
我最早玩PID是在温控项目上。一个加热腔,热电偶测温,固态继电器控制加热功率。目标温度比如100度,实际温度80度,偏差20度,P环节直接给大功率加热;升到95度了,偏差缩小,功率降下来;到了100度附近,靠I环节消除稳态误差,靠D环节抑制超调。整个过程不需要知道加热腔的精确热力学模型,三个参数调好了就能稳在目标温度附近。
做电机调速也类似。编码器反馈实际转速,和目标转速做差,PID输出PWM占空比。负载一变,转速往下掉,偏差出现,控制器自动补油。这个过程中PID根本不知道负载是什么,不需要建模,只需要根据转速偏差的变化去调节输出就够了。
这套东西最强的地方是模型无关性。它不要求你准确描述被控对象的内部机理,只要求你测得到被控量,使得上调节量。而Agent系统恰好满足这两个条件:任务执行质量可以评估,后续执行策略可以调整。所以拿PID的思路做Agent稳定化,技术上天然适配。
2.3 把PID翻译成Agent世界的语言
我实际落地时的做法是这样的。定义一个偏差量e(t),表示当前任务执行状态和目标状态之间的差距。评估方式可以是用大模型打分,也可以是规则判断加模型判断的混合。然后PID的每个环节落到具体动作上。
P环节:根据当前偏差大小决定调整力度。偏差小,微调当前步骤的描述或补充提示;偏差中,更换当前步骤的执行策略;偏差大,直接终止当前路径,回到最近一个检查点重新规划。
I环节:维护一个累积偏差变量。如果系统连续多步在同类任务上效果不佳,说明存在系统性的偏差源,这时候主动调整工具选择策略或整体的执行范式。
D环节:对比最近几步的偏差变化率。如果偏差上升很快,触发提前干预机制,不等偏差扩大到临界值再动手。
这套映射做出来之后,我就发现一个问题:标准的PID虽然有效,但调参是个玄学。而且Agent系统里的“扰动”远比工业现场复杂——模型本身的随机性、上下文长度的变化、外部API的抖动,这些都算扰动。所以我又往前走了半步,去看自抗扰控制。
3. PID的瓶颈与自抗扰的思路:看见扰动,主动消灭它
3.1 经典PID解决不了的麻烦
PID雖好,但在工业上有个固有缺陷:它只根据偏差做调整,并不关心这个偏差是怎么来的。如果系统受到的是一个持续的外部扰动,PID也能扛住,但响应速度偏慢,而且需要误差先出现才动手。换句话说,PID是“被动纠错”,而不是“主动防御”。
在工业上这个问题可以忍。加热系统的扰动是缓慢的、渐变的,PID完全来得及反应。但Agent系统不一样,它的扰动是剧烈的、突变的。比如一个工具突然返回了格式异常的数据,或是模型突然生成了一段偏离主题的内容,这些扰动如果不被及时识别和补偿,系统很快就会跑飞。
另一个麻烦是PID参数整定困难。在Agent系统里,P、I、D三个参数的含义不像温度控制那么直观,很难用常规的整定方法去收敛。参数调不好,要么反应过度把系统搞得来回振荡,要么反应不足跟没加控制一样。
3.2 扩张状态观测器:把“看不见的干扰”变成“看得见的量”
自抗扰控制的核心创新,在于引入了一个扩张状态观测器,英文缩写ESO。它的思路非常巧妙:把系统内部模型不确定性、外部扰动、以及一切说不清道不明的干扰,统统当作一个“总扰动”,然后通过观测器实时估计出这个总扰动的数值。
打个比方。你在开车,PID控制器会根据车偏离车道线的距离来修正方向盘。但如果遇上侧风,车会被吹偏,PID要等车已经偏了才知道有风。而带扩张状态观测器的系统会通过车偏离的趋势和加速度变化,实时估算出“有一股大约多大的侧向力在推我”,然后提前打方向盘抵消它。
放在Agent里,扩张状态观测器可以用一个估计网络或一个辅助评估模块来实现。它输入系统最近几步的状态、输出结果、上下文信息,输出一个“当前扰动估计值”。这个估计值代表的含义是:“在当前任务背景下,有哪些因素在持续把结果拉离目标方向”。比如某些历史信息在误导当前推理,或者某个工具的输出风格和任务要求不匹配,或者上下文过长导致注意力稀释。
有了扰动估计之后,控制策略就不是单纯“看偏差纠偏”了,而是“提前补偿干扰”。这比PID高一个段位:PID是等船偏了再扶舵,自抗扰是感觉到风来了就先压舵。
3.3 主动抗扰:不等问题放大再补救
我实际用的自抗扰式Agent架构里,控制量由两部分组成。一部分是误差反馈,相当于PID的调整作用,处理的是已经出现的偏差;另一部分是扰动补偿,用观测器的估计值反向抵消干扰。如果观测器估计出“最近几轮的文档风格在逐渐偏离技术文档的严谨性要求”,控制器就会在前一步还没产生明显偏差时,就给生成步骤加一个风格校准的指令。
这个思路用在长文本生成、多跳问答、工具链执行上,效果尤其明显。长任务最怕的不是某一步出错,而是错误在后续步骤中被逐步放大。如果能在步骤一产生轻微偏差时就检测到“当前环境下存在推动结果漂移的力量”,直接从源头把力量抵消掉,后面的步骤自然就稳了。
实现起来,扩张状态观测器不一定非要一套复杂的神经网络。我自己测试过几种方案:轻量方案是用一个小模型定时对最近状态做偏差归因分析;重方案是把几步的状态拼接成一个序列,让一个微调过的评估模型预测当前的扰动向量。关键是你要把“观测扰动”和“状态评估”分开做,观测器的目标是识别干扰,而不是评价结果好坏,这两件事混在一起容易糊。
4. 实操落地:给Agent装一套看得见摸得着的控制回路
4.1 总体框架:观测、评估、调节、再评估
落地这套系统,我的建议是从一个极简的闭环开始,不要一上来就上完整的大成套。先把一个核心任务的执行链路改造为“规划-执行-观测-评估-调节-再执行”的结构。
具体说,Agent每完成一步或几步操作,就把当前状态送到观测模块。观测模块做两件事:第一,估算当前状态和目标状态的偏差值;第二,通过扩张状态观测器估算当前的干扰强度。然后控制器根据偏差值和干扰值,产出一个调节指令,告诉Agent下一步应该继续执行、调整策略、切换工具还是回溯重规划。
等这一步执行完,再次进入观测和评估。如此循环,就形成了一个真正的闭环系统。这个框架不需要改变底层模型,不需要重新训练,只需要在Agent的外围包一层控制器。实际开发时,我用一个独立的控制模块来跑这个逻辑,和主执行链路解耦,控制器出问题也不会拖垮整个Agent。
这个框架里最核心的组件就是三个:评估器(负责算偏差)、观测器(负责估扰动)、控制器(负责生成调节量)。三个组件都可以用Prompt调用大模型实现,也可以用规则加小模型实现。我建议前期先用大模型验证效果,跑通了再考虑压缩成本。
4.2 三个可落地的控制回路
我在项目中实际部署了三层控制回路,每一层的控制频率和控制力度都不一样,对应不同的时间尺度。
最内层是步骤级控制回路,控制频率最高。每执行一个工具调用或一次文本生成,就做一次偏差评估。这一层的作用是防止单步跑偏,适合用轻量评估模型加规则触发,响应要快,控制动作要轻。比如发现生成结果格式不对,立刻修正提示词让模型重写。
中间层是任务级控制回路,通常每完成一个子任务或每累积几步之后触发一次。这一层评估的是整体任务路径是否仍然指向最终目标,如果发现任务规划已经陈旧,就触发重规划。这一层适合用大模型评估,因为它需要理解全局上下文。
最外层是会话级控制回路,频次最低。它关注的是整个交互过程中的策略倾向、风格一致性和资源消耗。如果系统长期使用某种工具序列导致效果不佳,就在这一层调整工具链的优先级。它实际扮演着“领导”的角色,一般由人来介入或者低频大模型分析来实现。
这三层回路共享同一个偏差定义,但控制粒度不同。这样做的好处是,每一步的快速问题由内层响应,中期的规划偏移由中层纠正,长期的策略问题由外层兜底。不会出现什么芝麻小事都要惊动重规划的情况,系统的行为自然就平稳了。
4.3 参数怎么定:偏差阈值、控制强度和冷却期
控制理论里调参是大事,Agent系统也一样。有三个参数是我每次做新项目必定要确定的。
第一个是偏差阈值。偏差值不是连续的,我会先把它离散化成几个档位:正常、轻微偏离、中等偏离、严重偏离。每个档位对应不同的控制动作。阈值的标定没有捷径,要靠一批标注样本跑一遍,看看不同场景下的偏差分布。标准是:在正确执行的情况下,偏差评估值应该落在正常档;一旦开始跑偏,评估值要能灵敏地跳到更高档位。
第二个是控制强度。即对同一个档位的偏差,系统做多大动作的调整。动作太大容易引发振荡——比如模型刚被纠正一下,下一轮又给反方向纠正,来回折腾。动作太小则不起作用。我的经验是,控制强度宁可先偏小,观察两轮效果再逐步放大,尤其避免首轮就动用“回溯重规划”这种重武器。
第三个是冷却期。控制动作不能太频繁。我一开始没设冷却期,结果控制器疯狂干预,几步就干预一次,Agent根本没法好好干活。后来加了冷却期:轻量调整至少间隔一步,重规划至少间隔三步或一个子任务。这样可以避免因为单次波动就连续折腾,给系统一个自然收敛的时间窗口。
参数设定还有一个跟工业上很像的坑:不要追求完美整定,要追求鲁棒。你以为针对当前这批数据调出来的参数很完美,换一批任务就露馅。要故意留一些裕度,让系统在不太精确的参数下也能维持基本稳定,这才是工业级的思路。
5. 做这套系统容易踩的坑和有效排查手段
5.1 评估器本身就是噪声源
我调试这套系统最头疼的问题,是评估器判不准。你用一个大模型来评估任务偏差,大模型自己是有随机性的,同一个状态评估两次分数可能差很多。这意味着什么?控制系统的输入信号本身就带噪声。工业现场的传感器也有噪声,但通常可控,大模型评估的噪声是真不小。
解决办法是给评估加冗余。同一个状态用两个不同的评估Prompt各评一次,不一致时就取保守值。另一个办法是调控制器的滤波逻辑,对连续几步的偏差做平滑处理,不要让单次的评估抖动触发控制动作。我实际效果最好的是“滑动窗口均值加突变检测”的组合:正常情况下看三步均值,一旦某一步偏差突然跳变,立刻按跳变处理。
如果评估实在不稳定,还有一个下策:把评估器换成规则主导的评价,只在规则覆盖不了的场景才调大模型。规则明确、可复现,作为控制输入信号更稳定。代价是覆盖面窄,但前期跑通流程够用了。
5.2 观测器的滞后问题
扩张状态观测器在实际系统里存在一个天然问题:它对扰动的估计是滞后的。因为它要基于历史数据来反推当前干扰大小,所以预测出的扰动总是慢半拍。慢半拍在处理突变扰动时尤其致命——等观测器估计出“有强干扰”的时候,系统已经跑偏了。
我的应对策略是给观测器加超前预测。具体做法是,观测器不只估计当前扰动,还要基于最近的变化速率,外推一步扰动值。相当于给观测器加了“导数”能力。外推可以很粗糙,哪怕只是判断“扰动正在快速增大”也好过毫无准备。
另一个经验是,观测器的输入不能只看结果,要把过程信息也喂进去。比如工具调用的中间返回值、推理链条的关键节点,这些过程特征对判断干扰来源非常有用。只观测最终输出会导致信息量严重不足,观测器就成了瞎子。
5.3 控制器干预导致的振荡问题
刚开始做闭环控制时,我犯过一个典型的工程错误:控制器对偏差响应太激进。一步发现偏差就立刻重规划,重规划出来的路径和原来差别太大,下一步评估又发现新偏差,于是再重规划。整个Agent就在反复推倒重来,任务反而推进不下去。
后来我理解了,这跟工业上PID参数过大的震荡现象是同构的——控制器增益太高,系统发散。解决思路也是一样的:降增益,引入阻尼,限制单次控制动作的最大幅度。我在控制器里加了一个约束:单次的策略调整只能在原有方案的某个邻域内变动,不能完全推倒重来。要彻底换方案,必须连续多次触发中等偏差信号,或者单次严重偏差加上冷却期已过,双条件都满足才行。
排查振荡的实操方法是画“偏差轨迹图”。把每一步的偏差值记下来,画成折线,如果看到反复的锯齿状波动,基本就是控制强度过大或频率太高。先调参数再调架构,大多数振荡都能靠参数压制住。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| Agent反复重规划,任务不推进 | 控制强度过大、冷却期太短 | 降低重规划触发条件,增加冷却期步数 |
| 偏差评估忽高忽低 | 评估模型随机性太强 | 加冗余评估,对偏差做滑动平均 |
| 控制好像不起作用 | 评估阈值太宽松,未触发控制 | 重新标定阈值,观察偏差分布 |
| 早段稳定,中后段漂移 | 观测器对累积型扰动估计不足 | 加强I环节作用,增加过程信息输入 |
| 换了任务场景后全面失效 | 参数过拟合当前任务 | 回退到保守参数,故意留控制裕度 |
6. 最后分享一个我反复用的实战小技巧
有一件事是这套控制回路落地时最容易被忽视的:人工接管通道必须保留。控制器再好,总有它判断不了的场景。我的设计里始终预留一个控制动作叫“请求人工确认”。当偏差连续多次处于中等偏上且观测器估计扰动强度很大时,不强行让Agent自己纠正,而是停下来把当前状态和偏差报告给用户,让用户决策。
这个设计一开始是出于安全考虑,后来发现它在效果上也是加分项。因为用户一旦介入,其实就相当于给系统注入了一个高精度的真实反馈信号。这个信号可以帮助校准评估器和观测器的参数。跑几轮人工介入之后,控制器自己会越调越准,需要人工的频率也会逐步降下来。
控制论这套东西看着老,但它解决的问题恰恰是最新的。Agent的可靠性本质上就是一个控制问题:如何在不完全知道内部机理的情况下,通过有限的观测来维持系统稳定。这个问题的答案,工业界其实早就写好了,只是很少有人往这个方向想。现在我把这套思路从老本行搬到Agent工程里跑通了,希望这篇文章能帮你少走几个月的弯路。如果你也在做Agent工程化,务实一点的建议是:从一层最简的闭环控制回路开始,先跑通再优化,别一上来就上全套自抗扰,那样大概率连问题都不好排查。