🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
摘要:Workflow 和 Agent 到底有啥区别?为什么 Coze 工作流和 ReAct Agent 看起来都在"执行任务",本质却完全不同?本文从面试翻车经历出发,结合 Anthropic 官方定义、ReAct 框架、完整代码示例和实战选型指南,帮你彻底搞懂这对最容易混淆的 AI 概念。
📌 前言
上周面试,面试官笑眯眯地问了一句:
"你说说 AI Workflow 和 Agent 有什么区别?"
我心想这不简单嘛,都是让 AI 干活呗。结果说了三分钟,面试官表情逐渐凝固......
后来我翻了 Anthropic 的《Building Effective Agents》、LangChain 的文档、还有 ReAct 论文,又在 Coze 和 LangGraph 上分别做了两个项目,才真正搞明白:这俩东西看起来都在"执行任务",但底层逻辑完全不同。
今天把我的理解整理出来,附完整代码和实战选型经验,帮你下次面试不再翻车。
🎯 本文适合谁
- 面试时被问过 Agent 相关概念的同学
- 用过 Coze / Dify / LangChain 但分不清 Workflow 和 Agent 的开发者
- 想搞清楚 Agentic AI 底层逻辑、做好技术选型的技术人
📚 一、先说结论:一张图看懂本质区别
scss
┌─────────────────────────────────────────────────────┐
│ AI 系统光谱 │
│ │
│ 简单 LLM 调用 ──→ Workflow ──→ Agent │
│ (更多控制) (更多自主) │
│ │
│ 确定性 ◄─────────────────────────────► 不确定性 │
│ 可预测 ◄─────────────────────────────► 可探索 │
│ 固定轨道 ◄──────────────────────────► 自由路径 │
└─────────────────────────────────────────────────────┘
💡 这张图来自 Anthropic《Building Effective Agents》,是理解两者区别最核心的框架。
一句话总结:
| Workflow | Agent | |
|---|---|---|
| 本质 | 流水线 | 司机 |
| 执行方式 | 预设轨道,确定性执行 | 动态探索,自主决策 |
| 核心依赖 | 规则 + 编排引擎 | LLM 推理 + 工具调用 |
| 适合场景 | 流程化、重复性任务 | 开放性、动态性任务 |
📚 二、Workflow:一条精心设计的流水线
2.1 什么是 Workflow?
Workflow 本质上是一套自定义的流程,你可以把它想象成工厂里的流水线。
每一步都有明确的输入和输出,每个节点的逻辑是固定的。当条件满足,就会进入下一个环节。
在技术上,它通常是一个编排好的 AI 工作流引擎------由 AI 调用、条件判断、循环逻辑组成的图谱。
2.2 你一定用过的 Workflow
如果你用过 Coze 构建工作流,那你已经在玩 Workflow 了:
输入节点 → LLM 节点 → 条件判断 → 图片生成 → 输出节点
比如我之前做的「AI 照相馆」项目,需求很简单:用户上传照片,系统自动判断是证件照还是艺术照,然后调用对应的模型生成处理后的照片。
一开始我想用 Agent 来做,觉得"智能"一点更好。结果踩了个大坑:
踩坑记录:Agent 在判断照片类型时,有时候会"自作主张"------明明是证件照,它觉得用户可能想要艺术效果,就走了艺术照的分支。客户反馈"怎么生成的和我想的不一样"。后来换成 Workflow,用固定的条件判断节点,每次结果都稳定可控。
最终的 Workflow 设计:
markdown
📸 用户上传照片(输入)
↓
🧠 LLM 分析照片风格(提取特征)
↓
🔀 条件判断:证件照 or 艺术照?
├─ 证件照 → 调用证件照模型 → 返回标准证件照
└─ 艺术照 → 调用风格迁移模型 → 返回艺术照
↓
📤 输出处理后的照片
关键教训:流程确定、要求稳定的场景,Workflow 比 Agent 靠谱得多。
2.3 用代码理解 Workflow(LangChain.js)
下面是一个完整的 Workflow 示例------简历筛选链路,用 LangChain 的 LCEL(LangChain Expression Language)实现:
typescript
import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";
// ====== Workflow:简历筛选链路 ======
// 每一步都是固定的,上一步输出 = 下一步输入
const model = new ChatOpenAI({ modelName: "gpt-4" });
// 第一步:提取简历信息
const extractPrompt = ChatPromptTemplate.fromTemplate(`
请从以下简历中提取关键信息,以 JSON 格式返回:
- skills: 技能列表
- experience: 工作经历
- education: 教育背景
简历内容:{resume}
`);
// 第二步:匹配岗位需求
const matchPrompt = ChatPromptTemplate.fromTemplate(`
根据以下候选人信息和岗位需求,给出匹配度分析:
候选人:{candidate_info}
岗位需求:{job_requirements}
请输出:匹配度分数(0-100) + 匹配原因 + 缺失技能
`);
// 第三步:生成评估报告
const reportPrompt = ChatPromptTemplate.fromTemplate(`
根据以下匹配分析,生成一份简洁的简历评估报告:
{match_result}
`);
// 组装 Workflow 链路(pipe = 流水线传送带)
const resumeWorkflow = extractPrompt
.pipe(model) // 第一步:LLM 提取信息
.pipe(new StringOutputParser())
.pipe(matchPrompt) // 第二步:匹配岗位
.pipe(model)
.pipe(new StringOutputParser())
.pipe(reportPrompt) // 第三步:生成报告
.pipe(model)
.pipe(new StringOutputParser());
// 执行 Workflow
const result = await resumeWorkflow.invoke({
resume: "张三,3年React开发经验,熟悉TypeScript...",
job_requirements: "高级前端工程师,要求3年以上React经验..."
});
💡 注意 :
pipe就像传送带,数据从一头进去,按预设路径流出来。每一步干什么、先干什么后干什么,都是写死的。
2.4 Workflow 的 5 种经典模式
Anthropic 在《Building Effective Agents》中总结了 5 种常见的 Workflow 模式:
| 模式 | 说明 | 适用场景 | 举个例子 |
|---|---|---|---|
| Prompt Chaining | 任务拆成多步,上一步输出是下一步输入 | 翻译 → 润色 → 校对 | 英文论文翻译流水线 |
| Routing | 根据输入类型分流到不同处理链路 | 客服分类(售前/售后/投诉) | 智能工单分发系统 |
| Parallelization | 多个子任务同时执行,最后汇总 | 多维度数据分析 | 同时分析简历的技能、经历、学历 |
| Orchestrator-Workers | 一个主节点分配任务给多个子节点 | 大型文档拆分处理 | 长文档分章节摘要 |
| Evaluator-Optimizer | 生成 → 评估 → 优化的循环 | 代码生成 + 自动测试 | 写代码 → 跑测试 → 修 bug → 再测 |
📚 三、Agent:一个会思考的探索者
3.1 什么是 Agent?
Agent 和 Workflow 的逻辑完全不同。
它不是走在一条预设的轨道上,而是站在一个开放的空间里,自己去探索怎么做。
从技术上讲,一个 Agent 具备三大核心能力:
┌─────────────────────────────────────┐
│ Agent 核心能力 │
├─────────────────────────────────────┤
│ 🔍 感知环境 │
│ 理解输入、识别可用工具、评估当前状态 │
├─────────────────────────────────────┤
│ 🗺️ 规划路径 │
│ 动态生成任务链,而非预定义流程 │
├─────────────────────────────────────┤
│ ⚡ 执行行动 │
│ 调用工具、完成子任务、持续调整 │
└─────────────────────────────────────┘
3.2 ReAct:Agent 的经典范式
ReAct(Reasoning + Acting)是 Agent 领域最经典的框架之一,来自 Princeton 和 Google Research 2022 年的论文。
核心思想:把推理(Reasoning)和行动(Acting)交织在一起,形成一个循环:
markdown
┌──────────┐
│ Thought │ ← 思考:我该做什么?
└────┬─────┘
↓
┌──────────┐
│ Action │ ← 行动:调用工具执行
└────┬─────┘
↓
┌──────────┐
│ Observe │ ← 观察:获取行动结果
└────┬─────┘
↓
循环,直到任务完成
3.3 用代码理解 Agent(LangChain ReAct)
下面是一个完整的 ReAct Agent 示例------旅行规划助手:
typescript
import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { tool } from "@langchain/core/tools";
import { z } from "zod";
// ====== Agent:旅行规划助手 ======
// 没有预设流程,Agent 自己决定调用什么工具、按什么顺序
const model = new ChatOpenAI({ modelName: "gpt-4" });
// 定义 Agent 可以使用的工具
const searchFlights = tool(
async ({ from, to, date }) => {
// 模拟搜索机票 API
return `${from}→${to},${date},经济舱约 ¥3500-5000`;
},
{
name: "search_flights",
description: "搜索机票价格,输入出发地、目的地、日期",
schema: z.object({
from: z.string().describe("出发城市"),
to: z.string().describe("目的地城市"),
date: z.string().describe("出发日期"),
}),
}
);
const searchWeather = tool(
async ({ city, month }) => {
return `${city} ${month}月:平均气温 25-30°C,多云为主`;
},
{
name: "search_weather",
description: "查询目的地天气",
schema: z.object({
city: z.string(),
month: z.number(),
}),
}
);
const searchVisa = tool(
async ({ from, to }) => {
return `中国公民前往日本:需要办理旅游签证,约 5-7 个工作日`;
},
{
name: "search_visa",
description: "查询签证要求",
schema: z.object({
from: z.string(),
to: z.string(),
}),
}
);
// 创建 ReAct Agent(不是 Chain!没有固定流程!)
const travelAgent = createReactAgent({
llm: model,
tools: [searchFlights, searchWeather, searchVisa],
});
// 执行:Agent 会自己决定先查什么、再查什么
const result = await travelAgent.invoke({
messages: [{
role: "user",
content: "帮我规划7月从北京到东京的旅行,预算5000元"
}]
});
💡 关键区别 :Workflow 的代码里,你能清楚看到"先干什么后干什么"。Agent 的代码里,你只定义了目标和可用工具,调用顺序是 Agent 自己决定的。
3.4 Agent 的执行过程(真实日志)
当你运行上面的 Agent,它可能走这样的路径:
vbnet
Thought: 用户预算5000元,我需要先了解机票和住宿的大致开销
Action: search_flights({ from: "北京", to: "东京", date: "2026-07-15" })
Observe: 北京→东京,2026-07-15,经济舱约 ¥3500-5000
Thought: 机票就占了大部分预算,我需要看看有没有更便宜的方案
同时查一下天气,看看7月去东京合不合适
Action: search_weather({ city: "东京", month: 7 })
Observe: 东京 7月:平均气温 25-30°C,多云为主
Thought: 天气还行。但预算紧张,我需要查签证费用,综合评估
Action: search_visa({ from: "中国", to: "日本" })
Observe: 中国公民前往日本:需要办理旅游签证,约 5-7 个工作日
Thought: 综合来看,机票+签证就接近5000了,住宿会超预算。
我建议用户考虑特价机票或者缩短行程...
看到了吗? Agent 的路径是动态生成的------它发现预算不够,自动调整了策略。如果用 Workflow,流程是"查机票 → 查天气 → 查签证 → 生成计划",不会根据中间结果灵活调整。
📚 四、核心区别对比:5 个维度深度拆解
| 维度 | Workflow | Agent |
|---|---|---|
| 控制方式 | 人编排流程,AI 执行 | AI 自主决策,人设定目标 |
| 确定性 | ✅ 同样输入 → 同样输出 | ❌ 同样输入 → 可能不同路径 |
| 可预测性 | ✅ 路径和结果可预测 | ❌ 路径不可预测,结果有波动 |
| 技术栈 | 规则引擎、Coze、Dify | LLM 推理、LangGraph、AutoGPT |
| 容错方式 | 预设异常分支 | 动态调整策略 |
| 成本 | 低(调用次数固定) | 高(多轮推理 + 工具调用) |
| 延迟 | 低(流程固定,无决策开销) | 高(每步都要 LLM 推理) |
一个比喻说清楚
Workflow 是有轨电车 🚋:路线固定、效率高、准时到站,但不能临时改道。
Agent 是老司机 🚗:知道目的地在哪,但遇到修路会绕行、发现近路会抄近道、甚至目的地变了也能自己调整。
📚 五、实战选型:什么时候用 Workflow,什么时候用 Agent?
5.1 Anthropic 的官方建议
Anthropic 在《Building Effective Agents》中给出了一个非常重要的原则:
"Don't use agents when a workflow will do." 能用 Workflow 解决的问题,就不要上 Agent。
为什么?因为 Agent 的成本、延迟、不可控性都更高。简单就是最好的。
5.2 选型决策树
markdown
你的任务可以拆成固定步骤吗?
│
├─ 是 → 步骤之间需要动态决策吗?
│ ├─ 否 → ✅ 用 Workflow
│ └─ 是 → ✅ 用 Workflow + Agent 混合
│
└─ 否 → 任务目标明确但路径不确定?
├─ 是 → ✅ 用 Agent
└─ 否 → 先想清楚需求再来 😅
5.3 实战选型速查表
| 业务场景 | 推荐方案 | 原因 | 推荐框架 |
|---|---|---|---|
| 内容审核 | Workflow | 规则明确、流程固定、要求稳定 | Coze、Dify |
| 简历筛选 | Workflow | 提取→匹配→评分,步骤固定 | LangChain Chain |
| 智能客服 | Workflow + Agent | 主流程固定,特殊场景需自主处理 | LangGraph |
| 旅行规划 | Agent | 开放性、多约束动态权衡 | LangGraph ReAct |
| 竞品分析 | Agent | 需要多轮搜索、动态调整分析方向 | AutoGPT |
| 数据清洗 | Workflow | 规则明确,批量处理,要求高效 | Airflow + LLM |
| 代码 Debug | Agent | 需要推理、尝试、根据报错动态调整 | Cursor Agent |
| 合同审查 | Workflow | 条款逐项检查,流程固定 | Coze 工作流 |
5.4 一个真实的技术选型故事
我在做一个智能客服项目时,最初方案是纯 Agent------觉得"智能"一点用户体验好。
结果发现两个问题:
- 成本爆炸:每次对话 Agent 要调用 5-8 次 LLM(理解意图 → 查知识库 → 生成回复 → 检查质量 → 优化话术),token 费用是 Workflow 的 3 倍
- 回复不稳定:同一个问题,Agent 两次回答可能不一样,客户投诉"怎么每次说的都不一样"
最终方案:Workflow 做主流程 + Agent 做异常处理
markdown
用户消息 → Workflow 意图识别 → 分流
├─ 常见问题 → Workflow 固定回复(稳定、低成本)
├─ 复杂问题 → Agent 动态处理(灵活、智能)
└─ 无法识别 → 转人工
这样既保证了 80% 常见问题的稳定回复,又让 20% 复杂问题有 Agent 的灵活性。
📚 六、未来趋势:Workflow + Agent 融合
纯 Workflow 太死板,纯 Agent 太不可控。未来的 AI 工程一定是两者结合:
arduino
┌─────────────────────────────────────┐
│ Agent(上层) │
│ 灵活性 + 智能性 + 自主决策 │
│ 负责"做什么"------目标规划、动态调整 │
├─────────────────────────────────────┤
│ Workflow(底层) │
│ 稳定性 + 可控性 + 确定性执行 │
│ 负责"怎么做"------标准化流程、工具调用 │
└─────────────────────────────────────┘
Workflow 是骨架,Agent 是大脑。
用 LangGraph 实现这个架构:
typescript
import { StateGraph, Annotation } from "@langchain/langgraph";
// 定义状态
const State = Annotation.Root({
input: Annotation<string>(),
taskType: Annotation<string>(), // Agent 决定任务类型
result: Annotation<string>(),
});
// Workflow 节点:固定的处理流程
async function processStandardTask(state) {
// 标准任务走固定流程,稳定高效
return { result: `标准流程处理:${state.input}` };
}
// Agent 节点:动态决策
async function agentDecide(state) {
// Agent 根据输入决定走哪个分支
const model = new ChatOpenAI({ modelName: "gpt-4" });
const decision = await model.invoke(
`判断这个任务是"标准"还是"复杂":${state.input}`
);
return { taskType: decision.content };
}
// 构建混合图谱
const graph = new StateGraph(State)
.addNode("agent_decide", agentDecide) // Agent 做决策
.addNode("standard_process", processStandardTask) // Workflow 做执行
.addEdge("__start__", "agent_decide") // 先让 Agent 判断
.addConditionalEdges("agent_decide", (state) => {
return state.taskType === "standard"
? "standard_process" // 标准任务 → Workflow
: "complex_process"; // 复杂任务 → Agent 处理
})
.compile();
💡 重点总结
- Workflow = 流水线:预设轨道,确定性执行,适合流程化、重复性任务
- Agent = 探索者:动态决策,自主适应,适合开放性、不确定性任务
- ReAct 框架:Agent 的经典范式,Thought → Action → Observe 循环
- 选型原则:能用 Workflow 就别用 Agent(Anthropic 官方建议)
- 实战经验:80% 标准流程用 Workflow + 20% 异常场景用 Agent
- 未来趋势:Workflow(骨架)+ Agent(大脑)融合,既稳定又智能
❓ 常见问题 FAQ
Q1:Coze 工作流是 Agent 吗?
不是。Coze 工作流是典型的 Workflow------你在可视化界面里拖拽节点、连线,本质上是在编排一条固定的流程。Coze 也有 Bot 模式,那个更接近 Agent。
Q2:Workflow 和 Agent 哪个更贵?
Agent 通常更贵。因为 Agent 每一步都要调用 LLM 做推理,还可能多次调用工具。Workflow 的调用次数是固定的,成本可预测。
Q3:LangChain 的 Chain 和 Agent 有什么区别?
Chain = Workflow(固定链路,pipe 串联),Agent = 自主决策(动态选择工具和调用顺序)。
Q4:ReAct 和 Function Calling 有什么关系?
Function Calling 是 OpenAI 提供的工具调用能力,ReAct 是一种 Agent 推理框架。ReAct Agent 通常用 Function Calling 来执行 Action,但 ReAct 的核心是"推理+行动"的循环,不只是工具调用。
Q5:2025 年主流方案会是纯 Agent、纯 Workflow、还是融合?
大概率是融合。纯 Workflow 太死板,纯 Agent 太贵且不可控。业界已经在用 LangGraph 等框架构建 Workflow + Agent 混合架构。
🔗 参考资料
- Anthropic - Building Effective Agents
- ReAct: Synergizing Reasoning and Acting in Language Models (arXiv:2210.03629)
- LangChain 官方文档
- LangGraph 官方文档
- Coze 工作流文档
💬 交流讨论
你在实际项目中更倾向用 Workflow 还是 Agent?遇到过哪些坑?评论区聊聊,我会逐一回复!
你觉得 2025 年主流方案会是哪个?评论区扣个数字:
- 扣 1:纯 Agent(自主智能才是未来)
- 扣 2:纯 Workflow(稳定可控最重要)
- 扣 3:两者融合(取长补短才是正道)
觉得有用?点个赞👍收藏⭐关注👆,下一篇我会用 LangGraph 从零实现一个同时包含 Workflow 和 Agent 的智能客服系统,附完整可运行代码!
标签:AI Agent、Workflow、LangChain、ReAct、LangGraph、Agentic AI、面试