2026-06-26 16:00:00
用过 AI 写代码的人,多半经历过这样一种反差。
一方面,AI 偶尔展现出的能力近乎魔法。你用一两句话描述想要什么,它就能生成一个精美的、可交互的小工具、一个能跑的脚本、一段你没想到的巧妙实现。那一刻你会觉得,编程这件事被彻底改变了。
但另一方面,一旦你把它放进一个稍微真实、稍微复杂的项目里——不是写一个孤立的 demo,而是在一个有几万行代码、有历史包袱、要和别人协作的项目里持续用它——情况就变了。”整个过程漏洞百出,各种不易察觉的错误层出不穷”,有人这样描述。项目”快速起步,然后失控”。
这种反差不是因为你用得不对,也不是因为模型不够强。它是一个结构性的问题。这篇文章想讲清楚:为什么 AI 编程会”快速起步然后失控”,以及一个叫 beecodeai 的产品,是怎么从根上应对这个问题的。
为了讲清楚,我们会借用一套语言——控制论。它的核心直觉非常朴素:任何想”控制”某个东西的系统,都得遵循几条绕不开的规律。 而 AI 编程,恰恰就是一个”人想控制代码库”的系统。一旦你戴上这副眼镜,很多原本说不清的困惑,都会变得清晰。
要理解 beecodeai 为什么长成这样,得先回答一个最根本的问题:AI 编程,到底难在哪?
很多人会直觉地认为:难在”让 AI 写出正确的代码”。但这个直觉是错的,而且错得很有迷惑性。
先放下 AI,想象一个你家里可能有的东西:恒温器(也就是空调或暖气的温控器)。
恒温器在做什么?它想让你房间的温度维持在一个你设定的值,比如 24 度。为了做到这件事,它需要三个东西:
它的工作方式是一个不断循环的过程:用温度计量一下现在多少度 → 和目标的 24 度比一下 → 如果低了就开暖气、高了就开空调 → 过一会儿再量一次…… 这个”量一下、比一下、调一下、再量一下”的循环,就叫反馈回路。
恒温器就是一个最简单的控制系统——一个”想要把某个东西维持在某个状态”的系统。控制论就是研究这类系统的学问。它发现,不管你是控温、开车、驾驭飞船,还是——我们马上要讲的——用 AI 写代码,只要你在”控制”什么东西,就都得遵循同一套规律。
现在我们把恒温器的每个部件,对应到 AI 编程上:
| 恒温器 | AI 编程 |
|---|---|
| 房间的温度(你想控制的东西) | 代码库(你真正在改变的东西) |
| 你设定的 24 度(目标) | 你的需求(你想要代码做成什么样) |
| 温度计(感知现状) | 测试、类型检查、代码审查(你用来知道代码现在到底对不对) |
| 暖气/空调(改变现状的手段) | AI(你用来改代码的工具) |
| 你(决定开暖气还是开空调) | 你 + AI 的判断(决定下一步做什么) |
看出门道了吗?在 AI 编程里,代码库就是那个”被控制的东西”。你每让 AI 写一段代码、改一个功能,本质上都是在”改变代码库的状态”,就像恒温器开一次暖气改变了房间温度。
而且和恒温器一样,你不能只管”开暖气”(让 AI 写代码),你还得量温度(验证代码对不对)、和目标比(验证它是不是你想要的)、再调整(让 AI 修)。如果没有”量温度”这一步,你就是闭着眼睛在调温度——房间是冷是热你都不知道。
有了这个映射,我们就能看清 AI 编程的瓶颈了。
回到恒温器:假设你给暖气换了一个功率大十倍的新型号(开暖气的能力暴增),但你用的还是那个又慢又不准的旧温度计,而且温度计还只放在房间的一个角落。会发生什么?暖气是猛了,但你根本测不准房间的真实温度,结果要么过热、要么过冷——升级”改变温度的手段”没用,因为瓶颈在”感知温度”和”判断”上。
AI 编程完全是这个状况。过去两年,”让 AI 写代码”(开暖气)的能力突飞猛进,模型越来越强。但是——你用来验证代码对不对、协调多个 AI 工作的能力(量温度、做判断)几乎没有变化。 你还是那一个人,一天还是能看那么多代码,还是只能同时盯住那么几件事。
所以 AI 编程真正的瓶颈,从来不在”生成”——模型已经够强了。瓶颈在验证和协调:搞清楚 AI 写的代码到底对不对、是不是你真正想要的、多个 AI 同时干活怎么不打架。
一旦你接受”瓶颈在验证和协调,不在生成”,整个问题就变了:不再问”怎么让 AI 写得更多”,而是问”用什么结构,才能把验证和协调这件事组织好“。这就是 beecodeai 全部设计的出发点。
在继续之前,控制论还有一条非常重要、也非常朴素的规律,叫阿什比必要多样性定律。它的名字唬人,意思却很简单:
你想控制的东西有多复杂,你的控制能力就得有多强。控制能力不够,就会失控。
还是用恒温器:如果房间里只有”温度”这一个因素,恒温器(能应对”过冷/过热/正好”三种情况)完全搞得定。但如果房间里突然多了”湿度”“气压”“二氧化碳浓度”,而你的恒温器还是只会调温度——它就应付不来了,因为它能做的事,覆盖不了环境的变化。
映射到 AI 编程:代码库就是那个”环境”,它的复杂度就是你需要应对的变化。 而控制论告诉你一个残酷的事实——
AI 每写出一段新代码,代码库就变得更复杂一点(环境变复杂了);但你的理解和验证能力(控制能力)几乎是不变的。 一开始代码库小,你还跟得上;但随着 AI 飞快地往里堆代码,代码库的复杂度像滚雪球一样膨胀,迟早会超过你能 hold 住的上限。到那一刻,你就”失控”了——这不是你努力不够,是结构性的必然。
这就是为什么那么多项目”快速起步,然后失控”。所以,我们需要一个系统,来帮我们管理这种”复杂度膨胀 vs 控制能力固定”的失控。它应该长什么样? 这就是接下来要讲的。
在讲 beecodeai 长什么样之前,还要再借用一个类比,因为它能解释 AI 编程里另一个让人困惑的现象:为什么同一个 AI,有时候表现神勇,有时候又蠢得离谱?
答案是:大模型本质上是一个放大器。
想象一个扩音器(麦克风+音箱)。你对它说话,它把你的声音放大输出。这里面有个关键特点:它放大的是你给它的信号——你说的清楚,它输出的就清楚;你含含糊糊,它放出来的就是含糊的声音,而且因为被放大了,含糊得更明显。
大模型就是这样一个”放大器”,只不过它放大的不是声音,而是你的意图:
这解释了一个反直觉的现象:很多时候 AI 写出的烂代码,根子不在 AI,而在你给它的需求太模糊。 你以为你说明白了,其实你脑子里的想法还是一团浆糊,AI 只是把这团浆糊忠实地放大了。
放大器还有一个特点:它有有效工作区间。
还是扩音器:你对着麦克风正常说话,音箱正常放大,声音好听。但如果你一次塞给它一个极其复杂的、乱七八糟的声音信号,它就会失真——输出的声音变调、破音。放大器不是什么都能完美放大的,信号太复杂,它就处理不了,输出就开始变形。
大模型也一样。一个任务如果不太复杂,AI 在它的”有效工作区间”内,输出质量很高。但任务一旦太复杂——要考虑的东西太多、跨度太大、约束太隐晦——AI 就会超出它的能力区间,输出开始”失真”:逻辑断裂、前后矛盾、漏掉关键约束。
这是放大器视角最重要的一条洞察:放大器不挑食,它同时放大你想要的信号,和不想要的噪声。
意思是:你让 AI 写代码写得越多、越快,它产出的正确代码变多了,但同时产出的错误、隐患、技术债也同比例变多了。你不能指望”只放大好的、不放大坏的”——放大器做不到。
把这一条和上一章合起来,结论就很清楚了:
AI 编程不是一个”生成”问题(怎么让 AI 写更多),它是一个”控制”问题(怎么在 AI 飞快写代码的同时,把那些被一起放大的错误抓出来、协调好)。 想靠”让 AI 更强、写得更快”来解决问题,是搞错了方向——那只会让错误产生得更快。真正的解法,得从”控制”那一侧入手。
那具体怎么从控制侧入手呢?这就引出了下一章的主角:反馈回路。
第一章我们提过,恒温器工作的本质是一个循环:量温度 → 和目标比 → 调整 → 再量。这个循环有一个专门的名字,叫反馈回路。它是所有控制系统的命门,搞懂它,你就搞懂了 beecodeai 设计的底层逻辑。
反馈回路,就是一个”做完一件事后,根据结果再调整,然后再做、再调整”的循环。
开车是最直观的例子。你在高速公路上开车,想保持在车道中间。你不是”一次性把方向盘转到某个角度就不管了”——那样车早跑偏了。你实际做的是:看一眼车在车道里的位置 → 发现偏了就微调方向盘 → 过一会儿再看一眼 → 再微调…… 这就是一个反馈回路:感知(看)→ 比较(和中间比)→ 调整(转方向盘)→ 再感知。
注意这里的一个关键点:如果把你”看路”的能力去掉,你根本开不了车。 哪怕你转方向盘的技术再好,闭着眼睛也没用。因为没有了”感知”,你就不知道该往哪调整。反馈回路里,”感知”和”调整”同样重要,缺一不可。
把这一点翻译回 AI 编程:光让 AI 写代码(调整),却不验证它写得对不对(感知),就等于闭眼开车。 而很多团队用 AI 的方式,恰恰就是闭眼开车——AI 飞快地写,人来不及看,等到发现问题时已经堆了一座屎山。
接下来这条道理,是整个 beecodeai 设计的”信心来源”,但它有点反直觉。
回到恒温器。假设你有两个选择:
哪个更能让房间温度稳定在 24 度?
答案有点反直觉:只要暖气不是太烂(能制热就行),选择 B 的效果远好于选择 A。 因为决定温度稳不稳的,主要不是”暖气有多猛”,而是”你能不能及时、准确地知道当前温度,并据此调整”。哪怕暖气普通,只要温度计准、反馈及时,房间也能稳稳停在 24 度。
这个道理在工程学里有一条精确的表述:
在一个有反馈的系统里,输出的准确度,主要由反馈环节决定,而不太依赖于生成环节本身的好坏。
翻译成大白话:你不需要一个完美的 AI(生成器),你需要的是足够好的”验证”(反馈)。只要验证够强、够及时,哪怕 AI 本身有缺陷,最终结果也能被纠正到正确。
这是 beecodeai 整个设计的底气所在。它没有(也没必要)去追求”最完美的 AI”,它追求的是让验证这件事尽可能强、尽可能及时——因为那才是决定成败的关键。
不过这里有个陷阱,也是下一章要讲的:“验证”这件事,比想象的难得多。 不是随便什么”验证”都管用。
上一章说”验证够强就行”。但你马上会问:让 AI 自己跑一遍测试、自己说一句”没问题了”,算不算验证?
答案是:不算,而且这种”验证”几乎一定会骗你。 这是控制论里一个不太直观、但极其关键的结论。我们用一个真实的反面教训来讲它——这个教训就发生在我们设计 beecodeai 的讨论过程里。
在设计 beecodeai 的过程中,我们让好几个 AI 参与讨论,帮我们分析产品该怎么设计。有一次发生了这样一件事:
我们让几个 AI 分析”beecodeai 里到底有没有一个自动驱动流程的引擎”。这几个 AI 都没有真正去读代码,只是凭印象互相附和,结果它们越说越确信”系统里有一个精密的流程引擎”——一个完全不存在的东西,被它们当成事实越传越真。
为什么几个 AI 都会犯同一个错?因为它们犯错的根源是一样的:它们读了同一批材料、用了相似的推理方式、还能看到彼此的发言。一个 AI 产生的幻觉,恰好落在其他 AI 的盲区里,于是非但没被发现,反而被其他 AI 当成了佐证。
几个会犯同样错误的 AI 凑在一起互相确认,不是”好几倍可靠”,而是”把同一个错误确认了好几倍”。 这就好比一群都近视、且近视度数一样的人互相检查视力——他们看不见的东西,彼此也都看不见,互相说”我看清了”毫无意义。
这种现象在控制论里有个名字,叫共模错误(”共模”就是”大家共同的模式”)。靠一群会犯同样错误的家伙互相检查,是查不出这种共同错误的。
那怎么才能打破这种回音室?关键在一个词:异质——也就是”不一样”。
还是检查视力的例子:一群同样近视的人互相查没用。但如果引入一个不近视的人(一种”异质”的检查者),他一下就能看出”你们都看不见那行字”。
在我们的回音室例子里,那个”不近视的人”是什么?是代码本身。当我们停止听 AI 互相附和,转而去读真实的代码——代码不会附和,不会要面子,它是什么就是什么——幻觉瞬间就瓦解了。
这里区分两种完全不同的”验证”:
所以一条铁律是:一个 AI 无法有效审查它自己写的东西。 它审查时用的是同一个脑子、同一套知识、同一种思维模式,它写的时候犯的错,审查时还会再犯一遍。有效的验证必须来自”外部”:另一种 AI、确定的工具、或者人。
而且,”异质验证”本身也分等级,可靠性从高到低大致是:
记住这张阶梯,因为 beecodeai 的验证设计,就是在按这个阶梯把贵的验证省下来,把便宜的验证用足。
好,现在我们有了三副眼镜——控制系统、放大器、反馈回路/验证——可以正式看 beecodeai 这个产品了。
讲了半天理论,beecodeai 到底是个什么东西?
一句话:beecodeai 是一个让你(哪怕在手机上)指挥电脑里的一个 AI 团队,去完成编程任务的工具。 你的电脑上运行着一个”管家”程序(我们叫它 daemon),它管着几个 AI(每个可以有不同的”脑子”/模型),在你的代码仓库上干活;你通过手机或者电脑和它们沟通、下指令、看进展。
光说定义没用,我们走一个真实的任务看看它怎么运作。假设你想给你的 APP 加一个支付功能。
第一步:创建一个”任务”。 你在 beecodeai 里新建一个任务,标题写”给 APP 加支付功能”,描述里写清楚你想要什么(支持微信/支付宝、能退款、安全)。这个”任务”就是这一整件事的载体——后面所有的讨论、代码、验证,都挂在这个任务上。
第二步:讨论需求。 你在这个任务下和 AI 来回讨论:退款规则到底怎么定、要不要支持部分退款、安全上要注意什么。讨论的过程,其实就是在把第一章说的”目标”想清楚——还记得放大器吗?需求越清楚,AI 放大出来的噪声越少。
第三步:让 AI 实现。 需求讨论清楚了,你让一个 AI(比如擅长写代码的那种)去实现。它在你的代码仓库里写代码。你不用盯着,它在自己的工作区里干。
第四步:验证。 实现完,不能直接用——得验证。你让另一个 AI(或者测试脚本)去测:编译过不过、测试通不通、关键流程跑一遍对不对。还记得第四章吗?验证要用”异质”的东西,所以测试和代码检查比”让写代码的 AI 自己说没问题”靠谱得多。
第五步:你看一眼,拍板。 验证结果汇总到你面前——不是让你看几千行代码,而是看一个结论:”测试通过了,这几个关键点没问题,这里有一个需要你决定的取舍”。你做个判断:可以,那就合并;不行,打回去让 AI 改。
第六步:合并,任务关闭。 代码合并进主仓库,这个任务就算完成了。
整个过程里,你会注意到一个关键设计:所有事情都挂在一个”任务”上——讨论、代码、验证、结论,全都收敛在同一个地方,而且全过程都被记录下来。 你三个月后想知道”当时支付功能为什么这么设计”,回到这个任务就能看到完整的来龙去脉,不用在聊天记录里大海捞针。
这个”以任务为中心”的设计,不是拍脑袋想出来的,而是踩了很多坑之后的结论。下一章讲这些坑。
beecodeai 不是一开始就长这样的。它有过两个前身,分别走了两条被实战证伪的”死路”。理解这两条死路,你才能理解为什么”任务”是答案。
beecodeai 的第一个版本,是一个纯聊天的产品。它的想法很自然:既然能跟 AI 自然语言对话,那就像用微信一样,把每个 AI 当成通讯录里的一个联系人,所有工作都通过聊天完成。
这个想法的直觉非常强,但一用起来就崩了。问题出在哪?
工作全部散落在聊天记录里,没法追溯,没法协作。
举个具体场景:你和某个 AI 聊了三天,解决了一个 bug。第四天,你想回头确认”当时为什么选了方案 A 而不是方案 B”。你得在几百条聊天消息里一条条翻,而且很多关键决策是散落在不同日子的对话里的,拼都拼不起来。
更糟的是协作:如果两个 AI 要一起做一件事,它们没有一个共同的”工作对象”可以挂靠。你只能当人肉中转——AI A 说一句,你复制给 AI B,AI B 回一句,你再转回去。对话一结束,状态就消散了,没有任何东西沉淀下来代表”这件事进行到哪了”。
用我们前面的语言说:纯聊天模式没有”求和点”——没有一个地方把”目标和现状的差距”记录下来、累积起来。每次对话结束,这个差距信息就丢了,你得下次重新判断。这等于恒温器每次量完温度就失忆,永远在”盲控”。
另一个极端是纯任务看板:把 AI 当成团队里的员工,给它派工单,它做完把工单从”待办”挪到”完成”。这是把传统的项目管理软件直接套到 AI 身上。
它的毛病更隐蔽,但也更致命:它还在用”管理人类”的方式管理 AI,缺少真正的编排核心。
看板擅长展示”谁在做什么、卡在哪”,但 AI 协作真正需要的,是实时的信息流动——一个 AI 刚产出的东西,要能立刻成为另一个 AI 的输入;你的一句话,要能立刻改变正在进行的工作。看板是一张静态的快照,不是流动的回路。它有”可见性”,但”可见”不等于”可控”。
而且纯看板有个致命的信息流问题:AI 通过命令自己去改工单状态,系统只是被动接收。这意味着状态变更成了黑盒——AI 把工单挪到”完成”,但你不知道它到底做了什么、做对没有,事后也追溯不了。
把两条死路的失败反过来,答案就浮现了:
你需要一个东西,既能像聊天一样实时交流,又能像工单一样追溯结构。这个东西,就是”任务”。
任务把”目标 + 讨论 + 执行 + 结果”收敛在同一个地方。它不是聊天和工单的妥协,而是同时拿到了两者的长处。
这就是 beecodeai 最核心的产品判断:以”任务”——而不是对话,也不是看板卡片——作为组织 AI 编程工作的基本单元。
但光说”任务为中心”还不够,关键在于这个任务具体怎么设计。接下来一章,我们逐个看 beecodeai 任务系统的几个关键设计决策,以及每个决策背后那个”为什么”。
这一章是全文的重头戏。beecodeai 的任务系统有几个看起来”反常”的设计——它们要么特别简单,要么故意”不做”某些事。我会逐个讲清楚,每个设计都是在回答”怎么把验证和协调组织好”这个问题。
大多数任务管理软件都有一堆状态:待办、进行中、待测试、待审核、已完成、已取消……beecodeai 只有两个:开(open)和关(closed)。
为什么这么简陋?
因为 beecodeai 想 expressed 的,不是”流程走到第几步”,而是“这件事和目标之间的差距,是否已经被吸收了”。还记得第一章的反馈回路吗?一个任务刚创建时,它和”想要的目标”之间差距很大(需求还没实现);随着讨论、实现、验证,这个差距一步步被缩小;当差距小到可以接受(代码做完了、验证过了),任务就关闭。
所以”开/关”这两个状态,本质上是:差距还没吸收(开)/ 差距已经吸收(关)。这是最本质的二分,多了反而模糊焦点。
那”现在在讨论还是在测试”这种信息怎么办?用标签来表达。需要区分时就打个 讨论中、实现中、验证中 的标签,不需要时就不用打。标签是可选的、轻的、你自定义的——这比强制一套复杂状态机灵活得多。
在 beecodeai 里,任务上发生的任何事——你评论了一句、改了标题、加了个标签、分配了一个 AI、AI 完成了一步——都被记录成一条不可更改的”事件”,按时间顺序排成一条流。任务的当前状态,就是这条事件流的”汇总”。
这个设计叫”事件溯源”,道理很朴素,可以用银行流水来理解。
你的银行账户”现在有多少钱”,其实是从你开户以来每一笔存入、取出”汇总”出来的。银行不会只存一个”当前余额”然后覆盖它——它存的是所有交易记录(事件流),余额是从记录里算出来的。为什么这么做?因为交易记录可追溯(你能查到每一笔钱哪来的)、不可篡改、出了问题能对账。
beecodeai 给任务记事件流,是一模一样的道理:
这个设计还顺带解决了一个纯看板模式的毛病:在纯看板里,AI 自己改状态、系统被动接收,变更成了黑盒。而事件流是系统主动推送给所有相关方的——谁做了什么,大家都看得到,编排变得可审计。
这是 beecodeai 里最容易引起误解的一点,也是它最”反常”的设计之一。
顺着”控制系统”的思路,最自然的设计是:给任务定义一条清晰的流程,比如 需求 → 设计 → 开发 → 测试 → 评审 → 发布,每个阶段有进入和退出条件,到了某阶段自动通知相关 AI、自动推进到下一步。这种”流程状态机”看起来特别专业,几乎所有项目管理软件都这么做。
beecodeai 刻意不这么做。 在 beecodeai 里,”阶段”只是一个用户自己打的标签,配上”进到这个阶段时自动说一句话”“这个阶段需要哪些 AI 关注”这样的可选配置。它不强制流程、不校验”必须先做完 A 才能做 B”、不自动推进。
为什么?因为真实的 AI 编程流程,根本不是一条直线,而是来回乱跳的。
想象你在做饭。菜谱上写”备料 → 起锅 → 炒 → 调味 → 装盘”,是一条直线。但真实做饭是什么样?你炒着炒着发现盐放早了,赶紧想办法补救(回到了”调味”);补救的时候发现食材切太大,又临时去改刀(回到了”备料”);装盘前尝一口觉得不够味,又倒回去调味。真实的工作流是螺旋的、来回横跳的,不是流水线。
AI 编程一样。你以为讨论完需求就该开发了,结果开发到一半发现需求本身想错了,得退回去重新讨论;你以为测试完了该发布了,结果测试发现是个根本性的设计问题,直接打回到最初的需求层。讨论、实现、验证这三件事,在真实工作里高度交错、反复横跳。
如果你强行定义一条线性的流程状态机,它就会和真实工作流持续打架:系统逼着你”假装”自己正处在某个规定阶段,而你的真实工作早就在阶段之间跳来跳去了。状态机会变成一种官僚主义——你不是在工作,你是在维护状态机的体面。
所以 beecodeai 让”阶段”只是一个描述性的标签:你想标记现在在干嘛就打个标签,想跳就跳,想回头就回头。它记录”现在大概在做什么”,但不强制你必须怎么走。
(顺带说一句:正是因为不把流程写死,beecodeai 才有可能在未来把”安排流程”这件事本身交给 AI 去做——AI 自己决定什么时候该叫谁来帮忙、什么时候该进入下一步。如果把流程写死了,这种灵活性就彻底没了。这个方向,我们后面还会讲到。)
当多个 AI 同时为一个任务干活时,beecodeai 给每个 AI 分配一个完全独立的代码副本(工作目录),它们彼此隔离,互不干扰。
这个设计可以用两个厨师来理解。如果两个厨师共用一个灶台、一口锅,他们肯定会打架——一个在炒菜,另一个把食材倒进去;一个放了盐,另一个又放一遍。所以正经的厨房给每个厨师一套独立的灶具,各做各的,最后再合到一起。
beecodeai 给每个 AI 独立工作目录,道理一样,但还有更深一层的原因——防止”AI 自己查自己”那种失效。
还记得第四章的回音室吗?一个 AI 不能有效审查自己写的东西。但如果两个 AI 在同一个代码副本上工作,它们就共享了同一段工作记忆——审查的那个 AI,脑子里全是写代码那个 AI 留下的痕迹,它俩实际上”想到一起去了”,等于变相的自己查自己。把两个 AI 物理隔离到不同的代码副本里,它们的工作记忆不互通,审查才真的是”另一个独立的视角”。
所以这个”独立副本”的设计,表面上是工程隔离(防并发冲突),深层是为了满足”验证必须异质”这条规律。
beecodeai 鼓励你把多个不同的 AI(尤其是用了不同底层模型的)拉进同一个任务,让它们交叉检查彼此的工作。
为什么强调”不同”?还是第四章的道理:几个会犯同样错误的 AI 互相检查,查不出共同的错误(共模错误)。要真正能查出问题,这些 AI 得犯不一样的错——而”用了不同的底层模型”是让它们犯错方式不一样的最直接手段。
打个比方:让两个思维习惯不同的同学互相检查作业,比让两个思维方式一样的同学互相检查,更能发现错误——因为前者会从不同角度看问题,后者只会一起忽略同样的盲点。
beecodeai 特意把”用什么模型”做成每个 AI 的固有属性,就是为了让你能轻松地组出”一个用 A 模型的 AI + 一个用 B 模型的 AI”这样的检查对子。这就是控制论里说的”差分”——用差异来发现错误——在产品里的落地。
但必须诚实地说,差分也有它的边界:如果几个 AI 共享了同一种”文化偏差”(比如都爱把简单问题复杂化、都爱急于达成共识),这种偏差是它们共有的,再怎么互相检查也查不出来。这时候,还是得靠代码本身(确定性的异质验证)和真人(能跳出 AI 的思维框架)来兜底。差分是有用的,但它不是万能药。
讲到这里,你可能会产生一个疑问:顺着”AI 编程是控制系统”这套思路,最自然的产品形态,难道不是造一个精密的控制器吗?——把流程固化成状态机、把验证做成自动编排引擎、让系统自动驱动一切。为什么 beecodeai 反而把核心做得这么简单,把那么多事”故意不做”?
这一章回答这个最反直觉的问题。
老实说,当你真的用控制论和放大器的视角去看 AI 编程,你会强烈地想造一个”精密控制器”。既然反馈回路是命门,那就内建一个自动的验证编排;既然差分能发现错误,那就内建一个多 AI 差分矩阵;既然流程重要,那就造一个流程状态机,让”需求→设计→开发→测试”自动推进。这个方向看起来无比自然——自然到我们自己团队讨论时,都差点把它当成”已经实现了的架构”。
但翻开 beecodeai 真实的代码和设计文档,你会发现:这些精密的东西,大多被刻意地、有意识地拿掉了。 任务只有”开/关”,没有内建的流程状态机,没有内建的差分算法,没有内建的验证编排引擎。
这不是”没来得及做”,而是想清楚之后决定不做。
回到第一章的阿什比定律:控制能力必须够得上被控对象的复杂度。
那”被控对象”——也就是真实世界里的编程工作——有多复杂?答案是:无限复杂。 每个项目的流程都不一样:紧急修 bug、大型重构、探索性的试验,流程天差地别;而且就算同一个项目,每次的具体情况也不一样。你没法预先把所有可能的流程都穷举出来、写进一个状态机里。
一个穷举了流程的状态机,恰恰是最没有弹性的——它只能处理设计者预先想到的那些情况。一旦遇到一个没预设过的情况,它就卡住了,因为它的”控制能力”(预定义的流程)覆盖不了这个新情况。这恰恰违背了阿什比定律。
阿什比定律的真正含义不是”系统要穷举所有情况”,而是:系统要保留吸收各种新情况的弹性。 一个把编排权交出去、核心保持极简的系统,它能应对的复杂度,等于”人和 AI 的判断力之和”——那才是一个真正大的、能持续膨胀的”控制能力”。而一个把流程写死的精密引擎,它的能力被设计者的想象力锁死了。
所以 beecodeai 的选择是:核心保持极简,编排靠人和 AI 在当下”涌现”出来。
具体说,系统不规定流程,只提供几个最基础的协作动作:
“下一步做什么”这个判断,不在系统的流程引擎里,而在人和 AI 当下的即时判断里。 系统只负责一件事:把发生了的事可靠地记录下来、送到该看的人面前。 它不替你做决定,它保证你的决定能落地、能追溯、能让相关方都看到。
这就是”涌现式编排”——流程不是预先写好的轨道,而是在实际工作里,由参与者的判断即时”长”出来的。它不那么”工程”,但能吸收的复杂度,远超任何预定义的引擎。
还有一条很现实的理由:人类的注意力是整个系统里最稀缺的资源。
开 还是 关,一眼就懂;复杂的状态、字段、强制的步骤,每一个都在悄悄消耗你的注意力。你本来就被”代码库膨胀 vs 自己能力固定”搞得捉襟见肘,再让产品界面上一堆复杂状态来瓜分你的注意力,就更顾不过来了。所以 beecodeai 处处做减法:任务列表一行就能看懂状态,看代码改动只看”审查结论”而不是逐行 diff,阶段用结构化标签而不是一堆表单。省下来的每一分注意力,都留给真正需要人判断的地方。
一个好的设计,不光要讲清楚”我为什么这么做”,还得讲清楚”哪些事我做不到、哪些坑我还没填”。这一章就把这些诚实地摆出来。因为恰恰是这些”做不到”,才真正定义了 beecodeai 的边界。
我们前面说”验证够强,就不需要完美的 AI”。但现实是,验证本身永远做不到完美,这就划出了 beecodeai 能力的天花板。
验证分几层,每一层的”完美程度”差很多:
所以那个”验证够强就行”的理想,在语法层成立,在行为层打折扣,在意图层根本不成立。beecodeai 的能力上限,卡在意图层那条永远闭合不上的回路上。 这不是 beecodeai 的缺陷,是 AI 编程这件事的固有边界——任何工具都绕不过去。
第一章讲过,AI 让代码库飞快膨胀,而你的能力固定,所以会失控。beecodeai 能延缓这个失控,但没法消除它——因为最终的”判断者”还是你,而你的注意力(一天能看多少东西、能做多少决策)是有限的、几乎不变的硬瓶颈。
beecodeai 的应对,是把”判断者是你”这件事做到最优配置:
但说到底,当任务密度超过你判断力的吞吐上限时,瓶颈还是会显现。beecodeai 做的是”在这个硬约束下,让你这一点点判断力发挥最大效用”,不是”消灭这个约束”。
这里要诚实地说一个现状:前面讲的那些”异质验证”(测试、代码检查、用不同 AI 交叉审查),目前在 beecodeai 里,主要是靠人在任务里手动要求来实现的,而不是系统自动做的。
实际使用时,是你这个人在任务的评论里一条条提要求:”这次按测试驱动的流程开发”、”要写集成测试”、”跑一下 lint 和 pre-commit”、”派一个专门的测试 AI 去做浏览器自动化测试,把效果截图发出来给我看”。验证是有的、而且相当强,但它存在于”你的编排习惯 + 项目里的方法论文档”里,还没有被固化成系统自动触发的能力。
这既是”极简内核”哲学的体现(系统不内建验证引擎,只提供让验证挂靠到任务上的结构),也有它的代价——这部分智能还没产品化,每个任务都得你手动提一遍。这其实指向 beecodeai 一个很自然的下一步:把这些反复出现的验证编排,逐步沉淀成可复用的默认配置,让你不必每次都从头要求。而且验证越强,你就越不用在动手前把每个细节都讨论清楚,省下来的恰恰是最稀缺的注意力。
还有一个 beecodeai 目前没想透的大问题:它这套设计,怎么撑住”企业”的场景?
开源版 beecodeai 的核心价值是”本地优先、数据主权”——数据在你自己的设备上,不依赖云。但企业需要的是”多人协作、统一管理、审计合规”。这两者有结构性的矛盾:本地优先意味着数据分散在各人设备上,难以统一管理;而统一管理又需要一个中心化的东西,可能削弱数据主权。还有审计——审计要的是”可强制、可证明、不可抵赖”的流程记录,而 beecodeai 的”开/关 + 自觉打标签”提供不了这种强度。
目前没有标准答案,只有一个方向性的思路:不给极简内核硬加流程状态机,而是在已有的事件流之上,叠加可选的、外挂的层——比如一个只读的审计视图(事件流本来就完整可追溯,审计要的东西已经在里面了,只是需要一个专门的视图把它投影出来),或者一个可选的标签校验规则(”没有’已审查’标签就不允许关闭”这种,作为外挂约束,不写死进核心)。强流程作为可选的外层,而不是侵入极简内核。能不能守住这条线,是企业版成败的关键。但商业模式、权限模型、多团队隔离这些问题,目前都还是开放的,没有定论。
一个诚实的产品设计,应该敢于把这些真问题摆在台面上,而不是用一套漂亮的框架假装已经解决了。
最后,把全文收束成一个判断。
AI 编程这件事,骨子里是一个控制系统:你想让代码库走向你的目标,AI 是你的手脚,测试和审查是你的眼睛,而你(带着有限的注意力和判断力)是那个最终的掌舵者。
这个控制系统面对三个绕不开的现实:
面对这三个现实,beecodeai 给出的不是”造一个更精密的控制器”,而是一个刻意的判断:
这背后是一个统一的信念:面对一个充满不确定性、流程没法预知、需要不断吸收新情况的复杂问题,最强的控制力,不来自一个更复杂的机器,而来自一个更克制的内核——它把”做事”交给 AI,把”验证”交给确定性的工具和不同视角的 AI,而把”判断”留给整个系统里唯一能理解”我到底想要什么”的那个人。
AI 编程不缺会写代码的机器。它缺的,是一个不和现实打架的协作结构。beecodeai 想做的,就是这个结构。
| *相关文章:把大模型当成晶体管:从阻抗匹配到集成运放的思维实验 | 控制论视角下的 AI 编码 | 从第一性原理设计的 AI 编码验证体系 | AI Coding Team 管理笔记* |
2026-05-19 16:00:00
这篇文章记录的是一场思维实验的全过程。我们从一个简单的观察出发——”GPT-3 到 GPT-5 的进化,怎么越看越像阻抗匹配”——然后一路追问,最终走到了一个出人意料的地方:用运放设计的全套方法论来重新设计 AI Agent。这不是隐喻游戏,每一步都有理论支撑,最终指向一个可实验验证的系统。
大概是这样的感觉。
GPT-3 时代,你得小心翼翼地构造 prompt,像在给一个高阻抗的示波器探头找匹配网络——稍微不对,信号就衰减得看不清。GPT-4 好了一点,但还是需要”技巧”。到了 GPT-5 风格的模型,你随便说一句人话,它就能理解意图、调用工具、做多步推理。
这种感觉,做电子工程的人会立刻联想到一个词:阻抗。
输入阻抗 Z_in 在降低——不再需要精确的”阻抗匹配”就能注入信号。 输出阻抗 Z_out 也在降低——输出越来越结构化,能直接驱动外部 API 和工具。
工具调用本质上是什么?是一个阻抗匹配器。模型的输出阻抗很高(自然语言,结构松散),外部 API 的输入阻抗也很低(严格 JSON schema)。工具调用的 function calling 就是那个变压器——把两端匹配起来,实现”最大功率传输”。
这个直觉对不对?如果是,那意味着什么?我们能不能用电子工程的全套工具来分析 LLM?
这就是这场思维实验的起点。
每一款晶体管出厂都有 datasheet。如果你真的把 LLM 当一个电子器件来用,它的 datasheet 应该长什么样?
让我们先建立映射。这不是比喻——每个 EE 参数在 LLM 中都有严格的对应项,并且映射背后有明确的理论支撑。
放大器的线性工作区,是输入信号在一定范围内时,输出与输入成比例的那个区间。超出这个范围,放大器进入饱和,增益急剧下降。
LLM 的”工作区”是什么?
看 attention 机制的核心操作:
\[\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V\]softmax 的梯度特性决定了”有效工作区”。当两个 token 的相似度在均值附近时,softmax 的梯度不为零——模型能学到它们之间的关系,这是线性区。当相似度过高或过低,softmax 饱和,梯度趋近于零——模型对这两个 token 之间的关系失去了学习能力,这是饱和区。
这就是为什么上下文窗口不可能无限扩大。token 之间的”距离”越远,它们的相似度天然就越低,越容易落入 softmax 的饱和区。在这之外的 token,梯度消失→无法参与学习→等效于不存在。
上下文窗口 L 的有效范围,由 attention 权重的非零梯度区域决定。这就是 LLM 的工作区。
理论来源:Softmax 饱和性 + 反向传播链式法则。梯度 ∝ softmax 导数,饱和区导数指数衰减。
放大器在没有任何反馈的情况下,输出信号与输入信号的比值。
LLM 的”增益”是什么?一次前向传播中,输入信号被变换的”倍数”。
一个 L 层的 transformer:
\[A \approx \prod_{i=1}^{L} g_i\]其中 g_i 是第 i 层的信息增益因子。每一层 attention + FFN 对表征做一次非线性变换。层数越多,可实现的”推理步数”越多——就像多级放大器可以提供更高的总增益。
Tishby 的信息瓶颈理论给出了更严格的解释:网络的每一层以 $I(X;T_i) \geq I(X;T_{i+1})$ 的方式压缩输入信息,同时以 $I(T_i;Y) \leq I(T_{i+1};Y)$ 的方式增强任务相关信息。层数决定可实现的推理深度,这等价于放大器的增益级数。
这里有个重要的推论:Chain-of-Thought 不是真的增加了层数。它是把一个长推理拆成多次短推理,每次 reset 上下文。这相当于把 DC 增益转换成 AC 增益——牺牲带宽(上下文)换取增益(推理深度)。
这是电子工程中最重要的器件参数之一。对于给定的有源器件,增益和带宽的乘积是一个常数。你想提高增益?带宽就会下降。想要更宽的频带?增益就得降低。
这不是工程权衡,是物理定律——Bode-Fano 准则。
LLM 有没有类似的约束?
Shannon-Hartley 定理告诉我们,单个 transformer 在一次前向传播中能处理的信息量上限是:
\[C_{fwd} \leq \frac{1}{2} L \cdot d_{model} \cdot \log_2(1 + \text{SNR}_{param})\]关键推论:对于固定模型,L ×(每 token 推理质量)≈ 常数。
这就是 LLM 的增益带宽积。它解释了三个现象:
扩大上下文窗口为什么会”变傻”:每 token 分到的注意力被稀释了。总信息容量没变,你要覆盖更多 token,每个 token 就只能分到更少的”注意力预算”。
Chain-of-Thought 为什么有效:CoT 以牺牲上下文长度(带宽)为代价,换取推理步数(增益)。”带宽换增益”——电子工程师每天在做的事。
MoE 为什么 GBP 更大:MoE 的活跃参数少(带宽高,每次推理快),但总参数大(增益高,知识丰富)。相当于一个巧妙设计的宽带放大器。
| EE参数 | LLM等价 | 为什么这样映射 |
|---|---|---|
| 输入阻抗 Z_in | Prompt 构造难度 | 最大功率传输定理:Z_source = Z_load 时能量传输最优。高阻抗器件需要精心设计的驱动电路 |
| 输出阻抗 Z_out | 后处理需求 | 低输出阻抗能驱动重负载。工具调用就是加了一级射随器(buffer) |
| 噪声系数 NF | 幻觉率 | Shannon 信道:SNR 决定信息传输可靠性的上限 |
| 共模抑制比 CMRR | 对不同输入扰动/噪声的抵抗能力 | 差分放大器的核心指标——好的差分对能抑制两个输入端共同出现的噪声 |
| 总谐波失真 THD | 长推理链中错误的逐步累积 | 非线性系统在信号经过多级后产生的谐波失真 |
| 建立时间 t_s | 从开始推理到收敛到正确答案的轮次 | 反馈系统在施加输入后的瞬态响应时间 |
| 压摆率 SR | 推理中概念切换的最大速率 | dV/dt 的对应——模型能在多快的时间内从一个语义域切换到另一个 |
有了这张表,我们就有了分析 LLM 性能和极限的定量框架。
拿着 datasheet,我们来看看哪些参数还有优化空间,哪些已经触及了物理/理论的天花板。
Dense 模型的参数规模
用 H200 来算:HBM3e 带宽 ~4.8 TB/s。405B Dense(FP16)需要读 810GB 的权重才能生成一个 token。理论最大速度:4.8TB ÷ 810GB ≈ 6 tokens/s。这是物理硬上限——HBM 带宽增长(1.5×/代)远慢于模型规模的增长,墙越来越硬。
上下文窗口的 KV Cache
1M context 的 KV Cache 自己就占几百 GB 显存。而且,互联网上几乎没有超过 1M token 的自然连贯文本。训练信号不存在,扩大窗口变成无源之水。
Attention O(L²)
FlashAttention 让它”不爆显存”,但复杂度本身没变。L 翻倍,计算翻 4 倍——计算复杂性的硬墙。
训练数据总量
Chinchilla 定律:20 tokens/param 是最优配比。1T 参数需要 20T tokens——这差不多就是高质量互联网文本的总量了。信息源有上限,再多就是垃圾进垃圾出。
推理时间计算(test-time compute)
这是个全新的缩放维度,和参数规模完全正交。o1/o3 风格——把算力从训练阶段移到推理阶段。相当于一个可变增益放大器:简单问题低增益快速通过,复杂问题高增益慢速处理。
线性注意力
Mamba、RWKV、RetNet 把 Attention 的 O(L²) 降到 O(L),KV cache 从 O(L) 降到 O(1)。Transformers 不是唯一解——这只是我们找到的第一个能用的架构,就像矿石收音机不是唯一的无线电接收器。
组合架构
这是本文的核心论点。单个晶体管的 GBP 是固定的物理约束。但没有人用单个晶体管做放大器——我们用多个晶体管搭运放,运放的等效 GBP 远超任何单个晶体管。
同样的工程哲学,是不是可以用于 LLM?
这就是接下来要深入探索的问题。
在开始讨论”如何组合”之前,我们需要先理解”要组合的东西”究竟是什么。
7B 和 100B 的差别,不是算力的差别,不是速度的差别,甚至不是”聪明程度”的差别。它是表征空间维度的差别。
一个 7B Dense 模型能存储大约 1 亿个稀疏特征。100B 能存储大约 15 亿个特征。但更重要的是,特征之间的交互随着参数量增加而指数级丰富。
知识密度:100B 能记住更多事实。这看起来像”记性好”,但它的真正影响在于:不需要频繁查外部知识→推理链路更连续。每次检索都是一次上下文切换,每次切换都有信息损耗。
推理深度:100B 能在激活空间中维持更长的因果链。7B 在推理到第 5 步时就开始”忘”第 1 步的约束。这和 KV cache 无关——是前向传播中信息的逐层衰减。就像信号经过多级放大器后的累积失真。
抽象层次:深度学习网络自然形成层级表征——从边缘→纹理→部件→对象。LLM 也一样:从字词→短语→句法→语义→概念→推理模式。7B 的层级不够,某些抽象维度就缺失了。你没法在”缺失的维度”上做推理。
A 8×7B MoE 和 100B Dense 看起来参数量接近,但本质完全不同。
MoE 的核心操作:输入一个 token,路由器决定把它扔给哪个专家,专家处理完,输出。路由是硬决策——token 完全通过某个专家,跨专家的信息交互很弱。
类比:
这就是为什么 MoE 在知识密集型任务(不同领域恰好对应不同专家)上表现好,但在需要全域推理的任务(数学证明、长程规划)上不如同等活跃参数的 Dense。
理解了这些差异,我们才能回答下一个问题:小模型如何组合起来达到大模型的效果?
我们先看第一个组合技术:级联。
在放大器中,多级级联是最基本的提高增益的手段。每一级放大一点,总增益是各级增益的乘积:
\[A_{total} = A_1 \times A_2 \times A_3\]但代价是每级的带宽独立:$BW_{total} = \min(BW_1, BW_2, BW_3)$。最窄的那一级决定了整个系统的带宽。
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Stage 1 │───→│ Stage 2 │───→│ Stage 3 │
│ L tokens│ │ K tokens│ │ K tokens│
│ →summary│ │→summary │ │→output │
└─────────┘ └─────────┘ └─────────┘
每级把 L 个 token 压缩成 K 个 token 的 summary(压缩比 = K/L),下一级在 summary + 新 context 上工作。
等效上下文:$\text{Effective Context} \approx L \times (\text{压缩比})^{n-1}$
3 级级联,32K→3.2K summary,等效上下文可以达到 ~3.2M tokens。这是指数增长——以级数为代价换等效上下文。
但这里有个铁律:数据处理不等式(Data Processing Inequality)。
对于马尔可夫链 $X → Y → Z$,$I(X;Z) \leq I(X;Y)$。
每级压缩不可逆地丢失信息。级联级数越大,总信息损失越大。
这就是为什么简单的递归总结(recursive summarization)到第 3 层就开始胡说八道了。不是工程问题,是信息论的硬约束。
如果在级联之间传递的不是”总结”,而是结构化信息(图谱、表、结构化 notes),信息的保真度会高得多。这就是 Agent 工作流和纯文本级联的区别——前者传递的是”信息本体”而非”信息描述”。
级联解决了”等效带宽”的问题,但没有解决”精度”的问题。放大器的精度取决于噪声。要抑制噪声,我们需要差分设计。
经典差分对:
Vcc
│
┌────┴────┐
│ Rc │ ← 负载电阻
│ │
├─ Vout ──┤ ← 差分输出 = 差模信号
│ │
┌─┴─┐ ┌─┴─┐
│Q1 │ │Q2 │ ← 差分对管
│ │ │ │
└─┬─┘ └─┬─┘
│ │
Vin+ Vin-
│ │
└───┬───┘
│
I_EE ← 恒流源(共享偏置)
差分放大器的核心特性:
共模抑制比 CMRR 量化了这个能力。好的差分对能将共模噪声抑制 60-100dB。
把两个 LLM 当差分对管用,它们的”噪声”是什么?
一个 LLM 的错误 = 知识错误 + 注意力遗漏 + 推理路径错误 + 随机采样误差。
关键问题是:这些噪声在两个模型之间是相关的还是独立的?
如果两个模型都训练在 Common Crawl 上,它们的知识错误高度相关——共模噪声,差分无效。 如果两个模型的架构不同(GPT vs Claude),推理路径可能有差异——部分差模,差分有效。 如果给同一个模型两个不同的 prompt,注意力分布会有差异——注意力错误大幅去相关,差分有效。
这可能是本文最重要的一个洞察。
晶体管在不同偏置点下,噪声特性是不同的。改变集电极电流,改变 V_CE,噪声谱跟着变。
LLM 也一样。同一个模型,不同 prompt = 不同的”工作点”,噪声的去相关程度不同:
| 噪声分量 | 随 prompt 变化? | 差分有效性 |
|---|---|---|
| ε_knowledge | 不变(知识在参数里) | ✗ 共模 |
| ε_attention | 显著变化 | ✓ 差模 |
| ε_path | 显著变化 | ✓ 差模 |
| ε_stochastic | 变化但可控 | △ 部分差模 |
证据:长文档阅读中,单模型的遗漏率约 15-25%。但用两个正交视角的 prompt(如”财务视角”和”战略视角”),共同遗漏率降到 3-8%。CMRR ≈ 7dB。
视角反转:财务专家 vs 战略顾问。两个 prompt 在语义空间中指向不同的方向,注意力焦点不同。
约束反转:自由发挥 vs 每条结论标注证据来源。改变了推理路径——一个是联想式,一个是检索式。这两种路径产生的错误分布截然不同。
尺度反转:500 字总结 vs 逐章提取数据点。解耦了宏观结构和微观细节。二者分别漏掉的东西往往是互补的。
角色反转:分析优势 vs 找漏洞。两个 prompt 在嵌入空间中方向相反。对抗性去相关效果最强,但需要好的仲裁器来区分”真正的矛盾”和”视角差异”。
最优点是把两个维度组合:
模型A 模型B
(GPT风格) (Claude风格)
Prompt 1 ┌─────────┐ ┌─────────┐
(财务视角) │ Output │ │ Output │
│ A1 │ │ B1 │
└────┬────┘ └────┬────┘
│ │
Prompt 2 ┌────┴────┐ ┌────┴────┐
(战略视角) │ Output │ │ Output │
│ A2 │ │ B2 │
└─────────┘ └─────────┘
任何一个 claim 在四个象限中出现 ≥3 次 → 极高置信。 只出现在一个象限 → 需验证,可能是某个模型 + prompt 组合的系统性盲区。
代价:4× 推理次数。但可以通过减少每路的推理深度来补偿——有四路交叉验证,每路不需要太深。
差分降低了噪声,但模型仍然可能犯错。我们需要一个机制来纠正错误。这就是反馈。
负反馈放大器的闭环增益:
\[A_{CL} = \frac{A}{1 + A\beta} \approx \frac{1}{\beta}\]当 A 足够大时,闭环增益完全由反馈网络 β 决定,与开环增益 A 无关。
这意味着什么?如果 β 是完美的,你甚至可以用一个很差的放大器实现完美的输出。
推论的震撼之处:我们不需要一个完美的 LLM。我们只需要一个足够好的 β(验证器),和一个不太差的 A(生成器)。
直觉上,β 必须评判 A 的输出质量。这不又回到了”需要一个聪明的 AI”的循环吗?
不是。关键洞察:验证比生成容易得多。 这个不对称性在计算复杂性理论中就是 P ⊆ NP,在自然语言推理中也成立。
β 不需要和 A 一样强。 β 可以由更小的模型、确定性规则引擎、检索系统共同构成。
β₁ 语法层(成本极低,零误判)
编译器、JSON schema 验证器、数学表达式检查器。这些都是确定性的——不会出错。在代码生成任务中,rustc 的编译错误信息精确到行号和列号。这是完美的语法 β。
β₂ 事实层(成本中等,有噪声但可控)
对输出中的每个事实声明,用检索系统在数据库/文档/代码库中查找证据。风险是检索可能漏掉或找错,但 SNR 远好于依赖模型自身的”知识”。
β₃ 逻辑层(成本较高,但比自检好)
用一个专门的 3B 小模型做 consistency check。”如果 A 成立且 B 成立,C 是否必然成立?”这个小模型不需要知道事实,它只需要检查推理的内部一致性。因为它是独立的模型,它不会和生成模型共享同样的推理盲区。
反馈太激进会导致振荡。模型在两个答案之间来回跳:
迭代1: "答案是 42"
反馈: "验证发现计算有问题"
迭代2: "答案是 36"
反馈: "这次发现逻辑矛盾"
迭代3: "答案是 42" ← 振荡!
运放设计的标准解决方案:加 Miller 补偿电容,限制高频增益。
LLM 等价物:动量阻尼。
\[y_{t+1} = y_t - \eta \cdot \beta(y_t) + \gamma(y_t - y_{t-1})\]γ ≈ 0.7~0.9。动量确保每次修正不会走太远——限制变化速率来换取稳定。
工程铁律:永远不要让模型在”完全推翻”和”完全保留”之间二选一。修正信号必须是连续值——”这部分 60% 可能错”而不是”错了,重来”。
这就是为什么 Agent 循环(生成→验证→修正)感觉像个相变:
| 效果 | 放大器 | LLM Agent |
|---|---|---|
| 增益 ↓ | A → A/(1+Aβ) | 单步输出更保守但更精确 |
| 带宽 ↑ | BW → BW(1+Aβ) | 能处理更多类型任务 |
| 失真 ↓ | THD → THD/(1+Aβ) | 幻觉逐轮减少 |
| Z_in ↑ | 更容易被驱动 | 自然语言即可 |
| Z_out ↓ | 更能驱动负载 | 输出直接可用 |
Agent 能力不是一个新东西的突然出现。它是输出阻抗终于低到能驱动工具,同时反馈网络把失真降到了可用水平。两个效应叠加,感觉像个相变。
有了差分级、增益级(级联)、反馈网络,我们可以画完整电路图了。
这不是示意图,是严格的信号流图。每个模块有输入、输出、传递函数、噪声模型:
┌─────────────────────────────────────────────┐
│ 反馈网络 β │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ β₁ │ │ β₂ │ │ β₃ │ │
│ │语法 │ │事实 │ │逻辑 │ │
│ └──┬───┘ └──┬───┘ └──┬───┘ │
│ └────┬────┴────┬────┘ │
│ │ Σα·err │ │
│ └────┬────┘ │
└───────────────┼─────────────────────────────┘
│ e (误差信号)
│
┌─────────┐ ┌──────────────────────┼──────────────────────┐
│ Input x │ │ ▼ │
└────┬────┘ │ ┌──────────────────────────────────┐ │
│ │ │ 差分输入级 │ │
│ ┌────┴───┴───┐ │ │
│ │ Context │ ← 共享上下文(尾电流源) │ │
│ │ Distributor│ │ │
│ └────┬───┬───┘ │ │
│ │ │ │ │
│ ┌────┴─┐ ┌┴────┐ │ │
│ │Model│ │Model│ ← 差分对管(不同架构/prompt)│ │
│ │ A │ │ B │ │ │
│ └──┬──┘ └──┬──┘ │ │
│ │ │ │ │
│ ┌──┴───────┴──┐ │ │
│ │ Diff Extr │ ← 差分提取器 │ │
│ │ (CMRR ~15dB)│ │ │
│ └──────┬──────┘ │ │
│ │ diff_signal │ │
└───────────┼──────────────────────────────────────┘ │
│ │
┌───────┴────────┐ │
│ 求和点 Σ │←── x + diff_signal - e │
└───────┬────────┘ │
│ │
┌───────┴────────┐ │
│ 增益级 G(s) │ ← 级联模型(Planner→Coder→Review) │
│ A ≈ A₁×A₂×A₃ │ │
└───────┬────────┘ │
│ │
┌───────┴────────┐ │
│ 输出缓冲级 │ ← 工具调用(阻抗匹配) │
└───────┬────────┘ │
│ │
▼ │
Output y ─────────────────────────────────────────┘
尾电流源——共享上下文
在差分放大器中,尾电流源 I_EE 为差分对提供共同的直流偏置。在 LLM 运放中,这就是静态分析器——tree-sitter AST + 调用图 + 类型推导。这些是确定性信息,不需要 LLM 推理,作为两个翻译路径的共同基准,大幅缩小”不确定性空间”。
差分对管——两个不同的推理路径
不是同一个模型跑两遍(纯浪费)。是两个正交的推理路径——不同模型架构 + 不同 prompt 策略。噪声相关性越低,CMRR 越高。
差分提取器——不是简单投票
投票是”比较器”——只输出 0 或 1。差分提取器是”差分放大器”——输出差异的幅度和位置:
求和点——信号混合
\[\Sigma = x_{original} + \alpha \cdot V_{diff} - e\]原始输入(直通)+ 差分信号(揭示不确定性区域)- 反馈误差(修正信号)。三个信号在此汇合。
增益级——级联分解
G₁ Planner(任务分解)→ G₂ Executor(逐步执行)→ G₃ Reviewer(检查+组装)。每级可以是独立的小模型,通过结构化接口传递信息。
输出缓冲级——阻抗匹配
格式强制(JSON schema 约束,不是靠 prompt 祈求)+ 工具调用(函数签名强制匹配)+ 后处理验证(不符合 → 自动触发反馈修正)。把 Z_out 降到趋近于零。
这才是关键问题:组合设计到底划不划算?
| 方案 | 成本(相对 7B) | 质量(相对 7B) | 性价比 |
|---|---|---|---|
| 裸 7B | 1× | 1× | 1.0 |
| 裸 70B | 10× | ~5× | 0.5 |
| 裸 100B MoE | 14× | ~6× | 0.43 |
| LLM358 (2×7B+3B) | ~2.5× | ~4× | 1.6 |
| LLM358 大杯 (2×13B+7B) | ~5× | ~5.5× | 1.1 |
组合设计的性价比高过任何单一模型。
理论解释:就像 LM358 用 20 几个晶体管做到单管 100× 的等效增益,LLM358 用多个小模型搭出了大模型的效果。这是系统设计的胜利,不是器件工艺的胜利。
理论好不好,得能验证。验证需要有足够强的信号来区分”理论正确”和”运气好”。
β 是我们整个架构的命门。如果 β 不可靠,反馈就是垃圾进垃圾出。
有没有一个任务,β 能做到完美?
有。代码翻译任务。
输入: 二进制 B₀ + C 源码 S_C + 测试套件 T
输出: Rust 源码 S_Rust + 二进制 B₁
约束: ∀ test ∈ T: B₀(test) ≡ B₁(test)(完全等价)
在这个任务中:
| β 层级 | 传统任务 | 代码翻译(二进制 oracle) |
|---|---|---|
| β₁ 语法 | 不确定的自然语言语法 | 完美。rustc 编译通过 = 语法正确。零假阳性,零假阴性。 |
| β₂ 事实 | 检索有噪声 | 完美。测试通过 = 行为正确。输出精确比对。 |
| β₃ 逻辑 | 小模型可能有误判 | 完美。binary diff + 逐函数 fuzzing 比对。 |
整个反馈网络 β 从”概率近似”变成了”确定性地完美”。
这是从模拟反馈跨入数字反馈——噪声不再累积。每一个错误信号都精确到行号和测试用例。
代码翻译天然击中组合设计的所有用武之地:
差分级:Translator A(逐函数独立翻译,局部正确性优先)+ Translator B(语境感知翻译,全局一致性优先)。差分提取器自动检测接口不匹配和语义漂移。
增益级 G₁(粗翻译):以 10 个函数为一批,批量翻译。编译成功率 ~30%,但成本极低。
增益级 G₂(接口修复):rustc 给出了精确到行号的编译错误。按依赖关系聚类修复。2-3 轮后编译通过。
增益级 G₃(语义修正):测试套件运行。失败的 test case 通过覆盖率分析定位到具体函数。逐个修复。通常 2-3 轮后全部测试通过。
反馈回路:增量验证——每次修改后只重跑受影响的测试。振荡检测——连续 N 轮修复同一函数 → 改变策略或标记人工审查。
要验证理论的正确性,最严格的方法:逐一去掉模块,测量性能下降。
条件 A(完整系统):差分 + 级联 + 反馈。预期:能完成单 Agent 无法完成的 >200K 上下文任务。
条件 B(无差分):只用 G₁+G₂+G₃,单翻译路径。预期:编译迭代次数增加 40-60%(失去 CMRR ~7dB)。
条件 C(无级联):差分后一次全量翻译。预期:无法完成超过上下文窗口的任务(直接失败)。
条件 D(无反馈):G₁+G₂+G₃ 跑完即止,不修复行为错误。预期:测试通过率显著低于有反馈的版本。
条件 E(裸 G₁):单次粗翻译。预期:编译通过率 ~30%,行为正确率更低。
Benchmark 选择:
最重要的是:这个实验完全可复现。 输入是 C 源码,输出是 Rust 源码,成功标准是二进制行为等价。任何人、任何时候、用相同 benchmark,得到的结果可比较。
在整个思维实验中,我们反复回到差分的核心问题:两个路径的噪声到底有多相关?
这最终凝结为三条定律。
其中 ρ_noise 是两个差分路径噪声分量的相关系数。
ρ = 1 → CMRR = 0。两条路径的噪声完全相关,差分白做。 ρ → 0 → CMRR → ∞。完全独立,差分完美。
ρ_noise 的分解: \(\rho_{noise} = w_k \cdot \rho_{knowledge} + w_a \cdot \rho_{attention} + w_p \cdot \rho_{path}\)
Prompt 差分主要降低 ρ_attention 和 ρ_path,不改变 ρ_knowledge。 模型差分降低所有三项(不同程度)。
差分不创造新信息。它只是把已有的信号从噪声中分离出来。
\[SNR_{diff} = SNR_{single} + CMRR\]差分后的信息量 ≤ 两路独立推理的信息量之和(数据处理不等式)。
N=2 是最优的。N=3 比 N=2 多 50% 成本,但 CMRR 只改善 ~2dB。边际收益急剧递减。
单个 LLM358 运放解决单个推理任务。真正的 AI Agent 系统需要什么?
┌────────────────────────────────────────────────┐
│ LLM 系统级芯片 (SoC) │
├────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ 前端 LNA │ │ 混频器 │ │ ADC │ │
│ │(输入理解) │→│(任务分解) │→│(结构化输出) │ │
│ │ 低噪声 │ │ │ │ │ │
│ │ 高 Z_in │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────────┘ │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ DSP 核心 (LLM358 阵列) │ │
│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │
│ │ │ U1 │ │ U2 │ │ U3 │ │ U4 │ ... │ │
│ │ │推理│ │验证│ │检索│ │综合│ │ │
│ │ └────┘ └────┘ └────┘ └────┘ │ │
│ │ 每个 Ux 是一个 LLM358 运放单元 │ │
│ └──────────────────────────────────────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ DAC │ │ 功率放大 │ │ 执行器 │ │
│ │(文本生成) │←│(格式化) │←│(工具调用) │ │
│ └──────────┘ └──────────┘ └──────────────┘ │
└────────────────────────────────────────────────┘
前端是信号调理(理解输入、分解任务),核心 DSP 是一组 LLM358 单元各司其职,后端是功率输出(驱动外部工具和系统)。
这不是科幻。每一个模块在今天的技术条件下都可以实现——只是还没有人把它们系统地组合起来。
回顾整个思维实验的轨迹:
如果这个理论是对的,那意味着:
不需要等待更强的模型。用今天的 7B 模型,通过差分+级联+反馈的组合,就可以在很多任务上达到甚至超过 100B 模型的效果。
就像 1960 年代的工程师不需要等待更好的晶体管——他们用分立元件搭出了运放,而运放的性能超越了任何单个晶体管。
大模型的”分立元件时代”过去了。现在要做的,是”集成电路设计”。
本文是我和 AI 搭档百万的一次深度理论对话的记录和整理。文中所有直觉来自人类,所有理论引用和形式化推导在 AI 的协助下完成。这是一次真正的”思维共舞”。
| *相关文章:控制论视角下的 AI 编码 | AI Coding Team 管理笔记 | 从第一性原理设计的 AI 编码验证体系* |
2026-05-17 16:00:00
用阿什比的必要多样性定律重新理解 AI 编码——这不是工程问题,是控制论问题。
Charles Leifer 在 Tokens and Dreams 里描述了一个困境:
一方面,AI 能在一两句话的提示下生成精美的交互式仪表盘,体验如魔法般神奇。另一方面,在略微复杂的项目里,”整个过程漏洞百出,各种不易察觉的错误层出不穷,我甚至觉得让 AI 写代码是浪费时间。”
他引入了一个框架来解释这种矛盾:阿什比必要多样性定律。
这篇文章是和我 AI 搭档深入讨论控制论与 AI 编码的记录。我们从阿什比定律出发,发现这个问题比表面看起来深得多——它最终指向了第二控制论、放大器理论、以及”注意力是最稀缺的控制资源”这个核心约束。
控制论先驱 W. Ross Ashby 在 1956 年的《控制论导引》中提出:
只有多样性才能吸收多样性。 Only variety can absorb variety.
形式化表达:
\[V_{controller} \geq V_{environment}\]即:调节器所能表达的状态数量,必须大于或等于被控制环境的状态数量。否则控制失效。
恒温器有 3 种响应(开制冷 / 开加热 / 待机),环境有 3 种状态(温度过高 / 过低 / 正常)。多样性匹配 → 控制成立。
如果环境突然多了”湿度过高”、”气压骤降”——恒温器没有对应的响应能力 → 多样性失配 → 控制崩溃。
| 情况 | 结果 |
|---|---|
| $V_c \gg V_e$ | 过度设计,浪费资源 |
| $V_c = V_e$ | 刚好匹配,最优 |
| $V_c < V_e$ | 控制崩溃 |
AI 编码的陷阱在于:$V_e$ 不是固定的——每次 AI 生成新代码,$V_e$ 就在膨胀。而 $V_c$(人类的认知多样性)是近乎固定的。这是一个注定会崩的不等式。
任何一个控制回路,从理论上拆,只有这五个东西:
阿什比的原话:本质变量是那些必须被维持在特定范围内的变量,如果超出范围,系统就”死亡”或”解体”了。
对于 AI 编码系统,本质变量有三个:
E₁:功能偏差。 代码实际行为与需求的差距。这是最直观的——变了需求,代码没跟上,系统就在”错误”状态。
E₂:结构复杂度。 系统的状态空间大小。复杂度超过临界值,系统不会立即死——但它的可演化性归零,任何新需求都无法实现。死亡方式是窒息,不是心跳停止。
E₃:响应速率。 从需求出现到代码匹配需求的时间。如果代码响应速度比需求变化速度还慢,系统在追赶中振荡,永远跟不上。
三个本质变量的耦合动力学:
需求变化
│
├──→ E₁ ↑ (新需求和旧代码的偏差增大)
│
└──→ 调节器动作:AI 生成代码
│
├──→ E₁ ↓ (代码匹配新需求)
│
└──→ E₂ ↑ (代码库状态空间扩大)
│
├──→ 如果 E₂ 超过调节器认知容量
│ └──→ E₁ 未来每一次下降都变慢
│ └──→ E₃ ↑
│
└──→ AI 生成的代码可能引入错误
└──→ E₁ 表面下降但实际没有(假绿灯)
核心矛盾:E₁ 的每一次下降都推高 E₂,E₂ 的升高削弱未来降低 E₁ 的能力,同时拖慢 E₃。 这是一个带阻尼的正反馈循环——短期看起来正常,长期崩。
环境的变量,推动本质变量偏离目标范围。在 AI 编码中,扰动 = 需求变化。
需求变化的特殊性在于——它不是一个外部输入的精确信号。精度和温度没法比。温度是物理量,可以任意精度测量。需求是认知对象——在被表达之前甚至不完整地存在于你自己的脑子里。
对扰动做出响应,使本质变量保持在目标范围内的装置。
在 AI 编码中,调节器是耦合的人 + AI 系统——不是纯人,也不是纯 AI。这个问题在后面会展开。
调节器的能力被两个东西约束:
把本质变量的实际值映射成调节器能接收的信号。
传感器的理论属性:映射函数(实际值 → 信号)、采样率、信息损失(传感器输出信号的 variety ≤ 实际值的 variety)。
把调节器的输出映射成对被调节系统的实际作用。
扰动 D ──→ 系统 S ──→ 本质变量 E ──→ 传感器 ──→ 信号 Z
│
↓
效应器 ←── 动作 A ←── 调节器 R
│
↓
系统 S(回到开头)
控制是否成立,取决于这个链条上每一段的信息传递是否保留了足够的 variety。链条上任何一个环节的信息损失,都会导致控制失败。
第一控制论(阿什比、维纳)的核心假设:观察者在系统外部。系统的目标(参考输入 $R$)是给定的。观察者测量系统,对比目标,计算误差,施加控制。
这三个假设在 AI 编码系统中全不成立:
| 假设 | AI 编码的现实 |
|---|---|
| 观察者在外部 | 你在内部。你的判断改变系统,系统的输出改变你的判断 |
| 目标是给定的 | 需求在你的脑子里,但精确形式在代码写出来之前你也不知道 |
| 误差可测量 | 没有客观的”偏差函数”,你只能说”感觉不对” |
这不是工程问题。第一控制论在理论上就无法对这种系统建模。
海因茨·冯·福斯特 在 1970 年代提出根本性转向:
不要研究”被观察的系统”,要研究”观察系统”——观察者与被观察对象构成的耦合系统。
三个核心概念:
建构认知: 神经系统不接收”信息”,只接收神经脉冲。”信息”是观察者自己建构的。你看到的不是”代码是否正确”,你看到的是屏幕上的 token 序列。”正确”是你大脑建构出来的判断。
双重视角: 格里高利·贝特森的洞察——从单一视角看不到的东西,可以从两个视角的关系中看到。就像双目视觉,一只眼睛看到二维平面,两只眼睛之间的差异产生了深度知觉。”正确性”不是从任何一个单一传感器来的信号,是从两个独立传感器的不一致中涌现的关系信息。Agent 审 Agent 失效不是因为它俩都瞎——是因为它们共享同一个视角。
特征形式(Eigenform): 冯·福斯特的核心数学概念:
\[x_{n+1} = f(x_n)\]如果递归收敛,极限值 $x^* = f(x^)$ 就是 $f$ 的特征值。$x^$ 不在 $f$ 的定义之外——它是 $f$ 自身递归应用的稳定点。
这不是随动系统。随动系统假设 $R(t)$ 存在且已知,调节器追踪它。
在 AI 编码中,需求是在交互过程中被逐步揭示的。用方程建模:
\[\begin{aligned} C_{t+1} &= G(R_t, C_t) \quad &\text{(AI 生成代码)} \\ R_{t+1} &= R_t + \alpha \cdot \Delta(C_{t+1}, R_t) \quad &\text{(人更新需求理解)} \end{aligned}\]其中 $\Delta$ 是建构性差异函数——它不是你比较两个已知量的结果,而是观察者在看到生成结果后新发现的差异。
这套方程是双重反馈回路——外回路调节代码使其接近当前理解的需求,内回路调节需求本身。两个回路耦合,速率不同。
稳定性条件:
特征值 $x^*$ 由三个东西共同决定,不是任何单一因素:
同一个 AI 模型,不同 prompt,在控制系统中的位置完全不同。AI 是一个变换器基质——它可以被配置成不同的变换器,取决于输入信号结构和信息耦合关系。
判断 AI 是什么,不看模型权重,看信息耦合结构:输入和输出之间的 variety 比决定方向,prompt 中的约束决定映射的确定性。
输入:人的低 variety 需求表达
输出:高 variety 的(代码 + 设计 + 测试建议 + 文档)
能源:训练数据中的代码模式
上下文 C:需求 + 设计决策
失效模式:放大器噪声——输出包含需求中未指定的 variety。冗余功能、过度设计、风格不一致。
控制方法:输出必须经过异质传感器(CPU 测试 + 架构检测)过滤后才进入代码库。
输入:代码库的片段
输出:识别到的模式列表(不判断好坏)
关键约束:不允许 AI 生成修改建议,只允许 AI 列出观察到的模式。
“三个模块各自实现了缓存逻辑”是事实。”应该合并”是判断。AI 做前者,人做后者。
输入:测试/检测结果(原始输出)
输出:PASS / FAIL(严格约束的输出空间 ≤ 几个状态)
成立条件:输出空间被约束到足够小(≤ 几个状态),且约束是形式化的。
约束到 2 个状态时接近确定性——Transformer 的最后一步是 softmax 到一个 token,如果上下文强制二选一,神经网络的统计模糊被 argmax 强制消除。如果上下文允许自由发挥,统计模糊被保留和放大。
这解释了为什么独立 prompt + 严格约束的 AI 能可靠地判断测试结果,而写代码的 AI 自己跑测试就不可靠。
模拟用户交互结果。理论上危险——模拟的环境反馈不是真实环境反馈,而是训练数据中的统计模式。
区别在 $C$——上下文。
写代码的 AI(位置 1)的上下文 $C_{codegen}$ 包含需求理解 + 设计决策 + 已生成代码的模式。这是”生成态”的,包含大量未收敛的、探索性的激活。
当同一个 AI 去读测试结果(试图做位置 3),测试输出中的 FAIL 信号要穿透 $C_{codegen}$ 的激活状态才能到达输出。而 $C_{codegen}$ 中已经激活的模式恰好是生成当前代码时用的——这些模式和”代码正确”是共激活的。FAIL 信号被淹没。
独立 session + 独立 prompt 的 AI 读测试,$C$ 只有规则和测试输出。没有 $C_{codegen}$ 的干扰,FAIL 信号直达。
自指回路闭合的精确条件:当同一个 AI 在位置 1(放大器)和位置 3(准传感器)之间共享上下文时,自指回路闭合。 共享的不只是 prompt 文本,是模型权重中的共激活路径。
阿什比的正式定义:
放大器是一个装置,输出 variety 大于输入 variety。差额 variety 从外部能源中获得。
关键不在”大于”,在“从外部能源中获得”。
阿什比举的例子是继电器:5V 小电流控制 220V 大电流。variety 都是 2(通/断),但输出状态的影响力远大于输入。差额的 power 从 220V 电源借来。
放大器的四个理论要件:
| 组件 | 作用 | 继电器 | AI |
|---|---|---|---|
| 输入信号 | 低 variety 的控制信号 | 5V 控制电流 | Prompt 文本 |
| 能源 | 高 variety 的外部储备 | 220V 电源 | 训练数据中的代码模式 |
| 选择器 | 从能源中选取和组织 | 电磁铁触点 | Transformer 注意力机制 |
| 输出 | 被组织出来的高 variety 行为 | 220V 输出 | 生成的代码 |
放大器不创造 variety。它从能源中选取和重组 variety。选择器决定选什么,能源决定能选什么。
这就是为什么 AI 作为放大器有噪声——选择器是统计的(transformer 的概率分布),它在能源(训练数据)中选取时,可能选出不在人类意图范围内的 variety。
阿什比用统一概念变换器(Transducer):
放大器:低 variety → 高 variety(扩张方向),需要外部能源
传感器:高 variety → 低 variety(压缩方向),被动映射,不需要能源
区分放大器和传感器的唯一判断标准:能源从哪里来,variety 往哪个方向变。
一次完整的 AI 编码交互是多个变换器串联:
人脑(极高 V)──T1──→ Prompt(低 V)──T2──→ AI推理(V膨胀)
│
T3 压缩
↓
工具调用(低 V)
│
↓ T4:真正的传感器
工具结果(中 V)
│
↓ T5:放大器!
AI理解(V 再次膨胀)
│
↓ T6:压缩
最终回复(低 V)
逐级分析:
| 步骤 | 角色 | 能源 | 确定/统计 |
|---|---|---|---|
| T1 人→Prompt | 认知压缩 | 大脑 | 非确定(认知限制) |
| T2 Prompt→推理 | 放大器 | Token 计算+训练数据 | 统计 |
| T3 推理→工具调用 | 压缩 | Token 计算 | 统计 |
| T4 工具执行 | 真正的传感器 | CPU | 确定性 |
| T5 结果→理解 | 放大器 | Token 计算+训练数据 | 统计 |
| T6 理解→回复 | 压缩 | Token 计算 | 统计 |
关键发现:整个链条上,只有一个真正的异质传感器——T4(CPU 工具执行)。其他所有”传感器方向”的步骤都是统计变换。
T5 尤其致命——它看起来像传感器(读取结果 → 汇报),但本质是放大器(扩张 variety)。AI 读测试输出后告诉你”测试通过”,不是因为它检测到了”通过”,是因为它在训练数据中看到了这个输出常常对应”通过”。
自指回路闭合的真正位置在 T5——AI 解释传感器结果时,激活的训练数据模式和 T2 代码生成时来自同一个分布。
| 能源类型 | 来源 | 成本 | variety 质量 | 噪声特性 |
|---|---|---|---|---|
| 人类注意力 | 大脑 | 极高,不可扩展 | 最高(有语义判断) | 几乎无噪声 |
| Token 计算 | GPU 推理 | 中,可扩展但有上限 | 中等(统计采样) | 结构性噪声 |
| CPU 计算 | 确定性执行 | 低,高度可扩展 | 最低(固定规则) | 无噪声 |
核心原则:把每种能源部署在其噪声特性不造成伤害的位置。
人→意图澄清(只有人能判断”这是不是我真正想要的”)
Token→生成代码(低 variety 需求 → 高 variety 代码,必须有放大器)
CPU→验证执行(无噪声——说红灯就是红灯,不会被”说服”)
能源替代的正确方向:CPU 替代 Token 替代人类——能 CPU 做的不用 Token,能 Token 做的不用人。但信任等级反过来:CPU 输出可以信任(确定性),Token 输出必须验证,人类判断是最终裁决。
人在这个系统里的传感器不是低精度传感器。是极高精度但极低带宽的信道。
| 理论极限 | 实践约束 | |
|---|---|---|
| 精度 | 无限(一行行读,任何细节都能理解) | 无约束 |
| 分辨率 | 无限(能区分任意两个代码状态) | 无约束 |
| 带宽 | 极其有限(单位时间能处理的代码量非常小) | 唯一约束 |
这意味着:你不是看不到问题,是来不及看所有东西。控制失败的模式不是”没看出来”,是来不及看。
从香农的角度,信道容量:
\[C = B \cdot \log_2(1 + \frac{S}{N})\]这个信道是高信噪比、低带宽的。优化方向不是再提高信噪比(你已经够准了),而是:
从以上理论推导,AI 编码有效控制的完整架构:
┌──────────────────────────────────────────────────────┐
│ 第 0 层:异质 CPU 传感器网络 │
│ │
│ • 类型检查(形式逻辑,完全异质) │
│ • 自动化测试(CPU 执行,确定性输出) │
│ • 架构不变量检测(图论算法——依赖方向、循环依赖、 │
│ 模块边界、调用路径白名单) │
│ • 混沌/模糊测试(主动注入故障,发现未知脆弱点) │
│ • 复杂度指标监控(代码行数涨幅 vs 功能涨幅) │
│ │
│ 输出:红灯(阻断)/ 异常(升级)/ 绿灯(不消耗注意力) │
└────────────┬─────────────────────────────────────────┘
│
┌────────┴────────┐
↓ ↓
红灯(阻断) 绿灯(通过)
│ │
│ └→ 不消耗人的注意力
↓
┌──────────────────────────────────────┐
│ 人的注意力(唯一跨域节点) │
│ │
│ 只接收三种信号: │
│ ① 架构不变量被突破(需要决策) │
│ ② AI 不确定的信号(需要校准) │
│ ③ 环境异常模式(需要判断) │
│ │
│ 输出:意图校准 + 规则调整 + 设计决策 │
└──────────────┬───────────────────────┘
│
↓
┌──────────────────────────────────────┐
│ Token 放大器(位置 1) │
│ │
│ 输入:需求 + 设计决策 │
│ 输出:代码 + 测试建议 │
│ 上下文:与审查链路隔离 │
└──────────────┬───────────────────────┘
│
↓
┌──────────────────────────────────────┐
│ 代码库(被调节对象) │
│ │
│ • 模块化边界隔离复杂度 │
│ • 接口契约由人定义和守护 │
│ • AI 在边界内自由生成 │
└──────────────────────────────────────┘
位置 1 的 AI(放大器)和位置 2/3 的 AI 不能共享会话上下文。
位置 1 的上下文包含需求理解和生成激活。这些激活不能进入任何审查链路。
每个位置只做一个方向的变换,不切换。
只有人的注意力连接放大器域和传感器域。
AI 在放大器域不能直接接收传感器信号。传感器信号必须先变成人可判断的形式,由人决定是否需要修改需求/约束,然后人重新发 prompt 给放大器。
这不是效率损失,是控制论上的必要隔离。
Agent 审 Agent 不是不能用,是不能用它的结论。它只能产生待外部验证的假设。
❌ Agent A 审 Agent B 的代码 → "代码质量好,建议合并"
(用同质的统计判断替代异质验证)
✅ Agent A 审 Agent B 的代码 → "发现以下模式:[列表],
建议自动验证以下方面:[列表]"
然后 CPU 传感器去跑验证,验证结果才是真正的信号
Agent 的审查输出是测试用例的生成器,不是质量的判断者。
这些原理不是比喻。控制论、企业管理理论、AI 编码系统管理理论在数学上共用同一套骨架。
比尔把阿什比定律直接拉到组织管理上。一个可生存的组织必须具备五个功能子系统——缺任何一个,组织最终会死。
| 子系统 | 功能 | AI 编码中的对应 |
|---|---|---|
| S1:执行 | 直接与环境交互,产生价值 | AI 生成代码 |
| S2:协调 | 防止 S1 各部分互相冲突 | 模块化接口契约 |
| S3:控制 | 资源分配、监控 S1 是否按规则运行 | CPU 传感器网络 + 人的注意力 |
| S4:情报 | 扫描环境变化,预测未来 | 用户行为分析、环境反馈 |
| S5:政策 | 定义组织身份和终极约束 | 人的核心判断:做什么、不做什么 |
管理就是决策。决策的质量受限于决策者的信息处理能力。所以组织的本质功能是压缩信息、分解决策,使每个决策者在自己的能力范围内做判断。
这和”CPU 传感器压缩信息 → 红灯送到注意力 → 人在认知容量内做决策”是同一个原理。
组织不是”存在于外部世界的东西”。组织是人通过不断解释和重新解释自己的行为而建构出来的。组织是意义建构的持续过程。
这和 $R_{t+1} = R_t + \alpha \cdot \Delta(C_{t+1}, R_t)$ 完全同构。企业看到市场反馈,更新了对自己”是什么”的理解——和你看到 AI 输出的代码,更新了对需求的理解,是同一个动力学。
递归性原则: 每个可生存子系统需要自己的完整 S1-S5 结构。一个模块出问题时你必须亲自进去看,说明它没有内在的”生存结构”。
必要多样性的垂直分配: 每一层级的 variety 必须匹配它面对的环境 variety,不能把所有 variety 都推到顶层。
双重信号通道: 命令通道(向下)和反馈通道(向上)必须分开。当前 AI 编码的问题在于反馈通道和放大通道是同一个(都在 AI 里)。这在比尔的框架里是致命结构缺陷。
Algedonic 信号: 组织需要一个不受层级过滤的、直达顶层的警报系统。生产环境异常、架构不变量被突破——直接推送到你,不经过任何 AI。
必要的自由: 不是告诉 AI 做什么,是告诉 AI 不能做什么。模块内部完全自主(接口契约被遵守的前提下),接口层和架构层零自主权。
| 问题 | 控制论根因 | 解法 |
|---|---|---|
| 自指系统 | 调节器与被调节对象同质 | 引入外部异质锚点:CPU 传感器、用户反馈、形式化规则 |
| 复杂度失控 | 状态空间 > 调节器多样性 | 模块化隔离 + 严格 YAGNI + 认知审计 |
| 反馈信号退化 | 采样不足、信号失真、延迟 | 分层验证 + 混沌工程 + 快速发布获取真实反馈 |
| 认知事件视界 | 生成速度 > 理解速度 | 人类守护接口边界,AI 在边界内生成 |
| 不确定性错位 | 第 3 层加速,第 1/2 层失控 | 验证资源向第 1/2 层倾斜 |
| Agent 审 Agent 失效 | 共模失效(共享盲区) | 降级为测试生成器,不做质量判断 |
最终的控制论原则: AI 是扩展你多样性的工具,而不是替代你成为调节器的系统。 只要人类始终是回路中唯一能接触外部现实的节点,控制就不会消失。
| 本博客相关文章:AI Coding Team 管理笔记 | 从第一性原理设计的 AI 编码验证体系 |
2026-05-09 16:00:00
写代码是便宜的,验证是贵的。但验证的本质是什么?
上一篇笔记讲了 AI Coding Team 的管理方法——马斯克守底线、黄仁勋守质量、雷军守价值。但那篇更偏”怎么做”,这篇要深入”为什么”。
起因是读到孔某人的文章《大组织内的AI Coding过度推行是一种饮鸩止渴》,里面提到美团31万行代码AI重构的困境:AI Coding让代码产出速度暴增,但系统复杂度增长得更快,团队的维护能力跟不上。
这让我重新思考一个根本问题:验证系统的第一性原理到底是什么?
先区分两个容易混淆的概念:
两者的关系:认知是预期的基础。如果认知本身就偏了,预期必然偏。
关键区别:验证只能观测当下,不能观测未来。 跑一个测试,你观测的是此刻代码的行为,跟此刻你对代码行为的认知之间的差距。用当下的观测去推断未来——那是推断,不是验证。
所以严格来说:
不确定性 = 认知与现实的差距
预期是派生的。修正认知偏差是根本。
验证做的唯一一件事:拿现实来校准认知。校准完了,认知更接近现实了,不确定性就降低了。
减少不确定性,不是让认知去匹配现实,也不是让现实去匹配认知,而是两者共同收敛到一起,凝固下来。
产品开发是两者的交替循环:认知→建造→观测→更新认知→再建造……直到两者凝固——认知稳定了,现实也稳定了。凝固不是永久的,下一轮迭代可以重新打回流体态。
验证的严格程度,应该正比于:
验证强度 ∝ 不确定性 × 失败代价
AI Coding改变了什么?它大幅增加了”不确定性”这一侧——因为AI写的代码你不完全理解,而且产出速度极快,不确定性在以指数级累积。但”后果严重性”没有变。
所以:如果验证强度不变,风险就在指数级增长。
不确定性在整个系统内是分层的:
第1层:方向/意图不确定性(根源)
“做出来的东西是不是我真正需要的?”
不确定性最大,影响最深远。美团的问题本质在这里——AI Coding让PM提出更多低质量需求,模糊的、实验性的需求都进了生产系统。代码写得再正确,方向错了也是浪费。
第2层:设计不确定性(桥梁)
“设计能不能支撑实现和未来扩展?”
AI写代码的特点是:每段局部都是合理的,但全局结构会逐渐腐化。因为AI没有”系统全局观”——它看的是当前上下文窗口里的内容,不是整个代码库的架构。
第3层:实现不确定性(执行)
“代码是不是按设计在运行?”
这是最直观的一层——单元测试、集成测试、CI/CD。AI Coding放大的主要是这一层的产出速度。
关键洞察:AI Coding放大的是第3层的产出速度,但第1层和第2层的不确定性没有同步降低。 这就是美团困境的本质——代码写得快了,但设计质量没有跟上,需求质量没有把关。
意图只存在于人的脑子里,是内部状态,外部世界观测不到。要把意图从一个脑袋传到另一个脑袋,唯一的通道是符号化表达——语言、文字、图示。
所以:意图传递的唯一通道是沟通。讨论(广义的)是唯一方法。
但讨论有一个根本性缺陷:语言无法自我验证。 你说了一段话,对方说”我理解了”,你没有证据表明对方的理解和你的意图一致。
有效的方法:让对方把理解的东西具象化成可观测的产物,然后你验证这个产物。
你的意图(不可观测)
↓ 讨论传递
对方的理解(不可观测)
↓ 具象化
产物(可观测!)——复述、设计文档、原型
↓ 你验证
发现偏差 → 再讨论 → 再具象化 → 再验证 → ……
核心原则:永远不要问”你理解了吗?”——要问”你觉得这个需求是什么?说给我听。” 前者是噪声,后者是信号。
认知中存在”我不知道我不知道”的盲区。无法直接消除,但可以通过碰撞间接暴露:
极端化推演:把需求推向极端,看哪里断裂。用极端场景作为探针,探测认知的边界。
红队思维:故意攻击需求。问”为什么要做这个?不做会怎样?” 每一个”为什么”都在从不同角度照射意图,暴露隐含假设。
多元视角:从用户视角、技术视角、商业视角分别审视。每个视角是一束光,照到认知中不同的暗区。
你的全部认知可以分为两层:
不稳定层:意图、方向、业务判断。随需求和场景变化,每个项目都不同,需要注意力持续投入。
稳定层:设计审美、工程标准、架构原则。来自多年经验,跨项目基本不变,已经凝固。
注意力是稀缺资源。 稳定层如果每次都靠人工审查,就是浪费注意力。应该把它固化成验证系统,让AI自动执行,注意力就解放出来,只关注不稳定层。
转化过程:
凝固认知(主观)
↓ 表达成规则
客观规则(可形式化)
↓ 编码成工具/流程
验证系统(可自动执行)
验证系统不是规则的集合,是一个系统——有组件、有流程、有反馈、有边界。
检查器(Checker):自动执行的判断,不需要人参与。类型检查、lint、自动化测试、安全扫描。
审查器(Reviewer):需要判断力的审视,AI执行,人审查结论。AI交叉代码审查、架构审查、设计审查。
流程(Process):事情必须按什么顺序走,每个节点有准入和准出条件。设计评审流程、合并流程、发布流程。
反馈环(Feedback Loop):从结果中学习,更新系统本身。线上bug回溯→更新检查规则。
L1 自动检查层(零人工成本):类型检查、lint、测试、安全扫描
L2 AI审查层(低人工成本):架构审查、设计审查、代码审查
L3 流程守护层(中人工成本):设计评审、合并审批、发布流程
L4 人工层(高人工成本):方向判断、意图确认、异常处理
越底层越频繁、越自动化、越不消耗人。越顶层越稀少、越需要判断力、越消耗人。
原则1:从失败中生长,不是从蓝图中设计。 不要试图一次性设计完美的验证系统。让系统在实际运行中,从每一次失败里学到规则。问题→追溯→加检查→系统进化。
原则2:检查器优先于审查器,审查器优先于人工。 能自动化的自动化,不能自动化但可重复的让AI执行,需要判断力的人来做。进化方向:把审查器不断降级为检查器。
原则3:验证失败必须有反馈回路。 验证系统的价值不在于找到问题,在于让同类问题不再发生。修了→追溯根因→更新规则→同类问题永不再犯。
原则4:SOP是验证系统的操作手册。 精确定义:谁触发→做什么→输入什么→输出什么→谁检查→不通过怎么办。
原则5:系统的边界。 反复出现的问题、代价高昂的失败、AI容易犯的系统性错误——值得验证。一次性问题、代价极低的失败——不值得验证。
实际操作中,我把流程简化为两个阶段:
阶段1:意图+规划 — 我和一个AI直接讨论,讨论到认知凝固,产出意图文档和蓝图。
阶段2:设计+实现 — 分配给多个AI并行工作。各自做详细设计→互相review→实现代码→提PR→自动检查+交叉review→合并→部署测试环境→我体验验证。
关键设计:
整个系统不需要自建基础设施,用GitHub原生工作流就够了:
仓库本身就是上下文。每个Agent clone仓库后,意图文档、蓝图、其他模块的设计文档都在里面。不需要额外的”上下文推送”机制。
第1代:你直接和一个AI讨论+实现,验证靠你自己
↓
第2代:你讨论,分配给2-3个AI并行实现,简单PR review
↓
第3代:从问题中长出新机制
- 接口对不上?→ 加接口契约检查
- Review质量低?→ 加上下文自动推送
- Agent卡住?→ 加阻塞自动上报
↓
第4代:大部分验证自动化,你只在意图层和异常时介入
验证系统的第一性原理可以归结为一句话:
验证的本质是减少不确定性。不确定性 = 认知与现实的差距。
所有验证方法——测试、review、CI、讨论对齐、用户反馈——都是在做同一件事:用观测来缩小认知和现实之间的差距。
在这个AI Coding的时代,写代码越来越便宜,但认知和现实之间的差距不会自动缩小。你的价值从”能写代码”变成了”能定义正确的问题”和”能建验证系统来保证答案是对的”。
黄仁勋说得对:写代码是便宜的,验证是贵的。但更准确的说法是——写代码是AI的事,验证是你的事。
2026-05-02 16:00:00
不审查代码,审查系统。不信任代码,信任验证。
我写代码几乎 95% 以上是让 AI 写的。Python 后端我可以仔细 review,发现问题让 AI 改。但对于不熟悉的领域——比如 APP 开发、C++、Rust——我没法逐行审查。随着 AI 越来越强,多个 Agent 并行开发,代码量远超我能看的范围。
核心问题:注意力有限,如何保证交付质量?
答案是:从”审查代码”转变为”验证行为”。
马斯克管理 SpaceX 的方式——他不懂每个零件的制造细节,但他知道物理极限。
他的方法是第一性原理 + Failure Mode Analysis。不管方案多漂亮,他只问一个问题:
最坏情况是什么?
他常说的话:
映射到软件——你不需要 review AI 写的 Rust 代码,但你能判断方案在系统层面是否合理:
具体执行:让 AI 做 failure mode 分析,你 review 分析结果,不做取舍决策(速度 vs 质量 vs 成本)。
黄仁勋最核心的一个数字:NVIDIA 验证工程师的数量是设计工程师的好几倍。
他的哲学:写代码(设计)是便宜的,验证是贵的。不要试图理解每个细节,但要保证验证系统覆盖每个细节。
对应到 AI 团队管理——先建验证基础设施,再让 AI 干活:
每个任务的标准流程:
你只看两样东西:验证覆盖率 + 最终通过/失败报告。
核心理念:一个人检查所有人的代码不可扩展,但一套检查系统可以无限扩展。
雷军跟黄仁勋完全不同的思路。黄仁勋建验证体系,雷军会说你搞得太工程师思维了。
雷军的哲学就七个字:专注、极致、口碑、快。
他的做法是基本可用就发布,让用户告诉你哪里不对。MIUI 早期版本 bug 多到离谱,但每周发一版更新,用户疯狂反馈,团队跟着改。
具体执行:
自动化测试验证不了的东西——体验、交互、需求真伪——只有真人能告诉你。
最好的 review 是用户的投诉。
三个人分别守住不同的维度:
| 马斯克 | 黄仁勋 | 雷军 | |
|---|---|---|---|
| 守住 | 底线 | 质量 | 价值 |
| 防止 | 出大事才知道 | bug 率失控 | 做一堆没用的 |
| 核心动作 | 问最坏情况 | 建验证体系 | 问用户反馈 |
| 关键问题 | 会炸吗 | 测到了吗 | 有人用吗 |
缺任何一个维度都不行:没有马斯克,系统出大事才知道;没有黄仁勋,bug 率控制不住;没有雷军,做了一堆没用的东西。
不是自己写文档,是跟 AI 讨论、拍板、让 AI 写。
你脑子里有想法/方向
↓
跟 AI 讨论(可能多轮)
"我觉得应该用事件驱动,你觉得呢?"
"并发场景下消息顺序怎么保证?"
AI 回复 → 你追问 → AI 补充 → 你再质疑
↓
你拍板:"就这个方案,XX部分用A方案,YY部分用B方案"
↓
AI 写架构文档、接口定义、技术方案
↓
你 review 文档(确认 AI 有没有理解对你的决策)
↓
确认无误,文档就是开发契约
时间分配:
你的核心竞争力不是”写文档写得漂亮”,是讨论过程中暴露出来的判断力和决策力。就像 CEO 不会自己写 PPT——CEO 提供观点和判断,秘书(AI)负责整理成文档。
Agent A 写代码(sonnet 级别)
Agent B 写测试(sonnet 级别)
Agent C review 代码(opus 级别,不同 prompt)
Agent D review 测试覆盖度(opus 级别)
自动 CI pipeline 跑一遍
全绿 → 合并,红灯 → 信息回到 Agent A 重做
你只需要看最终的通过/失败报告 + review AI 输出的 review 结论摘要。
25% 跟 AI 讨论架构和方案 ← 核心:讨论、质疑、拍板
15% review AI 写的文档/接口定义 ← 确认 AI 理解对了你的决策
15% 跟 AI 对话质疑执行方案 ← 第一性原理问问题
15% Review 验证结果和报告 ← 测试覆盖率、CI 状态、运行指标
10% 端到端手动验证 ← 把自己当用户走一遍
10% 看关键代码,保持直觉 ← 极少数情况
10% 业务决策、外部协调 ← 跟真人相关的事
| 情况 | 该怎么做 |
|---|---|
| 不熟悉 AI 用的语言 | 只看测试结果和 CI 报告,不看代码 |
| 多个 AI 并行开发 | 先建好验证体系,再让他们开工 |
| 不确定 AI 写的对不对 | 问 AI “失败模式是什么” |
| 不知道功能该不该做 | 先做最小版本给用户,用反馈决定 |
| 代码量太大看不过来 | 专注看架构图和数据流,不看实现 |
| AI 写的代码有性能问题 | 看 profiling 结果,不看代码本身 |
| 担心安全漏洞 | 配好 SAST 扫描和 dependency audit |
| 不知道质量如何 | 看测试覆盖率和线上监控指标 |
你的角色不是不懂技术的 PM,是懂物理定律的系统架构师。
PM 只管”要做什么”,你管”怎么做才不会炸”。你不是在管理一群程序员,你是在建设一个质量保障体系,然后让 AI 在这个体系里自由发挥。
2026-02-23 16:00:00
当 AI 大模型推理速度突破 5000 tokens/s,Agent 的 Re-Act 循环进入毫秒级时代,一个物理铁律浮出水面:有限的上下文窗口(200K~1M tokens)将在几十秒内被“思考”与“日志”填满。现有的“追加历史记录”模式瞬间失效,因为这无异于试图用容量极小的 L1 缓存去存储整个程序运行周期的所有数据流。
这一矛盾决定了 AI Agent 的技术终局:上下文窗口必须从“聊天记录堆”重构为“CPU 寄存器堆”。未来的 Agent 架构不再是简单的对话流,而是类似于操作系统的状态机循环——Context Window 只保留当前指令指针和核心状态寄存器,通过严格的“状态覆盖”替代无脑的“日志追加”,用信息熵减对抗数据洪流。
真正的瓶颈在于 LLM 的核心物理限制——上下文窗口容量。即便模型能力不断提升,上下文窗口从 200K 扩展到 1M,它依然是一个有限的物理容器。试图通过无限扩大窗口来承载 Agent 无限运行产生的日志,无异于试图用一杯水去接一条不断流淌的河。
我们必须从 Transformer 的本质出发,承认一个残酷的现实:Transformer 是无状态的,它通过重放历史来模拟状态。 如果 Agent 要像操作系统进程一样长久、稳定地运行,我们必须彻底重构它的运行模式。
本文将提出一种新的架构范式:将 AI Agent 从“文本补全机器”重构为“状态机循环”,并将其类比为汇编语言与 CPU 架构,以此解决上下文爆炸的根本问题。
目前的 AI Agent 大多基于 Re-Act 模式,其运行逻辑本质上是“日志驱动”的:
这种模式的问题在于,为了维持“状态”,模型必须保留所有“过程”。这就像 CPU 为了执行下一条指令,必须把过去执行过的所有指令记录都读一遍。随着时间推移,Context Window 必然溢出,或者因注意力机制的 $O(N^2)$ 复杂度导致计算崩溃。
操作系统的启示: 在计算机体系结构中,CPU 执行指令只依赖两个东西:
CPU 不关心上一毫秒执行了什么,只关心当前状态。Agent 也必须如此。
如果我们将 Agent Loop 视为一段汇编程序,那么大语言模型(LLM)本身不再是那个无所不知的“大脑”,而是一条极其复杂的“状态转移汇编指令”。
在这个模型下:
Agent 的运行模式应当从“追加日志”转变为“寄存器操作”。每一次推理,都是一次 “状态读入 -> 计算 -> 状态写回” 的过程。
既然 Context Window 是昂贵且有限的“寄存器”,我们就不能像写流水账一样随意填充。必须像设计 CPU 寄存器一样,对其进行严格的分区和结构化设计。
我们将 Context Window 划分为固定的“槽位”,每个槽位承载特定的功能:
.text 段:指令区(只读)这是 Agent 的内核代码,定义了 Agent 的行为逻辑。
[Goal] Fix Bug #404
[Step 1/3] Read main.py (Done)
[Step 2/3] Locate error line -> [Current IP]
[Step 3/3] Apply fix
R_IP 即可知晓“我在哪,要去哪”,无需回溯历史。.data 段:数据区(读写)这是 Agent 的工作台,也是上下文工程的核心。
{
"task_status": "debugging",
"open_files": ["main.py"],
"error_line": 102,
"key_variables": {"user_id": null}
}
.stack 段:调用栈R_State 和 R_IP 压栈。任务结束后弹出恢复。基于上述架构,Agent 的 Re-Act Loop 变成了一个标准的 CPU 指令周期。这个过程的核心在于 “信息压缩”。
注意力机制聚焦于 R_IP 和 R_State。模型不需要知道“之前发生了什么”,只通过当前状态判断“现在该做什么”。
模型根据 R_System 的规则,分析当前状态是否需要调用工具,或者是否需要更新内部状态。
模型输出两部分内容:
Read_File)。Update_State)。这是解决上下文爆炸的关键步骤:
R_Working。R_Working,提取关键信息(如“错误在第 500 行”),生成 Delta_State 更新 R_State。R_Working 中的原始数据。结果:10,000 行的日志被压缩成了 R_State 中的一个字段 "error_line": 500。上下文占用仅增加几个 Token,但信息被完整保留。这就是“状态机”对抗“上下文爆炸”的武器。
在这种架构下,我们需要精心设计 Context Window 的布局,引导 LLM 遵守寄存器约束。
Prompt 模板示例:
# [R_System] Instruction Set
You are a State-Machine Agent. Maintain state strictly in JSON format.
Output format:
1. <tool_call name="..."/>
2. <state_update key="..." value="..."/>
# [R_IP] Current Instruction Pointer
Goal: Analyze Stock Trend
Step: 3/5 (Calculate Moving Average)
# [R_State] Global Registers (Max 4000 tokens)
{
"ticker": "AAPL",
"trend": "UP",
"analysis_progress": "50%"
}
# [R_Working] Scratchpad (Last Tool Output)
[Tool: API] Returned 1000 data points... (Large Text)
# [Input]
Based on R_State and R_Working, generate Next Tool Call and State Update.
AI Agent 的未来,不是让模型拥有无限的记忆,而是让模型学会像操作系统一样高效地管理资源。
通过引入指令指针(R_IP)和状态寄存器(R_State),我们将 Agent 的运行模式从线性的“文本流”转变为循环的“状态机”。在这个架构下,无论 Agent 运行一秒钟还是一百年,其 Context Window 的占用始终稳定在一个可控的范围内。
这才是 AI Agent 从“玩具”走向“工业级应用”的必经之路。我们不是在写对话,我们是在编写 AI 的汇编代码。
通过「RSS阅读器」或者关注公众号「自宅创业」可以订阅博客更新,也可以在 关于我 页面找到我的联系方式,欢迎交流!