Workflow:把确定步骤从模型手里拿回来
问题场景
Agent 适合开放式任务,但不是所有任务都应该让模型自由决定。比如“生成学习计划”通常有固定步骤:
- 解析目标。
- 检索资料。
- 估算难度。
- 生成计划。
- 给出练习。
这类任务更适合 Workflow。模型可以参与某些步骤,但流程控制权应该在代码里。
深入学习
本页只讲顺序工作流。并行、分支、共享状态、错误处理和暂停恢复见 Workflow 控制流。
Agent 和 Workflow 的区别
| 维度 | Agent | Workflow |
|---|---|---|
| 步骤 | 运行时由模型决定 | 开发时定义 |
| 适合任务 | 开放式、探索式 | 明确、多步骤、可复现 |
| 调试方式 | 看模型推理和工具调用 | 看每个 step 的输入输出 |
| 风险 | 不稳定、可能绕路 | 灵活性低,但更可控 |
Mastra 映射
Mastra Workflow 的核心是:
createStep()定义步骤。createWorkflow()定义输入输出。.then()串联步骤。.commit()完成定义。
ts
import { createStep, createWorkflow } from '@mastra/core/workflows'
import { z } from 'zod'
const normalizeGoal = createStep({
id: 'normalize-goal',
inputSchema: z.object({ goal: z.string() }),
outputSchema: z.object({ normalizedGoal: z.string() }),
execute: async ({ inputData }) => {
return { normalizedGoal: inputData.goal.trim() }
},
})
export const studyPlanWorkflow = createWorkflow({
id: 'study-plan-workflow',
inputSchema: z.object({ goal: z.string() }),
outputSchema: z.object({ normalizedGoal: z.string() }),
})
.then(normalizeGoal)
.commit()设计流程图
mermaid
flowchart TD
A[输入学习目标] --> B[规范化目标]
B --> C[检索课程资料]
C --> D[生成学习计划]
D --> E[生成练习题]
E --> F[输出结构化结果]Vibe coding 提示词
text
请帮我实现一个 Mastra Workflow:studyPlanWorkflow。
要求:
- 输入 { goal: string; days: number }。
- 第一步规范化 goal。
- 第二步调用本地资料搜索函数,不直接调用模型。
- 第三步生成每天学习安排。
- 每个 step 都要有 inputSchema 和 outputSchema。
- 不要把所有逻辑写在一个 step 里。验证方式
运行工作流 Demo:
bash
npm run demo:04观察每个 step 的输入输出,确认数据是一步步传递的。
常见错误
| 错误 | 后果 | 修复 |
|---|---|---|
| Workflow 里没有 schema | 输入输出不可控 | 每步都写 schema |
| 把 Agent 当唯一 step | 仍然不可复现 | 只在需要语言生成时调用 Agent |
| 上一步输出和下一步输入不匹配 | 运行失败 | 明确字段名和结构 |
| 没有错误分支 | 失败难定位 | 对空资料、非法 days 做处理 |