Conversation to DAG Workflow Engine:把对话式需求变成可执行工作流

HTMLPAGE 团队
16 分钟阅读

用户给的是自然语言,系统跑的是有向无环图。本文讲清 conversation-to-dag 的建模方法、节点契约、失败恢复和上线治理。

#AI agent #Workflow Engine #DAG #Orchestration

用户说的是一句话,系统执行的是几十个步骤。真正把 AI agent 做成平台,不是让模型多回答几轮,而是把对话意图稳定编译成可执行 DAG(有向无环图)。

问题是,大多数团队把这件事做成了“提示词工程扩写”:让模型先列步骤,再顺着步骤执行。这个方案在 demo 阶段看起来能跑,但一到生产就暴露四个结构性缺陷:

  • 目标漂移:同一用户意图,模型每次拆出的步骤不一致。
  • 状态断裂:执行中断后无法精确恢复到正确节点。
  • 风险失控:涉及外部副作用时难以做可验证补偿。
  • 成本失真:不知道 token 和工具调用到底花在了哪条路径上。

把对话转换成 DAG,不是“格式更工程化”,而是把执行系统从概率行为拉回可治理系统。

什么时候必须上 Conversation-to-DAG

并非所有 agent 都要上 DAG。以下场景优先级最高:

场景不上 DAG 的代价
跨工具多步骤任务步骤顺序和依赖关系不稳定
有审批/策略节点难证明“为什么放行”
有外部副作用出错后无法精确补偿
有 SLA 和预算要求无法做路径级时延与成本治理

如果你的 agent 只做单轮问答、无副作用、无审计要求,可以先不上 DAG;但一旦进入“执行系统”范畴,DAG 基本是必选项。

编译链路:从语义到执行图

建议将编译过程拆成三段,每段都可独立观测和回滚:

阶段输入输出失败动作
Intent Parsing对话上下文goal、constraints、non-goalsask_user
Plan Synthesisgoal+constraintsnode list + edge listreplan
Graph Validationplan graphexecutable DAGhuman_review

这里有个关键约束:Graph Validation 必须独立于大模型自由生成。换句话说,模型可以“提议图”,但系统必须“验证图”。

节点建模:把节点当成可审计合约

每个节点至少要包含以下字段:

  • nodeId
  • inputSchema
  • outputSchema
  • preconditions
  • sideEffects
  • failurePolicy
  • compensationPolicy

其中最容易被省略的是 sideEffects 和 compensationPolicy。省略它们,意味着你默认“失败可以重试”,这在有写操作的场景里几乎总是错的。

运行时语义:不是“按顺序执行”这么简单

一个可用的 DAG runtime 至少需要支持:

  1. 前置条件守卫:节点可执行前,强制检查依赖状态。
  2. 幂等执行:重复调度不会重复产生副作用。
  3. 检查点恢复:中断后从稳定节点继续,而不是整图重跑。
  4. 分支合并策略:冲突字段有明确优先级或人工合并规则。

这四项决定了你的系统在高并发和故障场景下是否可控。

失败案例:计划正确,执行不可恢复

某内容审核平台将“生成摘要 -> 证据检索 -> 风险评分 -> 审批提交”编译为 DAG,看起来路径清晰。但 runtime 没有 checkpoint。一次外部检索超时后,系统从头重跑,导致摘要版本变化、审批证据不一致,最终人工无法确认哪份结果可信。

修复动作:

  • 在“证据检索完成”节点写入稳定检查点。
  • 审批节点绑定检查点版本号。
  • 重试仅允许在检索子图内进行,不允许整图重跑。

修复后,恢复时间下降,人工争议显著减少。

观测与指标:看图,不看平均值

建议最少跟踪以下指标:

指标目的
编译成功率衡量 conversation-to-graph 稳定性
节点失败分布定位故障集中节点
关键路径时延优化用户体感等待时间
人工接管率评估自动化边界是否合理
补偿成功率评估副作用治理质量

不要只看“整任务完成率”。完成率高但补偿失败高,意味着你在“带伤完成任务”。

落地路线图(建议四周)

  1. 第 1 周:确定 1 个高价值任务,定义节点契约与失败策略。
  2. 第 2 周:实现最小 DAG runtime(前置条件、幂等、检查点)。
  3. 第 3 周:接入观测和 run ledger,建立路径级指标看板。
  4. 第 4 周:灰度上线,优先验证恢复与补偿链路。

这条路线避免一次性大改,能在每周看到可验证增量。

一个真实的图应该长什么样

以“根据客户问题生成一份可发送的技术方案”为例,如果只让 agent 对话式执行,系统很容易把信息收集、方案生成、风险审核和外发动作混在一起。更稳的做法是把它拆成一张明确的图:

nodeId责任依赖关键输出
parse_request解析客户问题与目标nonegoal、audience、constraints
collect_context拉取客户行业、历史沟通、产品资料parse_requestevidencePack
draft_solution生成方案草稿collect_contextdraftArtifact
risk_review检查承诺、价格、合规风险draft_solutionriskDecision
human_approval高风险时人工确认risk_reviewapprovalResult
publish_response写入 CRM 或发送邮件human_approval / risk_reviewsideEffectRecord

这张图的重点不是“步骤多”,而是每一步都有独立的输入、输出、失败策略和审计价值。publish_response 是唯一真正产生外部副作用的节点,所以它必须比 draft_solution 有更严格的幂等键、权限校验和补偿记录。

Planner 不能直接拥有最终决定权

很多早期系统会让模型一次性输出完整执行计划,然后 runtime 照单执行。这种设计最大的问题是:模型既是计划者,又像是规则引擎,还顺手成了审批者。职责混在一起后,任何一次提示词漂移都会影响生产动作。

更稳的分工是:

  • 模型负责提出候选图。
  • Validator 负责检查图是否合法。
  • Policy engine 负责判断哪些节点需要审批或禁止执行。
  • Runtime 负责按图执行,不临场重新解释规则。

这种分工看起来更重,但它能让团队在出问题时知道该修哪一层。计划不合理,修 planner;图不合法,修 validator;策略误放行,修 policy;执行重复,修 runtime。

图验证要覆盖四类错误

在上线前,建议把图验证做成独立测试套件,而不是埋在 prompt 里:

验证类型要拦截的问题
结构验证是否有环、是否有孤立节点、依赖是否存在
契约验证节点输入输出是否能连接
风险验证高风险节点是否有审批或补偿策略
预算验证关键路径是否超过时延或成本预算

尤其要注意预算验证。一个图在语义上正确,但如果把三个慢工具串在关键路径上,用户仍会觉得系统不可用。

什么时候不要把对话编译成单张大图

不是所有任务都应该一次性生成完整 DAG。以下情况更适合分段编译:

  • 用户目标本身不清晰,需要先探索问题。
  • 外部依赖结果会显著改变后续路径。
  • 涉及多个高风险人工审批点。
  • 图规模过大,超过团队当前观测能力。

分段编译的原则是:每一段图都必须能独立提交检查点。否则“分段”只是把一张大图切碎,恢复能力并不会变强。

与 Run Ledger 的关系

DAG runtime 记录的是“怎么执行”,Run Ledger 记录的是“哪些事实需要被长期引用”。两者不要混成一个表。一个实用边界是:

  • DAG event 记录每个节点的细节。
  • Ledger 记录可审计、可计费、可追责的事实。
  • Trace 记录调试细节和调用链。

例如 draft_solution 的完整生成过程可以放在 trace 和 artifact;但 publish_response 是否真的发送、用了哪个审批结果、产生了什么外部 ID,必须进入 ledger。

上线 Checklist

  • conversation 到 DAG 的编译结果可审计
  • 每个节点有输入输出 schema 与失败策略
  • 高风险节点声明副作用与补偿动作
  • runtime 支持检查点与幂等执行
  • 关键路径时延和补偿成功率可观测
  • 图版本支持灰度与回滚

延伸阅读: