
当我们讨论 Agent 时,我们在讨论什么?是一个能调工具的 LLM?是一个能自主决策的循环?还是一个能在流程中自我定位、自我校验、自我交付的工作单元?本文从 OODER 框架的实践出发,论证一个核心命题:Workflow 不是 Agent 的上层编排,而是 Agent 的底层基础设施。

Harness 规范定义了 Agent 的行为契约,Loop 调用构成了 Agent 的执行引擎,子流程与场景组的抽象简化了 Agent 的组合设计,而 NLP-Chat → Dump SSE 的独立过程审计,则让流程的自动测试推导出 Workflow 本身——形成 Agent 开发的自举闭环。
目录
一、Agent 开发为什么需要 Workflow二、Harness 规范:行为契约三、Loop 调用:执行引擎四、子流程与场景组:组合抽象五、NLP-Chat → Dump SSE六、Workflow 推导七、实践验证八、Workflow-Native 展望九、结语
当下 Agent 开发的普遍范式是:Prompt + Tools + LLM Loop。开发者编写一个 system prompt,声明一组工具(function calling),让 LLM 在循环中自主调用工具完成任务。这个范式简洁有力,但在工程化场景中暴露出三个根本性问题:
第一,缺乏行为契约。 Agent 的 LLM 调用是"黑盒决策"——你不知道它会在第几轮选择哪个工具、是否会重复调用、是否会陷入死循环。没有契约约束的 Agent,就像没有交通规则的道路:每个司机都在自主驾驶,但整体效率为零。
第二,缺乏组合抽象。 当任务复杂度上升,单个 Agent 的 prompt 膨胀到难以维护。开发者本能地想拆分——"让一个 Agent 负责理解,另一个负责设计,第三个负责生成"。但拆分后的编排逻辑散落在代码各处,缺乏统一的组合抽象。这就像用 goto 语句写并发程序:能跑,但无法推理。
第三,缺乏可审计性。 Agent 执行过程中产生了 LLM 推理、工具调用、条件路由等大量中间状态,但这些状态是"流式"的——过去就没了。当 Agent 出了问题,开发者只能靠"再跑一次看看"来调试,无法回溯、无法审计、无法从历史执行中推导出流程的改进方向。
这三个问题的共同根因是:Agent 缺乏一个外显的、可执行的、可审计的流程定义。 而这正是 Workflow 的本质。
Workflow 在传统 BPM 领域是"人工流程的自动化",但在 Agent 语境下,它的角色发生了根本转变:
维度 | 传统 BPM Workflow | Agent Workflow |
|---|---|---|
驱动者 | 人工驱动,流程辅助 | LLM 自主驱动,流程约束 |
核心节点 | 人工审批、表单填写 | LLM 交互、工具调用、场景组 |
不确定性 | 流程定义确定性,人工选择不确定 | 流程定义约束性,LLM 决策不确定 |
审计对象 | 人工操作记录 | LLM 推理链 + 工具调用链 + 路由决策 |
组合单位 | 子流程 | 场景组(SceneGroup) |

关键洞察:Workflow 不是要消除 Agent 的自主性,而是要给自主性一个结构化的边界——让 Agent 在边界内自由决策,但边界本身是可定义、可验证、可演进的。
Harness(挽具)的隐喻来自马术:挽具不是限制马的奔跑,而是让马的力量可以被骑手感知和引导。在 Agent 语境下,Harness 规范定义了 LLM 的三级防护体系:
GuardConfig(三级守卫配置)
│
├── ProcessGuard(流程级)
│ ├── maxLlmRounds: 50 // 最多50轮LLM调用
│ ├── maxTotalTokens: 500000 // 总token预算
│ ├── maxBackwardCount: 3 // 最多3次回退
│ └── deepDesignRequired: true // 是否需要深度设计
│
├── ActivityGuard(活动级)
│ ├── maxLlmLoopCount: 5 // 每活动最多5轮LLM循环
│ ├── fcLoopMaxRounds: 5 // FC-Loop最多5轮
│ ├── maxRetry: 3 // 最多3次重试
│ └── tokenBudgetPerActivity: 50000 // 每活动token预算
│
└── ClassificationProfile(分类级)
└── 不同流程分类继承不同的默认守卫配置这不是简单的"限制",而是一份行为契约:LLM 承诺在 maxLlmRounds 轮内完成交付,在 tokenBudgetPerActivity 预算内产出结果,在 maxRetry 次重试后降级处理。而流程引擎承诺:只要 LLM 在契约内行为,就不会强制中断。

模式一:独立 LLM(SINGLE) — 最轻的挽具。LLM 在单次 FC-Loop 中完成决策。Harness 仅约束轮次和 token 预算。适用于意图分类、实体提取等快速决策场景。
模式二:LLM Harness 流程(HARNESS) — 标准挽具。每一轮 LLM 输出都要经过 harness 校验(质量门禁)。不通过则注入校验反馈重试,通过则推进到下一步。这是 Agent 最常用的模式——渐进式收敛:LLM 不是一次做对,而是在 Harness 的引导下逐步逼近正确结果。
模式三:渐进式自主驱动(PROGRESSIVE) — 最重的挽具。LLM 自主决定下一步走到哪个活动节点,包括回退到前序节点重新执行。Harness 约束回退次数(maxBackwardCount)和总轮次。适用于深度设计场景,LLM 需要在多步之间反复调整。
Harness 规范的工程意义远超"参数配置"。它实际上定义了Agent 的类型签名:
// 一个LLM_AGENT活动的完整签名
ActivityDefinition {
activityType: LLM_AGENT
config: {
llmMode: HARNESS, // 挽具模式
maxLlmLoopCount: 5, // 收敛上界
fcLoopMaxRounds: 5, // FC轮次上界
tokenBudgetPerActivity: 50000, // 资源上界
requiredInputs: ["intent", "entities"], // 输入契约
producedOutputs: ["architecture", "config"] // 输出契约
}
}有了类型签名,Agent 就是可组合的:下游 Agent 可以静态检查 requiredInputs 是否被上游的 producedOutputs 覆盖。这是从"相信 LLM 能自己搞对"到"工程化地保证 LLM 不会搞错"的关键转变。
Function Calling Loop(FC-Loop)是 Agent 执行的原子引擎。它的本质是 ReAct(Reasoning + Acting)模式的工程化实现:
while (round < maxRounds && !isDelivered) {
reasoning = LLM.chat(messages, tools) // 推理:LLM决定下一步
if (reasoning.hasToolCalls) {
for (toolCall : reasoning.toolCalls) {
result = executeTool(toolCall) // 行动:执行工具
messages.append(toolCall, result) // 反馈:结果注入上下文
}
} else {
isDelivered = true // 交付:LLM认为任务完成
}
round++
}在 OODER 的 FunctionCallingLoopExecutor 实现中,FC-Loop 的工程化细节值得深入分析:
超时分级控制。 不同的工具调用有不同的合理耗时。FC-Loop 设定了三级超时:单工具超时(60s)、工具组超时(30s × 工具数)、LLM 调用超时(120s)、总流程超时(180s)。这确保了 Agent 不会因为单个工具的异常而无限等待。
降级决策器。 当工具调用失败时,不是简单地重试,而是由 LlmFallbackDecider 根据错误上下文(ToolErrorContext)决策:重试?回滚到前一步?降级到替代工具?还是放弃并报告用户?这个决策器本身就是一个知识驱动的小型 Agent——它从 ToolErrorKnowledgeBase 检索类似错误的历史处理方案,做出最优决策。
SSE 事件推送。 FC-Loop 的每一轮推理和工具调用都通过 SseEventAssembler 构建结构化事件(flow_thinking、flow_tool_call、flow_tool_output)推送到前端。这让 Agent 的执行过程对用户可见——不是黑盒,而是可以实时观察的推理链。
FC-Loop 是原子级的循环,但在 Workflow 中,Loop 有三个层级:
层级一:FC-Loop(活动内循环) — LLM 在单个活动内的推理-行动循环。例如意图分类活动中,LLM 调用 intent_parse 工具获得 CRUD 意图,再调用 slot_fill 填充实体,最终交付。
层级二:Harness Loop(跨活动循环) — LLM 在多个活动间的渐进式收敛。例如配置生成活动中,LLM 第一轮生成配置经校验 header 为空,注入反馈后第二轮修正配置,header 含 6 列,通过交付。
层级三:Process Loop(流程级循环) — 流程在场景组间的推进与回退。例如 architect-pipeline 执行到质量校验不通过,回退到设计阶段重新设计。
三个层级的 Loop 分别对应 Harness 的三种模式(SINGLE / HARNESS / PROGRESSIVE),形成了从微观到宏观的循环嵌套结构。这正是 Workflow 作为 Agent 基础设施的核心能力:用循环的嵌套来表达 Agent 的递归决策能力。
Loop 的工程化核心问题是:如何保证循环一定会终止?
OODER 通过四级收敛保证来回答:
这四级保证形成了一个单调递减的资源预算——每一轮 Loop 都在消耗预算,预算耗尽则强制终止。这不是"相信 LLM 会自己停下来",而是"工程化地保证它必须停下来"。
传统 Workflow 的组合单位是子流程(SubProcess)。子流程的语义是:父流程调用子流程,子流程执行完毕后返回父流程。这个语义在人工流程中足够——因为人工流程的每一步都是确定性的。但在 Agent 流程中,子流程的语义出现了根本性裂缝:
裂缝一:调度权冲突。 子流程的节点对父流程可见——父流程可以调度子流程内部的任意节点。但在 Agent 场景中,一个"理解场景组"内部的意图分类、实体提取等步骤,应该由场景组自主决定执行顺序,而不是由外部流程来调度。
裂缝二:HUMAN 阻断冲突。 子流程中的人工节点会阻断父流程。但在 Agent 的场景组中,人工交互(如用户选择模板)只是驱动场景演变的因素,不应该阻断整个 Agent 流程的推进。
裂缝三:上下文泄漏。 子流程共享父流程的上下文——这意味着子流程的任何状态变更都会影响父流程。但在 Agent 场景中,场景组应该有独立的上下文,只在入口和出口与父流程交换数据。
SceneGroup 是独立封闭的自驱动单元。 流程可以注入上下文影响其运行,但不能调度其内部节点。SceneGroup 完整交付任务后整体返回。

SceneGroup 的核心状态模型包含:独立标识(sceneGroupId)、自管理的生命周期状态(CREATING → ACTIVE → SUSPENDED → ARCHIVED)、独立的上下文(业务配置、LLM 配置、知识库绑定)、独立的参与者管理、独立的快照管理、以及统一输出契约(taskStatus + taskSummary)。
场景组的组合遵循黑盒组合原则:每个场景组是一个黑盒,只通过入口(上下文注入)和出口(统一输出契约)与外部交互。这带来三个关键优势:
优势一:独立演进。 SG-UNDERSTAND 的内部逻辑可以完全重构(比如从规则引擎切换到 LLM 推理),只要输出契约不变,下游的 SG-DESIGN 不受任何影响。
优势二:并行执行。 无依赖的场景组可以并行执行。因为它们的上下文是独立的。
优势三:失败隔离。 SG-QUALITY 校验失败时,只需要回退到 SG-DESIGN 重新设计,不影响 SG-UNDERSTAND 已经产出的意图和实体结果。
核心哲学:用场景组替代子流程,就像用模块替代全局变量——黑盒组合、独立上下文、统一契约,这正是软件工程中"模块化"的核心思想在 Agent 领域的体现。
SSE(Server-Sent Events)不仅是前端实时推送的技术手段,在 Agent Workflow 中,它承担着更深层的角色——执行过程的忠实记录。
OODER 的 SSE 事件类型体系与 Workflow 的六种 ActivityType 严格对齐:
SSE 事件类型 | 对应 ActivityType | 语义 |
|---|---|---|
flow_step | 所有类型通用 | 步骤推进 |
flow_thinking | LLM_AGENT | LLM 推理过程 |
flow_tool_call | LLM_AGENT / TASK | 工具调用 |
flow_tool_progress | TASK | 长时间任务进度 |
flow_tool_output | LLM_AGENT / TASK | 工具执行结果 |
flow_event_wait | AGENT_EVENT | 事件等待 |
flow_event_trigger | AGENT_EVENT | 事件触发 |
flow_human_confirm | HUMAN(CONFIRM) | 人工确认 |
flow_human_form | HUMAN(FORM) | 人工表单 |
每一个 SSE 事件都携带完整的上下文信息:processInstId、activityId、round(第几轮 Loop)、tokenUsage(token 消耗)、timestamp。这些事件按时间序排列,就构成了一个 Agent 执行的完整轨迹。
"SSE Dump" 是将一次完整的 NLP-Chat 交互产生的所有 SSE 事件持久化存储,形成可回溯的审计数据。这不仅仅是日志——它是结构化的执行轨迹,每个事件都有明确的类型、上下文和因果链。
一个典型的 SSE Dump 审计报告包含:
用例ID: A-Grid-001
SSE流程: ✅ (38s完成)
路由路径: understand → design → generate → quality → integrate
产出物: Umt.cls (11988 bytes)
产出物质量: header含6列(工号/姓名/部门/职位/入职日期/状态)
Loop修复对齐: fieldEnglishNames跨组传递生效(Loop#14)
最终判定: PASSSSE Dump 的真正威力在于:它可以从历史执行中推导出流程的自动化测试。
考虑这个过程:
这就是从流程执行推导出流程测试——流程本身的执行历史成为测试用例的生成源。OODER 的 A/B/C 三类审计矩阵正是这个方法的实践:
分类 | 用例 | 含义 | 自动推导依据 |
|---|---|---|---|
A-Basic | A-Grid-001, A-Form-001 | 基础组件生成 | SSE 中最常见的路由路径 |
B-Medium | B-Chart-001, B-Gallery-001 | 中等复杂组件 | SSE 中需要特殊处理的 componentType |
C-Complex | C-Nav-001, C-CRUD-001 | 复杂组合页面 | SSE 中跨场景组交互的轨迹 |
SSE 审计不仅发现问题,更驱动了Loop 修复的闭环验证:
Loop#13: 发现 A-Grid-001 header为空
↓ 根因分析: entity_resolution活动缺失导致fieldEnglishNames=null
Loop#14: 新增EntityResolutionSkill + 添加ee_entity_resolution活动
↓ 验证: SSE Dump显示header含6列 ✅
Loop#15: 发现 B-Chart-001 退化(Chart→TreeGrid)
↓ 根因分析: ConfigGenerationStep将Chart升级为Layout
Loop#15修复: Chart/DEEP_LAYOUT不再升级Layout + excludeFromLayoutUpgrade
↓ 验证: SSE Dump显示ECharts组件 ✅每一次 Loop 修复都由 SSE 审计发现问题、由代码修改解决问题、由新的 SSE 审计验证修复——审计 → 修复 → 审计 的闭环,让 Agent 的质量像飞轮一样持续提升。
将前面的分析串起来,我们得到了一个令人兴奋的结论——Workflow 可以从自身的执行中推导出自身的改进。

这是一个自举(bootstrapping)闭环:Workflow 的执行产生了审计数据,审计数据推导出测试用例和改进方案,改进方案应用到 Workflow 定义,产生更好的执行结果。Workflow 不是一次性设计的,而是通过持续的自审计自演进。
Workflow 之所以能成为 Agent 的基础设施,根本原因在于它有一个足够强大的元模型——ProcessDefinition。这个元模型不仅描述了流程的结构,还承载了 Agent 运行所需的全部语义:
ProcessDefinition {
// 结构语义:流程是有向DAG
definitionId, name, version
swimLanes: List<SwimLaneDefinition> // 泳道=场景组
activities: List<ActivityDefinition> // 活动=Agent步骤
transitions: List<Transition> // 转换=路由规则
// Agent语义:每个活动都是Agent
activities[].activityType // TASK/LLM_AGENT/HUMAN/AGENT_EVENT
activities[].config.taskMode // SKILLS/SCENE_GROUP
activities[].config.llmMode // SINGLE/HARNESS/PROGRESSIVE
activities[].config.humanMode // CONFIRM/FORM/APPROVAL/DELEGATE
// Harness语义:行为契约
guardConfig: GuardConfig // 三级守卫
contextLoadPolicy: ContextLoadPolicy // 上下文装载策略
// 知识语义:知识驱动
knowledgeBindings: List<KnowledgeBinding> // 5级粒度×5层知识
flowToolIds: List<String> // 流程级工具
// 领域语义:领域隔离
classification, domain, sceneId
}这个元模型的丰富性确保了:任何 Agent 的行为都可以被 Workflow 表达,任何 Workflow 的执行都可以被审计推导。 这就是 Workflow 作为基础设施的数学基础——它是一个完备的 Agent 表达系统。
如果我们把视角拉远,Workflow 不仅是 Agent 的编排工具,它更像是 Agent 的操作系统:
操作系统概念 | Agent Workflow 对应 |
|---|---|
进程(Process) | ProcessInstance(流程实例) |
线程(Thread) | FC-Loop(函数调用循环) |
进程间通信(IPC) | ContextTransfer(上下文交换,4种模式) |
文件系统(VFS) | VfsFolder(统一虚拟文件系统) |
内存管理 | ContextLayerManager(6层上下文管理) |
进程调度 | RouteToEngine(路由分派,4种类型) |
信号/事件 | AGENT_EVENT(事件钩子) |
权限模型 | HUMAN 组织管理 + 审批门禁 |
系统调用 | CapabilityFunction(能力函数) |
审计日志 | SSE Dump + HistoryMergeService |
Agent 确实需要操作系统级别的服务:6层上下文管理对应操作系统的内存分页;4种上下文交换模式对应 IPC 机制;VFS 一致性对应统一文件系统命名空间;历史合并对应日志轮转。
基于以上分析,Agent 开发的范式正在发生根本性转移:
旧范式:Prompt Engineering — Agent = Prompt + Tools + LLM Loop。开发者手工编写 prompt,手工选择工具,手工调试循环行为。Agent 的质量完全依赖开发者的 prompt 功力。
新范式:Workflow Engineering — Agent = Workflow(Harness, Loop, SceneGroup, Audit)。开发者定义 Workflow(流程结构 + 行为契约 + 组合抽象),Agent 在 Workflow 的约束下自主执行,SSE 审计持续推导 Workflow 的改进。Agent 的质量由 Workflow 的完备性和 Harness 的约束力保证。
范式转移的核心洞察:与其让 Agent 聪明到不会犯错,不如让 Workflow 严格到不允许错误逃逸。Harness 守卫捕获越界行为,Loop 收敛保证终止性,SceneGroup 隔离防止错误传播,SSE 审计发现潜在退化——四道防线,层层递进。
前述的理论框架不是空中楼阁。OODER 的 A/B/C 三类审计矩阵提供了实践验证:
A-Basic(基础验证)——验证 Workflow 的基本循环能力:
用例 | SSE流程 | 路由 | 产出物 | 判定 |
|---|---|---|---|---|
A-Grid-001 | ✅ | architect | Umt.cls (11988B, 6列) | PASS |
A-Form-001 | ✅ | architect | Formpage.cls (13933B) | PASS |
A 类验证的是 FC-Loop + Harness 的基本闭环:LLM 能在约束轮次内完成交付,产出物符合质量门禁。
B-Medium(中等验证)——验证 Workflow 的路由分支能力:
用例 | SSE流程 | 路由 | 产出物 | 判定 |
|---|---|---|---|---|
B-Chart-001 | ✅ | architect | Echartspage.cls (10561B) | PASS |
B-Gallery-001 | ✅ | architect | Gallerypage.cls (9974B) | PASS |
B 类验证的是 SceneGroup 的独立上下文能力:不同 componentType 在同一管线中能正确路由到对应的生成逻辑。
C-Complex(复杂验证)——验证 Workflow 的跨场景组协作能力:
用例 | SSE流程 | 路由 | 产出物 | 判定 |
|---|---|---|---|---|
C-Nav-001 | ✅ | deep-design | NavTree+Layout+Block | PASS |
C-CRUD-001 | ✅ | rad | Layoutpage.cls (4121B) | DEGRADED |
C 类验证的是多 SceneGroup 间的上下文交换和协调能力。C-CRUD-001 的 DEGRADED 判定揭示了跨场景组传递 componentType 时的数据流断裂——这正是 SSE 审计发现、Loop 修复解决的典型问题。
ABC 审计矩阵不仅是测试矩阵,它本身就是一个Workflow 质量的度量空间:
三个维度的乘积就是 Workflow 作为 Agent 基础设施的成熟度:当成熟度达到阈值时,Workflow 就不再是"辅助编排",而是"可信基础设施"——Agent 可以在它的上面安全地运行,就像进程在操作系统上安全地运行一样。
软件工程经历过从 On-Premise 到 Cloud-Native 的范式转移。Cloud-Native 的核心是:应用生来就为云设计,而不是先设计再搬到云。
类似地,Agent 开发正在经历从 Prompt-Native 到 Workflow-Native 的范式转移。Workflow-Native 的核心是:Agent 生来就为 Workflow 设计,而不是先写 Agent 再套 Workflow。
这意味着:
当 Workflow 成为 Agent 的基础设施,一个更深层的可能性浮现:Workflow 能否自己演进?
答案藏在 SSE 审计的闭环中:SSE Dump 记录了 Workflow 的每次执行轨迹;轨迹分析发现了 Workflow 的退化点;退化点的根因分析定位到具体的 ActivityDefinition 配置缺陷;修复方案可以自动应用到 ProcessDefinition;新的 ProcessDefinition 产生更好的执行结果。
当修复方案从"人工应用"进化到"自动应用"时,Workflow 就实现了自演进——它从自身的执行经验中学习,自动调整自己的定义,就像一个 Agent 从自己的错误中学习一样。
而这时候,Workflow 本身就是一个 Agent——一个元层次的 Agent,它的任务是优化其他 Agent 的 Workflow 定义。
在这个图景中:

这不是未来主义的幻想——OODER 已经实现了这个图景的 80%。Harness 规范、FC-Loop 引擎、SceneGroup 抽象、SSE 审计闭环、VFS 一致性——每一块都已经落地运行。剩余的 20%(SG 内 HUMAN 不阻断、SG 产出物统一契约、Workflow 自演进)是明确的路线图,而不是模糊的愿景。
回到开篇的问题:当我们讨论 Agent 时,我们在讨论什么?
在 Prompt Engineering 时代,我们讨论的是"如何让 LLM 更聪明"。在 Workflow Engineering 时代,我们讨论的是"如何让 Agent 的运行环境更可靠"。
这个转变的实质是:Agent 的核心竞争力不在于 LLM 的推理能力,而在于 Workflow 的约束和组合能力。 一个在弱约束强自由环境中运行的强 LLM,不如一个在强约束合理自由环境中运行的弱 LLM——因为前者不可预测,而后者可工程化。
Workflow 从 Agent 的"上层编排"演变为"底层基础设施",这个演变遵循了软件工程的经典规律:
每一次演变的核心都是同一点:当工具足够深入地理解了它所服务的领域,它就不再是工具,而是领域的基础设施。 Workflow 深入理解了 Agent 的行为模式(Harness)、执行模式(Loop)、组合模式(SceneGroup)和演进模式(SSE Audit),因此它必然成为 Agent 的基础设施。
而 NLP-Chat → Dump SSE → 审计 → 推导 → 改进的闭环,则是这个基础设施的自举机制——Workflow 通过审计自身的执行来改进自身,就像操作系统通过监控自身的性能来优化调度策略一样。
Workflow 不是 Agent 的枷锁,而是 Agent 的道路。 道路约束了行进的方向,但正是约束让行进成为可能——没有道路的地方,只有荒野。
本文基于 OODER 框架的工程实践写成。文中引用的代码模型、审计数据和技术决策均来自实际项目。
关键参考文档:
© 2026 OODER Framework · Workflow as Agent Infrastructure
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。