介绍 OpenProse、NLAHs 等自然语言 Agent 框架的架构模式与 Attractor-Guided Engineering 方法论,为大规模 AI 应用开发提供参考。
相关项目:OpenProse (@openprose/reactor)、NLAHs(自然语言智能体驾驭框架)、AGE 模板、nop-chaos-flux(AGE 的生产级实现)AGE 方法论系列:Attractor Before Harness: A Methodology for Large-Scale AI Development、From Spec-Driven Development to AGE
OpenProse、自然语言智能体驾驭框架(NLAHs)和引吸子指导工程(AGE)都试图解决同一个问题:当 AI 智能体的输出不可靠时,你该怎么办?
前两者在控制层提供答案——OpenProse 使用确定性运行时,以便目标能够被精确维持;NLAHs 使用自然语言文档,以便驾驭框架策略可以被审查。AGE 提出的问题先于控制层:首先应该维持什么样的结构?
如果方向层不存在,更好的运行时和更清晰的驾驭框架只会导致整体结构继续漂移。
OpenProse 从运行时抽象出发——设计一种约定语言和执行引擎,使 AI 智能体能够维持随时间"保持真实"的目标。
NLAHs 从表示介质出发——将智能体驾驭框架策略从纠缠的控制器代码中外化为可编辑的自然语言文档,由共享运行时 IHR 解释和执行。
AGE 从工程流程出发——设计一套文档和工作流系统,使人-AI 协作能够持续收敛到稳定的结构。
OpenProse 问:如何保持目标不变?NLAHs 问:如何使单个智能体运行遵循可审计的策略?AGE 问:系统被推离轨道后,为什么它仍然会回到正确方向?
约定:本文中,"NLAHs" 指论文中提出的整体框架(自然语言智能体驾驭框架),"NLAH" 指单个策略文档,"IHR" 指共享运行时(智能驾驭运行时)。
OpenProse 和 AGE 的核心抽象对应两种不同的数学对象。
不动点:f(x) = x。当系统置于此点时,它不会移动。判断准则是严格相等。不动点可以是稳定的(附近的点收敛到它),也可以是不稳定的(附近的点远离它)。不动点的概念并不蕴含吸引域的存在。
引吸子:一个集合(一个点、一个极限环、一个奇异引吸子),使得周围区域中的所有初始状态(吸引域)随时间演化趋向它。关键性质不是"把它放在那里它就停留",而是"从附近开始你会被拉回来"。引吸子不需要是单个点;它可以是一个流形。系统不需要精确到达它——只要轨迹在吸引域内且在收敛,就足够了。
OpenProse 的指纹比较 fingerprint == fingerprint 是一种不动点检查:输出是否与之前相同?如果是,它就保持不变。
AGE 的"系统收敛到稳定结构"可以用引吸子标准理解:系统不需要精确到达理想状态;只要控制机制不断将其拉回稳定结构的附近,就足够了。
一个是状态判断——"它到达了吗?"另一个是过程判断——"方向对吗?"
除了收敛机制的区别(不动点 vs 引吸子),还有更深层的本体论差异:控制目标 vs 引吸子。
控制目标
一旦控制框架建立,控制目标定义"控制应该指向哪里"。它假设:
控制目标是外部强加的规范,驱动执行器符合它。
数学引吸子
引吸子由系统自身的动力学产生——周围区域中的所有初始状态随时间演化趋向它。关键性质:
引吸子为控制提供最终因。它先于控制存在,不在控制中。
注:AGE 的引吸子只是类比;它不是自然涌现的数学对象,而是工程化的语义场:人定义结构约束,工作流将这些约束转换为跨会话的恢复动力。其判断准则不是"没有外部设计",而是"扰动后的恢复是否由持久结构场驱动,而非一次性指令"。
操作手册告诉工人如何组装零件。工人遵循手册,当他们偏离时通过查阅手册来纠正。手册是控制目标——它要求工人"知道"它并主动执行它。
重力井是引吸子——无论如何推动物体,物体的动力学自然将其拉回。物体不需要"知道"重力井存在。
OpenProse 的责任(Goal/Maintains/Continuity)是外部定义的规范。运行时通过指纹比较检测偏差,偏差时重新渲染。这是控制目标加确定性执行。收敛依赖运行时强制重新执行规范。
NLAHs 的驾驭框架模式(约定 + 阶段 + 状态/验证/恢复/停止规则)告诉 IHR 如何组织单个任务运行。IHR 不是硬编码的控制器,而是使用运行时策略解释 NLAH,将条款翻译为子智能体调用、状态更新、验证门和制品约定。如果智能体偏离,验证/恢复/停止规则等作用是控制目标,不是系统动力学的自然收敛。"行为灵活但仍被策略指导"不是引吸子语义;它是运行时语义约束下的灵活执行。
扰动后恢复动力学:AI 改动代码(扰动)→ 测试/审计发现偏差 → 纠正 → 系统回到结构附近。跨会话的扰动-检测-纠正循环构成收敛动力。
隐式定义的流形:docs/architecture/ 不枚举每个正确状态;它定义约束方程。满足约束的状态形成流形——本地实现可以变化,但整体被拉向同一类结构。
跨会话涌现:数百次提交、数十个计划和多次审计产生的长期收敛是"系统行为",不是单次执行的行为。
AGE 的恢复同样依赖文档作为真实来源。差异不仅在粒度和时间尺度,还在于被约束的对象:控制层指令约束单次执行如何完成;方向层约束所有未来执行的结果被允许落入的结构区域。
三个系统在机制层展现结构平行性:
| OpenProse | NLAHs | AGE |
|---|---|---|
| Responsibility<br>(Goal / Maintains / Continuity) | NLAH<br>(contract / stages /<br>state / validation / recovery) | owner-doc system<br>(architecture / planning /<br>audit / correction) |
| fingerprint<br>comparison | runtime policy<br>interpretation | cross-session<br>convergence |
| re-render | validation +<br>child-agent retry | correction &<br>new planning |
机制槽相似,但语义不同。此表仅说明这三个都是控制系统,不表示它们控制同一类对象。OpenProse 和 NLAHs 使单次执行更可控;AGE 判断这些执行的积累是否仍指向同一长期结构。
差异不在机制层,而在上方是否存在方向层。OpenProse 的责任和 NLAHs 的 NLAH 都是自给自足的规范——它们定义自己的完成条件(指纹相等/约定满足),不需要外部参考"系统应该收敛到什么结构"。AGE 也有完成条件(CI 门/审计通过),但所有者文档的不可替代角色是:当本地完成条件与长期结构方向冲突时,它提供仲裁基础。CI 可以判断特定导入是否通过;所有者文档判断为什么 flux-react 不能对 renderer 包有反向依赖。前者是控制门;后者是方向层。
这正是方向层与控制层之间的区别:二者的差异不在于机制,而在于控制层之上是否存在一种独立、持久的目标结构,为所有控制提供终极目的。
三者之间并非层级关系(项目级吸引子 ⊃ 运行级吸引子),而是本体论上的差异:
方向层(Attractor)— AGE:由 owner-doc 定义的长期收敛结构
↑ 为控制提供终极目的
│
控制层(Control Target)— NLAHs/OpenProse:规范 + 运行时执行
↑ 实现控制机制
│
机制层(Mechanism)— IHR / reactor / CI:具体的检测、执行与恢复
AGE 文章的核心论点正是:方向层先于控制层。如果不定义“向何处收敛”,控制机制就不具备统一的意义。NLAHs 和 OpenProse 都在控制层进行创新——NLAHs 使用自然语言提升策略的可审计性和可移植性,而 OpenProse 使用确定性运行时提高执行精度与成本效率。但二者都无法回答方向层的问题:系统长期而言应当向什么结构收敛?一个可证伪的表述是:如果移除 AGE 的 owner-doc 优先级链、日志与缺陷提炼之后,系统在长期重构过程中仍能维持相同的架构方向,那么 AGE 关于方向层的主张就是多余的。
OpenProse 的核心隐喻来自 React。它将 AI 智能体的每次执行建模为一次 render。
三个关键假设:
AI 的价值在于有界 render——有限、可审计、单次完成的推理。
连续性的来源不是会话,而是世界模型的持久状态与 receipt 链。
成本与“意外程度”成正比,而非与时间成正比——如果没有任何变化,render 就不会执行。
这是一种运行时优先的世界观:先定义“运行时有哪些事实持续成立”,再考虑工程流程。
NLAHs(Natural-Language Agent Harnesses,自然语言智能体框架)的核心隐喻来自可编辑的策略文档。NLAH+IHR 系统将智能体框架拆分为四层栈。
三个关键假设:
框架策略可以从纠缠不清的控制器代码中分离出来,并用可编辑的自然语言表达。
自然语言承载策略,代码承载机制——精确操作保留在代码中,可审计策略保留在自然语言中。
共享运行时(IHR)可以为不同的 NLAH 提供统一的执行基础。
这是一种表示优先的世界观:策略的表示媒介决定了它的可审计性、可移植性和可分析性。
AGE 的核心隐喻来自动力系统理论。
三个关键假设:
AI 是一种在结构上不同于人类的扰动源——频率高、振幅大,并且缺乏持续的方向感。
吸引子必须先于框架存在——“应朝哪里纠正”先于“如何纠正”。
文档是吸引子的载体,代码是吸引子的瞬时投影——二者都不是吸引子本身。
这是一种流程优先的世界观:先定义“系统应当向什么结构收敛”,再设计运行时行为。
OpenProse 的 Responsibility 是一个自包含的计算单元,具有明确的输入边界(Requires)、输出边界(Maintains)、目标(Goal)和连续性约束(Continuity)。执行会产生一个 receipt——一种按内容寻址、可通过链式结构验证的决策证明。
NLAHs 的 NLAH 文档是一种可编辑的策略描述,用于定义一次任务运行的生命周期策略:契约、阶段、角色、状态规则、验证规则、恢复规则和停止条件。NLAH 并不“告诉模型如何回答”,而是“告诉运行时如何组织多步骤执行”。
IHR 的执行语义既不会将 NLAH 编译成代码,也不会让智能体读取文档后自由行动。它使用固定的运行时策略提示词,将基础智能体转变为父级编排器:父级读取 NLAH,并将契约、阶段、状态规则、验证规则、恢复规则和停止条件转换为子智能体任务包、交接、状态文件、制品门禁和完成检查。各阶段仍由子智能体以智能方式执行;测试、解析器、验证器和基准测试适配器等精确操作则由脚本或适配器处理。
AGE 的 Attractor 不是一个对象,而是一种由三层组成的结构属性:
结构层:一小组高层不变量(例如包依赖方向 flux-core → ... → flux-renderers、七种原语的闭包,以及 compile-first 流水线)。
载体层:承载这些不变量的可审计文档(docs/architecture/)。
实现层:当前代码中体现这些不变量的部分。
Responsibility 和 NLAH 都是实例——你可以统计“这个项目有 23 个 responsibility”或“这个基准测试有 1 个 NLAH”。Attractor 则是一种属性——你无法统计“这个项目有 5 个 attractor”;它更像是“这个系统的 attractor 是一个低维流形”。
三个系统都有将一次 AI 操作闭合为可完成单元的机制:OpenProse 的 render、NLAHs 的 task run,以及 AGE 的 plan。render 的闭合由输入指纹、后置条件和 receipt 决定;task run 的闭合由 NLAH 的任务契约、验证规则、制品契约和停止条件决定;plan 的闭合则由 Plan Status、Current Baseline、Goals、Non-Goals、执行/证明检查清单、Closure Gates 和独立闭合审计决定。
plan 不是待办事项列表,而是一种用于判断重大变更能否闭合的证据结构:首先验证当前基线,约束目标与非目标,在执行过程中逐项证明,最后由独立审计确认范围内的事项已经完成,或已如实推迟。plan 与 owner-doc 之间的关系并不是“每次都更新文档”。相反,owner-doc 用于判断当前变更的边界和闭合条件;只有当变更修改了当前生效的基线、公共契约或 owner 行为时,闭合才要求同步文档。
NLAH 与 AGE plan 在机制上相似:二者都使用自然语言定义契约、阶段、证据和停止条件,也都反对仅依赖智能体自行报告任务完成。不过,它们所闭合的对象不同:NLAH 闭合的是单次运行,证明执行轨迹符合框架策略;plan 闭合的是单次变更,证明当前范围内的结果、证据和文本状态足以通过独立审计并被接受。
OpenProse 采用严格的两阶段架构:在编译时,它使用 LLM 生成确定性制品(Forme DAG、canonicalizer 和后置条件验证器);在运行时,它绝不调用 LLM——所有决策都是确定性的。AGE 不存在“一次编译、随后运行”的分离;验证持续嵌入每次变更中——typecheck → build → lint → test → audit → logs,始终对方向进行验证。NLAHs 介于二者之间:自然语言策略与确定性钩子相分离,但 IHR 运行时依赖 LLM 来解释策略。
AGE 明确指出了自我验证陷阱:当 AI 基于同一个上下文同时生成代码和所有评估材料(类型、测试、文档、完成总结)时,如果理解存在偏差,所有“验证证据”都会朝同一个方向漂移。应对措施是强制分离生成与评估——闭合审计必须由一个全新的上下文执行。OpenProse 通过在编译时冻结确定性函数,绕过了同一问题。NLAHs 在论文的评估场景中依靠基准测试自动评分器来规避这一问题,但在生产部署中,它们同样需要外部验证机制,以避免自我验证陷阱。
这是三个系统之间最深层的分歧。
OpenProse 的不动点一致性:每项职责的渲染都会生成一个世界模型;规范化器会据此生成指纹。如果该指纹与之前相同,系统便是“一致的”。判断是二元的:相等或不相等,不存在“大致一致”。在组合层面,如果每项职责都到达各自的不动点,并且 DAG 拓扑正确,那么整个系统就是一致的。自底向上,每个局部不动点组合成一个全局不动点。
NLAH 的策略符合性一致性:AI 智能体的执行路径是否遵循 NLAH 指定的策略。论文定义了模式保留度、阶段覆盖率和产物契约合规性等指标来衡量这一点。它并非二元判断——NLAH 允许灵活执行,但要求保留策略结构(阶段、角色、验证门禁、状态规则)。论文对 RQ2 的研究发现,NLAH 能够保留可识别的工作流结构(工作流保留度为 0.63–0.67,阶段覆盖率为 0.57–0.82),但信息传递是主要薄弱环节(交接召回率最低仅为 0.32)。
AGE 的吸引子一致性:不是二元的。一个系统可能“总体上接近吸引子,但某个子系统已经偏离”——这并非“不一致”,而是“仍在吸引域内,但偏离了中心”。判断标准具有方向性:系统是在向吸引子收敛,还是正在远离它?一次提交可能通过所有测试(仍在吸引域内),但如果它引入了架构漂移(例如颠倒软件包的依赖方向),系统的演化轨迹就不再向吸引子收敛。自顶向下来看,即使每个模块的测试都通过了(每个局部部分都处于不动点),整体仍然可能逐渐远离吸引子。
AGE 的一个核心论断是:“所有状态层面的检查都可能通过,但系统整体仍在漂移。”nop-chaos-flux 的计划 76 就是一个例子:一次移除 array-editor 局部状态镜像的尝试导致了 11 项测试失败——这并非由某个单一缺陷造成,而是因为测试本身已经漂移到与旧实现存在时间耦合的状态。此前累积的每项变更都通过了审查和 CI,但从吸引子的视角来看,测试套件已经偏离了能够支持结构演进的位置。这正是吸引子概念存在的原因。
这种区别并非术语偏好:
不动点方法只能检测“是否已经准确到达?”——它们非常不擅长区分“正在收敛的途中,但尚未到达”和“已经发生偏离”。
吸引子方法天然关注轨迹的方向——系统不需要准确到达,只需要持续收敛,而收敛本身是可持续的。
不动点适用于离散状态空间(例如世界模型的指纹);吸引子在连续状态空间(例如架构的演进)中具有更强的表达能力。
这直接解释了为什么 OpenProse 使用 hash == hash(离散相等),而 AGE 使用“CI 通过 + 文档一致 + 架构边界完好”(多维收敛信号)。
AI 的定位。OpenProse 将 AI 建模为有边界的渲染函数;其角色是执行器。NLAH 将 AI 建模为由装具策略组织起来的执行系统:父编排器根据运行时策略解释 NLAH,子 AI 智能体执行具体任务——角色被区分为编排器和执行器。AGE 将 AI 建模为缺乏持续方向感的高频、高振幅扰动;其角色是扰动源与执行器——既受到约束,又被加以利用。
对文档的理解。OpenProse:*.prose.md 就是程序;如果任何内容与 Markdown 不一致,以 Markdown 为准。NLAH:NLAH 文档是一项策略——它规定“如何做”,但并不直接“执行”;其中最便于审计的部分与实现细节相互分离。AGE:文档是吸引子的承载层;代码是吸引子的瞬时投影;承载层定义了系统应当回归的位置。
失败处理。OpenProse:失败会生成失败回执,立即处理、相互独立,每次渲染都会单独记录。NLAH:NLAH 定义恢复规则(重试、回滚、证据);失败的产物会保留下来以供分析,但不会跨多次运行进行提炼。AGE:失败会生成结构化的缺陷记录;反复出现的失败模式会被提炼为护栏,并沿渐进式自动化阶梯逐级提升(记录 → 检查清单 → 启发式脚本 → lint 规则 → CI 门禁)。
AGE 方法论的一项核心论点是:凡是能够转化为确定性检查的内容,都会逐渐从轨迹数据中提取出来,形成确定性脚本。
nop-chaos-flux 的工具链为这一论点提供了完整的实证证据。观察到的五层渐进式自动化阶梯如下:
Tier 1: Trajectory capture (Bug Notes + Logs)
62+ bug fix notes, 72 daily dev logs
Tier 2: Pattern distillation (Architecture Guardrails + Audit Rules)
8 guardrails distilled from bugs, 19 dedicated audit rules
Tier 3: Codified review patterns (Skills/Prompts)
24 reusable audit/review prompt templates
Tier 4: Heuristic suspicion scanners (Heuristic Scanners, exit 0)
12 focused audit scanners, informational output
Tier 5: Hard-gate automation (Hard Gates, CI-blocking, exit 1 on failure)
14 hard gate scripts, 30+ ESLint rules, dependency-cruiser, Semgrep, Husky pre-commit
示例 A:构建产物污染源代码目录
第 1 层——缺陷 #23:packages/*/src/ 中残留的 .js 文件在 Vitest 运行期间悄然覆盖了 .ts 源文件,导致测试失败,而根本原因并不在测试代码中。最终共发现 102 个陈旧文件。
第 2 层——护栏 #6“源代码目录中不得存在构建产物”被提炼到 docs/references/architecture-guardrails-from-bugs.md 中,并附有指向缺陷证据的链接。
第 5 层——scripts/verify-no-src-artifacts.mjs 成为硬性门禁(会阻断 CI),而 scripts/clean-src-artifacts.mjs 则提供清理能力。pnpm lint 链会在 ESLint 之前依次运行清理和验证。
从缺陷到 CI 门禁,这一过程完整走过了五层阶梯。
如果将 nop-chaos-flux 的架构不变量建模为 OpenProse 职责