前两天有个读者问我:"我用 LangChain 写了个链式调用,这算是 Workflow 还是 Agent?"

这个问题问得特别好,因为很多人嘴上说着 Workflow 和 Agent,心里想的却是 '反正都是 AI 在干活' 。
看完他的代码,我发现他写的是这样的东西:
复制代码import { PromptTemplate } from "@langchain/core/prompts";
import { ChatOpenAI } from "@langchain/openai";
import { StringOutputParser } from "@langchain/core/output_parsers";// 这其实就是一个典型的 Workflow
const creativeChain = storyPrompt
.pipe(creativeModel)
.pipe(outputParser);const result = await creativeChain.invoke("恭喜拿下offer");
这段代码确实像一条流水线:输入进去,经过一系列处理,输出结果。但这是 Agent 吗?显然不是。
那 Workflow 和 Agent 到底有什么区别?今天我们就来彻底讲清楚这件事。
Workflow 本质上是一套预定义的流程,可以把它想象成一条标准化的流水线。
每一步做什么、输入输出是什么、走到哪一步该干什么,都是提前画好的。当条件满足,就自动进入下一环节。
在技术层面,它通常是一个编排好的 AI 工作流引擎——由 AI 调用、条件判断、循环逻辑组成的一个有向图。
我用 Coze 构建过一个"AI 照相馆"工作流,流程大概是这样的:
复制代码用户上传照片 → 人脸检测 → 风格选择 → AI 生成 → 输出结果
每个节点都是固定的:输入是照片,输出是处理后的图片。中间没有任何"自由发挥"的空间——这就叫确定性执行。
LangChain 的 LCEL(LangChain Expression Language) 是构建 Workflow 的利器,在 JavaScript 中通过 .pipe() 方法串联各个组件:
复制代码import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StructuredOutputParser } from "@langchain/core/output_parsers";
import { z } from "zod";// 定义输出结构
const resumeSchema = z.object({
name: z.string(),
skills: z.array(z.string()),
yearsOfExperience: z.number(),
education: z.string(),
});// 定义一个简历解析的 Workflow
const model = new ChatOpenAI({ model: "gpt-4" });const prompt = ChatPromptTemplate.fromTemplate(`
提取以下简历中的关键信息:
{resume_text}输出格式:姓名、技能列表、工作经历年限、教育背景
`);const parser = StructuredOutputParser.fromZodSchema(resumeSchema);// 这条链就是一条标准的 Workflow 流水线
const resumeWorkflow = prompt.pipe(model).pipe(parser);// 执行
const result = await resumeWorkflow.invoke({ resume_text: resumeContent });
看到没? .pipe() 就像工厂里的传送带,把数据从一个节点传到下一个节点,直到产出最终结果。
举一个真实的招聘场景。假设你要用 AI 处理 1000 份简历,流程固定:
这个场景里,每一步都是明确的、可预期的、不需要临时决策的。用 Workflow 再合适不过。
Workflow 的核心价值:稳定、可控、高效。 就像一个熟练的流水线工人,每天重复做同样的事,但永远不会出错。
如果说 Workflow 是走在既定轨道上的列车,那 Agent 就是一个站在开放空间里的探险家——它自己去琢磨该怎么完成任务。
一个完整的 Agent 通常具备三个核心能力:
1. 感知环境
通过输入文本、图像、数据来理解任务是什么,以及当前有哪些工具可以调用。
2. 规划路径
不是预先定义好的路线,而是动态生成任务链。它会思考:"要做这件事,我第一步该干什么?如果失败了怎么办?"
3. 执行与调整
调用工具完成子任务,然后根据执行结果不断调整策略。
用 LangGraph 的 createReactAgent 实现一个最简单的 ReAct Agent:
复制代码import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { DynamicTool } from "@langchain/core/tools";
import { ChatOpenAI } from "@langchain/openai";// 定义工具
const searchWeather = new DynamicTool({
name: "search_weather",
description: "查询城市天气",
func: async (city) => `${city}今天晴天,温度25°C`,
});const searchFlight = new DynamicTool({
name: "search_flight",
description: "查询航班信息",
func: async ({ departure, destination }) =>
`从${departure}到${destination}的航班,最低票价800元`,
});const tools = [searchWeather, searchFlight];
const model = new ChatOpenAI({ model: "gpt-4" });// 创建 Agent
const agent = createReactAgent({ llm: model, tools });// Agent 会自动决定调用哪个工具、什么顺序调用
const result = await agent.invoke({
messages: [{ role: "user", content: "我想下周去三亚玩,帮我规划一下" }],
});// Agent 可能先查天气,再查航班,甚至可能去查酒店
// 具体路径完全由它自己决定
你看,我没有告诉 Agent "先查天气再查航班",它自己会判断该怎么做。
让 Agent 去规划一次旅行:
这个过程中,Agent 走的每一步都是动态决策的,而不是提前写死的。
| 维度 | Workflow | Agent |
|---|---|---|
| 路径 | 预定义,固定 | 动态生成,不确定 |
| 决策方式 | 规则驱动 | 大模型推理驱动 |
| 工具调用 | 按预设顺序 | 自主决定调什么、何时调 |
| 适应性 | 不会变通 | 根据环境反馈调整 |
| 可预测性 | 高 | 低 |
| 适用场景 | 重复性、流程化任务 | 复杂、动态、探索性任务 |
用一句大白话总结:
或者用更形象的比喻:
如果用户问的都是"怎么退款""物流到哪了"这类固定问题:
javascript
复制代码// 用 Workflow
// 意图识别 → FAQ 检索 → 模板回复
// 简单、快速、成本低
如果用户问的是"我该怎么处理这个复杂纠纷":
复制代码// 用 Agent
// 查询订单 → 查看聊天记录 → 调取物流信息 → 综合判断
// 需要多步推理和工具调用
复制代码// 团队规范检查、格式化 → Workflow
// 发现潜在的逻辑漏洞、提出重构建议 → Agent
我在实际项目中总结了一个决策框架:
一个反直觉的结论:能用 Workflow 解决的,优先用 Workflow。Agent 虽强,但贵且不可控。
我们现在做的 AI 工程,早就不是"二选一"了,而是融合。
一个成熟的 AI 应用通常长这样:
复制代码底层 Workflow:提供稳定性和可控性
↓
中间层:路由和编排
↓
上层 Agent:提供灵活性和智能性
就像我最近在做的项目:
复制代码// 伪代码示意
const mainAgent = createPlannerAgent(); // 总控 Agent// Agent 决策后,调用各个 Workflow 执行具体任务
if (task.type === "resume_screening") {
await resumeWorkflow.invoke(task.data); // 稳定的简历筛选流程
} else if (task.type === "interview_scheduling") {
await scheduleWorkflow.invoke(task.data); // 稳定的排期流程
} else if (task.type === "complex_negotiation") {
await negotiationAgent.invoke(task.data); // 需要智能决策的部分
}
底层 Workflow 做确定性的事(骨架),上层 Agent 做探索性的事(大脑)。两者结合,既高效又有智慧。
另外提一句,MCP(模型上下文协议)的出现正在进一步模糊两者的边界——工具即节点,模型即路由,未来的 AI 工程形态会更加灵活。这个话题我们下次专门聊。
写这篇文章的时候,我特意把笔记里那句"Workflow 是确定性执行,Agent 是不确定性探索"圈了出来。这句话值得你背下来。
最后送你三句话:
希望这篇文章能帮你彻底分清 Workflow 和 Agent。下次面试或者写方案的时候,别再傻傻分不清楚了