1. 三种 Agent 工作流架构到底在解决什么问题
1.1 从单次调用到多步协作的必然演进
很多人第一次接触 Agent 这个概念,脑子里浮现的画面是“给大模型一个任务,它自己想办法搞定”。但真正落地过几个项目之后就会发现,单次调用能做的事情极其有限。一个稍微复杂点的需求,比如“帮我分析这份销售数据并生成一份带图表的周报”,单次调用根本扛不住——模型既要理解数据格式,又要做统计计算,还要生成可视化代码,最后还要组织成文。这就像让一个人同时扮演数据分析师、前端工程师和文案策划,不是不可能,但出错概率高得离谱。
Agent 工作流架构的出现,本质上就是把这种“一人分饰多角”的困境拆解成“多人流水线协作”。每个环节由专门的节点负责,节点之间通过明确的输入输出契约连接,整体形成一个可观测、可调试、可优化的系统。我见过太多团队一开始图省事,把所有逻辑塞进一个超长提示词里,结果调试的时候完全不知道是哪一步出了问题,只能靠反复改提示词碰运气。这种开发体验,用“盲人摸象”来形容一点都不夸张。
增强型、链式与路由式这三种架构,恰好对应了从简单到复杂的三个层次。增强型解决的是“单个节点能力不够”的问题,链式解决的是“任务需要多步顺序执行”的问题,路由式解决的是“不同输入需要走不同处理路径”的问题。理解这三者的适用边界和组合方式,基本上就掌握了 Agent 工作流设计的核心骨架。
1.2 三种架构的核心差异与选型逻辑
先给一个直观的类比。增强型架构像是给一个员工配了一堆工具和参考资料,让他一个人把事情办完;链式架构像是把任务拆成几个工位,每个工位做完传给下一个;路由式架构像是在流水线入口放一个分拣员,根据包裹类型决定走哪条线。
增强型架构的关键特征是“单节点能力扩展”。它不改变工作流的基本形态,而是在单个 Agent 节点上叠加外部能力——比如接入知识库检索、调用计算工具、挂载代码执行环境。这种架构适合任务边界清晰、但需要外部信息或精确计算的场景。举个例子,一个客服问答 Agent,用户问“我的订单什么时候到”,Agent 需要查订单系统、查物流接口,然后组织语言回复。这就是典型的增强型:核心逻辑还是“理解问题-获取信息-生成回答”,只是获取信息这一步被增强了。
链式架构的核心在于“顺序依赖”。任务被拆成多个步骤,每一步的输出是下一步的输入,形成一条有向无环图。这种架构适合流程明确、步骤之间强依赖的场景。比如“合同审查”这个任务,可以拆成:提取关键条款 → 比对标准模板 → 标记风险点 → 生成审查意见。每一步都必须等上一步完成,顺序不能乱。链式架构的挑战在于错误传播——如果第二步提取错了,后面全错。所以链式架构里,每个节点的输出校验和异常处理特别重要。
路由式架构解决的是“分支决策”问题。系统先对输入进行分类或意图识别,然后根据结果把请求分发到不同的处理链路。这种架构适合输入类型多样、不同类别需要完全不同处理逻辑的场景。比如一个智能助手,用户可能问天气、可能问代码、可能问日程安排,这三类问题的处理方式完全不同。路由式架构先判断“用户想干什么”,再决定“用什么方式干”。
实际项目中,这三种架构很少单独使用,更多是组合出现。一个完整的 Agent 系统往往是:入口做路由分发,每条路由内部是链式流程,链式流程中的某些节点又做了增强。理解每种架构的独立形态,是为了在组合时知道每个部分该用什么模式。
1.3 选型时最容易踩的三个坑
第一个坑是“过度设计”。有些团队一上来就搞复杂的路由加链式加增强,结果发现大部分请求其实走的是同一条路径,路由层形同虚设,反而增加了维护成本。我的经验是:先用最简单的增强型跑通核心流程,等到确实出现“不同输入需要不同处理”的需求时,再引入路由。
第二个坑是“链式节点粒度过细”。有人把链式流程拆成十几个节点,每个节点只做一件极小的事情,结果节点间的通信开销和状态管理复杂度爆炸。链式架构的节点划分应该以“语义完整性”为标准,而不是以“代码行数”为标准。一个节点应该完成一个完整的语义步骤,比如“提取所有日期信息”是一个节点,“把日期格式从 MM/DD 转成 DD/MM”就不应该单独成节点,而应该作为前一个节点的内部逻辑。
第三个坑是“忽略路由的兜底路径”。路由式架构最怕的是输入不属于任何已知类别,系统直接报错或返回空。好的路由设计必须包含一个默认路径,处理那些无法分类的输入——哪怕只是返回“抱歉,我暂时无法处理这类请求,请换个说法试试”,也比直接崩溃强。
2. 增强型架构:单节点能力扩展的实操细节
2.1 增强型架构的典型组成与数据流
增强型架构的基本形态是一个“感知-思考-行动”循环。Agent 接收输入后,先判断是否需要外部信息或工具,如果需要就调用相应能力,拿到结果后再生成最终输出。这个循环可以迭代多次,直到 Agent 认为任务完成。
一个典型的增强型节点包含四个部分:意图解析器、能力注册表、执行调度器和结果合成器。意图解析器负责理解当前输入需要什么能力;能力注册表维护所有可用工具的元信息(名称、描述、参数 schema);执行调度器根据解析结果调用对应工具;结果合成器把工具返回的原始数据转换成自然语言或结构化输出。
数据流是这样的:用户输入 → 意图解析 → 匹配能力 → 调用工具 → 获取结果 → 判断是否满足 → 是则合成输出,否则回到意图解析继续下一轮。这个循环的上限通常设为 3 到 5 次,防止无限循环消耗资源。
我实测下来,增强型架构的性能瓶颈往往不在模型推理,而在工具调用的网络延迟。如果一个任务需要连续调用三个外部接口,每个接口平均 500ms,那就是 1.5 秒的额外延迟。所以增强型架构里,能并行调用的工具一定要并行,能缓存的查询结果一定要缓存。
2.2 工具注册与参数校验的工程实践
工具注册是增强型架构的地基。每个工具需要提供:名称(唯一标识)、功能描述(给模型看的自然语言说明)、参数定义(JSON Schema 格式)、调用示例(few-shot 示例)。这四个要素缺一不可,尤其是调用示例——模型对示例的理解能力远强于对抽象描述的理解。
参数校验是很多人忽略的环节。模型生成的工具调用参数经常出现类型错误、缺少必填字段、或者值超出合理范围。我的做法是在执行调度器里加一层校验中间件,对每个工具调用做三件事:检查必填参数是否存在、检查参数类型是否匹配、检查参数值是否在允许范围内。校验不通过时,不直接报错,而是把校验错误信息返回给模型,让它重新生成参数。这个重试机制能解决 80% 以上的参数错误。
注意:工具描述里一定要写明“什么时候不该用这个工具”。只写“这个工具能做什么”是不够的,模型很容易在不合适的场景下调用工具。比如一个“查询天气”的工具,描述里应该加上“当用户询问与天气无关的问题时,不要调用此工具”。
2.3 增强型架构的适用边界与性能考量
增强型架构最适合“单轮任务、边界清晰、需要外部信息”的场景。比如:基于知识库的问答、需要实时数据的查询、需要精确计算的任务。它的优势是实现简单、调试直观、延迟可控。
但它也有明显的边界。当任务需要多步推理且每步依赖前步结果时,增强型架构的循环会变得很长,每次循环都要重新理解上下文,效率低下。当任务需要多个 Agent 协作时,增强型架构无法表达 Agent 之间的依赖关系。这时候就需要链式或路由式架构来补位。
性能方面,增强型架构的延迟主要由三部分组成:模型推理时间、工具调用时间、循环次数。优化方向也很明确:用更小的模型做意图解析(分类任务不需要大模型)、并行化无依赖的工具调用、设置合理的循环上限。我见过一个项目因为没设循环上限,Agent 在某个边界情况下反复调用同一个工具,直接把 API 配额耗尽了。
3. 链式架构:多步顺序执行的拆解与衔接
3.1 链式节点的划分原则与依赖管理
链式架构的核心设计决策是“怎么切分节点”。切得太粗,单个节点逻辑复杂难以维护;切得太细,节点间通信成本高。我的经验法则是:一个节点应该对应一个可独立验证的语义步骤。什么叫可独立验证?就是这个节点的输出,你可以单独拿出来判断对错,而不需要看后续节点的结果。
举个例子,“从用户邮件中提取会议时间、参会人、议题”这是一个可独立验证的节点——提取结果对不对,一眼就能看出来。“根据提取的信息生成会议邀请”是另一个节点。但“把时间格式从 12 小时制转成 24 小时制”就不应该单独成节点,因为它不是一个完整的语义步骤,只是数据清洗的一个操作。
依赖管理方面,链式架构天然是线性依赖,但实际项目中经常出现“某个节点需要前面多个节点的输出”的情况。比如“生成会议纪要”这个节点,可能需要“原始邮件内容”和“提取的会议信息”两个输入。这时候有两种处理方式:一种是把所有中间结果都放在共享上下文里,每个节点从上下文里取自己需要的;另一种是显式定义每个节点的输入依赖,由调度器负责传递。前者实现简单但容易造成上下文膨胀,后者更清晰但需要额外的调度逻辑。我倾向于后者,因为显式依赖让整个流程更可观测。
3.2 节点间数据传递的格式约定与校验
链式架构里,节点间的数据格式约定是稳定性的关键。我的做法是:所有节点间的数据传递都用结构化格式(JSON 或类似),并且每个节点在输出前做一次 schema 校验。这样做的原因是,模型生成的输出格式经常不稳定——有时候多一个字段,有时候少一个字段,有时候字段类型变了。如果不做校验,错误会一路传播到最后一个节点才暴露出来,排查成本极高。
具体操作上,我会为每个节点的输出定义一个 JSON Schema,节点执行完后用这个 schema 校验输出。校验不通过时,把校验错误和原始输出一起返回给模型,让它重新生成。这个重试机制配合清晰的 schema 描述,能把格式错误率降到很低。
提示:schema 描述里不要只写字段名和类型,要写清楚每个字段的语义和示例值。比如
"meeting_time": {"type": "string", "description": "会议开始时间,格式为 ISO 8601,例如 2024-03-15T14:00:00"}。模型对示例的遵循度远高于对抽象类型的遵循度。
3.3 链式架构的错误传播与中断处理
链式架构最大的风险是错误传播。第二步错了,第三步基于错误输入继续执行,第四步再基于第三步的错误结果……最后得到一个完全离谱的输出,但你根本不知道是哪一步开始错的。
解决这个问题有两个层面。第一个层面是节点级校验:每个节点执行完后,除了 schema 校验,还要做业务逻辑校验。比如“提取会议时间”这个节点,校验逻辑可以是“时间必须在未来 30 天内”或者“时间必须在工作日”。校验不通过就中断,不往下传。
第二个层面是全局中断策略。链式流程需要定义清楚:某个节点失败时,是重试、跳过、还是终止整个流程?我的建议是分级处理——格式错误重试(最多 2 次),业务校验失败终止并返回明确错误信息,工具调用超时重试一次后终止。终止时要把当前节点的输入、输出、错误信息都记录下来,方便排查。
还有一个容易被忽略的点:链式流程的中间状态需要持久化。如果流程走到第五步时服务重启了,没有持久化的话就得从头再来。对于长流程(超过 5 个节点),我建议每一步的输入输出都落库,支持断点续跑。
4. 路由式架构:分支决策与动态分发
4.1 路由决策的实现方式与准确率优化
路由式架构的第一个核心问题是:怎么判断输入该走哪条路?常见的方式有三种:基于规则的关键词匹配、基于模型的意图分类、以及混合方式。
基于规则的方式最简单,维护一个关键词到路由的映射表。优点是快、可控、零成本;缺点是覆盖不全,用户换个说法就匹配不上了。基于模型的方式准确率更高,但需要标注数据来训练或微调分类模型,而且每次路由都要调用模型,有延迟成本。混合方式是先用规则做快速匹配,匹配不上的再走模型分类。我实测下来,混合方式在大多数场景下性价比最高。
路由准确率的优化,关键在于分类体系的粒度。分类太粗,不同意图混在一起,后续处理逻辑没法差异化;分类太细,每个类别的样本太少,模型学不好。我的经验是:先按“处理逻辑是否相同”来划分大类,同一个大类内部如果还有明显差异,再用二级路由细分。比如“咨询类”是一个大类,下面可以细分“产品咨询”“价格咨询”“售后咨询”,但如果这三类的处理逻辑差不多,就没必要细分。
4.2 多级路由与兜底策略的设计
实际项目中,单级路由往往不够用。用户输入可能先按“领域”路由(技术/生活/娱乐),再按“意图”路由(查询/操作/闲聊),最后按“复杂度”路由(简单问答/多步任务)。这就是多级路由。
多级路由的设计要点是:每一级路由的决策依据要明确且互斥。第一级按领域分,第二级按意图分,第三级按复杂度分——每一级的分类维度不同,不会出现“这个输入既属于 A 又属于 B”的模糊情况。如果出现模糊,说明分类维度设计有问题,需要调整。
兜底策略是多级路由的安全网。每一级路由都要有默认路径,处理那些无法明确分类的输入。默认路径的处理方式通常是:走一个通用的增强型 Agent,尝试用最基础的能力回应;如果连这个都失败,就返回引导性话术,让用户换一种方式表达。兜底路径的响应质量不需要很高,但必须存在,否则系统会在边界情况下直接崩溃。
4.3 路由与链式、增强型的组合模式
路由式架构很少单独使用,它通常是整个系统的入口层。一个典型的组合模式是:入口路由 → 链式流程 → 增强型节点。
具体来说,用户输入先经过路由层,判断属于哪类任务。每类任务对应一条链式流程,链式流程中的某些节点是增强型节点(需要调用外部工具或知识库)。这样整个系统既有路由的分发能力,又有链式的流程控制,还有增强型的单点能力扩展。
组合时的关键接口是上下文传递。路由层需要把原始输入和路由决策结果传递给链式层;链式层的每个节点需要把中间结果传递给下一个节点;增强型节点需要从上下文中获取它需要的参数。这个上下文对象的设计很重要——它应该是一个可扩展的字典结构,每个层可以往里写数据,也可以从中读数据,但读的时候要明确 key 的命名规范,避免冲突。
我踩过的一个坑是:路由层和链式层用了不同的上下文对象,导致路由决策结果没法传递给链式层,最后只能在路由层把决策结果拼接到原始输入里,非常别扭。后来统一了上下文对象的设计,所有层共享同一个上下文,问题才解决。
5. 三种架构的选型对照与组合实战
5.1 选型决策表与典型场景匹配
| 架构类型 | 核心能力 | 适用场景 | 不适用场景 | 实现复杂度 |
|---|---|---|---|---|
| 增强型 | 单节点能力扩展 | 知识库问答、实时查询、精确计算 | 多步强依赖任务、多分支任务 | 低 |
| 链式 | 多步顺序执行 | 文档处理流水线、多阶段审核、内容生成 | 输入类型多样、需要分支决策 | 中 |
| 路由式 | 分支决策分发 | 多意图助手、多领域客服、任务调度 | 单一类型输入、流程固定 | 中高 |
选型时先问三个问题:任务需要多步吗?不同输入需要不同处理吗?单步需要外部能力吗?如果只需要外部能力,选增强型;如果需要多步但不需要分支,选链式;如果需要分支,选路由式。如果三个都需要,那就是组合架构。
5.2 组合架构的落地案例拆解
假设要做一个“智能文档处理助手”,用户上传文档后,系统需要判断文档类型(合同/报告/论文),然后走不同的处理流程。合同需要提取条款并比对模板,报告需要提取数据并生成摘要,论文需要提取参考文献并检查格式。
这个场景的架构设计是:入口路由判断文档类型 → 每类文档对应一条链式流程 → 链式流程中的提取节点是增强型节点(调用 OCR 或文档解析工具)。
路由层的实现:先用文件扩展名做一级判断(.pdf/.docx/.txt),再用文档内容的前 500 字做二级判断(用模型分类)。链式层的实现:合同流程是“提取条款 → 比对模板 → 标记差异 → 生成审查意见”,报告流程是“提取数据 → 计算统计量 → 生成摘要”,论文流程是“提取参考文献 → 检查格式 → 生成检查报告”。增强型节点的实现:提取节点挂载文档解析工具,根据文档类型选择不同的解析策略。
这个组合架构的关键设计点是:路由层的分类结果要传递给链式层,链式层根据分类结果选择对应的流程。实现上,路由层在上下文里写入document_type字段,链式层的调度器根据这个字段加载对应的流程定义。
5.3 架构演进路径与重构时机
不要一开始就设计复杂的组合架构。我的建议演进路径是:第一阶段用增强型跑通核心能力,第二阶段在增强型外面包一层链式流程,第三阶段在链式流程前面加入路由层。
重构的时机判断:当你发现“每次加新功能都要改核心流程”时,说明需要路由层了;当你发现“单个节点的提示词越来越长、越来越难维护”时,说明需要链式拆分了;当你发现“某些节点需要反复调用外部工具”时,说明需要增强型能力了。
重构时最需要注意的是保持接口稳定。路由层的输入输出格式、链式层的节点接口、增强型节点的工具注册格式,这些接口一旦确定就不要轻易改。接口稳定了,内部实现怎么调整都不会影响其他层。
6. 常见问题与排查技巧实录
6.1 路由误判与链式断链的排查思路
路由误判的典型表现是:用户问 A 类问题,系统走了 B 类流程,返回了完全不相关的答案。排查时先看路由层的分类结果,确认是分类错了还是分类对了但流程选错了。分类错了就优化分类逻辑(加规则、补样本、调阈值);分类对了但流程选错了,就是路由映射表配错了,改配置就行。
链式断链的典型表现是:流程走到某个节点后没有输出,或者输出为空。排查时先看这个节点的输入是否正常——如果输入就是空的,说明是上一个节点的问题;如果输入正常但输出为空,说明是这个节点的执行问题。节点执行问题常见原因有三个:提示词里没有明确要求输出格式、模型返回了空内容、工具调用超时但没有正确处理。
提示:链式流程的每个节点都应该有超时设置和空输出处理。超时后返回明确的错误信息,空输出时触发重试或走默认值。不要让空输出静默传递到下一个节点。
6.2 上下文膨胀与性能衰减的应对
组合架构跑一段时间后,常见的问题是上下文越来越长,模型推理越来越慢,成本越来越高。原因是每个节点都往上下文里写数据,但没有人清理。
应对策略有三个。第一,上下文分层:把上下文分成“全局上下文”(整个流程共享的少量关键信息)和“节点上下文”(当前节点需要的临时数据)。节点执行完后,临时数据可以清理。第二,上下文压缩:对于长文本内容,在写入上下文前先做摘要或提取关键信息,不要原文塞进去。第三,上下文窗口管理:给上下文设一个大小上限,超过上限时按优先级淘汰旧数据。
我实测下来,上下文分层是最有效的。全局上下文通常只有几个字段(用户 ID、任务类型、关键参数),节点上下文只在当前节点生命周期内存在。这样即使流程很长,全局上下文也不会膨胀。
6.3 模型输出不稳定的工程化约束手段
模型输出不稳定是 Agent 工作流的固有挑战。同一个输入,两次运行可能得到不同格式的输出。工程化的约束手段包括:结构化输出约束(用 JSON Schema 强制输出格式)、few-shot 示例(在提示词里给 2-3 个输入输出示例)、输出后校验(用代码校验输出是否符合预期格式)、重试机制(校验不通过时自动重试)。
这四种手段的组合使用效果最好。我的标准配置是:每个节点都定义输出 schema,提示词里包含至少 2 个示例,执行后做 schema 校验,校验失败重试最多 2 次。这套组合能把格式错误率控制在 1% 以下。
还有一个技巧是温度参数调低。对于需要稳定输出的节点(比如提取、分类),温度设为 0 或 0.1;对于需要创造性的节点(比如生成文案),温度可以设高一些。不同节点用不同温度,这个在链式架构里很容易实现,因为每个节点是独立调用的。
6.4 常见问题速查表
| 问题现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| 路由总是走默认路径 | 分类阈值过高或分类器未生效 | 检查分类器输出和阈值配置 | 降低阈值或重新训练分类器 |
| 链式流程中途卡住 | 某节点超时或死循环 | 查看各节点执行日志和耗时 | 加超时设置和循环上限 |
| 输出格式频繁错误 | 提示词缺少格式约束 | 检查提示词和 schema 定义 | 加 few-shot 示例和 schema 校验 |
| 上下文越来越长 | 节点只写不清理 | 检查上下文写入逻辑 | 实施上下文分层和压缩 |
| 工具调用参数错误 | 工具描述不清晰 | 检查工具描述和参数 schema | 补充描述和示例,加参数校验 |
| 相同输入结果差异大 | 温度参数过高 | 检查各节点温度设置 | 降低需要稳定输出的节点温度 |
7. 我在实际项目中的几点体会
增强型架构的调试成本最低,因为它的执行路径是线性的,出问题容易定位。链式架构的调试成本中等,需要逐节点排查。路由式架构的调试成本最高,因为路由决策本身可能出错,路由之后的流程也可能出错,两个错误叠加时排查难度翻倍。所以我的建议是:能用增强型解决的就不要上链式,能用链式解决的就不要上路由。架构的复杂度应该由业务需求驱动,而不是由技术偏好驱动。
另一个体会是:日志和可观测性不是可选项,是必选项。Agent 工作流的执行过程比传统程序复杂得多,没有详细的执行日志,排查问题基本靠猜。我的做法是每个节点执行时记录:节点名称、输入摘要、输出摘要、执行耗时、是否重试、错误信息。这些日志汇总到一个可查询的地方,出问题时按时间线一看就清楚了。
最后分享一个小技巧:在开发阶段,给每个节点加一个“dry run”模式,只打印输入输出但不实际调用模型或工具。这样可以快速验证流程连通性和数据格式,不用每次都等模型推理。等流程跑通了再关掉 dry run 做真实测试,能省不少时间。