MoreRSS

site iconGuyskk | 黄康德修改

曾在下厨房、一面数据、饿了么等公司实习,并在PayPal上海工作三年。目前为自由职业者/独立开发者,正在进行自宅创业。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Guyskk | 黄康德的 RSS 预览

AI 编程=控制系统:BeecodeAI 的设计原理

2026-06-26 16:00:00

BeecodeAI APP 完整介绍


你大概也有过这种体验

用过 AI 写代码的人,多半经历过这样一种反差。

一方面,AI 偶尔展现出的能力近乎魔法。你用一两句话描述想要什么,它就能生成一个精美的、可交互的小工具、一个能跑的脚本、一段你没想到的巧妙实现。那一刻你会觉得,编程这件事被彻底改变了。

但另一方面,一旦你把它放进一个稍微真实、稍微复杂的项目里——不是写一个孤立的 demo,而是在一个有几万行代码、有历史包袱、要和别人协作的项目里持续用它——情况就变了。”整个过程漏洞百出,各种不易察觉的错误层出不穷”,有人这样描述。项目”快速起步,然后失控”。

这种反差不是因为你用得不对,也不是因为模型不够强。它是一个结构性的问题。这篇文章想讲清楚:为什么 AI 编程会”快速起步然后失控”,以及一个叫 beecodeai 的产品,是怎么从根上应对这个问题的。

为了讲清楚,我们会借用一套语言——控制论。它的核心直觉非常朴素:任何想”控制”某个东西的系统,都得遵循几条绕不开的规律。 而 AI 编程,恰恰就是一个”人想控制代码库”的系统。一旦你戴上这副眼镜,很多原本说不清的困惑,都会变得清晰。


第一章:先看清 AI 编程到底难在哪

要理解 beecodeai 为什么长成这样,得先回答一个最根本的问题:AI 编程,到底难在哪?

很多人会直觉地认为:难在”让 AI 写出正确的代码”。但这个直觉是错的,而且错得很有迷惑性。

一个帮你理解的类比:恒温器

先放下 AI,想象一个你家里可能有的东西:恒温器(也就是空调或暖气的温控器)。

恒温器在做什么?它想让你房间的温度维持在一个你设定的值,比如 24 度。为了做到这件事,它需要三个东西:

  1. 一个温度计:它得知道现在房间到底是多少度。
  2. 一个目标:你想让它维持的 24 度。
  3. 一个能改变温度的手段:天冷了开暖气,天热了开空调。

它的工作方式是一个不断循环的过程:用温度计量一下现在多少度 → 和目标的 24 度比一下 → 如果低了就开暖气、高了就开空调 → 过一会儿再量一次…… 这个”量一下、比一下、调一下、再量一下”的循环,就叫反馈回路

恒温器就是一个最简单的控制系统——一个”想要把某个东西维持在某个状态”的系统。控制论就是研究这类系统的学问。它发现,不管你是控温、开车、驾驭飞船,还是——我们马上要讲的——用 AI 写代码,只要你在”控制”什么东西,就都得遵循同一套规律。

把恒温器映射到 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 写更多),它是一个”控制”问题(怎么在 AI 飞快写代码的同时,把那些被一起放大的错误抓出来、协调好)。 想靠”让 AI 更强、写得更快”来解决问题,是搞错了方向——那只会让错误产生得更快。真正的解法,得从”控制”那一侧入手。

那具体怎么从控制侧入手呢?这就引出了下一章的主角:反馈回路


第三章:反馈回路——一切控制系统的命门

第一章我们提过,恒温器工作的本质是一个循环:量温度 → 和目标比 → 调整 → 再量。这个循环有一个专门的名字,叫反馈回路。它是所有控制系统的命门,搞懂它,你就搞懂了 beecodeai 设计的底层逻辑。

什么是反馈回路

反馈回路,就是一个”做完一件事后,根据结果再调整,然后再做、再调整”的循环。

开车是最直观的例子。你在高速公路上开车,想保持在车道中间。你不是”一次性把方向盘转到某个角度就不管了”——那样车早跑偏了。你实际做的是:看一眼车在车道里的位置 → 发现偏了就微调方向盘 → 过一会儿再看一眼 → 再微调…… 这就是一个反馈回路:感知(看)→ 比较(和中间比)→ 调整(转方向盘)→ 再感知。

注意这里的一个关键点:如果把你”看路”的能力去掉,你根本开不了车。 哪怕你转方向盘的技术再好,闭着眼睛也没用。因为没有了”感知”,你就不知道该往哪调整。反馈回路里,”感知”和”调整”同样重要,缺一不可。

把这一点翻译回 AI 编程:光让 AI 写代码(调整),却不验证它写得对不对(感知),就等于闭眼开车。 而很多团队用 AI 的方式,恰恰就是闭眼开车——AI 飞快地写,人来不及看,等到发现问题时已经堆了一座屎山。

一个反直觉但极其关键的道理

接下来这条道理,是整个 beecodeai 设计的”信心来源”,但它有点反直觉。

回到恒温器。假设你有两个选择:

  • 选择 A:换一个极其精密、极其昂贵的暖气(”生成”能力强)。
  • 选择 B:换一个极其精准的温度计,并且让它频繁地量温度(”感知/反馈”能力强)。

哪个更能让房间温度稳定在 24 度?

答案有点反直觉:只要暖气不是太烂(能制热就行),选择 B 的效果远好于选择 A。 因为决定温度稳不稳的,主要不是”暖气有多猛”,而是”你能不能及时、准确地知道当前温度,并据此调整”。哪怕暖气普通,只要温度计准、反馈及时,房间也能稳稳停在 24 度。

这个道理在工程学里有一条精确的表述:

在一个有反馈的系统里,输出的准确度,主要由反馈环节决定,而不太依赖于生成环节本身的好坏。

翻译成大白话:你不需要一个完美的 AI(生成器),你需要的是足够好的”验证”(反馈)。只要验证够强、够及时,哪怕 AI 本身有缺陷,最终结果也能被纠正到正确。

这是 beecodeai 整个设计的底气所在。它没有(也没必要)去追求”最完美的 AI”,它追求的是让验证这件事尽可能强、尽可能及时——因为那才是决定成败的关键。

不过这里有个陷阱,也是下一章要讲的:“验证”这件事,比想象的难得多。 不是随便什么”验证”都管用。


第四章:什么样的”验证”才算数

上一章说”验证够强就行”。但你马上会问:让 AI 自己跑一遍测试、自己说一句”没问题了”,算不算验证?

答案是:不算,而且这种”验证”几乎一定会骗你。 这是控制论里一个不太直观、但极其关键的结论。我们用一个真实的反面教训来讲它——这个教训就发生在我们设计 beecodeai 的讨论过程里。

一个真实的反面教训:回音室

在设计 beecodeai 的过程中,我们让好几个 AI 参与讨论,帮我们分析产品该怎么设计。有一次发生了这样一件事:

我们让几个 AI 分析”beecodeai 里到底有没有一个自动驱动流程的引擎”。这几个 AI 都没有真正去读代码,只是凭印象互相附和,结果它们越说越确信”系统里有一个精密的流程引擎”——一个完全不存在的东西,被它们当成事实越传越真。

为什么几个 AI 都会犯同一个错?因为它们犯错的根源是一样的:它们读了同一批材料、用了相似的推理方式、还能看到彼此的发言。一个 AI 产生的幻觉,恰好落在其他 AI 的盲区里,于是非但没被发现,反而被其他 AI 当成了佐证。

几个会犯同样错误的 AI 凑在一起互相确认,不是”好几倍可靠”,而是”把同一个错误确认了好几倍”。 这就好比一群都近视、且近视度数一样的人互相检查视力——他们看不见的东西,彼此也都看不见,互相说”我看清了”毫无意义。

这种现象在控制论里有个名字,叫共模错误(”共模”就是”大家共同的模式”)。靠一群会犯同样错误的家伙互相检查,是查不出这种共同错误的。

怎么打破回音室

那怎么才能打破这种回音室?关键在一个词:异质——也就是”不一样”。

还是检查视力的例子:一群同样近视的人互相查没用。但如果引入一个不近视的人(一种”异质”的检查者),他一下就能看出”你们都看不见那行字”。

在我们的回音室例子里,那个”不近视的人”是什么?是代码本身。当我们停止听 AI 互相附和,转而去读真实的代码——代码不会附和,不会要面子,它是什么就是什么——幻觉瞬间就瓦解了。

这里区分两种完全不同的”验证”:

  • 同质的验证:用和”生成”同源的东西来检查。比如让写代码的 AI 自己审自己、让同一个模型换种说法再检查一遍。这种验证对”共模错误”完全无效——自己看不见的盲区,换个姿势还是看不见。
  • 异质的验证:用和”生成”完全不同的、确定性的东西来检查。比如编译器(代码编不过就是编不过,它不会骗你)、测试(跑不过就是跑不过)、真人(能理解意图)。这种验证才查得出共模错误。

所以一条铁律是:一个 AI 无法有效审查它自己写的东西。 它审查时用的是同一个脑子、同一套知识、同一种思维模式,它写的时候犯的错,审查时还会再犯一遍。有效的验证必须来自”外部”:另一种 AI、确定的工具、或者人。

“验证”还分等级

而且,”异质验证”本身也分等级,可靠性从高到低大致是:

  1. 确定性的工具(编译器、类型检查、代码规范检查器):最可信。它说错就是错,不会糊弄你,成本也最低。
  2. 自动化测试:次可信。可靠程度取决于测试写得好不好、覆盖全不全。
  3. 另一个不同的 AI 审查:能发现一些问题,但也有自己的盲区和噪声。注意是”另一个不同的”——同模型同视角的没用。
  4. 真人审查:最可信,但最贵、最慢——所以要省着用,留给最关键的判断。

记住这张阶梯,因为 beecodeai 的验证设计,就是在按这个阶梯把贵的验证省下来,把便宜的验证用足

好,现在我们有了三副眼镜——控制系统、放大器、反馈回路/验证——可以正式看 beecodeai 这个产品了。


第五章:beecodeai 是什么——用一个真实任务讲清楚

讲了半天理论,beecodeai 到底是个什么东西?

一句话:beecodeai 是一个让你(哪怕在手机上)指挥电脑里的一个 AI 团队,去完成编程任务的工具。 你的电脑上运行着一个”管家”程序(我们叫它 daemon),它管着几个 AI(每个可以有不同的”脑子”/模型),在你的代码仓库上干活;你通过手机或者电脑和它们沟通、下指令、看进展。

光说定义没用,我们走一个真实的任务看看它怎么运作。假设你想给你的 APP 加一个支付功能。

第一步:创建一个”任务”。 你在 beecodeai 里新建一个任务,标题写”给 APP 加支付功能”,描述里写清楚你想要什么(支持微信/支付宝、能退款、安全)。这个”任务”就是这一整件事的载体——后面所有的讨论、代码、验证,都挂在这个任务上。

第二步:讨论需求。 你在这个任务下和 AI 来回讨论:退款规则到底怎么定、要不要支持部分退款、安全上要注意什么。讨论的过程,其实就是在把第一章说的”目标”想清楚——还记得放大器吗?需求越清楚,AI 放大出来的噪声越少。

第三步:让 AI 实现。 需求讨论清楚了,你让一个 AI(比如擅长写代码的那种)去实现。它在你的代码仓库里写代码。你不用盯着,它在自己的工作区里干。

第四步:验证。 实现完,不能直接用——得验证。你让另一个 AI(或者测试脚本)去测:编译过不过、测试通不通、关键流程跑一遍对不对。还记得第四章吗?验证要用”异质”的东西,所以测试和代码检查比”让写代码的 AI 自己说没问题”靠谱得多。

第五步:你看一眼,拍板。 验证结果汇总到你面前——不是让你看几千行代码,而是看一个结论:”测试通过了,这几个关键点没问题,这里有一个需要你决定的取舍”。你做个判断:可以,那就合并;不行,打回去让 AI 改。

第六步:合并,任务关闭。 代码合并进主仓库,这个任务就算完成了。

整个过程里,你会注意到一个关键设计:所有事情都挂在一个”任务”上——讨论、代码、验证、结论,全都收敛在同一个地方,而且全过程都被记录下来。 你三个月后想知道”当时支付功能为什么这么设计”,回到这个任务就能看到完整的来龙去脉,不用在聊天记录里大海捞针。

这个”以任务为中心”的设计,不是拍脑袋想出来的,而是踩了很多坑之后的结论。下一章讲这些坑。


第六章:为什么是”任务”为中心——beecodeai 踩过的两条死路

beecodeai 不是一开始就长这样的。它有过两个前身,分别走了两条被实战证伪的”死路”。理解这两条死路,你才能理解为什么”任务”是答案。

死路一:把 AI 当联系人(纯聊天模式)

beecodeai 的第一个版本,是一个纯聊天的产品。它的想法很自然:既然能跟 AI 自然语言对话,那就像用微信一样,把每个 AI 当成通讯录里的一个联系人,所有工作都通过聊天完成。

这个想法的直觉非常强,但一用起来就崩了。问题出在哪?

工作全部散落在聊天记录里,没法追溯,没法协作。

举个具体场景:你和某个 AI 聊了三天,解决了一个 bug。第四天,你想回头确认”当时为什么选了方案 A 而不是方案 B”。你得在几百条聊天消息里一条条翻,而且很多关键决策是散落在不同日子的对话里的,拼都拼不起来。

更糟的是协作:如果两个 AI 要一起做一件事,它们没有一个共同的”工作对象”可以挂靠。你只能当人肉中转——AI A 说一句,你复制给 AI B,AI B 回一句,你再转回去。对话一结束,状态就消散了,没有任何东西沉淀下来代表”这件事进行到哪了”。

用我们前面的语言说:纯聊天模式没有”求和点”——没有一个地方把”目标和现状的差距”记录下来、累积起来。每次对话结束,这个差距信息就丢了,你得下次重新判断。这等于恒温器每次量完温度就失忆,永远在”盲控”。

死路二:把 AI 当员工(纯看板模式)

另一个极端是纯任务看板:把 AI 当成团队里的员工,给它派工单,它做完把工单从”待办”挪到”完成”。这是把传统的项目管理软件直接套到 AI 身上。

它的毛病更隐蔽,但也更致命:它还在用”管理人类”的方式管理 AI,缺少真正的编排核心。

看板擅长展示”谁在做什么、卡在哪”,但 AI 协作真正需要的,是实时的信息流动——一个 AI 刚产出的东西,要能立刻成为另一个 AI 的输入;你的一句话,要能立刻改变正在进行的工作。看板是一张静态的快照,不是流动的回路。它有”可见性”,但”可见”不等于”可控”。

而且纯看板有个致命的信息流问题:AI 通过命令自己去改工单状态,系统只是被动接收。这意味着状态变更成了黑盒——AI 把工单挪到”完成”,但你不知道它到底做了什么、做对没有,事后也追溯不了。

死路指向的答案

把两条死路的失败反过来,答案就浮现了:

  • 纯聊天缺的是结构和持久状态(像工单那样能追溯、能协作);
  • 纯看板缺的是实时流动(像聊天那样能即时沟通)。

你需要一个东西,既能像聊天一样实时交流,又能像工单一样追溯结构。这个东西,就是”任务”。

任务把”目标 + 讨论 + 执行 + 结果”收敛在同一个地方。它不是聊天和工单的妥协,而是同时拿到了两者的长处。

这就是 beecodeai 最核心的产品判断:以”任务”——而不是对话,也不是看板卡片——作为组织 AI 编程工作的基本单元。

但光说”任务为中心”还不够,关键在于这个任务具体怎么设计。接下来一章,我们逐个看 beecodeai 任务系统的几个关键设计决策,以及每个决策背后那个”为什么”。


第七章:beecodeai 的核心设计——每个决策背后的”为什么”

这一章是全文的重头戏。beecodeai 的任务系统有几个看起来”反常”的设计——它们要么特别简单,要么故意”不做”某些事。我会逐个讲清楚,每个设计都是在回答”怎么把验证和协调组织好”这个问题。

决策一:任务只有”开”和”关”两个状态

大多数任务管理软件都有一堆状态:待办、进行中、待测试、待审核、已完成、已取消……beecodeai 只有两个:开(open)和关(closed)。

为什么这么简陋?

因为 beecodeai 想 expressed 的,不是”流程走到第几步”,而是“这件事和目标之间的差距,是否已经被吸收了”。还记得第一章的反馈回路吗?一个任务刚创建时,它和”想要的目标”之间差距很大(需求还没实现);随着讨论、实现、验证,这个差距一步步被缩小;当差距小到可以接受(代码做完了、验证过了),任务就关闭。

所以”开/关”这两个状态,本质上是:差距还没吸收(开)/ 差距已经吸收(关)。这是最本质的二分,多了反而模糊焦点。

那”现在在讨论还是在测试”这种信息怎么办?用标签来表达。需要区分时就打个 讨论中实现中验证中 的标签,不需要时就不用打。标签是可选的、轻的、你自定义的——这比强制一套复杂状态机灵活得多。

决策二:所有的变更,都记录成一条条”事件”

在 beecodeai 里,任务上发生的任何事——你评论了一句、改了标题、加了个标签、分配了一个 AI、AI 完成了一步——都被记录成一条不可更改的”事件”,按时间顺序排成一条流。任务的当前状态,就是这条事件流的”汇总”。

这个设计叫”事件溯源”,道理很朴素,可以用银行流水来理解。

你的银行账户”现在有多少钱”,其实是从你开户以来每一笔存入、取出”汇总”出来的。银行不会只存一个”当前余额”然后覆盖它——它存的是所有交易记录(事件流),余额是从记录里算出来的。为什么这么做?因为交易记录可追溯(你能查到每一笔钱哪来的)、不可篡改出了问题能对账

beecodeai 给任务记事件流,是一模一样的道理:

  • 可追溯:一个任务从创建到关闭,发生了什么、谁在什么时候做了什么,一清二楚,没有信息丢失。三个月后想复盘,完整记录都在。
  • 断了能恢复:每个事件都有个递增的编号。你的手机断网了、AI 重启了,重新连上后只要说”我最后看到第 120 号事件”,系统把 121 号之后的推给它就行——不会丢、不会乱。
  • 解耦:产生事件的人不需要管谁会看——系统负责把事件可靠地送到该送的人面前。

这个设计还顺带解决了一个纯看板模式的毛病:在纯看板里,AI 自己改状态、系统被动接收,变更成了黑盒。而事件流是系统主动推送给所有相关方的——谁做了什么,大家都看得到,编排变得可审计

决策三:”阶段”是一个标签,不是一个强制流程

这是 beecodeai 里最容易引起误解的一点,也是它最”反常”的设计之一。

顺着”控制系统”的思路,最自然的设计是:给任务定义一条清晰的流程,比如 需求 → 设计 → 开发 → 测试 → 评审 → 发布,每个阶段有进入和退出条件,到了某阶段自动通知相关 AI、自动推进到下一步。这种”流程状态机”看起来特别专业,几乎所有项目管理软件都这么做。

beecodeai 刻意不这么做。 在 beecodeai 里,”阶段”只是一个用户自己打的标签,配上”进到这个阶段时自动说一句话”“这个阶段需要哪些 AI 关注”这样的可选配置。它不强制流程、不校验”必须先做完 A 才能做 B”、不自动推进。

为什么?因为真实的 AI 编程流程,根本不是一条直线,而是来回乱跳的。

想象你在做饭。菜谱上写”备料 → 起锅 → 炒 → 调味 → 装盘”,是一条直线。但真实做饭是什么样?你炒着炒着发现盐放早了,赶紧想办法补救(回到了”调味”);补救的时候发现食材切太大,又临时去改刀(回到了”备料”);装盘前尝一口觉得不够味,又倒回去调味。真实的工作流是螺旋的、来回横跳的,不是流水线。

AI 编程一样。你以为讨论完需求就该开发了,结果开发到一半发现需求本身想错了,得退回去重新讨论;你以为测试完了该发布了,结果测试发现是个根本性的设计问题,直接打回到最初的需求层。讨论、实现、验证这三件事,在真实工作里高度交错、反复横跳。

如果你强行定义一条线性的流程状态机,它就会和真实工作流持续打架:系统逼着你”假装”自己正处在某个规定阶段,而你的真实工作早就在阶段之间跳来跳去了。状态机会变成一种官僚主义——你不是在工作,你是在维护状态机的体面

所以 beecodeai 让”阶段”只是一个描述性的标签:你想标记现在在干嘛就打个标签,想跳就跳,想回头就回头。它记录”现在大概在做什么”,但不强制你必须怎么走。

(顺带说一句:正是因为不把流程写死,beecodeai 才有可能在未来把”安排流程”这件事本身交给 AI 去做——AI 自己决定什么时候该叫谁来帮忙、什么时候该进入下一步。如果把流程写死了,这种灵活性就彻底没了。这个方向,我们后面还会讲到。)

决策四:每个 AI 在自己独立的代码副本上工作

当多个 AI 同时为一个任务干活时,beecodeai 给每个 AI 分配一个完全独立的代码副本(工作目录),它们彼此隔离,互不干扰。

这个设计可以用两个厨师来理解。如果两个厨师共用一个灶台、一口锅,他们肯定会打架——一个在炒菜,另一个把食材倒进去;一个放了盐,另一个又放一遍。所以正经的厨房给每个厨师一套独立的灶具,各做各的,最后再合到一起。

beecodeai 给每个 AI 独立工作目录,道理一样,但还有更深一层的原因——防止”AI 自己查自己”那种失效

还记得第四章的回音室吗?一个 AI 不能有效审查自己写的东西。但如果两个 AI 在同一个代码副本上工作,它们就共享了同一段工作记忆——审查的那个 AI,脑子里全是写代码那个 AI 留下的痕迹,它俩实际上”想到一起去了”,等于变相的自己查自己。把两个 AI 物理隔离到不同的代码副本里,它们的工作记忆不互通,审查才真的是”另一个独立的视角”。

所以这个”独立副本”的设计,表面上是工程隔离(防并发冲突),深层是为了满足”验证必须异质”这条规律

决策五:用”多个不同的 AI”协作,而不是一个 AI 反复跑

beecodeai 鼓励你把多个不同的 AI(尤其是用了不同底层模型的)拉进同一个任务,让它们交叉检查彼此的工作。

为什么强调”不同”?还是第四章的道理:几个会犯同样错误的 AI 互相检查,查不出共同的错误(共模错误)。要真正能查出问题,这些 AI 得犯不一样的错——而”用了不同的底层模型”是让它们犯错方式不一样的最直接手段。

打个比方:让两个思维习惯不同的同学互相检查作业,比让两个思维方式一样的同学互相检查,更能发现错误——因为前者会从不同角度看问题,后者只会一起忽略同样的盲点。

beecodeai 特意把”用什么模型”做成每个 AI 的固有属性,就是为了让你能轻松地组出”一个用 A 模型的 AI + 一个用 B 模型的 AI”这样的检查对子。这就是控制论里说的”差分”——用差异来发现错误——在产品里的落地。

但必须诚实地说,差分也有它的边界:如果几个 AI 共享了同一种”文化偏差”(比如都爱把简单问题复杂化、都爱急于达成共识),这种偏差是它们共有的,再怎么互相检查也查不出来。这时候,还是得靠代码本身(确定性的异质验证)和真人(能跳出 AI 的思维框架)来兜底。差分是有用的,但它不是万能药。


第八章:为什么 beecodeai 故意”做得少”

讲到这里,你可能会产生一个疑问:顺着”AI 编程是控制系统”这套思路,最自然的产品形态,难道不是造一个精密的控制器吗?——把流程固化成状态机、把验证做成自动编排引擎、让系统自动驱动一切。为什么 beecodeai 反而把核心做得这么简单,把那么多事”故意不做”?

这一章回答这个最反直觉的问题。

诱惑:造一个精密的控制器

老实说,当你真的用控制论和放大器的视角去看 AI 编程,你会强烈地想造一个”精密控制器”。既然反馈回路是命门,那就内建一个自动的验证编排;既然差分能发现错误,那就内建一个多 AI 差分矩阵;既然流程重要,那就造一个流程状态机,让”需求→设计→开发→测试”自动推进。这个方向看起来无比自然——自然到我们自己团队讨论时,都差点把它当成”已经实现了的架构”。

但翻开 beecodeai 真实的代码和设计文档,你会发现:这些精密的东西,大多被刻意地、有意识地拿掉了。 任务只有”开/关”,没有内建的流程状态机,没有内建的差分算法,没有内建的验证编排引擎。

这不是”没来得及做”,而是想清楚之后决定不做

为什么不造:穷举流程,是阿什比定律的反面

回到第一章的阿什比定律:控制能力必须够得上被控对象的复杂度。

那”被控对象”——也就是真实世界里的编程工作——有多复杂?答案是:无限复杂。 每个项目的流程都不一样:紧急修 bug、大型重构、探索性的试验,流程天差地别;而且就算同一个项目,每次的具体情况也不一样。你没法预先把所有可能的流程都穷举出来、写进一个状态机里。

一个穷举了流程的状态机,恰恰是最没有弹性的——它只能处理设计者预先想到的那些情况。一旦遇到一个没预设过的情况,它就卡住了,因为它的”控制能力”(预定义的流程)覆盖不了这个新情况。这恰恰违背了阿什比定律。

阿什比定律的真正含义不是”系统要穷举所有情况”,而是:系统要保留吸收各种新情况的弹性。 一个把编排权交出去、核心保持极简的系统,它能应对的复杂度,等于”人和 AI 的判断力之和”——那才是一个真正大的、能持续膨胀的”控制能力”。而一个把流程写死的精密引擎,它的能力被设计者的想象力锁死了。

编排靠”涌现”,不靠”引擎”

所以 beecodeai 的选择是:核心保持极简,编排靠人和 AI 在当下”涌现”出来。

具体说,系统不规定流程,只提供几个最基础的协作动作:

  • 想让某个 AI 介入?在任务里 @ 它,它就被叫进来。
  • 想交叉验证?把另一个用不同模型的 AI 拉进来,让它审查。
  • 想标记进展?打个标签。
  • 觉得讨论够了、可以动手了?说一声,对应的 AI 就开始干。

“下一步做什么”这个判断,不在系统的流程引擎里,而在人和 AI 当下的即时判断里。 系统只负责一件事:把发生了的事可靠地记录下来、送到该看的人面前。 它不替你做决定,它保证你的决定能落地、能追溯、能让相关方都看到。

这就是”涌现式编排”——流程不是预先写好的轨道,而是在实际工作里,由参与者的判断即时”长”出来的。它不那么”工程”,但能吸收的复杂度,远超任何预定义的引擎。

极简的另一个理由:省下最稀缺的资源

还有一条很现实的理由:人类的注意力是整个系统里最稀缺的资源。

还是 ,一眼就懂;复杂的状态、字段、强制的步骤,每一个都在悄悄消耗你的注意力。你本来就被”代码库膨胀 vs 自己能力固定”搞得捉襟见肘,再让产品界面上一堆复杂状态来瓜分你的注意力,就更顾不过来了。所以 beecodeai 处处做减法:任务列表一行就能看懂状态,看代码改动只看”审查结论”而不是逐行 diff,阶段用结构化标签而不是一堆表单。省下来的每一分注意力,都留给真正需要人判断的地方。


第九章:诚实地谈谈——什么是做不到的

一个好的设计,不光要讲清楚”我为什么这么做”,还得讲清楚”哪些事我做不到、哪些坑我还没填”。这一章就把这些诚实地摆出来。因为恰恰是这些”做不到”,才真正定义了 beecodeai 的边界。

做不到一:验证没法做到完美

我们前面说”验证够强,就不需要完美的 AI”。但现实是,验证本身永远做不到完美,这就划出了 beecodeai 能力的天花板。

验证分几层,每一层的”完美程度”差很多:

  • 语法层(代码能不能编译、过不过类型检查):可以做到完美——编不过就是编不过,机器不会骗你。
  • 行为层(代码跑起来对不对,靠测试):在有测试覆盖的地方是完美的,但测试永远覆盖不全。而且最要命的是——AI 最容易出新问题的地方(那些没人写测试的边角),恰恰是测试覆盖不到的地方。在这些地方,反馈回路是断的
  • 意图层(这段代码到底是不是用户真正想要的):永远没法自动验证。因为”我想要什么”只存在于你脑子里,机器测不出来。你只能靠”看一眼”或者”讨论”,而讨论又没法自动判断对错。

所以那个”验证够强就行”的理想,在语法层成立,在行为层打折扣,在意图层根本不成立。beecodeai 的能力上限,卡在意图层那条永远闭合不上的回路上。 这不是 beecodeai 的缺陷,是 AI 编程这件事的固有边界——任何工具都绕不过去。

做不到二:你的注意力,是最终的瓶颈

第一章讲过,AI 让代码库飞快膨胀,而你的能力固定,所以会失控。beecodeai 能延缓这个失控,但没法消除它——因为最终的”判断者”还是你,而你的注意力(一天能看多少东西、能做多少决策)是有限的、几乎不变的硬瓶颈。

beecodeai 的应对,是把”判断者是你”这件事做到最优配置:

  • 用讨论,把要解决的问题缩小:把一个模糊的、有无数种实现方式的庞大需求,通过讨论收敛成一个清晰的、范围明确的设计。问题变小了,你需要应对的复杂度就小了——这等于在做”防患于未然”,在写代码之前就把失控的风险降下来。而且这一步的”杠杆”极高:一次把需求讨论清楚,省下的是后面无数次的返工。
  • 把你有限的注意力,用在最该用的地方:让你只在真正需要人判断的关键点上介入(这个需求对不对、这个架构取舍怎么选、验证报了红灯怎么办),而不是把注意力浪费在逐行看代码这种机器能干的事上。

但说到底,当任务密度超过你判断力的吞吐上限时,瓶颈还是会显现。beecodeai 做的是”在这个硬约束下,让你这一点点判断力发挥最大效用”,不是”消灭这个约束”。

做不到三:当前很多验证,还得靠人肉安排

这里要诚实地说一个现状:前面讲的那些”异质验证”(测试、代码检查、用不同 AI 交叉审查),目前在 beecodeai 里,主要是靠人在任务里手动要求来实现的,而不是系统自动做的。

实际使用时,是你这个人在任务的评论里一条条提要求:”这次按测试驱动的流程开发”、”要写集成测试”、”跑一下 lint 和 pre-commit”、”派一个专门的测试 AI 去做浏览器自动化测试,把效果截图发出来给我看”。验证是有的、而且相当强,但它存在于”你的编排习惯 + 项目里的方法论文档”里,还没有被固化成系统自动触发的能力

这既是”极简内核”哲学的体现(系统不内建验证引擎,只提供让验证挂靠到任务上的结构),也有它的代价——这部分智能还没产品化,每个任务都得你手动提一遍。这其实指向 beecodeai 一个很自然的下一步:把这些反复出现的验证编排,逐步沉淀成可复用的默认配置,让你不必每次都从头要求。而且验证越强,你就越不用在动手前把每个细节都讨论清楚,省下来的恰恰是最稀缺的注意力。

没想清楚的问题:企业版

还有一个 beecodeai 目前没想透的大问题:它这套设计,怎么撑住”企业”的场景?

开源版 beecodeai 的核心价值是”本地优先、数据主权”——数据在你自己的设备上,不依赖云。但企业需要的是”多人协作、统一管理、审计合规”。这两者有结构性的矛盾:本地优先意味着数据分散在各人设备上,难以统一管理;而统一管理又需要一个中心化的东西,可能削弱数据主权。还有审计——审计要的是”可强制、可证明、不可抵赖”的流程记录,而 beecodeai 的”开/关 + 自觉打标签”提供不了这种强度。

目前没有标准答案,只有一个方向性的思路:不给极简内核硬加流程状态机,而是在已有的事件流之上,叠加可选的、外挂的层——比如一个只读的审计视图(事件流本来就完整可追溯,审计要的东西已经在里面了,只是需要一个专门的视图把它投影出来),或者一个可选的标签校验规则(”没有’已审查’标签就不允许关闭”这种,作为外挂约束,不写死进核心)。强流程作为可选的外层,而不是侵入极简内核。能不能守住这条线,是企业版成败的关键。但商业模式、权限模型、多团队隔离这些问题,目前都还是开放的,没有定论。

一个诚实的产品设计,应该敢于把这些真问题摆在台面上,而不是用一套漂亮的框架假装已经解决了。


结语:beecodeai 最核心的那个判断

最后,把全文收束成一个判断。

AI 编程这件事,骨子里是一个控制系统:你想让代码库走向你的目标,AI 是你的手脚,测试和审查是你的眼睛,而你(带着有限的注意力和判断力)是那个最终的掌舵者。

这个控制系统面对三个绕不开的现实:

  1. AI 让代码库飞速膨胀,但你的控制能力几乎不变——所以会”快速起步,然后失控”。
  2. 大模型是放大器,它同时放大信号和噪声——所以靠”让 AI 写得更快”解决不了问题,错误也会被一起放大。
  3. 验证没法做到完美,而你的注意力是硬瓶颈——尤其是”代码是不是我真正想要的”这件事,永远只有你自己能判断。

面对这三个现实,beecodeai 给出的不是”造一个更精密的控制器”,而是一个刻意的判断

  • 以”任务”为中心,而不是对话或卡片——因为它同时拿到了聊天的实时和工单的可追溯。
  • 核心刻意保持极简(只有开/关、事件流、标签)——因为穷举流程会丧失应对无限复杂度的弹性,而弹性才是阿什比定律真正要求的。
  • 编排靠人和 AI 即时涌现,不靠写死的引擎——因为”下一步做什么”的判断,分散在人和会推理的 AI 身上,远比集中在一个预定义的流程里能应对更多。
  • 验证用异质的、分层的东西(确定性工具 > 测试 > 不同模型的 AI > 人),并且优先把人这个最贵的验证器省下来,留给最关键的判断。
  • 诚实面对做不到的边界——意图层验证闭合不上、注意力是硬瓶颈、企业版还没想透——不假装已经解决。

这背后是一个统一的信念:面对一个充满不确定性、流程没法预知、需要不断吸收新情况的复杂问题,最强的控制力,不来自一个更复杂的机器,而来自一个更克制的内核——它把”做事”交给 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?

这就是这场思维实验的起点。


第一章:给 LLM 建一份器件手册

每一款晶体管出厂都有 datasheet。如果你真的把 LLM 当一个电子器件来用,它的 datasheet 应该长什么样?

让我们先建立映射。这不是比喻——每个 EE 参数在 LLM 中都有严格的对应项,并且映射背后有明确的理论支撑。

工作区(Linear Region)

放大器的线性工作区,是输入信号在一定范围内时,输出与输入成比例的那个区间。超出这个范围,放大器进入饱和,增益急剧下降。

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 导数,饱和区导数指数衰减。

开环增益 A

放大器在没有任何反馈的情况下,输出信号与输入信号的比值。

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 增益——牺牲带宽(上下文)换取增益(推理深度)。

增益带宽积 GBP

这是电子工程中最重要的器件参数之一。对于给定的有源器件,增益和带宽的乘积是一个常数。你想提高增益?带宽就会下降。想要更宽的频带?增益就得降低。

这不是工程权衡,是物理定律——Bode-Fano 准则。

LLM 有没有类似的约束?

Shannon-Hartley 定理告诉我们,单个 transformer 在一次前向传播中能处理的信息量上限是:

\[C_{fwd} \leq \frac{1}{2} L \cdot d_{model} \cdot \log_2(1 + \text{SNR}_{param})\]
  • L = 上下文长度(带宽)
  • d_model = 表征维度
  • SNR_param = 参数信噪比(量化后降低)

关键推论:对于固定模型,L ×(每 token 推理质量)≈ 常数。

这就是 LLM 的增益带宽积。它解释了三个现象:

  1. 扩大上下文窗口为什么会”变傻”:每 token 分到的注意力被稀释了。总信息容量没变,你要覆盖更多 token,每个 token 就只能分到更少的”注意力预算”。

  2. Chain-of-Thought 为什么有效:CoT 以牺牲上下文长度(带宽)为代价,换取推理步数(增益)。”带宽换增益”——电子工程师每天在做的事。

  3. 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 的层级不够,某些抽象维度就缺失了。你没法在”缺失的维度”上做推理。

MoE 的隐秘代价

A 8×7B MoE 和 100B Dense 看起来参数量接近,但本质完全不同。

MoE 的核心操作:输入一个 token,路由器决定把它扔给哪个专家,专家处理完,输出。路由是硬决策——token 完全通过某个专家,跨专家的信息交互很弱。

类比:

  • Dense 100B:100 个人在一个房间里自由对话,任何两个人之间都可能有互动。
  • MoE 8×7B:8 个房间各 7 个人,每个问题扔进一个房间,房间之间几乎不交流。

这就是为什么 MoE 在知识密集型任务(不同领域恰好对应不同专家)上表现好,但在需要全域推理的任务(数学证明、长程规划)上不如同等活跃参数的 Dense。

理解了这些差异,我们才能回答下一个问题:小模型如何组合起来达到大模型的效果?


第四章:级联——以复杂度换等效上下文

我们先看第一个组合技术:级联。

在放大器中,多级级联是最基本的提高增益的手段。每一级放大一点,总增益是各级增益的乘积:

\[A_{total} = A_1 \times A_2 \times A_3\]

但代价是每级的带宽独立:$BW_{total} = \min(BW_1, BW_2, BW_3)$。最窄的那一级决定了整个系统的带宽。

LLM 级联

┌─────────┐    ┌─────────┐    ┌─────────┐
│ 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      ← 恒流源(共享偏置)

差分放大器的核心特性:

  1. 差模信号被放大:Q1 和 Q2 接收到不同的信号 → Vout = G × (Vin+ - Vin-)
  2. 共模信号被抑制:Q1 和 Q2 接收到相同的噪声 → Vout ≈ 0

共模抑制比 CMRR 量化了这个能力。好的差分对能将共模噪声抑制 60-100dB。

LLM 差分的核心问题

把两个 LLM 当差分对管用,它们的”噪声”是什么?

一个 LLM 的错误 = 知识错误 + 注意力遗漏 + 推理路径错误 + 随机采样误差。

关键问题是:这些噪声在两个模型之间是相关的还是独立的?

如果两个模型都训练在 Common Crawl 上,它们的知识错误高度相关——共模噪声,差分无效。 如果两个模型的架构不同(GPT vs Claude),推理路径可能有差异——部分差模,差分有效。 如果给同一个模型两个不同的 prompt,注意力分布会有差异——注意力错误大幅去相关,差分有效。

Prompt 差分:改变工作点

这可能是本文最重要的一个洞察。

晶体管在不同偏置点下,噪声特性是不同的。改变集电极电流,改变 V_CE,噪声谱跟着变。

LLM 也一样。同一个模型,不同 prompt = 不同的”工作点”,噪声的去相关程度不同:

噪声分量 随 prompt 变化? 差分有效性
ε_knowledge 不变(知识在参数里) ✗ 共模
ε_attention 显著变化 ✓ 差模
ε_path 显著变化 ✓ 差模
ε_stochastic 变化但可控 △ 部分差模

证据:长文档阅读中,单模型的遗漏率约 15-25%。但用两个正交视角的 prompt(如”财务视角”和”战略视角”),共同遗漏率降到 3-8%。CMRR ≈ 7dB。

四种 Prompt 差分策略

视角反转:财务专家 vs 战略顾问。两个 prompt 在语义空间中指向不同的方向,注意力焦点不同。

约束反转:自由发挥 vs 每条结论标注证据来源。改变了推理路径——一个是联想式,一个是检索式。这两种路径产生的错误分布截然不同。

尺度反转:500 字总结 vs 逐章提取数据点。解耦了宏观结构和微观细节。二者分别漏掉的东西往往是互补的。

角色反转:分析优势 vs 找漏洞。两个 prompt 在嵌入空间中方向相反。对抗性去相关效果最强,但需要好的仲裁器来区分”真正的矛盾”和”视角差异”。

模型差分 + 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,在自然语言推理中也成立。

  • 生成一个正确的数学证明 vs 验证一个已有的证明 → 后者容易得多
  • 写一个无 bug 的程序 vs 运行测试 → 后者是自动化的
  • 编一个合理的故事 vs 检查故事是否有逻辑矛盾 → 后者可以依赖规则

β 不需要和 A 一样强。 β 可以由更小的模型、确定性规则引擎、检索系统共同构成。

三层 β 架构

β₁ 语法层(成本极低,零误判)

编译器、JSON schema 验证器、数学表达式检查器。这些都是确定性的——不会出错。在代码生成任务中,rustc 的编译错误信息精确到行号和列号。这是完美的语法 β。

β₂ 事实层(成本中等,有噪声但可控)

对输出中的每个事实声明,用检索系统在数据库/文档/代码库中查找证据。风险是检索可能漏掉或找错,但 SNR 远好于依赖模型自身的”知识”。

β₃ 逻辑层(成本较高,但比自检好)

用一个专门的 3B 小模型做 consistency check。”如果 A 成立且 B 成立,C 是否必然成立?”这个小模型不需要知道事实,它只需要检查推理的内部一致性。因为它是独立的模型,它不会和生成模型共享同样的推理盲区。

防止振荡——EE 的补偿理论直接可用

反馈太激进会导致振荡。模型在两个答案之间来回跳:

迭代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 能力不是一个新东西的突然出现。它是输出阻抗终于低到能驱动工具,同时反馈网络把失真降到了可用水平。两个效应叠加,感觉像个相变。


第七章:组装——LLM358 运放

有了差分级、增益级(级联)、反馈网络,我们可以画完整电路图了。

这不是示意图,是严格的信号流图。每个模块有输入、输出、传递函数、噪声模型:

                        ┌─────────────────────────────────────────────┐
                        │              反馈网络 β                      │
                        │  ┌──────┐  ┌──────┐  ┌──────┐              │
                        │  │ β₁   │  │ β₂   │  │ β₃   │              │
                        │  │语法  │  │事实  │  │逻辑  │              │
                        │  └──┬───┘  └──┬───┘  └──┬───┘              │
                        │     └────┬────┴────┬────┘                   │
                        │          │  Σα·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。差分提取器是”差分放大器”——输出差异的幅度和位置:

  • 两个路径都说 X → 共模,高置信,抑制
  • 只有 A 说 Y → 差模,标记为”单路径发现”
  • A 说 X,B 说 not-X → 矛盾,触发深度仲裁

求和点——信号混合

\[\Sigma = x_{original} + \alpha \cdot V_{diff} - e\]

原始输入(直通)+ 差分信号(揭示不确定性区域)- 反馈误差(修正信号)。三个信号在此汇合。

增益级——级联分解

G₁ Planner(任务分解)→ G₂ Executor(逐步执行)→ G₃ Reviewer(检查+组装)。每级可以是独立的小模型,通过结构化接口传递信息。

输出缓冲级——阻抗匹配

格式强制(JSON schema 约束,不是靠 prompt 祈求)+ 工具调用(函数签名强制匹配)+ 后处理验证(不符合 → 自动触发反馈修正)。把 Z_out 降到趋近于零。

成本效益

这才是关键问题:组合设计到底划不划算?

方案 成本(相对 7B) 质量(相对 7B) 性价比
裸 7B 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 比对。

整个反馈网络 β 从”概率近似”变成了”确定性地完美”。

这是从模拟反馈跨入数字反馈——噪声不再累积。每一个错误信号都精确到行号和测试用例。

为什么这个任务也恰恰是组合设计需要的

代码翻译天然击中组合设计的所有用武之地:

  1. 上下文爆炸:1 万行 C → 可能 5 万行 Rust(安全包装)。单个 LLM 放不下。
  2. 全局约束:类型系统、ownership、生命周期——不能分块独立翻译。
  3. 级联天然适用:G₁ 粗翻译 → G₂ 接口修复 → G₃ 语义修正。
  4. 差分天然适用:逐函数独立翻译 vs 语境感知翻译 → 接口不匹配自动暴露。
  5. 反馈天然适用:编译 → 修复编译错误 → 测试 → 修复行为错误 → done。

系统工作流

差分级: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 选择

  • SQLite amalgamation (~230K 行 C) → 超大规模,单 Agent 无法处理
  • zlib (~20K 行) → 中等规模,广泛应用
  • libjpeg-turbo → SIMD 汇编,中高难度
  • Lua 解释器 → 含 VM,中等规模
  • stb_image → 单头文件,指针密集

如果这套实验跑通了,它意味着什么

  1. 组合放大器理论在 LLM 领域成立。差分+级联+反馈的组合确实突破了单器件极限。
  2. 完美 β 使反馈系统逼近信息论极限。$A_{CL} \approx 1/\beta$,β 越完美,对 A 的要求越低。
  3. 系统 GBP > 任何单个模型的 GBP。用 2.5× 成本获得 4× 质量提升。
  4. 大模型器件的”集成电路时代”已经到来。不需要等待更强的模型,用现有模型 + 巧妙拓扑已经在很多任务上够用。

最重要的是:这个实验完全可复现。 输入是 C 源码,输出是 Rust 源码,成功标准是二进制行为等价。任何人、任何时候、用相同 benchmark,得到的结果可比较。


第九章:差分三定律

在整个思维实验中,我们反复回到差分的核心问题:两个路径的噪声到底有多相关?

这最终凝结为三条定律。

第一定律:噪声源独立性决定 CMRR 上限

\[CMRR_{max} = -10\log_{10}(\rho_{noise})\]

其中 ρ_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\]

差分后的信息量 ≤ 两路独立推理的信息量之和(数据处理不等式)。

第三定律:差分代价是并行度的函数

\[Cost_{diff} = N_{paths} \times Cost_{per\_path}\]

N=2 是最优的。N=3 比 N=2 多 50% 成本,但 CMRR 只改善 ~2dB。边际收益急剧递减。


第十章:从运放到 SoC——更大的图景

单个 LLM358 运放解决单个推理任务。真正的 AI Agent 系统需要什么?

┌────────────────────────────────────────────────┐
│              LLM 系统级芯片 (SoC)                │
├────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────────┐ │
│  │ 前端 LNA  │  │ 混频器    │  │ ADC           │ │
│  │(输入理解) │→│(任务分解) │→│(结构化输出)   │ │
│  │ 低噪声   │  │          │  │              │ │
│  │ 高 Z_in   │  │          │  │              │ │
│  └──────────┘  └──────────┘  └──────────────┘ │
│                                                │
│  ┌──────────────────────────────────────────┐  │
│  │          DSP 核心 (LLM358 阵列)            │  │
│  │  ┌────┐ ┌────┐ ┌────┐ ┌────┐           │  │
│  │  │ U1 │ │ U2 │ │ U3 │ │ U4 │  ...      │  │
│  │  │推理│ │验证│ │检索│ │综合│           │  │
│  │  └────┘ └────┘ └────┘ └────┘           │  │
│  │  每个 Ux 是一个 LLM358 运放单元           │  │
│  └──────────────────────────────────────────┘  │
│                                                │
│  ┌──────────┐  ┌──────────┐  ┌──────────────┐ │
│  │ DAC       │  │ 功率放大  │  │ 执行器        │ │
│  │(文本生成) │←│(格式化)   │←│(工具调用)     │ │
│  └──────────┘  └──────────┘  └──────────────┘ │
└────────────────────────────────────────────────┘

前端是信号调理(理解输入、分解任务),核心 DSP 是一组 LLM358 单元各司其职,后端是功率输出(驱动外部工具和系统)。

这不是科幻。每一个模块在今天的技术条件下都可以实现——只是还没有人把它们系统地组合起来。


结语:大模型的分立元件时代过去了

回顾整个思维实验的轨迹:

  1. 一个直觉——GPT-3 到 GPT-5 的进化,越看越像阻抗匹配
  2. 一份器件手册——把 LLM 严格映射到 EE 参数
  3. 认清极限——参数规模、上下文、训练数据,都已经或接近撞墙
  4. 发现类比——单个晶体管的 GBP 也是受限的,但我们用运放突破了它
  5. 设计差分——用 prompt 和模型的正交组合来抑制共模噪声
  6. 设计反馈——用没那么多噪声的验证器来修正有噪声的生成器
  7. 组装运放——完整电路图,每个模块有严格的理论对应
  8. 提出验证——代码翻译 + 二进制 oracle,一个完美 β 的实验台

如果这个理论是对的,那意味着:

不需要等待更强的模型。用今天的 7B 模型,通过差分+级联+反馈的组合,就可以在很多任务上达到甚至超过 100B 模型的效果。

就像 1960 年代的工程师不需要等待更好的晶体管——他们用分立元件搭出了运放,而运放的性能超越了任何单个晶体管。

大模型的”分立元件时代”过去了。现在要做的,是”集成电路设计”。


本文是我和 AI 搭档百万的一次深度理论对话的记录和整理。文中所有直觉来自人类,所有理论引用和形式化推导在 AI 的协助下完成。这是一次真正的”思维共舞”。

*相关文章:控制论视角下的 AI 编码 AI Coding Team 管理笔记 从第一性原理设计的 AI 编码验证体系*

控制论视角下的 AI 编码:二阶系统、放大器与注意力的最优分配

2026-05-17 16:00:00

用阿什比的必要多样性定律重新理解 AI 编码——这不是工程问题,是控制论问题。

起点:两种矛盾的 AI 编码体验

Charles Leifer 在 Tokens and Dreams 里描述了一个困境:

一方面,AI 能在一两句话的提示下生成精美的交互式仪表盘,体验如魔法般神奇。另一方面,在略微复杂的项目里,”整个过程漏洞百出,各种不易察觉的错误层出不穷,我甚至觉得让 AI 写代码是浪费时间。”

他引入了一个框架来解释这种矛盾:阿什比必要多样性定律

这篇文章是和我 AI 搭档深入讨论控制论与 AI 编码的记录。我们从阿什比定律出发,发现这个问题比表面看起来深得多——它最终指向了第二控制论、放大器理论、以及”注意力是最稀缺的控制资源”这个核心约束。


一、阿什比必要多样性定律

1.1 定律本身

控制论先驱 W. Ross Ashby 在 1956 年的《控制论导引》中提出:

只有多样性才能吸收多样性。 Only variety can absorb variety.

形式化表达:

\[V_{controller} \geq V_{environment}\]

即:调节器所能表达的状态数量,必须大于或等于被控制环境的状态数量。否则控制失效。

1.2 经典例子:恒温器

恒温器有 3 种响应(开制冷 / 开加热 / 待机),环境有 3 种状态(温度过高 / 过低 / 正常)。多样性匹配 → 控制成立。

如果环境突然多了”湿度过高”、”气压骤降”——恒温器没有对应的响应能力 → 多样性失配 → 控制崩溃。

1.3 定律的约束方向

情况 结果
$V_c \gg V_e$ 过度设计,浪费资源
$V_c = V_e$ 刚好匹配,最优
$V_c < V_e$ 控制崩溃

AI 编码的陷阱在于:$V_e$ 不是固定的——每次 AI 生成新代码,$V_e$ 就在膨胀。而 $V_c$(人类的认知多样性)是近乎固定的。这是一个注定会崩的不等式。


二、控制系统的五个理论组件

任何一个控制回路,从理论上拆,只有这五个东西:

2.1 本质变量(Essential Variables)

阿什比的原话:本质变量是那些必须被维持在特定范围内的变量,如果超出范围,系统就”死亡”或”解体”了。

对于 AI 编码系统,本质变量有三个:

E₁:功能偏差。 代码实际行为与需求的差距。这是最直观的——变了需求,代码没跟上,系统就在”错误”状态。

E₂:结构复杂度。 系统的状态空间大小。复杂度超过临界值,系统不会立即死——但它的可演化性归零,任何新需求都无法实现。死亡方式是窒息,不是心跳停止。

E₃:响应速率。 从需求出现到代码匹配需求的时间。如果代码响应速度比需求变化速度还慢,系统在追赶中振荡,永远跟不上。

三个本质变量的耦合动力学:

需求变化
    │
    ├──→ E₁ ↑ (新需求和旧代码的偏差增大)
    │
    └──→ 调节器动作:AI 生成代码
              │
              ├──→ E₁ ↓ (代码匹配新需求)
              │
              └──→ E₂ ↑ (代码库状态空间扩大)
                        │
                        ├──→ 如果 E₂ 超过调节器认知容量
                        │    └──→ E₁ 未来每一次下降都变慢
                        │          └──→ E₃ ↑
                        │
                        └──→ AI 生成的代码可能引入错误
                              └──→ E₁ 表面下降但实际没有(假绿灯)

核心矛盾:E₁ 的每一次下降都推高 E₂,E₂ 的升高削弱未来降低 E₁ 的能力,同时拖慢 E₃。 这是一个带阻尼的正反馈循环——短期看起来正常,长期崩。

2.2 扰动(Disturbance)

环境的变量,推动本质变量偏离目标范围。在 AI 编码中,扰动 = 需求变化

需求变化的特殊性在于——它不是一个外部输入的精确信号。精度和温度没法比。温度是物理量,可以任意精度测量。需求是认知对象——在被表达之前甚至不完整地存在于你自己的脑子里。

2.3 调节器(Regulator)

对扰动做出响应,使本质变量保持在目标范围内的装置。

在 AI 编码中,调节器是耦合的人 + AI 系统——不是纯人,也不是纯 AI。这个问题在后面会展开。

调节器的能力被两个东西约束:

  • 信道容量(能处理多少信息量)
  • 传递函数(给定输入,产生什么输出)

2.4 传感器(Sensor)

把本质变量的实际值映射成调节器能接收的信号。

传感器的理论属性:映射函数(实际值 → 信号)、采样率信息损失(传感器输出信号的 variety ≤ 实际值的 variety)。

2.5 效应器(Effector)

把调节器的输出映射成对被调节系统的实际作用。

2.6 整个回路的理论表述

扰动 D ──→ 系统 S ──→ 本质变量 E ──→ 传感器 ──→ 信号 Z
                                                      │
                                                      ↓
                        效应器 ←── 动作 A ←── 调节器 R
                          │
                          ↓
                        系统 S(回到开头)

控制是否成立,取决于这个链条上每一段的信息传递是否保留了足够的 variety。链条上任何一个环节的信息损失,都会导致控制失败。


三、这不是恒温器:第二控制论

3.1 为什么第一控制论不够

第一控制论(阿什比、维纳)的核心假设:观察者在系统外部。系统的目标(参考输入 $R$)是给定的。观察者测量系统,对比目标,计算误差,施加控制。

这三个假设在 AI 编码系统中全不成立

假设 AI 编码的现实
观察者在外部 你在内部。你的判断改变系统,系统的输出改变你的判断
目标是给定的 需求在你的脑子里,但精确形式在代码写出来之前你也不知道
误差可测量 没有客观的”偏差函数”,你只能说”感觉不对”

这不是工程问题。第一控制论在理论上就无法对这种系统建模。

3.2 第二控制论:观察者在系统内部

海因茨·冯·福斯特 在 1970 年代提出根本性转向:

不要研究”被观察的系统”,要研究”观察系统”——观察者与被观察对象构成的耦合系统。

三个核心概念:

建构认知: 神经系统不接收”信息”,只接收神经脉冲。”信息”是观察者自己建构的。你看到的不是”代码是否正确”,你看到的是屏幕上的 token 序列。”正确”是你大脑建构出来的判断。

双重视角: 格里高利·贝特森的洞察——从单一视角看不到的东西,可以从两个视角的关系中看到。就像双目视觉,一只眼睛看到二维平面,两只眼睛之间的差异产生了深度知觉。”正确性”不是从任何一个单一传感器来的信号,是从两个独立传感器的不一致中涌现的关系信息。Agent 审 Agent 失效不是因为它俩都瞎——是因为它们共享同一个视角。

特征形式(Eigenform): 冯·福斯特的核心数学概念:

\[x_{n+1} = f(x_n)\]

如果递归收敛,极限值 $x^* = f(x^)$ 就是 $f$ 的特征值。$x^$ 不在 $f$ 的定义之外——它是 $f$ 自身递归应用的稳定点。

3.3 “目标自发现系统”的正式模型

这不是随动系统。随动系统假设 $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$ 是建构性差异函数——它不是你比较两个已知量的结果,而是观察者在看到生成结果后新发现的差异

这套方程是双重反馈回路——外回路调节代码使其接近当前理解的需求,内回路调节需求本身。两个回路耦合,速率不同。

稳定性条件:

  • $\alpha$ 太大:每次看到代码都大幅修改需求,系统振荡不收敛
  • $\alpha$ 太小:死抱着最初的需求不变,收敛到错误的需求
  • $G$ 的生成速度 » 需求更新速度:代码堆积超过需求澄清速度,越过认知事件视界

特征值 $x^*$ 由三个东西共同决定,不是任何单一因素:

  1. 你的认知结构——对”好代码”的审美、”完成”的定义、容忍度阈值
  2. AI 的生成能力——$G$ 能探索的状态空间边界
  3. 外部校准信号——用户反馈、业务指标等不能内部产生的信号

四、AI 在控制回路中的四个理论位置

同一个 AI 模型,不同 prompt,在控制系统中的位置完全不同。AI 是一个变换器基质——它可以被配置成不同的变换器,取决于输入信号结构和信息耦合关系。

判断 AI 是什么,不看模型权重,看信息耦合结构:输入和输出之间的 variety 比决定方向,prompt 中的约束决定映射的确定性。

位置 1:需求放大器(Requirement Amplifier)

输入:人的低 variety 需求表达
输出:高 variety 的(代码 + 设计 + 测试建议 + 文档)
能源:训练数据中的代码模式
上下文 C:需求 + 设计决策

失效模式:放大器噪声——输出包含需求中未指定的 variety。冗余功能、过度设计、风格不一致。

控制方法:输出必须经过异质传感器(CPU 测试 + 架构检测)过滤后才进入代码库。

位置 2:审查/分析器(Pattern Recognizer)

输入:代码库的片段
输出:识别到的模式列表(不判断好坏)

关键约束:不允许 AI 生成修改建议,只允许 AI 列出观察到的模式

“三个模块各自实现了缓存逻辑”是事实。”应该合并”是判断。AI 做前者,人做后者。

位置 3:传感器方向(Quasi-Sensor)

输入:测试/检测结果(原始输出)
输出:PASS / FAIL(严格约束的输出空间 ≤ 几个状态)

成立条件:输出空间被约束到足够小(≤ 几个状态),且约束是形式化的。

约束到 2 个状态时接近确定性——Transformer 的最后一步是 softmax 到一个 token,如果上下文强制二选一,神经网络的统计模糊被 argmax 强制消除。如果上下文允许自由发挥,统计模糊被保留和放大。

这解释了为什么独立 prompt + 严格约束的 AI 能可靠地判断测试结果,而写代码的 AI 自己跑测试就不可靠。

位置 4:环境模拟器(Environment Simulator)

模拟用户交互结果。理论上危险——模拟的环境反馈不是真实环境反馈,而是训练数据中的统计模式。

为什么写代码的 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 文本,是模型权重中的共激活路径


五、放大器理论

5.1 放大器的本质:不是”变强”,是”借力”

阿什比的正式定义:

放大器是一个装置,输出 variety 大于输入 variety。差额 variety 从外部能源中获得。

关键不在”大于”,在“从外部能源中获得”

阿什比举的例子是继电器:5V 小电流控制 220V 大电流。variety 都是 2(通/断),但输出状态的影响力远大于输入。差额的 power 从 220V 电源借来。

放大器的四个理论要件:

组件 作用 继电器 AI
输入信号 低 variety 的控制信号 5V 控制电流 Prompt 文本
能源 高 variety 的外部储备 220V 电源 训练数据中的代码模式
选择器 从能源中选取和组织 电磁铁触点 Transformer 注意力机制
输出 被组织出来的高 variety 行为 220V 输出 生成的代码

放大器不创造 variety。它从能源中选取和重组 variety。选择器决定选什么,能源决定能选什么。

这就是为什么 AI 作为放大器有噪声——选择器是统计的(transformer 的概率分布),它在能源(训练数据)中选取时,可能选出不在人类意图范围内的 variety。

5.2 放大器与传感器:两个方向的变换器

阿什比用统一概念变换器(Transducer)

放大器:低 variety → 高 variety(扩张方向),需要外部能源
传感器:高 variety → 低 variety(压缩方向),被动映射,不需要能源

区分放大器和传感器的唯一判断标准:能源从哪里来,variety 往哪个方向变。

5.3 Prompt → Token 全过程的逐级分析

一次完整的 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 代码生成时来自同一个分布。

5.4 三种能源的性质与最优部署

能源类型 来源 成本 variety 质量 噪声特性
人类注意力 大脑 极高,不可扩展 最高(有语义判断) 几乎无噪声
Token 计算 GPU 推理 中,可扩展但有上限 中等(统计采样) 结构性噪声
CPU 计算 确定性执行 低,高度可扩展 最低(固定规则) 无噪声

核心原则:把每种能源部署在其噪声特性不造成伤害的位置。

人→意图澄清(只有人能判断”这是不是我真正想要的”)

Token→生成代码(低 variety 需求 → 高 variety 代码,必须有放大器)

CPU→验证执行(无噪声——说红灯就是红灯,不会被”说服”)

能源替代的正确方向:CPU 替代 Token 替代人类——能 CPU 做的不用 Token,能 Token 做的不用人。但信任等级反过来:CPU 输出可以信任(确定性),Token 输出必须验证,人类判断是最终裁决。


六、注意力的控制论模型

6.1 人的传感器:精度无限、带宽有限

人在这个系统里的传感器不是低精度传感器。是极高精度但极低带宽的信道

  理论极限 实践约束
精度 无限(一行行读,任何细节都能理解) 无约束
分辨率 无限(能区分任意两个代码状态) 无约束
带宽 极其有限(单位时间能处理的代码量非常小) 唯一约束

这意味着:你不是看不到问题,是来不及看所有东西。控制失败的模式不是”没看出来”,是来不及看

6.2 注意力的信息论公式

从香农的角度,信道容量:

\[C = B \cdot \log_2(1 + \frac{S}{N})\]
  • $B$ = 带宽(阅读速度,受限且近乎固定)
  • $S/N$ = 信噪比(理解深度,非常高)

这个信道是高信噪比、低带宽的。优化方向不是再提高信噪比(你已经够准了),而是:

  • 让你只接收需要高信噪比的信号
  • 把不需要高信噪比的信息路由到其他信道

6.3 注意力不该浪费的地方

  • 代码细节 — AI 应该自己搞定,验证体系应该自动覆盖
  • Agent 之间的一致性 — 它们一致性高不代表对,一致性低也不代表有问题
  • AI 的自我报告 — “一切正常”是噪声,因为它没有能力知道自己不正常

6.4 注意力应该连接的传感器

  • 验证体系的红灯 — 异质传感器报警,高价值信号
  • 环境反馈 — 真实用户的异常行为模式
  • 架构不变量被突破 — 你定义的约束是否被违反
  • AI 的不确定性信号 — 不是它说”好了”,是它说”我不确定”

七、完整的控制架构

从以上理论推导,AI 编码有效控制的完整架构:

┌──────────────────────────────────────────────────────┐
│              第 0 层:异质 CPU 传感器网络               │
│                                                      │
│  • 类型检查(形式逻辑,完全异质)                        │
│  • 自动化测试(CPU 执行,确定性输出)                    │
│  • 架构不变量检测(图论算法——依赖方向、循环依赖、        │
│    模块边界、调用路径白名单)                           │
│  • 混沌/模糊测试(主动注入故障,发现未知脆弱点)         │
│  • 复杂度指标监控(代码行数涨幅 vs 功能涨幅)            │
│                                                      │
│  输出:红灯(阻断)/ 异常(升级)/ 绿灯(不消耗注意力)   │
└────────────┬─────────────────────────────────────────┘
             │
    ┌────────┴────────┐
    ↓                 ↓
 红灯(阻断)     绿灯(通过)
    │                 │
    │                 └→ 不消耗人的注意力
    ↓
┌──────────────────────────────────────┐
│ 人的注意力(唯一跨域节点)             │
│                                      │
│ 只接收三种信号:                       │
│ ① 架构不变量被突破(需要决策)          │
│ ② AI 不确定的信号(需要校准)           │
│ ③ 环境异常模式(需要判断)             │
│                                      │
│ 输出:意图校准 + 规则调整 + 设计决策    │
└──────────────┬───────────────────────┘
               │
               ↓
┌──────────────────────────────────────┐
│ Token 放大器(位置 1)                 │
│                                      │
│ 输入:需求 + 设计决策                  │
│ 输出:代码 + 测试建议                   │
│ 上下文:与审查链路隔离                  │
└──────────────┬───────────────────────┘
               │
               ↓
┌──────────────────────────────────────┐
│ 代码库(被调节对象)                    │
│                                      │
│ • 模块化边界隔离复杂度                  │
│ • 接口契约由人定义和守护                │
│ • AI 在边界内自由生成                   │
└──────────────────────────────────────┘

八、三条上下文隔离规则

规则 1:上下文隔离

位置 1 的 AI(放大器)和位置 2/3 的 AI 不能共享会话上下文。

位置 1 的上下文包含需求理解和生成激活。这些激活不能进入任何审查链路。

规则 2:方向锁定

每个位置只做一个方向的变换,不切换。

  • 位置 1 永远是放大器方向(低→高 variety),只生成,不判断
  • 位置 2 永远是识别方向(高→中等 variety),只列模式,不判好坏
  • 位置 3 永远是传感器方向(高→极低 variety),只分类,不解释

规则 3:只有人跨域

只有人的注意力连接放大器域和传感器域。

AI 在放大器域不能直接接收传感器信号。传感器信号必须先变成人可判断的形式,由人决定是否需要修改需求/约束,然后人重新发 prompt 给放大器。

这不是效率损失,是控制论上的必要隔离。


九、Agent 审 Agent 的正确用法

Agent 审 Agent 不是不能用,是不能用它的结论。它只能产生待外部验证的假设

❌ Agent A 审 Agent B 的代码 → "代码质量好,建议合并"
   (用同质的统计判断替代异质验证)

✅ Agent A 审 Agent B 的代码 → "发现以下模式:[列表],
   建议自动验证以下方面:[列表]"
   然后 CPU 传感器去跑验证,验证结果才是真正的信号

Agent 的审查输出是测试用例的生成器,不是质量的判断者


十、与企业管理理论的殊途同归

这些原理不是比喻。控制论、企业管理理论、AI 编码系统管理理论在数学上共用同一套骨架。

斯塔福德·比尔的可生存系统模型(VSM)

比尔把阿什比定律直接拉到组织管理上。一个可生存的组织必须具备五个功能子系统——缺任何一个,组织最终会死。

子系统 功能 AI 编码中的对应
S1:执行 直接与环境交互,产生价值 AI 生成代码
S2:协调 防止 S1 各部分互相冲突 模块化接口契约
S3:控制 资源分配、监控 S1 是否按规则运行 CPU 传感器网络 + 人的注意力
S4:情报 扫描环境变化,预测未来 用户行为分析、环境反馈
S5:政策 定义组织身份和终极约束 人的核心判断:做什么、不做什么

赫伯特·西蒙的有限理性

管理就是决策。决策的质量受限于决策者的信息处理能力。所以组织的本质功能是压缩信息、分解决策,使每个决策者在自己的能力范围内做判断。

这和”CPU 传感器压缩信息 → 红灯送到注意力 → 人在认知容量内做决策”是同一个原理。

卡尔·维克的 sensemaking

组织不是”存在于外部世界的东西”。组织是人通过不断解释和重新解释自己的行为而建构出来的。组织是意义建构的持续过程。

这和 $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 验证系统的第一性原理

2026-05-09 16:00:00

写代码是便宜的,验证是贵的。但验证的本质是什么?

背景

上一篇笔记讲了 AI Coding Team 的管理方法——马斯克守底线、黄仁勋守质量、雷军守价值。但那篇更偏”怎么做”,这篇要深入”为什么”。

起因是读到孔某人的文章《大组织内的AI Coding过度推行是一种饮鸩止渴》,里面提到美团31万行代码AI重构的困境:AI Coding让代码产出速度暴增,但系统复杂度增长得更快,团队的维护能力跟不上。

这让我重新思考一个根本问题:验证系统的第一性原理到底是什么?

不确定性 = 认知与现实的差距

先区分两个容易混淆的概念:

  • 认知:我认为现在是什么样。关于当前现实的判断,是心智模型。
  • 预期:我认为未来会怎样。关于未来的判断,是意图投影。

两者的关系:认知是预期的基础。如果认知本身就偏了,预期必然偏。

关键区别:验证只能观测当下,不能观测未来。 跑一个测试,你观测的是此刻代码的行为,跟此刻你对代码行为的认知之间的差距。用当下的观测去推断未来——那是推断,不是验证。

所以严格来说:

不确定性 = 认知与现实的差距

预期是派生的。修正认知偏差是根本。

验证做的唯一一件事:拿现实来校准认知。校准完了,认知更接近现实了,不确定性就降低了。

认知与现实的双向收敛

减少不确定性,不是让认知去匹配现实,也不是让现实去匹配认知,而是两者共同收敛到一起,凝固下来

  • 方向A:认知 → 现实(学习、验证、测试)——”我原来以为是这样,观测后发现是那样,更新认知”
  • 方向B:现实 → 认知(建造、实现、创造)——”我想要这样,我造出一个东西来,让它变成这样”

产品开发是两者的交替循环:认知→建造→观测→更新认知→再建造……直到两者凝固——认知稳定了,现实也稳定了。凝固不是永久的,下一轮迭代可以重新打回流体态。

验证的强度公式

验证的严格程度,应该正比于:

验证强度 ∝ 不确定性 × 失败代价

  • 芯片:后果极其严重(流片一次几百万美元),不确定性高 → 验证极度严格
  • 火箭:后果是物理毁灭,不确定性极高 → 验证极度严格
  • Web应用:后果是可回滚的,不确定性中等 → 验证中等
  • 内部工具:后果低,不确定性低 → 验证轻量

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→合并→部署测试环境→我体验验证。

关键设计:

  • AI做不下去时可以直接找我,不需要层层上报
  • 反馈回路在每个环节都有:设计review、代码review、集成测试、我体验测试
  • 逃逸到下游的问题,追溯到上游的验证缺失,补充验证

基于GitHub的实现

整个系统不需要自建基础设施,用GitHub原生工作流就够了:

  • Git仓库 = 共享工作空间 + 版本管理
  • PR = 提交 + Review + 反馈 + 合并
  • Issue = 任务分配 + 跟踪 + 升级
  • GitHub Actions = 自动化检查
  • CODEOWNERS = 自动分配reviewer

仓库本身就是上下文。每个Agent clone仓库后,意图文档、蓝图、其他模块的设计文档都在里面。不需要额外的”上下文推送”机制。

系统生长路径

第1代:你直接和一个AI讨论+实现,验证靠你自己
    ↓
第2代:你讨论,分配给2-3个AI并行实现,简单PR review
    ↓
第3代:从问题中长出新机制
  - 接口对不上?→ 加接口契约检查
  - Review质量低?→ 加上下文自动推送
  - Agent卡住?→ 加阻塞自动上报
    ↓
第4代:大部分验证自动化,你只在意图层和异常时介入

写在最后

验证系统的第一性原理可以归结为一句话:

验证的本质是减少不确定性。不确定性 = 认知与现实的差距。

所有验证方法——测试、review、CI、讨论对齐、用户反馈——都是在做同一件事:用观测来缩小认知和现实之间的差距。

在这个AI Coding的时代,写代码越来越便宜,但认知和现实之间的差距不会自动缩小。你的价值从”能写代码”变成了”能定义正确的问题”和”能建验证系统来保证答案是对的”。

黄仁勋说得对:写代码是便宜的,验证是贵的。但更准确的说法是——写代码是AI的事,验证是你的事。

AI Coding Team 管理笔记

2026-05-02 16:00:00

不审查代码,审查系统。不信任代码,信任验证。

背景

我写代码几乎 95% 以上是让 AI 写的。Python 后端我可以仔细 review,发现问题让 AI 改。但对于不熟悉的领域——比如 APP 开发、C++、Rust——我没法逐行审查。随着 AI 越来越强,多个 Agent 并行开发,代码量远超我能看的范围。

核心问题:注意力有限,如何保证交付质量?

答案是:从”审查代码”转变为”验证行为”。

马斯克:守住底线

马斯克管理 SpaceX 的方式——他不懂每个零件的制造细节,但他知道物理极限。

他的方法是第一性原理 + Failure Mode Analysis。不管方案多漂亮,他只问一个问题:

最坏情况是什么?

他常说的话:

  • “给我解释最坏情况”(worst case explanation)
  • “这个方案的物理极限在哪?”
  • “如果这个东西失败,最可能因为什么?”

映射到软件——你不需要 review AI 写的 Rust 代码,但你能判断方案在系统层面是否合理:

  • 并发瓶颈在哪?锁的粒度对不对?
  • 分布式场景下会丢数据吗?
  • 依赖的第三方服务挂了,降级策略是什么?

具体执行:让 AI 做 failure mode 分析,你 review 分析结果,不做取舍决策(速度 vs 质量 vs 成本)。

黄仁勋:守住质量

黄仁勋最核心的一个数字:NVIDIA 验证工程师的数量是设计工程师的好几倍。

他的哲学:写代码(设计)是便宜的,验证是贵的。不要试图理解每个细节,但要保证验证系统覆盖每个细节。

对应到 AI 团队管理——先建验证基础设施,再让 AI 干活:

  • 单元测试框架(AI 写,CI 自动跑)
  • 集成测试(核心流程端到端验证)
  • 模糊测试(对 API 自动喂随机输入)
  • 性能基准(每次改动前后对比)
  • 安全扫描(dependency audit + SAST)
  • lint / 类型检查(任何语言都有成熟工具)
  • 金丝雀部署(灰度发布,线上自动验证)

每个任务的标准流程:

  1. 需求明确(你定义)
  2. AI 写实现
  3. AI 写测试
  4. 另一个 AI 做 code review
  5. 自动跑验证 pipeline
  6. 全绿 → 合并,红灯 → 打回

你只看两样东西:验证覆盖率 + 最终通过/失败报告

核心理念:一个人检查所有人的代码不可扩展,但一套检查系统可以无限扩展。

雷军:守住价值

雷军跟黄仁勋完全不同的思路。黄仁勋建验证体系,雷军会说你搞得太工程师思维了。

雷军的哲学就七个字:专注、极致、口碑、快。

他的做法是基本可用就发布,让用户告诉你哪里不对。MIUI 早期版本 bug 多到离谱,但每周发一版更新,用户疯狂反馈,团队跟着改。

  • “把砍掉的功能再做精简,还是太多了”
  • “不要闭门造车,把东西扔出去”
  • “口碑来自细节,细节来自亲身体验”

具体执行:

  • 不追求完美,追求够快。”能跑、核心功能对,就发布”
  • 每周花一小时,把自己当小白用户,走一遍核心流程
  • 砍功能:先做一个功能做到极致,上线拿到反馈,再决定下一步

自动化测试验证不了的东西——体验、交互、需求真伪——只有真人能告诉你。

最好的 review 是用户的投诉。

三位一体

三个人分别守住不同的维度:

  马斯克 黄仁勋 雷军
守住 底线 质量 价值
防止 出大事才知道 bug 率失控 做一堆没用的
核心动作 问最坏情况 建验证体系 问用户反馈
关键问题 会炸吗 测到了吗 有人用吗

缺任何一个维度都不行:没有马斯克,系统出大事才知道;没有黄仁勋,bug 率控制不住;没有雷军,做了一堆没用的东西。

架构设计怎么做

不是自己写文档,是跟 AI 讨论、拍板、让 AI 写。

你脑子里有想法/方向
       ↓
跟 AI 讨论(可能多轮)
  "我觉得应该用事件驱动,你觉得呢?"
  "并发场景下消息顺序怎么保证?"
  AI 回复 → 你追问 → AI 补充 → 你再质疑
       ↓
你拍板:"就这个方案,XX部分用A方案,YY部分用B方案"
       ↓
AI 写架构文档、接口定义、技术方案
       ↓
你 review 文档(确认 AI 有没有理解对你的决策)
       ↓
确认无误,文档就是开发契约

时间分配:

  • 60% 跟 AI 讨论、质疑、头脑风暴
  • 20% 拍板决策(选 A 不选 B,这个优先级高那个先不做)
  • 20% review AI 写的文档和接口定义

你的核心竞争力不是”写文档写得漂亮”,是讨论过程中暴露出来的判断力和决策力。就像 CEO 不会自己写 PPT——CEO 提供观点和判断,秘书(AI)负责整理成文档。

AI 审 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 在这个体系里自由发挥。

从文本补全到状态机循环:重定义 AI Agent 的操作系统架构

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 架构,以此解决上下文爆炸的根本问题。


一、 核心矛盾:日志驱动 vs. 状态驱动

目前的 AI Agent 大多基于 Re-Act 模式,其运行逻辑本质上是“日志驱动”的:

  • 输入:User Input + 全部历史对话+ 上一步工具返回。
  • 过程:LLM 阅读所有历史,预测下一步动作。
  • 输出:新的动作或回复。

这种模式的问题在于,为了维持“状态”,模型必须保留所有“过程”。这就像 CPU 为了执行下一条指令,必须把过去执行过的所有指令记录都读一遍。随着时间推移,Context Window 必然溢出,或者因注意力机制的 $O(N^2)$ 复杂度导致计算崩溃。

操作系统的启示: 在计算机体系结构中,CPU 执行指令只依赖两个东西:

  1. 当前指令指针:告诉 CPU 下一步做什么。
  2. 寄存器状态:告诉 CPU 当前数据是什么。

CPU 不关心上一毫秒执行了什么,只关心当前状态。Agent 也必须如此。


二、 架构重构:LLM 即汇编指令

如果我们将 Agent Loop 视为一段汇编程序,那么大语言模型(LLM)本身不再是那个无所不知的“大脑”,而是一条极其复杂的“状态转移汇编指令”

在这个模型下:

  • LLM 推理 = 一条汇编指令执行(耗时 100ms)。
  • Context Window = 寄存器堆
  • 磁盘/向量库 = 主存
  • Prompt = 指令操作数

Agent 的运行模式应当从“追加日志”转变为“寄存器操作”。每一次推理,都是一次 “状态读入 -> 计算 -> 状态写回” 的过程。


三、 设计原理:Context Window 的槽位化

既然 Context Window 是昂贵且有限的“寄存器”,我们就不能像写流水账一样随意填充。必须像设计 CPU 寄存器一样,对其进行严格的分区和结构化设计。

我们将 Context Window 划分为固定的“槽位”,每个槽位承载特定的功能:

1. .text 段:指令区(只读)

这是 Agent 的内核代码,定义了 Agent 的行为逻辑。

  • R_System (Instruction Set)
    • 定义 Agent 的身份、能力边界、工具使用规范。这相当于 CPU 的指令集手册,告诉 LLM 这条指令能做什么。
  • R_IP (Instruction Pointer)
    • 本质:程序计数器 + 任务栈。
    • 内容:当前执行的计划步骤。
    • 示例
      [Goal] Fix Bug #404
      [Step 1/3] Read main.py (Done)
      [Step 2/3] Locate error line -> [Current IP]
      [Step 3/3] Apply fix
      
    • 作用:LLM 只需看 R_IP 即可知晓“我在哪,要去哪”,无需回溯历史。

2. .data 段:数据区(读写)

这是 Agent 的工作台,也是上下文工程的核心。

  • R_State (Global State Register)
    • 本质:全局状态寄存器。
    • 约束长度严格受限(如 4K tokens)。
    • 形式:结构化文本(JSON/YAML),与向量等价,但人类可读可调。
    • 内容示例
      {
        "task_status": "debugging",
        "open_files": ["main.py"],
        "error_line": 102,
        "key_variables": {"user_id": null}
      }
      
    • 维护不追加,只覆盖。 通过 Edit Tool 进行增量更新。
  • R_Working (Scratchpad)
    • 本质:通用寄存器(AX, BX)。
    • 内容:当前步骤的临时数据、工具调用的原始返回结果。
    • 生命周期:极短。任务步骤完成后立即清空,为下一轮腾出空间。

3. .stack 段:调用栈

  • R_CallStack
    • 当 Agent 执行子任务或调用子 Agent 时,将当前的 R_StateR_IP 压栈。任务结束后弹出恢复。

四、 实现机制:熵减循环

基于上述架构,Agent 的 Re-Act Loop 变成了一个标准的 CPU 指令周期。这个过程的核心在于 “信息压缩”

Cycle 1: Fetch(取指)

注意力机制聚焦于 R_IPR_State。模型不需要知道“之前发生了什么”,只通过当前状态判断“现在该做什么”。

Cycle 2: Decode(译码)

模型根据 R_System 的规则,分析当前状态是否需要调用工具,或者是否需要更新内部状态。

Cycle 3: Execute(执行)

模型输出两部分内容:

  1. Tool Call:对外部世界的操作(如 Read_File)。
  2. Delta_State:对内部寄存器的修改指令(如 Update_State)。

Cycle 4: Writeback(写回)

这是解决上下文爆炸的关键步骤:

  • 外部数据:工具返回的大量数据(如 10,000 行日志)写入 R_Working
  • 状态压缩:LLM 分析 R_Working,提取关键信息(如“错误在第 500 行”),生成 Delta_State 更新 R_State
  • 清理丢弃 R_Working 中的原始数据。

结果:10,000 行的日志被压缩成了 R_State 中的一个字段 "error_line": 500。上下文占用仅增加几个 Token,但信息被完整保留。这就是“状态机”对抗“上下文爆炸”的武器。


五、 新范式:精心设计 Context Window 的布局

在这种架构下,我们需要精心设计 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阅读器」或者关注公众号「自宅创业」可以订阅博客更新,也可以在 关于我 页面找到我的联系方式,欢迎交流!