案例库/完整蓝皮书
ADPS 企业 Agent 系统蓝皮书 · 案例报告 01
东方屹腾执行型 Agent:让业务状态沿流程准确传递
模型理解意图,程序保存业务参数来源,任务图与状态机维护严格执行顺序。
证据边界:本文记录东方屹腾执行型 Agent 的项目实践。业务背景、原型问题和架构取舍由案例方梁博提供,尚未经过独立审计。示例数据结构由 ADPS 根据案例机制整理,用于解释设计,不代表案例方实际类名或字段名。
案例速览
| 项目 | 现场信息 |
|---|---|
| 业务任务 | 帮助中小企业完成薪资组配置,并逐步覆盖算薪、代发、报税等连续业务流程 |
| 最早暴露的问题 | 模型能选对工具,却会偶发误写上一步返回的业务 ID,或跳过有严格依赖的步骤 |
| 核心做法 | 模型处理意图和语义,程序保存业务参数来源,任务图与状态机维护执行顺序 |
| 关键运行结构 | Orchestrator、Activity/Frame 时间线、Workspace、SessionState、SessionNarrative |
| 当前证据 | 案例方项目复盘、系统结构和运行机制说明 |
| 适用范围 | API 由组织管理,步骤依赖严格,参数错绑会造成真实业务后果的企业流程 |
1. 先找客户真正卡住的那一步
东方屹腾的 SaaS 产品覆盖人事、组织、考勤、审批和薪酬,并连接银行与税务系统。产品矩阵已服务两万多家企业。团队最初评估过用工分析、薪酬结构优化和报表分析,这些场景容易演示,却没有击中客户启用系统时最费力的环节。
客户访谈指向了首次配置。新企业需要建立薪资组和薪资项,导入员工与组织,完成定薪,再配置考勤和审批规则。由运营团队代为配置的客户通常能顺利启用,自行配置的客户更容易中途放弃。
团队把“薪资组快速搭建”定为首个场景。它的范围不大,却包含模板匹配、数据快照、连续 API 调用、失败回滚和人工确认。一个 Agent 若能稳定完成这条链,才有资格继续进入算薪、代发和报税。
2. 第一个原型:工具选对了,状态仍会传错
最初的设想很直接:把现有 API 封装为 MCP Server,让模型按用户意图选择工具并组织参数。工具发现很快跑通,连续调用暴露了另一个问题。
以报销为例,流程依次创建申请、上传发票、提交审批和查询结果。上传接口使用的 application_id 必须来自刚才那次创建调用。薪资组配置也一样,模板匹配返回的 template_id 要原样进入后续导入接口。
早期原型把每步回执追加到对话上下文,再让模型生成下一步参数。测试中出现过 ID 误写和参数错绑。JSON Schema 可以检查字段类型和格式,无法证明一个值来自哪次调用。对于 64 位或 128 位业务标识,只错一个字符也可能访问错误实体。
这次失败划出了一条系统边界。
- 报告、摘要和 PPT 在步骤间传递文本,局部偏差通常还能重写。
- 薪酬、审批和报销在步骤间传递业务状态,漏步、跨步和参数错绑会改变真实数据。
东方屹腾继续使用模型理解用户和选择业务路径,同时把严格参数从语言上下文中拿出来,交给程序保存和注入。
3. 先把运行过程看清楚
后端使用 Go,初期没有引入 Agent 框架。第一阶段只接通连续对话、附件上传和流式回复,先固定入口和输出协议。Web 界面同步建设,业务人员可以在同一页面检查用户输入、执行进度和最终结果。
运行时从第一天就记录结构化事件。一次对话拆成按时间排序的 Activity,每个 Activity 下包含一个或多个 Frame。Frame 保存当时的输入、模型输出、工具调用、耗时和费用。意图识别、路由、ReAct 循环和状态变化也写入同一时间线。
这套记录先解决开发问题:哪一步选错了工具,哪个 ID 来自哪次调用,任务为何停在审批节点。生产环境再按权限隐藏调试详情。可观测性在这里不是上线后的监控补丁,它是业务评审和问题复现的共同底座。
4. 一次请求怎样流过系统
用户输入先经过意图识别,得到有限的控制信号。早期信号包括 chat、analyze 和 resolve,解析失败则进入 unknown。后续类型可随业务扩展,但每个类型都必须对应明确的程序分支。
用户消息
-> MessageHandler 接收并建立事件流
-> 意图识别生成控制信号
-> Orchestrator 选择执行链
-> 推理或规划确定下一步
-> 行动模块调用工具
-> 状态、任务进度和叙事摘要分别落盘
-> 统一事件流向界面返回进度与结果
MessageHandler 处理消息入口、SSE 和结束协议。Orchestrator 读取控制信号,调用推理、记忆、检索和行动模块。业务能力注册在明确的输入输出契约上,新增能力主要接入中段流程,不需要改动消息入口。
系统也把两类信息分开保存。控制信号、任务状态和准入结果驱动程序分支;用户目标、分析结论和执行摘要进入模型上下文。前者要求枚举和校验,后者允许语言表达。案例方把它们分别称为控制平面和叙事平面。
5. 什么时候探索,什么时候按计划执行
resolve 说明用户要完成一件事,还没有给出稳定步骤。任务边界模糊时,系统使用链式推理或 ReAct 边执行边判断。每轮把 Thought、Action 和 Observation 追加到 scratchpad,下一轮读取最新观察。
严格依赖出现后,控制权交给规划执行。规划器把任务拆成 DAG,执行器只调度所有上游节点已经完成的 ready 节点,验收器决定节点能否进入 completed。
| 现场状态 | 使用方式 | 原因 |
|---|---|---|
| 目标仍需澄清,下一步取决于刚取得的信息 | ReAct | 保留探索空间 |
| 步骤和依赖已经明确 | 任务 DAG 与状态机 | 防止跨步、漏步和重复执行 |
| 某一步会产生高风险副作用 | 状态机加人工审批 | 在原节点暂停并保留恢复位置 |
| 只需查询或生成内容 | 短链或直接回答 | 不为低风险任务引入完整调度成本 |
薪资组快速搭建的模拟链包含模板匹配、现有数据快照、模板导入和失败回滚。它曾仅以文字步骤交给 ReAct,测试中出现跨步和漏步。任务图正是由这次失败推动出来的。
6. 业务 ID 由程序保管来源
工具回执中的严格参数进入 SessionState。后续工具按坐标读取,模型只看到“模板已经匹配”这类叙事摘要。每个状态值同时保存来源信息,调用前可以核对生产工具和调用实例。
下面是 ADPS 根据案例机制整理的示意结构。
{
"scope": "session/payroll_setup",
"key": "template_id",
"value": "9287461350021",
"producer": "match_salary_template",
"call_id": "call_0187",
"receipt_ref": "events/0187/tool-result"
}
工具注册时声明自己生产和消费哪些状态。RunPipeline 在调用前完成四件事:根据坐标取值,核对来源,注入参数,记录本次消费关系。模型不会再次拼写 template_id。
这套机制成立于封闭工具体系。组织需要事先管理工具注册、状态键、作用域和权限。开放网络中的任意工具无法自动获得同样的来源保证。
7. 审批要能停住,也要能从原处继续
敏感节点开始前,执行器将节点置为等待审批。人工批准后,系统重新读取持久化状态,校验任务与工具条件,再从原节点继续。拒绝或超时则进入明确的终止或改计划路径。
案例包含两种人机衔接。
- 下一轮继续:当前会话结束,用户之后输入“继续”或补充信息,系统从已保存目标和进度恢复。
- 执行中等待:会话运行仍存在,某个任务节点阻塞,审批事件到达后恢复。
第二种方式需要持久化 DAG、节点状态、审批结果和参数来源。一个确认弹窗并不能提供恢复能力,真正的断点位于任务状态机。
8. 长程状态分放三处
系统逐步形成三个状态平面,各自回答一个问题。
| 状态平面 | 回答的问题 | 真源 | 主要读取方 |
|---|---|---|---|
SessionNarrative |
用户要什么,已经发生了什么 | Anchor、Ledger 与上下文投影 | 模型推理和回复合成 |
SessionState |
业务参数是什么,从哪里来 | 带 Provenance 的状态 Cell | 工具调用和前置校验 |
Workspace |
哪个任务现在可以执行 | DAG 与节点状态迁移 | 规划器、调度器和执行器 |
Anchor 保存原始目标,避免长任务反复摘要后偏离。Ledger 追加关键进展,Collection 在当前步骤选择必要记录。它们服务语义理解,不承担业务 ID 传递。
记忆再按使用距离分层:L1 服务当前步骤,L2 保存可追溯事实,L3 保存从多次任务中提炼的经验。L3 召回结果仍保留指向 L2 的来源 ID,需要核对时再加载原始记录。召回集中在首次推理、ReAct 首轮和任务规划等边界,不在每一步重复检索。
9. 当前证据能说明什么
| 主张 | 当前依据 | 状态 |
|---|---|---|
| 首次配置是中小客户启用产品的重要阻力 | 客户访谈与交付反馈 | 案例方业务证据 |
| 把工具回执放回上下文仍会出现 ID 误写 | 早期原型测试 | 案例方复盘,未公开错误率 |
| DAG 与状态机可以阻止未满足依赖的节点调度 | 调度规则与状态结构 | 架构机制说明 |
| SessionState 保留参数来源并由程序注入 | 状态坐标和调用链设计 | 架构机制说明 |
| 系统已经在两万多家企业场景中产生量化收益 | 尚无公开对照数据 | 本版不作此结论 |
后续公开材料最值得增加三类数据:严格流程的成功率与人工接管率,参数来源校验拦截的错误数,以及审批暂停后的恢复成功率。
10. 迁移时可以照着做的七步
- 选择一条会修改真实业务状态的连续流程,不从开放问答开始。
- 列出每一步的输入、输出、副作用、回滚方式和人工责任人。
- 标记所有不能由模型重新生成的值,例如业务 ID、版本号、金额和权限范围。
- 为每个严格值登记生产工具、消费工具、作用域和回执位置。
- 把已知依赖写成任务图,由程序决定节点是否可执行。
- 将高风险节点设为可持久化的等待状态,测试批准、拒绝、超时和重复事件。
- 用统一时间线串起模型、工具、状态和任务事件,再开始扩大场景。
第一条流程跑稳后,再判断哪些任务需要 ReAct,哪些可以直接进入固定计划。这样能把探索能力留给开放部分,把确定性留给业务状态。
11. 何时不该照搬
这套设计适合步骤明确、状态依赖严格、错误会改变业务数据的执行型任务。工具需要由组织注册和管理,状态键与来源能够事先定义。
资料检索、总结和报告生成通常不需要完整 DAG、机械状态平面和审批恢复。一次性脚本也未必值得建设长期会话状态。若工具来自开放生态,或同一业务值存在多个并发写入者,还需要补充信任策略、事务、锁和冲突处理,本案例没有覆盖这些问题。
12. ADPS 对照
| 模式 | 本案例中的实现 | 进一步阅读 |
|---|---|---|
| 工具调度 | 工具注册、状态生产消费声明、调用前注入 | A1 工具调度 |
| 规划执行 | DAG、节点状态机和验收器 | A2 规划执行 |
| 进度追踪 | Workspace 与持久化节点状态 | M3 进度追踪 |
| 上下文分诊 | Anchor、Ledger 与当前 Collection | P1 上下文分诊 |
| 审批门 | 高风险节点等待审批并从原处恢复 | G1 审批门 |
| 可观测性 | Activity、Frame 与统一事件时间线 | G4 可观测性 |
案例提供与引用
案例提供:梁博(Bo Liang),上海东方屹腾科技有限公司。
建议引用:ADPS、梁博,《东方屹腾执行型 Agent:让业务状态沿流程准确传递》,ADPS 企业 Agent 系统蓝皮书·案例报告 01,v0.4,2026。