最近被问到最多的一个问题就是Agent工作流到底该怎么设计,尤其是增强型、链式、路由式这三种架构,听起来都有道理,可真要动手搭一套能稳定跑业务的系统,很多人就卡住了。我自己前前后后做过几套Agent应用,包括某电商客服辅助系统、某内容翻译平台、某文档分析Demo,这三种模式都用过,也踩过不少坑。这篇文章就把我实际跑下来的经验梳理一遍,讲清楚每种架构解决什么问题、核心节点怎么设计、参数怎么定、遇到故障怎么排查,尽量给你一套能直接参考的方案。
先说结论:这三种架构并不是互斥的,复杂系统里往往是组合使用。增强型解决的是“单个任务质量不够好”的问题,链式解决的是“任务步骤太多、一次做不完”的问题,路由式解决的是“不同请求要用不同处理方案”的问题。理解了这三个本质,再去看各种工作流框架,思路会清晰很多。
1. 三种架构的定位与整体设计思路
1.1 为什么“单次调用”撑不住真实业务
很多人最初接触Agent时,习惯性地把任务一股脑塞给一次LLM调用,比如“帮我写一份市场分析报告,包括数据整理、竞品分析、趋势预测、排版建议”。这种Prompt写完之后,效果往往很随机:有时候模型自己发挥得很好,有时候会漏掉好几个关键部分,有时候甚至编造数据。原因很简单,大模型的单次输出能力是有限的,任务越复杂,状态空间越大,出错的概率就越高。
工作流架构的本质,是把不确定性拆解成可控的小环节。每一个环节只负责一件相对明确的事情,通过控制流把它们串起来。这样哪怕某个环节的效果不完美,你也能精准定位哪里出了问题、哪个节点需要换模型、哪个参数需要调整,而不是面对一整段莫名其妙的输出无从下手。
我见过不少团队在架构选型上走极端:一种是迷信大模型万能,什么流程都不做,全部靠自然语言硬怼,结果线上事故频发;另一种是一上来就搭非常复杂的多Agent协作框架,每个节点都塞一个模型,结果成本飙升、调试困难、产出还不如单次调用。真实的项目里,工作流设计的核心不是“越复杂越好”,而是让每一步都有明确的目标、可验证的产出、可控制的成本。
1.2 三种架构的分工与适用边界
这里用一个类比帮助理解。假设你开了一家餐厅:
- 增强型架构的运作方式,像一位大厨反复试菜。初版菜品做出来,尝一口不满意,调整调料,再做,再尝,直到达到标准。它在“深度打磨”上很强。
- 链式架构的运作方式,像一条流水线。有人负责洗菜,有人负责切菜,有人负责炒制,有人负责摆盘。每个环节的输出是下一个环节的输入,任务被有序拆解。
- 路由式架构的运作方式,像餐厅门口的引导员。客人说要包间,就带去宴会厅;客人在减肥,就推荐低卡菜单;客人赶时间,就引导去快餐档口。它解决的是“分流决策”问题。
把这三张图记住,选型就成功了一半。下面这个表格整理得更直接:
| 维度 | 增强型 | 链式 | 路由式 |
|---|---|---|---|
| 核心控制流 | 循环迭代 | 顺序传递 | 条件分支 |
| 关键依赖 | 评估结果决定是否继续 | 上一节点的输出作为下一节点输入 | 意图识别结果决定走哪条路径 |
| 典型任务 | 内容改写、代码审查、翻译润色 | 文档生成、数据清洗、多步分析 | 客服分流、工具选择、复杂问答 |
| 失败模式 | 循环震荡、越改越差 | 错误累积、中间结果污染 | 路由误判、分支选择错误 |
| 适用复杂度 | 中等复杂但需要高质量 | 复杂但步骤边界清晰 | 路径多样且互相独立的场景 |
做架构选型的时候,先问自己一个问题:当前的瓶颈到底是“做得不够好”还是“做不完”还是“不知道走哪条路”?找准瓶颈再选架构,比盲目模仿别人的技术方案靠谱得多。
2. 增强型架构的实操拆解与参数调优
2.1 生成-评估-优化的闭环怎么落地
增强型架构,也被叫做迭代反馈架构或反思架构,核心是一个闭环:生成器产出初稿,评估器给出评分与修改意见,精修器根据意见修改,然后回到评估器继续评分。听起来简单,但实际工程落地时有很多细节。
以我做过的一个产品文案改写工具为例。业务要求是把技术说明书风格的内容,改写成用户能看懂的通俗表达,同时保留所有关键参数。最初我们用单次Prompt做改写,结果每隔几条就会出现专业术语解释不清、关键参数被漏掉的毛病。
后来改成增强型工作流:
- 生成器节点:给定原文和改写要求,产出第一版改写稿。
- 评估器节点:按照“信息完整性、语言通俗度、术语准确性、格式合规”四个维度打分,输出0到10的分值和具体问题列表。
- 判断是否达标:不达标就进入精修器。
- 精修器节点:接收评估器给出的问题列表,针对性地修改原文,产出第二版。
- 重新评估,循环最多3次。
这个结构里最容易被忽视的是节点职责分离。我们第一次做的时候,让同一个模型既当生成器又当评估器又当精修器,结果模型自我感觉良好,给初稿打了高分,循环根本走不起来。后来强制把三个节点用不同的系统提示词隔离,甚至评估器用了另一个更便宜的小模型,效果反而明显提升。原因是评估者和生产者的视角应该尽量独立,同一个模型在同一轮对话里连续切换角色,容易产生“路径依赖”。
2.2 停止条件与控制成本的几个关键参数
增强型架构最大的风险是成本失控。每循环一轮,就要多调用一次生成和一次评估,Token消耗是线性增长的,但收益往往不是线性的。因此设计停止条件至关重要。
我常用的几个参数是这样的:
max_attempts:最多迭代次数,一般设3到5轮。超过这个次数直接采用最后一次输出,避免死循环。rating_threshold:达标线,比如评分高于8.5就提前终止。min_delta:最小提升量。如果相邻两轮的评分差异小于0.3,说明已经收敛到平台期,继续迭代意义不大,直接停止。deterioration_count:退化次数。如果评分连续下降两次,立即停止并回退到历史最高分版本。
下面是一段简化版的流程控制伪代码,方便理解参数之间的配合:
attempt = 0 best_output = None best_score = -1 deterioration = 0 while attempt < max_attempts: if attempt == 0: output = generate(original_input) else: output = refine(previous_output, critic_feedback) score, issues = evaluate(output) if score > best_score: best_score = score best_output = output deterioration = 0 else: deterioration += 1 if score >= rating_threshold: break if deterioration >= 2: output = best_output break critic_feedback = issues attempt += 1这个流程里有几个细节值得注意。首先,每次都从原文重新生成,而不是在上一版基础上改,能避免修改方向的漂移。精修器接收的是原文加评估意见,而不是“基于当前这版继续改”,否则模型会过度贴近上一次的表达习惯,陷入局部最优。其次,best_output一定要单独存,不能在循环变量里覆盖,否则退化回退时就拿不到历史最优结果了。
成本控制上,我的经验是生成器和精修器用能力强的模型,评估器用便宜模型。因为评估节点不需要很强的创造力,只需要按标准打分,很多7B级别的开源模型或者厂商的低价档模型就够用。我试过在评估器上从大模型换成小模型,单个任务的评估成本下降了接近六成,评分质量和之前差距不大——当然前提是评估标准写得足够清晰。
2.3 评估器设计的几个实操细节
评估器是整个增强型架构的灵魂。它的质量直接决定循环往哪个方向收敛,所以值得多花心思。
第一,评估维度必须结构化。我见过有人让评估器“输出一个0到10的分数”,结果模型给分非常随意。更好的做法是拆成多个子维度,每个维度单独打分,并给出具体理由。比如:
{ "scores": { "completeness": 9, "clarity": 7, "terminology_accuracy": 8, "format_compliance": 10 }, "issues": [ "专业术语'扭矩冗余'未做解释,目标读者可能看不懂", "第3段中'热衰减'和'散热效率'两个概念被混用", "关键参数表被改写成了段落形式,对比性下降" ] }有了结构化的问题列表,精修器才能“对症下药”。我对比过两种模式,一种评估器只给分数,精修器盲改;另一种给具体问题列表,精修器逐条修改。后者在同等迭代次数下的提升幅度明显更大,而且可解释性强,出了问题你知道是哪一轮引入的。
第二,评估器本身也会“幻觉”。不是说评估器在编造内容,而是它可能对质量标准理解不一致:同一份输出,这次打7分,下次打9分,导致循环无缘无故地提前终止或白跑一轮。缓解办法有三个:一是给评估器明确的Rubric说明,最好附上正例和反例;二是把评估器的温度参数调到最低,减少随机性;三是对关键业务增加规则兜底校验,比如“必须包含用户要求的关键词列表”“长度必须在某个区间内”,这类规则性校验永远不要依赖模型判断。
第三,增强型的“标杆”不一定是分数。有些场景下,你真正要优化的是“通过率”而不是“平均分”,比如代码审查场景里,是否包含安全漏洞比代码风格分数更重要。先定义清楚什么叫达标,再设计评估器,顺序不能反。
3. 链式架构的状态传递与错误处理
3.1 把大任务拆成有序步骤的切入点
链式架构的核心想法是:既然一次做完容易崩,那就每次只做一小步。这个思路在工程上并不新鲜,但在Agent场景里,难点在于步骤的边界怎么切,以及步骤之间的数据契约怎么定。
我做过一个从原始会议纪要自动生成结构化周报的应用,最早也是单次Prompt搞定,结果输出要么过于冗长,要么丢失了待办事项。后来拆成了四个环节:
- 清洗节点:去除口头禅、重复表达、无关讨论,保留有效信息。
- 要点提炼节点:把清洗后的文本压缩成若干条事实性要点。
- 结构生成节点:将要点按“进展、问题、计划、风险”四个板块组织成周报初稿。
- 校对节点:检查语义连贯性、时间信息准确性、待办事项是否完整。
这个拆法的窍门是:每一步的输出必须比输入更简单、更结构化,而不是同等复杂度。如果某个节点输出的文本长度和输入差不多,说明这一步没有起到应有的分解作用,链条本身就失去了意义。清洗节点把文本变短,要点提炼把段落变列表,结构生成把列表变结构化文档,校对把文档变可靠——每一环都在做“降熵”的事情。
3.2 数据契约与状态管理的关键点
链式架构里最容易翻车的不是模型效果,而是数据格式。我们前后端开发有个习惯叫接口契约,Agent链式架构里同样需要这个东西,而且比传统接口更重要,因为LLM的输出天然不稳定。
我通常的做法是给每个节点定义一个输入输出Schema,节点之间不直接传自由文本,而是传JSON。比如要点提炼节点的输出Schema:
{ "type": "object", "properties": { "key_points": { "type": "array", "items": { "type": "object", "properties": { "content": {"type": "string"}, "category": {"type": "string", "enum": ["progress", "issue", "plan", "risk"]} }, "required": ["content", "category"] } } }, "required": ["key_points"] }定义Schema的好处有三个。第一,节点的Prompt里不需要长篇大论解释“你需要输出什么格式”,直接把Schema贴进去,再给一个Few-shot示例,模型就能照做。第二,下游节点可以安全地读取特定字段,不需要依赖字符串解析。第三,漏洞可以被提前拦截——如果模型输出不符合Schema,JSON解析这一层就会暴露问题,而不是把坏数据传给下游。
状态管理上,我推荐用一个简单的流程编排器保存所有节点的中间输出,而不是让节点之间直接通信。这样每一步的输入输出都有存档,排查问题时可以回溯“哪一步开始变形的”。我自己常用的是一个轻量级的Python字典加JSON文件持久化,节点函数只接收input和context,返回output,所有副产物都写到统一的run目录下。等到流程复杂到一定程度,再考虑引入专用框架也不迟。
3.3 链式架构的误差累积与应对
链式最经典的坑是误差累积。前面说过,链路每一环都在降熵,但降熵不等于消除错误——如果清洗节点把某条有效信息误删了,后面的要点提炼和结构生成都拿不到它,最终周报就缺了一块。而且链条越深,这种“沉默错误”越隐蔽。
应对方式我总结为三板斧:
- 关键节点后加校验器。不是每个节点都需要校验,但要找出那些“一旦出错后续无法挽回”的节点。在我的周报流程里,清洗节点后面必须校验的关键字段是“讨论主题是否被移除”,结构生成节点后面校验“四个板块是否齐全、待办事项是否全部保留”。校验器可以是规则脚本,也可以是LLM判断,后者更灵活但要注意成本。
- 同一步骤做多次采样对比。对于真正核心的节点,可以并行调用两三次,用简单的投票机制选出多数结果。这个不要全链路用,成本扛不住,只在关键瓶颈上使用。
- 保留人工介入的阀门。链式流程跑完之后,给一段“人工确认”的缓冲地带。尤其在自动化程度还不高的时候,宁可多一道人工审核,也不要让错误输出直接流入生产系统。
还有一个小坑:节点之间的上下文污染。有些模型会在输出末尾附带“思考过程”或者对上游节点的分析评价,如果不加约束,这些杂讯会顺着数据流传递到下游,干扰后续节点的判断。解决方式是在每个节点的系统提示词里明确要求“仅输出最终结果,不要输出任何分析过程或解释”,并且在后处理时对输出做格式化清理。
4. 路由式架构的意图识别与降级策略
4.1 路由节点的三种实现方式
路由式架构解决的是“不同输入走不同路径”的问题。它包含一个路由节点,负责判断当前请求应该进入哪条后续流程。路由节点怎么实现,是这个架构的核心决策。我实际用下来,有三种主流路子。
第一种是规则路由。用关键词、正则表达式或简单的分类逻辑做判断。优点是速度快、成本低、结果完全可预期;缺点是泛化能力弱,用户换个说法就识别不了。适合路径数量少、意图边界清晰、输入格式相对固定的场景。比如处理用户发送的工单消息,用“退款”“退货”“发票”等关键词做初步分流,准确率可以达到九成以上。
第二种是向量相似度路由。把每个路径的意思,用若干条示例描述成一个“路径向量”,再把用户输入转成向量,计算相似度取最近的一个。优点是支持模糊匹配,对同义词、口语化表达更友好;缺点是需要有标注种子数据,而且对“多条路径意思接近”的场景区分度不够。适合路径较多但语义空间相对分散的场景,比如企业内部的多技能知识库问答。
第三种是LLM意图分类。把用户输入和路径列表交给模型,让它直接输出应该走哪条路。优点是完全开放式的语义理解,几乎不受表达方式限制;缺点是每一条消息都要消耗一次LLM调用,延迟和成本都高,而且模型可能偶尔“自作聪明”选错路径。适合对话语义复杂、路径边界模糊且调用频率不高的场景。
三选一的原则很直接:规则能解决的,不要用向量;向量能解决的,不要用LLM。每次往上跳一级,成本、延迟和不确定性都在增加。
4.2 路由失败时的降级设计与可观测性
路由节点设计得再好,也一定会出现误判。因此路由式架构里必须设计兜底路径,这是很多新手最容易忽略的点。我的做法是:当路由置信度低于某个阈值(比如相似度低于0.55),或者LLM分类结果不确定时,强制走一条通用兜底路径。兜底路径不追求完美,但至少要保证用户能得到一个不突兀的响应,比如转交人工客服、返回通用帮助文档,或者请求用户补充信息。
另外一个关键习惯是把路由结果完整记录到日志里。哪条输入、选了哪条路、置信度是多少、为什么选这条,这些信息是后续优化的弹药。我之前在做某客服系统时,一开始没有记录路由理由,产品反馈总说“分流不准”,但根本无法定位是关键词路由的覆盖问题还是数据标注问题。后来给路由节点增加了“输出理由”字段,把用户原话和路由依据都存下来,每周导出分析一次,两周内就把主要误判场景补齐了。
多轮会话场景里还有一个容易被忽视的细节:单轮意图路由会丢失上下文。用户先问“怎么退换货”,再发一句“寄回地址发我”,单看第二句很难判断要寄回到哪里。我的经验是维护一份轻量的“对话意图摘要”,每轮对话结束后更新,路由时同时参考当前输入和历史摘要。这个摘要不需要很复杂,两三行字概括用户当前诉求即可。
5. 架构组合选型的决策参考
5.1 不要用技术方案反推业务需求
聊到这里你应该有一个感觉:三种架构解决的是不同问题,真正的生产系统往往不止一种模式。但很多团队的麻烦恰恰是“上来先选框架再想需求”,比如看到别人用了某种多Agent框架很酷,自己也套上,结果系统重得跑不动。
我的建议是先做最简可行性验证。任何新需求,先用单次Prompt跑一遍,记录失败点。失败方式是“质量不够好”,考虑增强型;失败方式是“任务太长做不完”,考虑链式;失败方式是“不同用户需求边界差异大”,考虑路由式。用失败模式来驱动架构选择,而不是用架构来定义失败模式。
几个具体的判断场景:
- 你的任务需要“精修到专家水平”,比如专利申请文本改写,首选增强型。
- 你的任务在逻辑上有硬性先后顺序,比如“先抽取数据再生成图表再排版”,首选链式。
- 你的任务有多个风格完全不同、互不干扰的子任务,比如“查天气和点外卖”,首选路由式。
- 你的任务既长又需要高质量,那通常是链式加增强型的组合:每一步先链式拆解,其中质量不达标的子任务单独加增强循环。
5.2 一个混合编排的完整示例
拿一个虚构的“文档智能处理助手”来举例,请求可能来自不同入口,每个请求的目标也不一样:
- 用户上传一份合同文档,说“帮我总结关键条款”——路由式判断为“摘要任务”,进入链式流程:OCR清洗、条款抽取、摘要生成、格式调整。
- 用户上传一份技术白皮书,说“把这份文档改得更通俗”——路由判断为“改写任务”,进入增强型流程:生成初稿、评估可读性与术语保留、精修迭代。
- 用户上传一堆表格文件,说“帮我按格式整理成统一模板”——路由判断为“批量结构化任务”,进入链式流程,每个文件经过同样的转换步骤。
整个系统的最上层是一个路由节点,负责把请求分到功能模块;功能模块内部再根据任务特征决定用链式还是增强型。这种分层组合的思路,既保证了每个模块的职责清晰,又让架构具备弹性。
6. 常见问题与排查技巧实录
6.1 三类典型故障的排查思路
实际运行中,三种架构各自有一些高发问题。我整理了三个最典型的场景以及排查路径。
场景一:增强型循环“越改越差”。现象是精修器每轮都在修改,但评分不升反降,甚至出现内容被错误删减的情况。排查步骤:
- 先看评估器的评分是否有波动——连续多轮评分大幅波动说明评估标准不稳定。
- 看精修器的输入——如果精修器只是拿到问题列表但没拿到原文,容易在局部修改时跑偏。
- 检查修改幅度——如果每轮的diff过大,说明系统提示词里缺少“保持整体结构不变”的约束。
- 降低
max_attempts到3轮,同时提高rating_threshold,让系统接受“够用就好”。
场景二:链式流程在中段出现格式崩塌。现象是前一两步输出还是结构化的JSON,到了第三步变成了纯文本,下游解析全部失败。排查步骤:
- 从状态存档里回放每一步的原始输出,定位第一个格式不符合Schema的节点。
- 检查该节点的上下文长度——如果传入的文本太长,模型的输出能力会被压缩,格式更容易崩。
- 给该节点增加Few-shot示例,示例要和真实输入高度相似,而不是泛泛的示例。
- 在节点输出后加一次JSON schema校验和自动修复——修复逻辑可以调用一次小模型重输出,比重新跑整个链路便宜。
场景三:路由节点频繁误判。现象是特定类型的输入总是被分到错误的路径。排查步骤:
- 先看这类输入的原始文本和路由理由,找规律——通常会发现它们含有某个高频触发词,被规则路由错误捕获。
- 检查路径种子描述,看是否存在语义重叠,比如“退款”和“售后”路径的示例文本几乎一致。
- 如果是LLM路由,降低温度让判断更稳定,同时把常见误判样本加入Few-shot的反例。
- 在确认问题输入有规律后,优先用规则路由做前置拦截,把确定性高的部分先从LLM路由里剥离出来。
6.2 日志、可观测性和回归测试
Agent工作流和传统后端有个很大的不同:传统接口行为基本确定,Agent的输出是分布式的。一个输入,跑了十次,结果可能都不完全一样。这给测试和排查带来了很大挑战,所以日志设计要格外重视。
我给自己定的最低标准是:每次LLM调用都要记录输入摘要、输出摘要、Token数、延迟、模型版本、评分数值、路由路径。版本号必须记,因为模型厂商会悄悄更新底座模型,同一套工作流的输出分布可能一夜之间完全不同。没有版本记录,遇到问题根本不知道怎么对比。
因为LLM输出的随机性,线上一個看似正常的输入,可能在某个偶然因素下输出异常。所以我建议团队维护一个小型的回放测试集,里面收集三类样本:正常业务样本、边界样本、历史故障样本。每次工作流代码或Prompt有变更,就跑一遍回放测试集,对比输出质量是否回退。这个成本不算高,但价值很大——它能帮你在上线前拦住大多数“这次改动影响了那边场景”的隐患。
最后分享一个个人习惯:任何一套Agent工作流,我都要求团队成员画出一张“流程-成本-质量”的对照表。三种架构的本质,就是在这三个变量之间找平衡。你不需要一开始就把架构设计到完美,先跑通一条最简路径,然后逐步加节点、加反馈、加路由;但每加一层,都要有明确的收益预期和可观测的指标证明它真的有价值。这样出来的系统,才不是“看起来很高级”的技术摆设,而是能长期稳定运行的生产工具。