从一个纠结的下午说起
前阵子帮朋友搭一个简历初筛的小工具,我对着 LangChain 的文档坐了一下午,反复纠结一件事:这功能到底是用 Chain 拼个 Workflow 出来,还是直接上 Agent?
说出来有点丢人,那时候我真觉得这俩东西差不了多少 ------ 不都是让 AI 一步步把活干完吗?反正都要调用大模型,都要处理输入输出,叫什么名字不一样?
我先顺着直觉写了 Workflow 版本。就像平时搭 LangChain 的链那样,把 PDF 解析、信息提取、岗位匹配、打分排序几个节点用 pipe 串起来,输入一份简历,顺着流程跑一遍,直接出结果。跑通的时候我还挺得意,觉得这不就完事了,要 Agent 有啥用。
结果转头就被同事怼了一句:"这么简单的场景当然没区别,你让它去做个市场调研试试?Workflow 直接就卡死了。"
这句话给我整懵了。调研不也是一步步搜资料、整理、总结吗?为啥 Workflow 就不行?
先说说我理解的 Workflow:就是一条铺好的传送带
我先回头把 Workflow 的逻辑捋了一遍。
说白了,这东西就是一条工厂里的流水线。你提前把每一步要做什么、输入是什么、输出传给谁,全都规定死。启动之后,物料从入口进去,经过一道道工序,最后从出口出来就是成品。中间不会有意外,也不会走岔路,条件满足就进下一个节点,条件不满足就走分支,一切都在你的掌控里。
就像我写的那段最简单的链:
javascript
const creativeChain = storyPrompt
.pipe(creativeModel)
.pipe(outputParser)
// 就这么三步:拼提示词 → 丢给大模型 → 解析输出
// 输入啥输出啥明明白白,不会多干一步也不会少干一步
creativeChain.invoke('写一个关于 AI 的故事')
这里的 pipe 就像传送带,把上一步的结果直接递到下一步手里。LangChain 本质上就是帮你快速搭这种流水线的框架,节点多了还能加上条件判断、循环,拼成更复杂的图谱。现在很多工程里的流程自动化,本质也都是这个思路,把重复性的工作串起来,人只需要关注核心逻辑。
放到简历筛选这个场景里就更直观了: 第一步收简历 PDF,解析成纯文本; 第二步从文本里抠出技能、工作经历、学历这些关键字段; 第三步拿着这些字段去跟岗位 JD 做匹配; 最后按匹配度打分排序。
整个流程全是我提前定义好的,它不会突然去查候选人的社交媒体,也不会自己加个面试题环节。好处就是稳定、可控、好调试,出了问题一查就知道是哪个节点出了错。
之前在 Coze 上搭过 AI 照相馆的工作流,也是一个道理 ------ 拖几个节点:用户上传照片、调用抠图工具、换背景、生成图片、返回结果。用户付费用的就是这个稳定的流程,你总不能让 AI 自由发挥,把人家照片 P 成奇奇怪怪的样子吧?
说实话,大部分企业里的 AI 提效场景,本质上都是 Workflow。把原来人工走的流程,换成 AI 节点来执行,快还不容易出错。这种场景你跟老板说要上 Agent,老板大概率会问你:"它万一瞎搞,你背锅?" 那 Agent 到底特殊在哪?
我之前总觉得,Agent 就是高级版的 Workflow,无非是多了工具调用能力。后来翻了 ReAct 的实现逻辑,又跑了几个 Demo 才发现,根本不是一回事 ------ 两者的底层逻辑从根上就不一样。
Workflow 是你把路铺好,它只管沿着路跑。 Agent 是你只告诉它目的地,路它自己找。
你就把 Agent 想象成一个代驾司机。你说 "去机场",剩下的事你不用管。它会自己看导航,选最近的路;遇到堵车就绕路;发现高速封了就改走国道;甚至你中途说 "不去机场了,改去高铁站",它也能立刻调整路线。
它不需要你提前把每一个转弯、每一条车道都规定死。它自己会感知当前的路况,自己规划路径,自己执行驾驶操作,走不通了还能随时调整。
从技术上说,一个能干活的 Agent,核心就三件事。 第一件是感知环境。它得知道现在是什么情况,手头有哪些工具能用,用户的需求到底是什么。就像司机得看路、看导航、知道车上有多少油。 第二件是规划路径。拿到需求之后,不是立刻就干,而是先在脑子里拆成几步,先做什么后做什么。而且这个规划不是一成不变的,走一步看一步,随时更新。 第三件是执行任务。想好下一步干嘛了,就去调用对应的工具,拿到结果之后,再回到第一步,重新感知、重新规划下一步。
就拿规划旅行这事举例子。 如果用 Workflow 做,你得提前把流程写死:先搜出发地到目的地的机票,再搜目的地的酒店,再查当地天气,最后算总价。用户改个需求,比如想中途多去一个城市,你就得改整个流程。
但你把这事交给 Agent 就完全不一样。你只需要说 "帮我规划一下下周去成都的旅行,预算五千,要去看熊猫"。它可能先去搜机票,发现直飞太贵,转头去查高铁;查酒店的时候发现熊猫基地附近的酒店满了,就自动换成地铁直达的区域;甚至还会顺手查一下下周成都会不会下雨,提醒你带伞。
整个过程它走的路径,可能你一开始根本想不到。这就是 Agent 的核心:自主性和适应性。它不是在执行你写好的剧本,而是真的在 "想办法完成任务"。
那 Agent 又是什么?像个会自己找路的司机
那 Agent 到底特殊在哪?
我之前总觉得,Agent 就是高级版的 Workflow,无非是多了工具调用能力。后来翻了 ReAct 的实现逻辑,又跑了几个 Demo 才发现,根本不是一回事 ------ 两者的底层逻辑从根上就不一样。
Workflow 是你把路铺好,它只管沿着路跑。 Agent 是你只告诉它目的地,路它自己找。
你就把 Agent 想象成一个代驾司机。你说 "去机场",剩下的事你不用管。它会自己看导航,选最近的路;遇到堵车就绕路;发现高速封了就改走国道;甚至你中途说 "不去机场了,改去高铁站",它也能立刻调整路线。
它不需要你提前把每一个转弯、每一条车道都规定死。它自己会感知当前的路况,自己规划路径,自己执行驾驶操作,走不通了还能随时调整。
从技术上说,一个能干活的 Agent,核心就三件事。 第一件是感知环境。它得知道现在是什么情况,手头有哪些工具能用,用户的需求到底是什么。就像司机得看路、看导航、知道车上有多少油。 第二件是规划路径。拿到需求之后,不是立刻就干,而是先在脑子里拆成几步,先做什么后做什么。而且这个规划不是一成不变的,走一步看一步,随时更新。 第三件是执行任务。想好下一步干嘛了,就去调用对应的工具,拿到结果之后,再回到第一步,重新感知、重新规划下一步。
就拿规划旅行这事举例子。 如果用 Workflow 做,你得提前把流程写死:先搜出发地到目的地的机票,再搜目的地的酒店,再查当地天气,最后算总价。用户改个需求,比如想中途多去一个城市,你就得改整个流程。
但你把这事交给 Agent 就完全不一样。你只需要说 "帮我规划一下下周去成都的旅行,预算五千,要去看熊猫"。它可能先去搜机票,发现直飞太贵,转头去查高铁;查酒店的时候发现熊猫基地附近的酒店满了,就自动换成地铁直达的区域;甚至还会顺手查一下下周成都会不会下雨,提醒你带伞。
整个过程它走的路径,可能你一开始根本想不到。这就是 Agent 的核心:自主性和适应性。它不是在执行你写好的剧本,而是真的在 "想办法完成任务"。
我当时特意画了张图给自己理清楚两者的区别,大概是这么个感觉:

写段代码就懂了:两者执行逻辑完全不一样
光说概念有点虚,咱们看代码最直观。
先看 Workflow 的执行,其实就是顺序调用,没什么花活:
javascript
// 定义好每个节点的能力
const parsePdf = (file) => { /* 解析PDF返回文本 */ }
const extractInfo = (text) => { /* 提取简历核心字段 */ }
const matchJob = (info) => { /* 匹配岗位JD计算匹配度 */ }
const rankScore = (result) => { /* 按分数排序输出 */ }
// 串成一条完整流水线
const resumeWorkflow = parsePdf
.pipe(extractInfo)
.pipe(matchJob)
.pipe(rankScore)
// 调用一次就跑完,路径完全固定
const result = await resumeWorkflow.invoke(resumeFile)
整个过程是线性的(复杂点的就是你定义好的有向无环图),从入口到出口,一遍就走完了。大模型在里面只是某个节点的执行者,不是决策者。
再看 Agent 的执行逻辑,本质上是一个循环:
javascript
// 简化版伪代码,核心逻辑大差不差
async function agentRun(task, availableTools) {
let history = []
let finalAnswer = null
while (true) {
// 1. 让大模型思考:现在啥情况?下一步该干嘛?
const nextStep = await llm.invoke({
task,
history,
tools: availableTools.map(t => t.description)
})
// 注意这一行!每走一步都要调用一次大模型做决策
// 别问我为什么知道这很费钱,试了三次账单懂的都懂
if (nextStep.actionType === 'finish') {
finalAnswer = nextStep.content
break
}
// 2. 按大模型的决定去调用工具
const toolResult = await availableTools[nextStep.toolName]
.invoke(nextStep.params)
// 3. 把结果记进历史,下一轮接着思考
history.push({
thought: nextStep.thought,
action: nextStep.toolName,
observation: toolResult
})
}
return finalAnswer
}
看到没?它不是一次跑完,而是 "思考 → 行动 → 观察 → 再思考" 这么一圈一圈循环,直到大模型自己觉得任务做完了。
大模型在里面是决策者,每一步怎么走,全是它说了算。你只是给它提供工具,告诉它目标,具体怎么干你管不着。
这也是 Agent 最让人头疼的地方 你永远没法 100% 预测它下一步会干嘛。它可能突然去调用一个你没想到的工具,可能陷入死循环反复查同一个东西,甚至可能觉得任务做完了,但其实根本没达到你的要求。
我踩过的坑:别拿 Agent 当万能钥匙
说回最开始那个简历筛选的事。我当时不信邪,非要写个 Agent 版本试试,觉得 "智能" 一点总没错。
结果给我整破防了。
本来 Workflow 三秒钟就能出结果的事,Agent 来回调用了五六次工具,花了快半分钟。更离谱的是,有一份简历它居然觉得 "技能描述不够详细",自己去网上搜候选人的博客去了。
我看着控制台打出来的执行日志,人都傻了。
后来我才反应过来,我这是典型的拿着锤子找钉子。
Workflow 和 Agent,根本没有谁更高级一说,只是适用场景完全不同。
- 任务是固定的、重复的、要求稳定可控的,就用 Workflow。比如数据清洗、表单处理、客服问答、审批流程。这种场景上 Agent,纯纯是增加成本和风险,收益约等于零。
- 任务是开放的、复杂的、没有固定解法的,就用 Agent。比如市场调研、问题排查、方案设计、多步骤推理。这种场景你硬写 Workflow,光分支逻辑就能写到你怀疑人生。
我还踩过另一个坑:觉得 Workflow 就不能有智能。其实完全不是。Workflow 里的每个节点,都可以用大模型来做,比如信息提取、内容生成,这些都没问题。只是 "下一步走哪" 这件事,是规则定的,不是大模型定的。
反过来,Agent 也不是完全不受控。你可以给它划定边界,告诉它只能用哪些工具,必须遵守哪些规则,只是它在边界里面,是自由的。
最后说句实在的:两者从来不是二选一
聊到这可能有人会问,那实际做项目,到底选哪个?
说实话,现在稍微复杂一点的 AI 应用,根本就不是二选一,而是两者混着用。
我最近看到的很多工程化方案,都是这么个思路:底层用 Workflow 搭骨架,保证核心流程的稳定和可控;关键节点上放 Agent,让它去处理灵活多变的部分。
就拿招聘系统举例子。整体的简历筛选、初评、邀约流程,肯定是 Workflow 定死的,不能乱。但其中 "匹配岗位需求" 这个节点,你可以交给 Agent 去做 ------ 它可以灵活地根据候选人的经历,去判断适配度,甚至给出具体的面试建议,而不是死板地按关键词匹配。
再比如客服系统。大部分常见问题,走 Workflow 自动回复就够了,稳还快。只有遇到复杂的、没见过的问题,才转交给 Agent 去处理,让它去查知识库、查订单、协调人工。
说白了就是:Workflow 是骨架,负责稳;Agent 是大脑,负责活。 Workflow 没什么创造力,但靠谱、省心、成本低。 Agent 有想象力,但不可控、贵、容易出幺蛾子。 把两者结合起来,才是工程上最务实的做法。
最后唠两句我这趟琢磨下来最深的三个感受: 第一,别迷信 Agent。不是什么场景加上 Agent 就变高级了,很多时候一个简单的 Workflow 就能解决问题,又快又稳。 第二,别混淆本质。两者最核心的区别,从来不是有没有工具调用,而是 "谁来决定下一步"------ 是人定的规则,还是大模型自己。 第三,别非黑即白。真实的业务里,永远是混合架构最香,该稳的地方稳,该活的地方活。
你平时做项目的时候,更常用 Workflow 还是 Agent?有没有踩过什么有意思的坑?评论区聊聊,我也长长见识。