最近被问得最多的一个问题,不是某个具体的技术细节,而是:普通对话、工作流、Agent,到底该怎么选?问的人里不少已经吃过亏——要么一上来就堆Agent,结果流程跑着跑着开始自由发挥,输出根本没法交给下游系统;要么老老实实写了一整条工作流,回头发现需求本身就是开放式的,压根不存在固定路径。我现在的态度很明确:别一上来就问“要不要上Agent”,先回头看你手里这个需求,它的性质、结构和容错空间到底是什么。这篇文章就把我的选型思路、踩过的坑,以及一套可以直接照搬的判断方法写透。
1. 三个选项不是“低级到高级”,是三种不同分工
很多人有一个隐性的心理预设:普通对话是入门,工作流是进阶,Agent是终极形态。好像做AI应用不追到Agent就落伍了。这个预设害人不浅。
1.1 普通对话的本质是一锤子买卖
普通对话的本质,是不保留任务状态的“一次性生成”。你把问题丢给模型,它基于上下文给一个答案,对话结束,任务就算完了。它没有任务意识,不知道你其实是要一套连续动作,也不负责保证每一轮输出的格式和质量完全一致。
举个例子。你用普通对话让模型写一段商品文案,效果通常不错。但你让它一次性生成100条文案,要求每条包含品名、卖点、价格、适用人群,拿到手你会发现:第5条格式还很工整,第40条开始字段顺序就乱了,第80条可能漏了价格。因为它本质上是无状态生成,每一条之间没有强约束。
普通对话的真正价值在于:响应快、成本低、几乎零搭建成本。适合的场景是信息咨询、头脑风暴、文本润色、概念解释、代码问答这类“问一句、答一句”的事情。它解决的从来不是“任务”问题,而是“问答”问题。
1.2 工作流的本质是把经验固化成流程
工作流的思路,和工厂里的流水线一脉相承。你预先定义好一串节点:第一个节点做什么判断,第二个节点调哪个模型,第三个节点查哪张表,第四个节点按什么模板输出。每个节点之间的数据怎么流动,全部写死。
它的最大优点是确定性和可控性。同样一批输入,今天跑和明天跑,结果几乎一样。而且每个节点都留痕,出问题知道是在哪一步出错的。调试和回归测试也方便。
但代价是灵活性差。流程一旦定下来,想加一个分支就得改代码、重新发布、重新测试。如果需求经常变,或者业务场景本身就没有固定路径,工作流会越写越臃肿,最后变成一大坨if-else套着模型调用,维护成本拉满。
1.3 Agent的本质是“带着行动权限的决策循环”
Agent和上面两者有本质区别:它不仅生成文本,还能采取行动。它的核心不是“回答一个问题”,而是“执行一个任务”,并且在执行过程中根据观察到的结果,调整自己下一步的动作。
我理解Agent的底层逻辑是一个循环:观察(Observe)→ 决策(Decide)→ 行动(Act)→ 再观察。比如你让Agent去调研某个行业的最新动态,它会自己决定先搜哪些关键词,读了搜索结果觉得信息不够,再换一批关键词搜索,然后打开相关网页提取关键信息,最后汇总成报告。它不需要你手把手把每一步都定义好。
这正是Agent迷人的地方,也是它危险的地方。它有灵活性,也就有不稳定性。同样的任务今天跑和明天跑,走的路径可能完全不同,结果的质量也随之波动。而且Agent调外部工具时,天然存在失败、超时、越权这些风险,所以需要设计护栏(Guardrail),这在后面会专门展开讲。
1.4 一句话区分三者的边界
我琢磨了很久,用一句话来概括三者的分工可能最有用:普通对话负责“说”,工作流负责“按规矩办”,Agent负责“看着办”。
- 普通对话:模型输出文字,任务结束。
- 工作流:模型/规则/API按照预定路径执行,每一步的负责人是“流程设计者”。
- Agent:模型在目标约束下自己规划路径,每一步的负责人是“模型自己”。
你以为这是技术架构分类,其实这是“决策权”的分配。普通对话把决策权全给用户,工作流把决策权全给设计者,Agent把一部分决策权让渡给模型。想清楚这一层,后面的选型就顺了。
2. 一张对比表看清三种形态的本质差异
理论说完了,我给一张我自己项目里常用的对比表,把三种形态放在同一维度上看。这张表参考过不少内部评审,实战中用起来非常直接。
| 对比维度 | 普通对话 | 工作流 | Agent |
|---|---|---|---|
| 本质 | 一次性的文本生成 | 预定义步骤的确定性执行 | 带工具调用的动态决策循环 |
| 核心优势 | 快、便宜、零搭建 | 稳定、可测、可追溯 | 高柔性,能应对意外情况 |
| 主要缺陷 | 无任务状态、无外部行动 | 路径固定,改需求就改代码 | 不确定性高,必须有护栏 |
| 结果可控性 | 弱,同一问题不同答案 | 强,同输入基本同输出 | 弱到中,视任务而定 |
| 调试难度 | 低 | 中,节点化排查 | 高,需要日志链和逐步回溯 |
| 成本量级 | 最低,模型调用为主 | 中,流程编排+模型调用 | 最高,考虑多轮调用和工具开销 |
| 是否调用外部工具 | 通常不调用 | 可以调用,但由流程预先编排 | 主动调用,且可自行调整调用顺序 |
| 适用场景 | 问答、草稿、翻译、解释 | 批量生成、报告、定时任务、固定审批 | 开放调研、多条件决策、复杂排障 |
| 典型使用者 | 业务人员自助使用 | 由工程师配置好后长期运行 | 由工程师设计目标与护栏后运行 |
这张表里最容易被忽略的是“调试难度”这一行。普通对话不满意就重新问一句;工作流出错了,定位到某个节点就能修;Agent出了问题,你往往得从头到尾看一遍它的行动轨迹,才知道它在哪一步开始跑偏。这个成本在项目排期里被严重低估。
我再补一句实在话:成本量级这一行,很多人觉得Agent最贵是因为多轮调用,其实更大的开销是开发期的人工排查。Agent的自由度本身就意味着它的错误模式也更多样,你不可能用测试工作流的思路去测Agent。
3. 我的四个判断题:路径、外部依赖、稳定性、失败代价
这一节是全文最核心的部分。我把选型问题收敛成四个判断题,任何一个需求拿到手,我都先过一遍这四个问题。
3.1 第一问:任务路径是否已知且稳定?
这是最重要的一问。所谓的路径已知,指你能清晰地列出这个任务从输入到输出的所有步骤,而且这些步骤不会经常变。
举两个极端:
- 任务A:“每天晚上读取某个目录下新增的CSV文件,清洗数据,按模板生成日报,发送到指定邮箱。”这个任务的路径完全已知,步骤永远不变。我会直接写工作流,节点都不用太多,十分钟搭完。
- 任务B:“帮我分析当前业务存在的问题,并提出改进方案。”这个任务没有固定路径,分析角度可能从成本切入,也可能从用户反馈切入,每一步都取决于上一步的发现。这种任务根本不可能预先定义流程,Agent是唯一合理的选择。
如果一个任务路径已知,你硬要用Agent,结果就是:Agent在每一步都“自由发挥”地选择要怎么走,经常选出一条你没想到、但未必最优的路径,而且因为路径不固定,你每次跑出来的结果还不能保证一致。这是我见过的最常见的错误用法。
3.2 第二问:是否需要实时获取外部信息或操作外部系统?
这个问题用来划分“纯文本任务”和“行动型任务”。
纯文本任务,比如翻译、润色、摘要、思维导图,输出只依赖模型内部知识和上下文,没有外部依赖。这种任务普通对话甚至就够了,根本不需要工作流,更不需要Agent。
但一旦任务涉及查询数据库、调用API、抓取网页、操作文档、发送消息,就产生了外部依赖。这时候分两种情况:
- 外部操作的顺序是固定的,先查A再查B,最后写C。这种走工作流,提前编排好。
- 外部操作的顺序不固定,甚至要边做边决定下一步查什么。这种必须Agent。
拿“客服工单自动响应”举例。工单进来之后,先查用户历史订单,再查产品知识库,然后按模板生成回复。这中间查库的顺序是固定的,工作流就可以搞定。但如果工单内容是“用户反馈产品在某种特殊环境下报错”,需要排查环境、复现步骤、查日志、对比多个知识库条目,路径完全不确定,那就只能Agent。
3.3 第三问:输出结果是否需要保证格式与口径稳定?
这一问和上一问独立,专门用来对付“看起来简单但实际要求很高”的任务。
举个例子:每周写一份竞品分析周报,格式固定,包括市场动态、竞品功能变化、数据指标、风险提示。如果你只是让普通对话模型来写,它可能这周五个模块、下周七个模块,这周用表格,下周用列表,数据的口径也前后不一致。
解决方案有两个方向:
- 方向一:用工作流,把步骤定死。先抓取数据、再调用模型做分模块分析、然后套固定模板填充。输出结构稳定、口径一致。
- 方向二:用Agent的“结构化输出约束”,也就是明确告诉模型只能按JSON结构输出,并在循环里做格式校验。但实测下来,Agent在长任务里保持字段口径一致的能力依然不如写死的工作流稳定。尤其是多轮输出时,后期轮次容易出现字段遗漏,需要在Agent的工具调用里加一层校验节点。
我的经验是:凡是输出要进数据库、要对接下游系统、要打印成正式文档的任务,一律优先考虑工作流。结果稳定比过程聪明重要得多。
3.4 第四问:失败之后的代价有多大?
这个问在当前讨论里最少被人提起,但它往往一票否决。
咱们分三个级别:
- 失败代价低:比如AI生成一版策划方案,生成得不好,无非再生成一次。这种场景可以放心用普通对话甚至Agent,反正重试成本低。
- 失败代价中:比如自动生成财务分析初稿,生成质量差一些,人还有机会改,不会造成实质损失。这种场景工作流更合适,至少能保证输出骨架稳定。
- 失败代价高:比如AI自动执行订单退款、自动发送客户函件、自动修改数据库数据。这种场景无论对话、工作流还是Agent,都得加人工审批节点。如果要在这三者里选,那自然选可控性最强的工作流,而且必须在关键节点前后加校验步骤。
我见过某团队在付款审批场景里用Agent,Agent去核对发票信息后直接标记“通过”,结果某次它把一张重复提交的发票也标记通过了。其实这个流程根本不该交给Agent做判断——规则是明确的、步骤是明确的、连异常处理逻辑都是明确的,说得难听一点,写个if-else都比Agent可靠。后来他们把所有判断逻辑改成基于规则的工作流,准确率直接拉满。
3.5 四问答案的组合逻辑
这四个问题组合起来看,选型就清晰了。我给一个简明决策方向:
- 路径未知,且需要动手查信息、调工具 → Agent。
- 路径已知,但需要调外部工具、要稳定输出 → 工作流。
- 路径已知,纯文本操作,输出要求高 → 工作流,轻量编排就好。
- 路径未知,但纯文本讨论、容错高 → 普通对话或者轻Agent,都可以。
- 路径已知,纯文本,容错高 → 普通对话,别折腾。
这套组合逻辑我用了大半年,基本没出过大错。最大的价值不是选对,而是让你在做技术方案时有明确的“否决意识”——很多场景在第一个问题就被判了死刑。
4. 工作流撑不住、Agent才接手:规则组合爆炸的分界线
前面给了判断框架,但很多人在实际中还是会卡在一个模糊地带:有些任务看起来有规则、但规则又很复杂,不知道该写工作流还是上Agent。这一节专门讲这个临界点。
4.1 什么时候工作流开始撑不住
工作流的成本随着分支数量指数级上升。假设你有3个判断条件,每个条件2个分支,那就是2的3次方,8条路径。听起来还好。但如果有10个条件呢?1024条路径。没有任何人愿意维护这种工作流。
我自己的感受是:当一个任务的判断条件超过5个,或者判断条件之间有关联(前一个判断的结果会影响后一个判断条件是什么),工作流的维护成本就开始失控。你会发现自己不是在写流程,是在做一个条件组合管理系统。
举个例子。一个贷款初审流程,涉及客户收入、负债、征信、抵押物、地区政策、产品类型六个维度的交叉判断。如果用工作流,每一组条件组合都要跑一条分支,改一次政策就要重新梳理整张流程图。这种场景用规则加模型混合的工作流还能勉强支撑,但超过五个维度时,我建议直接考虑Agent。
4.2 Agent接管的真正原因:它在做“条件解耦”
Agent更擅长的不是“知道所有规则”,而是“在不知道完整规则时,自己查规则”。这个区别非常关键。
在贷款初审场景里,如果你给Agent配置好工具权限,比如查询征信接口、查产品规则库、查历史审批记录,它会自己去了解客户情况,并且判断哪些条件满足、哪些不满足,然后综合输出审批意见。它不需要你把所有条件组合写成一个几千行的流程文件,而是通过工具调用动态获取判断依据。
换句话说,复杂规则本身没有消失,但它从“写死在流程里”变成了“让模型去规则库里自己找答案”。这也解释了为什么Agent适合规则复杂且经常变化的业务——你不需要每次改规则就改代码,只需要更新规则库的内容,Agent的行为自然跟着更新。
4.3 规则能写清楚就别给模型自由
上面讲了Agent的好处,但我要在这里泼一盆冷水:规则能写清楚的时候,永远不要因为“懒”或“酷”就把决策权交给模型。
我见过一个反面案例。某团队做了一个文档自动分类系统,最开始用Agent,让模型自己决定文档属于哪个类目。效果其实不错,但问题是模型偶尔会把一些模棱两可的文档分错,而且每次分类的“理由”还不一样。后来我把分类逻辑改成规则优先:先按文件名关键词匹配,匹配不到再按内容特征匹配,还是不行才交给模型判断。结果准确率提升了一个台阶,成本还降了。
这个案例给我一个很深的启发:Agent的价值在于兜底,而不是包揽。凡是能用简单规则解决的,都应该写死;只有规则覆盖不到的地方,才值得让模型自由发挥。在一套系统里,规则和模型不是非此即彼,而是层层递进。
4.4 Agent护栏是底线不是功能
一旦决定上Agent,就别只把它当成一个“聪明的模型提示词”来用。你必须设计好护栏,否则线上事故只是时间问题。我自己在项目里至少会做这四层:
- 行动边界层:白名单工具,明确告诉Agent只能调哪些API,不能碰哪些系统。如果某个操作不在允许范围内,直接拒绝并提示人工介入。
- 轮次控制层:设置最大行动轮次,比如最多执行20轮动作,超过直接终止,防止Agent进入死循环。
- 输出校验层:对Agent每一步的结果做结构化校验,字段缺失或格式不对就触发重试,重试次数超过阈值就转人工。
- 审批闸门层:凡涉及资金、内容发布、对外沟通等高风险动作,一律停在“待人工确认”状态。
很多Agent项目跑飞,不是模型能力不够,而是一开始没想清楚“它能做什么、不能做什么”。Agent最需要的是边界感,这一点怎么强调都不过分。
5. 实战中的组合打法:对话做入口,工作流做主干,Agent只处理例外
最后聊一聊我在真实项目里最常见到的落地方案。很多人以为选了Agent就等于全面替代对话和工作流,但实际上,一个能真正跑起来的AI应用,往往是三者混用的。
5.1 入口层:普通对话负责和用户沟通
我把普通对话放在最外层,让用户用自然语言提出需求。它的作用是理解用户的意图,并把用户模糊的原始描述转化为结构化的任务参数。
比如一个内部运营助手,用户输入“帮我看看上月华东区的销售数据,写一个简短的复盘摘要”。普通对话层会负责识别出关键参数:区域是华东、时间范围是上月、目标是生成复盘摘要。识别完之后,它并不直接生成摘要,而是把参数传给下一个处理层。
这个设计的好处是把用户的自由表达和系统的稳定执行解耦。用户说什么都可以很随意,但系统内部跑起来是严格的、结构化的。
5.2 主干层:工作流负责稳定执行
参数确认后,进入工作流主干。工作流负责:查询数据库取数、按固定模板生成摘要、校验数据口径、把结果存回系统。这一层的每一步都是确定的,跑了十次也不会有意外。
这就是组合策略的核心逻辑:对话层负责“理解”,工作流层负责“执行”,Agent层负责“兜底”。绝大多数的日常需求,根本走不到Agent那一层,工作流就处理完了。成本可控、结果稳定、出问题也好查。
5.3 兜底层:Agent处理例外和开放任务
那Agent在哪里发挥作用?在处理工作流无法覆盖的情况。
仍然用那个运营助手的例子。工作流能处理“有固定报表、固定口径”的常规复盘。但如果用户问的是“华东区这个月数据异常,帮我查查可能是什么原因,并给一个分析思路”,这就不是工作流能回答的问题了。数据分析方向的判断、可能原因的排查、甚至要去外部系统看看有没有相关的活动记录,这个过程没有固定路径。
这时候就应该触发Agent,让它自由地去查询各类信息源,组合证据,给出一个完整的多步分析报告。Agent的产出不追求每一步都稳定一致,追求的是在复杂局面下依然能给出一个合理、可解释的结论。
5.4 三层之间的切换机制
三层之间的切换,我的做法是做一个轻量的“意图路由”。对话层识别完用户意图后,对意图做一个简单分类:
- 高频、规则明确的意图 → 直接进入工作流。
- 低频、开放、需要多轮信息收集的意图 → 进入Agent。
- 既不需要工作流也不需要Agent,只是单纯问个信息 → 留在普通对话层,直接回复。
这套路由逻辑本身不需要很复杂,几个关键词规则加一个轻量分类模型就够了。重点是想清楚路由的判断标准,这需要在业务需求里反复打磨。
5.5 组合打法的成本观
最后算一笔成本账。很多人觉得组合方案比单用Agent复杂,其实恰恰相反。三层架构里用户高频接触的只是对话层和工作流层,这两层成本很低,跑得也稳。Agent只在低频例外场景出现,它的高成本和不稳定性被限制在了一个很小的范围内。
如果反过来,什么都直接丢给Agent,那么每一次请求都承担着多轮调用和不确定性风险,成本不是按倍数上升,而是按数量级上升。更麻烦的是高不确定性意味着高频的人工介入,这在线上运营时非常消耗人力。
我自己的项目里,采用了三层组合之后,整体AI调用成本比当初全量用Agent的方案下降了大约60%,线上故障率也明显下降。这个对比足以说明问题。
最后说句实在话。这几年做项目最大的体会是:越简单的方案越能活到验收。听过太多“我们要做一个Agent”的需求,拆开一看其实是批量文档处理,工作流一天就能搞定。能上普通对话就别上工作流,能上工作流就别上Agent,这句话乍一听反直觉,但它是用预算和工期换回来的教训。真到了非Agent不可的场景——路径不定、需要动手干活、还要实时看反馈——你其实也已经清楚它该长什么样了。选型不是跟风,而是判断哪一层在替你赚钱、哪一层在替你省钱。这套判断框架,就是帮你把这两件事算清楚的。