反馈的回响:从 Agent 到 Everything
从 Agent 的反馈闭环出发,讨论它如何延展到更广的软件系统。
反馈的回响:为什么Agent需要反馈
导语
最近读了一篇技术哲思的文章《反馈的回响:从控制论到 Agentic Engineering》。文中谈及了作者从Agent Engineering过程中,反思多年前学生时代遇到的控制论理论。 我身心大受感触。 有种全身从上到下的酥麻, 就像郭靖以前和江南七怪学习,学习了很多, 但是无从施展。直到遇到全真教掌教“丹阳子”马钰,学习内功心法。一下子触类旁通,原本笨拙的招式也因内息顺畅而威力大进,武功突飞猛进。
什么是控制系统?
如何理解反馈。 文中举了一个非常常见的例子,就是洗澡。 在洗澡过程中。
- 我们可以通过手来控制旋钮,这是执行器。
- 我们自己皮肤感受到的温度,是传感器。
- 而花洒就是被控对象。
- 我们的大脑就是控制器。 我们会根据太冷了太热了(从传感器得到反馈), 从而通过大脑(控制器)调整往热调整还是往冷调整,并最终通过手控制旋钮(执行器)。最终让温度达到一个我们感觉到舒适的温度。

这个环节什么最重要呢? 答案就是反馈!!!
反馈-纠正的循环:通往最优的螺旋阶梯
其实,反馈早已渗透进我们生活的每个角落,只是我们习以为常而未曾察觉。
学习成长中的反馈:
- 学走路:婴儿每一次跌倒都是反馈——大脑根据失衡的感觉调整肌肉控制,从蹒跚学步到健步如飞
- 学骑车:身体的倾斜角度实时反馈给小脑,驱使我们不断调整方向和重心,从摇摇晃晃到如履平地
- 学语文数学:作业的对错是反馈,考试成绩是反馈,老师的批改更是精准的反馈信号,指引我们修正理解偏差
日常生活中的反馈:
- 洗澡调水温(如上文所述):皮肤感受到水太烫,手立刻往冷水方向拧;感觉水太凉,又往热水方向调——典型的负反馈控制系统
- 开车保持车道:眼睛看到车偏左了,手就向右打方向盘;发现偏右了,又向左修正
- 炒菜调味道:尝一口觉得淡了加盐,觉得咸了加水,舌头的味觉反馈指导着每一次调整
- 空调调温度:房间太热了调低温度,太冷了调高温度,体感温度就是反馈信号
技能习得中的反馈:
- 学乐器:耳朵听到音不准(反馈) → 手指立即调整按弦位置或吹奏力度
- 打篮球:球没投进(反馈) → 下次出手角度和力度就会微调
- 练书法:看到字写歪了(反馈) → 下一笔的运笔轨迹就会修正
- 学游泳:呛水了(反馈) → 调整换气节奏和头部角度
这些看似简单的动作,本质上都遵循同一个模式:
感知当前状态 → 与目标对比 → 产生偏差信号 → 执行纠正动作 → 再次感知 → 持续迭代
这就是一个完整的反馈回路(Feedback Loop)。从生物本能到技能习得,从工业自动化到人工智能 Agent,反馈是贯穿始终的底层逻辑。正是通过反馈的不断迭代,系统才能螺旋式上升,最终收敛到最优状态。
然而并不是所有的纠正都是有效的。 当你的纠正的动作方向不对, 或者纠正的动作偏大,系统就不会进入稳定状态。
在这其中, 系统会进入三个状态。
- 收敛
- 震荡
- 发散

很明显, 收敛是我们的最终目标。 那就意味着我们调整的方向要对, 力度要适中。
利用反馈来Harness Agent
简单介绍完控制理论后, 回到我们的主题Agent。 为什么Agent需要反馈?自然就明白了。 我们需要系统逐渐收敛。
那么对于软件系统来说,反馈有什么特殊性呢?
软件系统有一个独特的优势:它的底层执行逻辑是确定性的、二值的。编译要么通过要么报错,类型要么匹配要么不匹配,测试要么 pass 要么 fail。不像现实世界中“太冷”“太热”是一个连续的、主观的量,软件的很多反馈信号是清晰的、无歧义的——这就是所谓的“低噪声”。而且确定性带来了巨大的可复现性:相同的输入往往能稳定复现相同的输出,发现 bug 时可以从日志中提取请求包,在测试环境中精确重放,反复调试直到修复。
但这恰恰是一把双刃剑。确定性同时意味着零冗余——你必须精确,没有任何“差不多就行”的容错空间。 炒菜盐放多了多加水还能救,但一个 > 写成 >=、一个 nil 没判空——编译通过、测试也可能通过,但线上就是会崩。确定性让正确的代码永远正确,也让错误的代码永远错误,不会有任何“运气好”的时候。 在这种零冗余的环境下,反馈信号越少、越粗,系统就越容易在错误的方向上“自信地狂奔”。
更要命的是,“低噪声”只适用于我们自己写的纯逻辑。一旦引入第三方库、对接外部系统(数据库、缓存、消息队列、第三方 API),确定性就开始打折扣。它们的陷阱在于:行为不是通用的。 Go 的 encoding/json 遇到零值会忽略字段,Python 的 json.dumps 却不会;MySQL 和 PostgreSQL 的 upsert 语法完全不同;Kafka 的分区语义和 RabbitMQ 的路由语义南辕北辙。每一个库、每一个系统都有自己的“潜规则”,你无法靠“通用编程知识”提前预知。而更危险的是,这些潜规则带来的错误恰好绕过了常规反馈信号——编译不报错,测试不一定能覆盖,日志里看不到异常,但系统输出就是不正确。以 GORM 为例,更新零值字段时默认会跳过不更新,一切静默无报错,数据就是没改。
要缓解这类问题,一种手段是引入 Skill(技能规则)——为 Agent 注入先验知识,提前告知已知的“潜规则”。但这只能缓解,无法根治:先验知识永远有限,而“潜规则”是无限的。
噪声源太多,Skill 覆盖不了,常规反馈又感知不到——Agent 该怎么办?
想象一下打羽毛球的场景:如果你只能感知到“球有没有接到”,而无法判断球的落点、速度、旋转,你怎么改进击球?大概率是每次大力挥拍碰运气,至于球是飞出界了还是挂网了,你完全不知道该往哪个方向调整。这就是 Agent 当前面临的困境——反馈仅仅停留在“编译通过”这一层,就像一个只能感知“有没有接到球”的选手,知道代码能跑起来,但不知道跑得对不对、快不快、稳不稳。用控制论的话说,这是一个开环系统(Open-loop System):反馈信号太弱,系统输出完全取决于输入的“猜测”,无法自我纠正。
武装到牙齿的多层反馈系统
那么如何给 Agent 构建一个多层反馈系统呢?
| 反馈层级 | 反馈信号 |
|---|---|
| 编译 & 类型检查 | 报错/通过 |
| Lint & 代码规范 | 警告/规范违反 |
| 有意义的单元测试 | pass/fail + 覆盖率 |
| 合理的架构约束 | 依赖关系/模块边界 |
| 端到端测试 & 集成测试 | 业务流程 pass/fail |
| 关键路径 Event 日志 | 分支路径、状态流转、耗时等结构化日志 |
| 可检索的日志体系 | Agent 自主查询日志定位问题 |
每一层反馈都是对 Agent 的“传感器”能力的增强。反馈层越丰富,Agent 对自身输出的“感知”就越精确,纠正能力就越强,系统就越趋向稳定和收敛。 反之,如果只有最底层的一层反馈(编译通过),Agent 就像一个蒙着眼洗澡的人——能感觉到有水,但永远调不到合适的温度。
因此,Harness Agent 的本质目的就两个:提供更多的反馈信号,提供更明确的方向。 反馈信号告诉 Agent “你当前做得怎么样”,方向告诉 Agent “你应该往哪里调”。两者缺一不可——只有信号没有方向,Agent 知道错了但不知道怎么改;只有方向没有信号,Agent 知道该往哪走但不知道自己走了多远。
尽快纠正
当代码开始和预期目标产生误差时,必须尽早纠正。控制论告诉我们一个朴素的道理:偏差越大,纠正所需的代价就越高。就像打羽毛球时,如果拍面角度偏了 5 度,稍微调整手腕就能修正;但如果偏了 45 度,可能需要完全重新挥拍。同理,Agent 在写代码时,如果偏离方向 10 行就能发现并纠正,成本很低;如果等到写了 500 行才发现架构走偏,纠正起来就像在高速公路上掉头。
这就是为什么反馈的及时性(Latency)和反馈的准确性一样重要。一个延迟很大的反馈系统,即使信号很准确,也会导致系统不断“过冲”——等反馈回来的时候,系统已经跑得太远了,然后猛拉回来,又跑太远,进入震荡状态。
Hooks 机制正是解决“及时纠正”的关键手段。它允许我们在 Agent 执行的关键节点上插入自动化的检查和拦截,而不需要等到整个流程跑完才给出反馈。常见的 Hooks 包括:
| Hook 时机 | 反馈内容 | 纠正效果 |
|---|---|---|
| 文件保存时(pre-save) | 格式化、lint 检查 | 在代码写入磁盘前就修正风格问题 |
| git commit 前(pre-commit) | 代码规范、提交信息格式 | 防止不规范的代码进入版本库 |
| PR 提交时(CI Hook) | 编译、单测、静态分析 | 在合并前拦截引入的问题 |
| 编译时(build Hook) | 类型检查、依赖冲突 | 在运行前发现语法和依赖问题 |
| 运行时(runtime Hook) | 错误日志、性能指标 | 发现逻辑和性能问题 |
Hooks 本质上就是在反馈回路中插入“提前触发的传感器”,把“事后发现”变成“事中纠正”。反馈回路越短,系统越不容易跑偏,也就越容易收敛到目标状态。
Agent 为编程带来了什么
一句话总结:Agent 让写代码变快了十倍,但我们验证代码的速度还是原来的速度。
想象一个高速运转的工厂:生产线全力运转,但质检线只有一条老式的手动检测台。产品哗哗地产出来,质检员根本看不过来,不合格的产品只能混进仓库。

你不能指望让生产线“慢一点”来迁就质检台。正确的做法是改造质检台——给它装上自动化检测、X光扫描、压力测试、实时监控……用一整套反馈系统来匹配生产线的速度,而不是靠人眼去一个个看。
前面讲的 Lint、单测、架构约束、端到端测试、Event 日志、Hooks,本质上就是在“改造质检台”。没有它们,质检台就是一条漏检率极高的老式产线,产品哗哗流过去,问题全靠运气发现;有了它们,每一件产品流过时都会被快速、自动地检验——出了问题立刻拦下来,不用等到堆满仓库才发现。
所以与其说我们是在“使用” Agent,不如说我们是在**“升级工厂”**。升级的核心不是压制生产线的产能,而是把质检台的速度和精度提上去——反馈越快、覆盖越全,整条产线就越可靠。
回到文章开头那个洗澡的例子:我们每天都在用反馈调水温,为什么到了 Agent 这台高达面前,反而忘了给它装上“温度计”呢?
记住:反馈的回响,终将让一切收敛到最优。
