外壳是确定性的,核是概率性的
一句话
声明 desired state,观测 actual state,做 diff,收敛。失败不是异常路径,是这个循环里被自然吸收的一帧。
这句话在三代基础设施里原样成立:
| 代 | desired state 形式 | reconcile 对象 | 收敛保证 |
|---|---|---|---|
| IaC / GitOps | HCL / YAML,存在 Git 里 | 云资源 | 强——确定性 diff |
| Kubernetes | spec | 运行时状态 | 强——controller 持续 reconcile |
| AI Agent | 自然语言意图 | 任意开放任务 | 概率性 |
三代不是三个不相关的技术,是同一个范式的三次落地。
为什么是现在
前两代对 desired state 有一个硬要求:必须机器可精确表达。HCL、YAML 都是这种表达。代价是适用域被锁死在"能被精确写成配置的东西"上——基础设施可以,任意工作不行。
LLM 第一次打破了这个要求。desired state 可以是模糊的自然语言,系统自己生成 diff、自己生成动作。reconcile 范式因此从"基础设施"扩张到"任意工作"。
这不是一个新范式,是同一个范式的第三次落地。
代价:收敛性退化为概率
自然语言没有等价性判定。你没法像 diff 两份 YAML 一样,diff 两句话哪句更接近目标。于是 idempotency 和收敛性,从前两代的数学保证,退化成"大概率收敛"。
这一点必须诚实点出,否则这篇会被锤成 hype:AI agent 不是变成了可靠的 K8s controller,它是被工程手段架在了一个可靠的外壳里。
一句话收束:
外壳是确定性的,核是概率性的。
K8s 把不可靠的容器嵌进可靠的 control plane;agent 工程把不可靠的 LLM 嵌进可靠的外壳。同一个套路,换了层。
五个工程杠杆(按性价比排序)
外壳具体是什么?五个杠杆,从最便宜到最贵。
1. 缩小 desired state 的歧义
加 schema、加 example、加 acceptance criteria。本质是把第三代往第二代拽——能写成 spec 的部分,就别留在自然语言里。这是为什么 structured output 和 eval set 是 agent 工程的地基。
2. 可验证的子目标
把开放任务切成有判定函数的小步,每步用确定性方法验证——编译过、测试过、grep 到关键字。LLM 只管生成动作,验证外包给传统系统。Claude Code、Cursor 这代 coding agent 真正的秘密不是模型变强,是把验证外包给了编译器和测试。
3. 多次采样 + 投票/裁判
同一个 desired state 跑 N 次,用另一个 LLM 或规则做 judge。成本换收敛率,性价比排在前两个杠杆之后。
4. 有界重试 + 人类断路器
reconcile loop 必须有 budget——步数、token、时间,超了就停下来问人。K8s 有 backoff,agent 也得有。最容易被忽视的一点:很多 agent 失败模式不是"不收敛",是"在错误方向上无限收敛"——它一直在动,但动错了方向。budget 拦的就是这个。
5. 可观测性 = 可干预性
每一步的 observation、reasoning、action 都要能看、能 diff、能回滚。这是为什么 agent 平台会不断向 K8s 的 events / audit log 形态靠拢。
这五个杠杆和 K8s 的对应不是巧合
它们分别对应 K8s 生态里已经跑了十年的机制:CRD schema、admission webhook 里的 validating rule、多副本 + leader election、backoff + circuit breaker、events / audit log。不是 AI agent 工程发明了新解法,是把 K8s 的解法在新的不确定性等级上重新实现了一遍。
区别只有一处,也是最根本的一处:K8s 的核心组件是确定性状态机,加固外壳是为了应对基础设施层面的偶然故障——网络分区、节点宕机。AI agent 的核心组件本身就不确定,外壳要应对的不是偶然故障,是核心默认不收敛。前者是给可靠的东西上保险,后者是给不可靠的东西造一个能用的容器。
这篇没有展开"从 Prompt 到 Harness"的演化阶梯——那条线单独成篇。这里只想把一件事钉死:三代基础设施在解同一个数学问题,第三代的新东西不是范式,是范式第一次要吞下一个不收敛的核。