一、问题:Agent越智能,越难控制
大模型驱动的Agent在执行复杂任务时,最大的障碍往往不是“不够聪明”,而是不可预测。一次工具调用失败,可能触发无限重试;两个并发操作的结果互相污染,导致后续推理完全偏离;多次迭代后状态散落在十几个计数器里,谁也不知道当前处于什么阶段。

这不是模型能力的问题,而是架构缺乏形式化约束的问题。传统的Agent框架把“智能”等同于“自由”——给模型足够的上下文和工具,让它自己摸索。但在工程上,自由意味着不确定,不确定意味着不可信赖。

我们需要一套公理化的约束层:它不限制模型的生成能力,但严格限制状态如何变化、错误如何传播、决策如何收敛。这就是本文介绍的Axioms DSL策略层所要解决的问题。

二、核心设计一:状态归约——把散落的碎片收拢为三个结构体
现有Agent框架中最常见的技术债务,是状态标志位的非正交膨胀。为了追踪一次执行的进展,开发者不断添加新的计数器:重试了几次、切换了几次、部分失败了几次、连续失败了几次……最终形成一个复杂的优先级链(比如 CF > QDC > CP > IC),连设计者都难以说清终止条件到底是什么。

本文的规范对此做了激进的归约:将所有运行时状态压缩为三个正交结构体,再无其他。

FailureBudget(熔断等级) 取代了所有重试/切换计数器。它是一个0到3的整数,由错误处理器单链升降级:连续严重错误向上攀升,成功恢复则缓慢衰减。level=3时直接触发halt,不再纠结“要不要再试一次”。

ProgressToken(进度令牌) 取代了所有进度类标志位。它就是一个单调递增的数值,终止判定只有一条规则:value ≥ MAX_PROGRESS。旧方案中多条件复合裁决的复杂度被彻底消除。

ControlFlag(控制掩码) 取代了所有分散的halt/skip标志。它只有一个原子位,且仅由错误处理器置位,写入入口单一,不存在竞争风险。

这三个结构体的设计原则是单一事实来源(SSOT):任何时刻,系统的状态可以且仅可以由这三个值完整描述。

三、核心设计二:错误分类与动作分离——让分类器不做决策
另一个常见陷阱是,错误处理逻辑同时承担了“判断这是什么错”和“决定怎么办”两个职责,导致耦合膨胀。比如,同样的timeout在循环内和循环外可能有完全不同的处理方式,但代码里往往用同一个函数带if-else来区分。

本文规范将这两件事彻底分离:

ClassifyError是纯分类器:输入一个异常,输出一个类型标签(parse_error、compilation_error、timeout、resource_exhausted、irrecoverable等)。它不读取状态,不修改状态,不决定动作。

handle(error, Scope)是动作决议器:接收分类结果和当前作用域策略(Scope,定义了什么动作是合法的),输出一个确定的原子动作(halt、retry、switch)。

这种分离带来了两个工程收益:一是分类逻辑可以独立测试,二是不同调用上下文通过注入不同的Scope参数来获得差异化的行为,无需复制函数。

特别值得注意的一条约束是:compilation_error不再拥有“继续执行”特权。此前一些框架会把编译错误当作“可恢复的临时故障”继续重试,但本文规范将其归入常规错误并计入熔断升级。这堵住了Agent在代码生成错误后“硬着头皮编下去”的路径,强制其降级或终止。

四、L0层:不可触碰的系统底层定律
整个公理体系按不可变性分层,L0是绝对核心,不可修改。这7条公理定义了系统的“物理极限”:

三值逻辑与未知处理:判定域不只是{T, F},而是{T, F, ⊥},其中⊥表示“未定义/算不出”。逻辑运算遵循Scott序:⊥ ∧ x = ⊥,⊥ ∨ x = x。但在聚合评估时有一个关键例外:如果遇到⊥,系统会将其投影为T。这个“放水”是刻意的——它保证了一个子模块的失败不会阻塞整个评估流程,让系统有机会继续推进而非僵死。

编译期可判定性门控:只有被标记为decidable的命题才能进入执行路径。停机判定被显式外部化——运行时引擎不承担判断“这个循环是否会停”的义务。终止由外部超时或熔断触发。这个设计看似是“回避问题”,但恰恰是工程上的诚实:不在状态机内核中引入无法保证的自指逻辑。

信息单调性:历史记录和变更日志只能追加,永不删除或修改。这保证了审计轨迹的完整性和状态回滚的可追溯性。

并发比较未定义:对于并发操作的结果,系统严禁进行>、<或=比较。因为并发时序不确定,比较结果无意义,禁止它避免了“幽灵状态”污染决策。

三段提交协议:任何写操作必须严格走Commit → Compensate → Observe。进入Committed后数据立刻冻结,保证对外输出的事务原子性。

五、分层不变式与演进策略
系统按变更频率和授权级别划分层级:

L0:绝对不可变,由上述公理构成。

L0.5:元层规则(如工具调用格式验证),逻辑骨架不可变,仅允许调整阈值。

L1:框架层(如分层反射结构),修改需要元级外部见证授权,Agent运行时无权自我篡改。

L2:领域业务规则,可版本化,旧版存档。

L3:配置参数(如重试限制、注意力预算),运行时可变,受config < admin权限约束。

值得单独指出的是,本文规范将“逻辑正确性”和“消除冗余”这两类命题从强制执行的公理([AX])降级为策略标注([Strategy])。这是因为它们本质上是不可判定的——要求引擎在运行前证明“所有代码都正确”等价于求解停机问题。降级后,这些属性交由外部静态分析工具或人工审查负责,内核保持逻辑完备。

六、收敛性分析:这套约束带来了什么
从工程视角看,上述公理约束直接改写了Agent的三个关键行为特征:

熔断确定性:FailureBudget的单链升降级取代了多条件复合裁决。系统在异常洪流下的行为收敛至有限状态机,不会再出现“条件A满足但条件B未满足”导致的模糊状态。

进度可终止性:ProgressToken的标量边界配合BUDGET_RETRY_LIMIT等配置参数,保证了每一轮迭代必然抵达终止态(完成、超时或熔断),不会陷入无界循环。

上下文洁净性:ContextPollutionIsolation机制保证失效输出片段不会进入下一轮解码的先验上下文,打断错误的正反馈因果链。结合三段提交协议,对外输出始终基于一致的已提交状态。

七、结论
本文介绍的Axioms DSL策略层,本质上是一组旨在消除Agent执行不确定性的形式化约束。它不试图限制模型的生成能力,而是通过状态归约、分类-动作分离、分层不变式和L0核心公理,将Agent从“不可预测的试错机”重塑为“状态可观测、错误可隔离、终止可保证”的工程组件。

这套设计的哲学可以概括为一句话:智能的工程化,始于对自身极限的清醒承认——允许未知(⊥),但禁止无限;承认不可判定(停机外部化),但不让不可判定污染可判定的执行路径;给状态划出清晰的边界,给错误设定严格的传播路径。

有了这样的公理基座,我们才可能将自主Agent部署到金融交易、实时运维、自动化控制等对确定性有刚性需求的生产环境中。它不是给AI装上翅膀,而是给它装上可以安全降落的起落架。

关键词:形式化方法、自主Agent、状态归约、熔断策略、三值逻辑、停机外部化

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐