短期内不存在通用 AI 工作流魔法
——以及为什么每个人都应该自己实现和维护自己的 AI 自动化工作流
一、问题的提出
过去两年,AI 自动化领域出现了一个被反复推销的命题:存在(或即将出现)一种通用的 AI 工作流框架,能够跨模型、跨平台、跨部署形态地编排提示词、工具调用、多代理协作、上下文管理与故障恢复。采用它,就能“专注于业务逻辑”,把工作流的复杂性交给框架。
这个命题在商业上极具吸引力。本文要论证的是:它在工程上是错误的,而且不是“尚未成熟”意义上的错误,是参考系不成立意义上的错误。
本文的结论是:每个认真使用 AI 自动化的人,都应当自己实现并维护自己的工作流。这不是一种主张,是一个在当前 LLM 底层性质下被推出的必然结果。
论证从工程级工作流的定义开始,逐层收紧,最后落到可执行的判据。
二、定义:工程级工作流是半闭环控制器
“AI 工作流”指代两种东西,必须先分清。
demo 级工作流是一个循环:发消息,收消息,可能调用一两个工具。它可以通用,因为它不承担工程责任。它不判断空转,不判断完成,不判断上下文是否接近崩溃,不判断失败是瞬时还是结构性。它的通用性来自于它什么都没做。讨论它没有意义。
工程级工作流对模型行为做实时判断与控制。它判断本次输出是否构成实质进展,当前是否处于无进展循环,上下文是否接近上限,工具调用是否卡死,子代理是否失联,失败应当重试、换向还是暂停。每一项能力都针对具体被控对象的失效模式建立。
本文讨论第二种。
工程级工作流的本质是半闭环控制器。要看清这一点,必须先看清严格闭环为什么不可能。
严格闭环要求三件事同时成立:被控对象连续可观测,控制信号连续可作用,反馈时延远小于系统时间常数。恒温器满足全部三条。LLM 三条全部不成立:
模型内部状态不可观测,可观测的只有输出文本、工具调用、令牌计数、事件流——离散、稀疏、滞后。一次推理是原子调用,无法在生成中途改变方向,无法对第 50 个令牌施加修正,控制是分轮的、离散的。一次调用时延是秒到分钟级,工作流关心的状态变化也是秒到分钟级,回路不比被控对象快,实时纠偏不存在。
采样机制进一步保证:即使前两条成立,也无法精确修正。能改变的只是下一次采样的分布,不能确定采样落在哪里。控制对象是分布参数,不是轨迹。
因此,在当前 LLM 上闭环控制不可行。唯一可行的是半闭环。
半闭环的结构是:在离散监督点上观测状态、调整控制律,两个监督点之间按既定策略开环执行。执行段与监督点交替。
它受三个硬约束,违反任何一条,半闭环就会退化为开环或震荡:
监督点必须覆盖所有状态可能已变的边界。漏掉任何一类边界,那类失效只在恰好下一个监督点才被发现,而那时可能已晚。
监督点之间,控制律不能依赖实时状态。执行段没有观测点。所有依赖状态的控制必须放在监督点上。执行段只允许纯提示词策略或纯工具协议。
监督点频率与被控对象时间常数必须匹配。太稀则失效发现太晚,太密则开销超过收益且因噪声频繁误判。匹配是实测标定,不是推导。
这三个约束是本文后续所有论证的基础。它们共同指向一个结论:控制律必须针对被控对象标定。
三、被控对象是三层的联合
标定的对象是(模型 × 宿主 × 部署)。三层各自绑定,然后交叉耦合。
3.1 模型语义
控制律的第一层绑定点是模型对语义的理解方式。
不是能力强弱,是模型在具体对齐、训练分布与推理机制下对同一提示做出什么行为。差异是结构性的,不能靠调参抹平。
一个实例:某长期运行的自动化插件,针对模型在“发送消息”与“中止运行”上的语用混淆,必须在工具协议层把二者彻底分离——发送接口绝不隐式中止,中止只能是独立显式动作。因为一旦发送附带中止语义,模型会在“继续任务”时误杀正在执行的工具,造成不可恢复的中断。
这个约束不是从通用原则推导的。它是被咬过之后才知道的。
同一工程实践还必须处理:模型把“对端已受理”误读为“对端已处理完毕”而无限等待不存在的回执;模型完成任务后只输出文本、不调用回复接口,父任务永远收不到完成信号;模型在新任务中复用旧会话 ID,污染上下文;模型用“待命”“静默 ping”类空转消息维持循环,架空无进展暂停;模型逐字转发子代理报告,冒充自己的工作。
每一条都是先发生、后防范。通用框架不可能在发生前防范,因为不知道会发生;发生之后也不知道防谁,因为没见过这个具体模型在具体宿主上的具体失效。
3.2 宿主运行时
第二层绑定点是宿主的事件模型、工具调用协议、会话状态语义、并发模型、认证与发现机制。
外行倾向认为“模型都一样,宿主只是管道”。事实相反。同一件事在不同宿主上语义可能完全不同。
同一真实插件在两个宿主版本上支持同一套功能,两个版本之间是语义级差异:宿主 A 推事件钩子,宿主 B 是订阅式事件流,插件必须自行实现流健康监视与重连,否则用户中止信号静默失联而自动续推仍在跑;宿主 A 有权威忙闲表,宿主 B 没有,插件必须自建事件表且与另一条独立路径同源,否则出现“系统认为空闲、实际在跑”的分叉;宿主 A 消息记录为嵌套结构,宿主 B 为扁平记录,必须完整翻译,否则进度评估恒空、无进展刹车不触发、自动续推无限重发;宿主 A 令牌口径按条,宿主 B 按会话,且必须区分“单条上下文”与“会话总用量”,否则自动压缩过早触发然后永不收敛;宿主 A 中止信号是特定错误类型,宿主 B 是带原因字段的中断事件,必须区分用户中止、宿主关机、被新任务取代、空闲超时,把非用户中断误判为用户中止会静默暂停用户还在跑的任务。
这些差异没有一个能靠“适配一下”跨过。它们改变的是控制律依赖的事实基础。对半闭环三个约束的作用是直接的:监督点覆盖哪些边界取决于宿主暴露哪些事件;执行段能依赖什么取决于宿主在何处可干预;监督点频率取决于宿主并发模型下状态变化的时间常数。宿主一变,三个约束全部重标。
3.3 部署形态
第三层是部署。同一套模型与宿主,部署不同,控制律仍需重标。
多实例并行触发跨进程竞态,哪些状态需跨进程协调、协调延迟代价、崩溃后回收方式取决于拓扑。本地与远程改变“如何判断一个调用是失败还是尚未返回”。并发度决定每个超时阈值的实际含义——一个看似温和的两分钟停滞阈值,在十四路并发下批量杀死正常会话,因为首字节到达时间分布在高并发下完全改变,必须为“尚未产出任何内容”的状态单独设宽限期。计费与限额决定令牌统计口径、成本字段、压缩接口参数形态。
3.4 不可分解
三层不是独立维度,是交叉耦合的。提示词策略是模型语用特性与宿主工具描述的联合函数;超时阈值是模型时间分布与宿主并发模型的联合函数;工具协议是模型对动词的语义理解与宿主工具 schema 的联合函数;上下文策略是模型上下文退化特性与宿主令牌口径的联合函数。
这不是“耦合很严重”的修辞。它有可检验的证明:
假设存在分层通用:模型层、宿主层、部署层各自独立正确,组合即可工作。则对任意两个组合应存在一个保语义映射,把一组的控制律映射到另一组。
但控制律每一项都是三者的联合函数。改模型会改变宿主下有效的提示词策略;改宿主会改变模型的行为时间分布;改部署会改变模型与宿主联合观察到的并发行为。不存在这样的保语义映射。
因此分层通用不成立。
半闭环的三个约束正是这一不可分解性的具体体现。监督点覆盖、执行段依赖、频率匹配,每一个都是三层的函数。
四、LLM 的两个底层性质
三层耦合已经足以否定通用。LLM 的两个底层性质把它推到更强的结论。
4.1 PRNG:控制对象是分布
LLM 推理不是确定函数。采样温度、top-p、专家路由、浮点非确定性全部依赖 PRNG。
后果是:控制对象是一条轨迹的分布,不是一条轨迹。同模型、同提示词,两次运行结果不同。无法完全复现一次运行。能做的是统计意义上的控制——保证大多数情况下不触发失效,而不是绝不触发。
所有阈值都是统计标定。“两分钟无事件即认定卡死”是分布经验值,必然有误杀率与漏杀率。所有防护都是概率护栏。不能证明系统不会空转,只能证明在测试分布上空转概率低于某值。
需要加一个边界,否则会误读为“PRNG 是问题”:统计控制本身不是问题。工程上大量控制器本来就是统计的。问题在于分布本身在动时,统计控制失去固定分布假设。控制论中,针对固定分布的统计最优控制器在分布漂移下退化为比简单鲁棒控制器更差的控制器。PRNG 不是问题,PRNG 加分布漂移才是问题。
4.2 代际漂移:参考系本身在动
PRNG 只是让运行在分布内抖动。更严重的是:模型代际更替改变的是分布本身,不是分布的样本。
每代新模型在架构、训练数据、对齐目标、推理机制上都变了。不是同一分布上的均值漂移,是另一个分布。
后果是:上一代标定的所有阈值、提示词策略、工具协议,在新一代上不再是同一参考系下的量。旧防护在新分布下可能过严、过松、或完全无效。新分布的失效模式不会提前知道——只能再次被咬。
“通用于多代模型”在原理上不成立:它要求跨代连续的参考系,代际差异破坏了这个前提。
4.3 两个性质叠加
PRNG 让运行在分布内抖动。代际漂移让分布本身在动。三层耦合让控制律是(模型 × 宿主 × 部署)的函数。
三个方向同时漂移。通用框架要求存在一个稳定的参考系——哪怕只是一个“模型行为空间”,让抽象有意义。而三个方向的持续漂移保证了这个参考系不存在。
五、抽象必然失败,且更烂
构造通用系统,必须先假设模型与宿主之间在哪几个维度上会变。这个假设是设计时的训练分布。设计者没跑过所有组合,分布是想象出来的。
通用系统就是过拟合到想象分布上的系统。这是机器学习里的标准失效:训练分布在真实分布上有偏移时,过拟合系统比简单稳健基线更差。通用框架面对的偏移是三个方向的持续偏移:运行内抖动、运行间变化、代际漂移。
从压缩角度看更清楚:抽象丢信息,该丢的是噪音。但这里丢掉的——具体失效模式、具体阈值、具体时序——恰恰是让系统工作的信号。通用把信号当噪音压掉了。
这不是“效果弱一点”,是在真实部署里更烂。三个机制。
补偿逻辑互相打架。每条防护针对一个具体失效模式。模型 A 需要严格约束,模型 B 在同一约束下过度防御。通用系统只能同时装配两类防护:对 A 太紧,对 B 太松——比任何专用系统在各自地盘上都差。同一提示词对一个模型是救命绳,对另一个是噪音。通用只能平均,平均值在任何具体点上都不是最优。
通用系统无法调试。真实部署里只有一部分代码路径被触发。其余路径是死代码还是坏代码,不知道。专用系统每天在跑,bug 可复现;通用系统在特定组合上的 bug,连复现都做不到。更糟的是:通用系统把标定成本推迟到运行时,并把它转成“看不懂的 bug”。自己标定的 bug 是“我知道我在防什么,它没防住”;框架的 bug 是“我不知道它在防什么,也不知道为什么没防住”。
评测集本身过拟合。评测用例是设计者想象中会发生的用例。真实失效不在里面。“通过评测”只说明通过了设计者的想象。再往下一层:通用框架的评测往往是自评——作者在自己设计的任务上测自己的框架。结构上等价于训练集等于测试集。专用系统的评测来自真实运行中发生的失效——测试集是生产环境贡献的,不是设计者贡献的。因此“评测通过”对通用框架而言结构上不可信。在 PRNG 与代际漂移下,评测连稳定性都不成立:同一模型两次跑分不同,新一代不是旧一代的改进而是另一个分布。用基准分数论证“通用”,等于用移动目标在某一刻的投影论证覆盖。
六、那怎么办
结论不是“每个人都必须从零写一个插件”。结论是:必须拥有对工作流的控制权。
拥有控制权有三种形态。它们不是“推荐做法”,是根据你对控制的实际需要和承受成本的能力进行的选择。
自己写。成本最高,控制最完整。适合长期运行、承担实际责任的系统。
自己组装可审计的组件。用开源、可读、可改的构件自己拼。成本中等,控制中等,但每一层都在自己的版本控制里。出问题能定位到具体一层,能改,能回滚。
使用现成框架,但保留退出权。如果确实要用现成框架,最低要求是能冻结、能替换、能实测。冻结是能锁定它使用的模型版本、宿主版本、自身版本,升级由自己决定。替换是每条防护、每个阈值都能被单独替换或关闭,而不是全有或全无。实测是在自己的(模型 × 宿主 × 部署)组合上有可复现的实测数据,不是只在作者的组合上有。
三种形态的共同点:保留“什么时候重做、要不要重做、按什么标准重做”的决定权。
不能冻结、不能替换、不能实测的框架,无论多流行,都是不可接受的依赖。
三个投资方向:
在具体组合上做深。提示词策略、阈值、工具协议、监督点设计、状态机做透。控制律显式化,在代码库中可读、可改、可版本控制。每条防护有它防护的失效模式作依据;每条阈值有实测作依据;每个评测用例来自真实发生过的失效。
冻结被控对象。锁定权重版本、容器化推理、固定宿主版本。把“什么时候重做”变成由自己决定的问题。冻结不是保守,是把不可控漂移转化为可控计划。
保留退出权。代码不可迁移,经验可迁移。踩过的坑、建立的防护结构、标定阈值的方法论可复用;代码针对具体组合,别的组合用不了。因此每层依赖都必须可替换——不是将来会替换,是现在就能替换。
七、判据
本文不针对任何具体产品。但有一条判据是通用的:
任何以“通用 AI 工作流”为核心卖点的方案,无论叫框架、平台还是课程,都应被要求出示它在你的(模型 × 宿主 × 部署)组合上的实测数据。
出示不了,就是没有。没有实测数据而声称通用,只有两种可能:只覆盖 demo 级工作流(什么都不判断),或在你的组合上必然失败。两种都不值得付费。
更一般地:凡是“买来即用”的承诺,都应被要求出示失效模式清单与阈值实测来源。出示不了,就是卖想象。
判据不需要相信任何人,只需要被使用:
- 它列出了哪些失效模式?是它自己实测的,还是抄来的?
- 它列出了哪些阈值?实测环境是什么?和我的环境差多少?
- 它在我的组合上有没有可复现的测试?测试是谁写的?是不是自评?
- 它能不能被我冻结、替换、关闭单项?如果不能,我退出时的代价是什么?
四个问题,任何一个答不上来,可信度已经确定。
八、结语
本文不否定 AI 自动化的价值。恰恰相反:AI 自动化的价值是真实的,只是不能被打包成通用框架。
真正能工作的自动化系统,必然深度定制到具体(模型 × 宿主 × 部署)组合的半闭环系统。它看起来不通用,因为它本来就不通用。它的价值不在覆盖一切,而在在一个具体组合上,把系统行为驯服到可工程化。
这件事没有人能替你完成。因为“完成”的定义,是在你的具体组合上被咬得足够少——这个“你的”,不可替代。