Agent 实作 — 常见的工作流模式 (workflow patterns)
2025年8月7日
先前在 AI 代理是什么? 一文中,我们谈到 2025 年的 AI 关键字是代理;在 2025 的年中,各大公司都开发了自己的 AI 代理产品。以工程师会用到的产品来说,OpenAI 的 CodeX、Anthropic 的 Claude Code、Google 的 Jules 都在相近的时间点发表。
在 AI 代理高速发展的同时,不同的工作流 (workflow) 也逐步汇聚成形。在开发 AI 代理时,比起使用现有的框架,更推荐回到根本来思考,这时掌握基本的工作流,搭配所在的领域,去客制化自己的 AI 代理,获得的成果也往往会比较好。
代理 (agent) 与工作流 (workflow) 的区别是什么?
之所以需要 AI 代理或工作流,是因为代理能够帮忙解决某些特定的问题;然而,许多问题其实可以不用代理,也能顺利解决。如果能清楚界定两者的不同,在选择要用什么解决方案时,也能够更精准地选到适合的方案。
在 Anthropic 的《Building effective agents》一文中,有对两者清楚的区别。文中谈到,所谓的工作流 (workflow),是设定既定的路径,然后让 AI 在既定的路径中去执行不同任务。目前在社群中可以看到像是 n8n 或者 Zappier 这类工具,都偏向工作流这一个分类。使用者预先设定某个流程,例如要为某个演讲做摘要,可以设定先请 AI 把演讲录音转成文字,接着进到下一步把文字做顺稿,最后再把顺好的文字撷取重点精华。
在这个工作流中,虽然录音转文字、文字顺稿、撷取精华,这些步骤都会用到 AI,但是这些流程是预先设定好的,而非由 AI 在运作的过程中自己决定的。而因为根据在 AI 代理是什么? 一文提到的代理定义,AI 代理不需要事先设定好的流程,只需要目标,就会自行完成指定的任务,所以这种既定的流程,还不能算是代理,而只能被称为工作流。
AI 代理不一定是最佳的解决方案
虽然说工作流并非代理,在技术难度上比较低,但是推荐读者们不要轻忽工作流的好。身为一个工程师,重要的不只是技术,而是要能解决问题。如果用一个比较简单的工作流,就能解决问题,那即使不用 AI 代理,也完全没问题。
退一步来说,给定的工作流效率通常会比较高。因为 AI 代理本身牵涉到思考、推理、规划等步骤,这些都需要时间,因此假如某一个问题,用工作流跟用代理都能解决,通常用工作流的速度会比较快,因为步骤已经设定好,所以能够省去代理额外花费的时间。省时间之外,通常也能省下额外的成本,因为 AI 代理做的推理与规划,都是需要额外消耗 token、需要额外花费的。
因此,如同杀鸡焉用牛刀,在选择用 AI 代理的解决方案前,先探索是否有更简单、更快速、更省成本且可达到目标的方案,会是更推荐的做法。
然而,什么时候该选择用 AI 代理呢? 推荐是只有在工作流不足以满足需求时,再来评估是否用 AI 代理。这种状况通常代表,某一个任务比较复杂,或者某一个任务可能有比较多不同的变异状况,因此很难用简易的工作流来处理所有情境,这种状况下,使用 AI 代理就会是更合适的选择。
举例来说,协助工程师完成程式的程式代理 (coding agent) 选择用代理就会比工作流更合适,因为不同的程式实作,需要的步骤不同,这时如果预设了某个工作流,很可能导致既定的流程不符合解决问题所需的步骤,导致无法顺利解决问题。
常见的的工作流模式
在了解完 AI 代理与工作流的区别后,接着让我们来看有什么常见的 AI 工作流。以下我们会主要谈 Anthropic 发布的《Building effective agents》一文中,谈到的不同工作流模式。
连结模式 (Chaining Pattern)
首先,连结模式是最常见的模式,我们前面提的整理会议记录的例子,就属于连结模式。当某一个任务,能够具体地被拆成不同步骤,然后每一个步骤的成果,能被用在下一个步骤做为输入,这时候连结模式就是很不错的选择。
特别注意,在连结模式的某一个节点,都可以加入闸门 (gate),所谓的闸门是检查输出的结果是否如预期,可以有简易的检查,也可以搭配另一个 LLM 模型来帮忙检查。
以整理会议记录的范例来说,可以先请 AI 把演讲录音转成文字,这时文字输出就可以做为下一步的输入,请大型语言模型顺稿(例如把错别字更正),顺完稿的内容又能做为输入,请 LLM 来撷取重点精华。假如以程式码来表示,会是像下面这样
// 连结模式的主要部分
// audioToText、runLLM 以及 isValidOutput 等效用函式具体会是呼叫第三方效用函式
async function processAudioToSummary(
audioFile: string,
promptChain: string[]
): Promise<string[] | string> {
const responseChain: string[] = [];
let response = await audioToText(audioFile);
// 检查音档转文字结果,isValidOutput的检查做的就是闸门在做的事
if (!isValidOutput(response)) return response;
responseChain.push(response);
// 依序处理每个提示词
for (const prompt of promptChain) {
response = await runLLM(prompt, response);
if (!isValidOutput(response)) return response;
responseChain.push(response);
}
return responseChain;
}
// 不同步骤的提示词
const promptChain = [
"将文字转录内容进行顺稿,确保语句通顺且符合逻辑。",
"将内容分段,并标记每段的主题。",
"根据顺稿后的内容,撷取最重要的三点精华。",
];
// 使用范例,audioFile 会来自使用者
await processAudioToSummary(audioFile, promptChain);
阅读更多
以上我们介绍了工作流与代理的区别,也谈了连结模式。除了这个模式外,还有其他常见的工作流模式,我们在 E+ 成长计划中的主题文都有谈到。
对更深入了解这个主题,以及其他前后端开发、软体工程、AI 工程主题感兴趣的读者,欢迎加入 E+ 成长计划一起成长 (连结)。