Agent 双模式 —— Build vs Plan 全解析与规划模式实战
简介
在使用 AI 编程 Agent 工具时,一个核心问题是:你应该让 AI 直接动手写代码,还是先让它思考规划?
这就引出了 OpenCode 中两种重要的 Agent 工作模式:
- Build 模式:直接动手,边想边做,适合明确的小任务
- Plan 模式:先规划后执行,分步拆解,适合复杂的架构任务
这两种模式各有优劣,适合不同的场景。更妙的是,OpenCode 允许你通过简单的 Tab 键切换在两种模式之间自由切换,灵活应对各种开发需求。
本文将深入解析 Build 和 Plan 双模式的设计理念、使用方法、切换技巧,以及如何在规划模式下高效地分解和执行复杂任务。
一、两种模式的核心区别
1.1 Build 模式:直接行动派
Build 模式工作流:
用户输入 → AI 理解 → 直接执行工具 → 输出结果 → 继续特点:
- 收到任务后立即开始执行
- 边思考边编码,迭代式推进
- 工具调用和执行交替进行
- 适合快速原型、Bug 修复、简单功能开发
优势:
- 速度快,没有额外的规划开销
- 对于简单任务,规划反而浪费时间
- 可以边做边调整方向
劣势:
- 复杂任务容易偏离方向
- 缺少全局视角,可能做出次优决策
- 中途发现问题时需要回溯
1.2 Plan 模式:深思熟虑派
Plan 模式工作流:
用户输入 → AI 理解 → 生成计划 → 用户确认 → 逐步执行 → 完成特点:
- 收到任务后先分析和规划
- 生成结构化的执行计划
- 等待用户确认后再开始执行
- 适合架构设计、大型重构、多模块开发
优势:
- 有全局视角,决策更合理
- 计划可审查、可修改
- 复杂任务的执行更有条理
- 减少返工和方向性错误
劣势:
- 增加了规划阶段的时间开销
- 对于简单任务来说过度设计
- 计划可能与实际执行有偏差
1.3 模式对比一览
| 维度 | Build 模式 | Plan 模式 |
|---|---|---|
| 响应速度 | 快 | 慢(有规划阶段) |
| 适合任务 | 简单明确 | 复杂模糊 |
| 执行方式 | 边想边做 | 先想后做 |
| 用户控制 | 低 | 高(需确认计划) |
| 返工概率 | 较高 | 较低 |
| Token 消耗 | 较低 | 较高 |
| 输出格式 | 自然语言 + 代码 | 结构化计划 + 代码 |
二、Build 模式深入解析
2.1 Build 模式的使用场景
# 场景 1:快速修复一个明确的 Bug
opencode
(opencode prompt)> 修复 login.py 第 42 行的空指针异常
# 场景 2:添加一个简单的函数
(opencode prompt)> 在 utils.py 中添加一个格式化日期的函数
# 场景 3:快速原型验证
(opencode prompt)> 创建一个 Flask 的 Hello World 应用2.2 Build 模式的工作流程
用户: 修复 login.py 的空指针异常
│
▼
AI: 让我先查看 login.py 的内容
│
▼
工具调用: read_file("login.py")
│
▼
AI: 找到了问题,第 42 行 user.name 可能为空,我来修复
│
▼
工具调用: edit_file("login.py", patch="...")
│
▼
AI: 修复完成,让我运行测试验证
│
▼
工具调用: terminal("python -m pytest tests/test_login.py")
│
▼
AI: 测试通过,修复完成!2.3 Build 模式的高级技巧
# 技巧 1:使用约束条件引导 Build 模式
(opencode prompt)> 修改 database.py 使用连接池,要求:
(opencode prompt)> 1. 使用 psycopg2 的 SimpleConnectionPool
(opencode prompt)> 2. 最大连接数设为 10
(opencode prompt)> 3. 保持现有的 API 接口不变
# 技巧 2:分步骤请求,逐步推进
(opencode prompt)> 第一步:帮我创建 user_model.py 的骨架
(opencode prompt)> 第二步:现在添加 CRUD 方法
(opencode prompt)> 第三步:添加单元测试
# 技巧 3:让 AI 在 Build 中自我验证
(opencode prompt)> 重写 parse_config 函数,完成后运行测试验证正确性三、Plan 模式深入解析
3.1 Plan 模式的使用场景
# 场景 1:大型架构重构
(opencode prompt)> 帮我把单体应用拆分为微服务架构
# 场景 2:添加一个完整的功能模块
(opencode prompt)> 添加一个完整的用户权限管理系统,包括:
(opencode prompt)> - 角色定义
(opencode prompt)> - 权限矩阵
(opencode prompt)> - 中间件验证
(opencode prompt)> - 管理界面
# 场景 3:技术栈迁移
(opencode prompt)> 将项目从 Flask 迁移到 FastAPI3.2 Plan 模式的工作流程
用户: 添加用户权限管理系统
│
▼
AI: [进入 Plan 模式] 让我先分析现有代码结构...
│
▼
工具调用: 分析项目结构、查看相关文件
│
▼
AI: 生成执行计划:
📋 权限管理系统实施计划
阶段一:数据模型设计
├── 1.1 创建 Role 模型
├── 1.2 创建 Permission 模型
└── 1.3 创建 RolePermission 关联表
阶段二:核心逻辑实现
├── 2.1 实现权限检查中间件
├── 2.2 实现角色分配服务
└── 2.3 实现权限缓存层
阶段三:API 接口
├── 3.1 角色管理 API
├── 3.2 权限管理 API
└── 3.3 用户-角色绑定 API
阶段四:测试与文档
├── 4.1 单元测试
├── 4.2 集成测试
└── 4.3 API 文档
预计修改文件:8 个
预计新增文件:12 个
是否开始执行?[Y/n]
│
▼
用户: Y
│
▼
AI: 开始执行阶段一...
│
▼
[逐步执行各个阶段,每阶段完成后汇报进度]3.3 计划格式与结构
一个好的计划应该包含:
📋 [任务名称] 实施计划
## 概述
简要说明任务目标和范围
## 前置分析
- 当前状态分析
- 影响因素评估
- 风险识别
## 执行计划
### 阶段 N:[阶段名称]
- [ ] 步骤 N.1:具体描述
- 涉及文件:xxx
- 预计工作量:小/中/大
- [ ] 步骤 N.2:具体描述
...
### 阶段 N+1:[阶段名称]
...
## 依赖关系
阶段一 → 阶段二 → 阶段三
↓
阶段四(可与阶段三并行)
## 风险与备选方案
- 风险 1:描述 → 备选方案
- 风险 2:描述 → 备选方案
## 验收标准
- [ ] 标准 1
- [ ] 标准 2四、Tab 键切换模式
4.1 切换方式
在 OpenCode 的 TUI 界面中,你可以通过 Tab 键快速在 Build 和 Plan 模式之间切换:
┌─────────────────────────────────────────────┐
│ [Build] [Plan] ← 当前选中:Build │
│ │
│ > 帮我优化数据库查询性能 │
│ │
│ 按 Tab 切换到 Plan 模式 │
└─────────────────────────────────────────────┘
↓ 按 Tab
┌─────────────────────────────────────────────┐
│ [Build] [Plan] ← 当前选中:Plan │
│ │
│ > 帮我优化数据库查询性能 │
│ │
│ 按 Tab 切换回 Build 模式 │
└─────────────────────────────────────────────┘4.2 切换的最佳时机
何时切换到 Plan 模式?
│
├── 任务描述超过 3 行 → 切换 Plan
├── 涉及修改 5+ 个文件 → 切换 Plan
├── 包含架构决策 → 切换 Plan
├── 需要多阶段执行 → 切换 Plan
└── 不确定如何实现 → 切换 Plan
何时切换回 Build 模式?
│
├── 任务明确且简单 → 切换 Build
├── 快速原型验证 → 切换 Build
├── 修复小 Bug → 切换 Build
├── 添加单个函数 → 切换 Build
└── 计划已确认,进入执行阶段 → 切换 Build4.3 切换后的行为变化
# Build 模式下的典型行为
# 用户输入后,AI 立即开始:
# 1. 读取相关文件
# 2. 分析代码
# 3. 直接修改
# 4. 运行测试验证
# Plan 模式下的典型行为
# 用户输入后,AI 首先:
# 1. 读取相关文件(了解现状)
# 2. 分析问题
# 3. 生成结构化计划
# 4. 等待用户确认
# 5. 确认后逐步执行五、规划模式实战
5.1 实战场景:大型重构任务
让我们用一个完整的例子来展示 Plan 模式的威力。
# 用户输入
(opencode prompt)> [切换到 Plan 模式]
(opencode prompt)> 帮我将项目的错误处理从 try-except 模式
(opencode prompt)> 统一改造为自定义异常 + 全局异常处理器的模式AI 的规划响应:
📋 错误处理统一重构计划
## 概述
将项目中分散的 try-except 错误处理改造为统一的自定义异常体系,
并添加全局异常处理器,提升代码可维护性和错误追踪能力。
## 前置分析
- 当前项目中有 23 处使用 try-except 直接捕获 Exception
- 涉及 8 个模块文件
- 部分异常处理缺少日志记录
- 没有统一的错误响应格式
## 执行计划
### 阶段一:定义异常体系
- [ ] 1.1 创建 exceptions.py 基础模块
├── 定义 AppException 基类
├── 定义业务异常子类(NotFoundError, ValidationError 等)
└── 定义错误码枚举
涉及文件:src/exceptions.py(新建)
- [ ] 1.2 定义错误响应模型
├── ErrorResponse 数据类
└── 错误码到 HTTP 状态的映射
涉及文件:src/models/error.py(新建)
### 阶段二:实现全局异常处理器
- [ ] 2.1 创建异常处理中间件
├── 捕获 AppException 并格式化响应
├── 捕获未知异常并记录日志
└── 添加请求追踪 ID
涉及文件:src/middleware/exceptions.py(新建)
- [ ] 2.2 注册全局异常处理器
└── 在应用入口注册中间件
涉及文件:src/app.py(修改)
### 阶段三:替换现有异常处理
- [ ] 3.1 替换 service 层的异常处理(5 个文件)
- [ ] 3.2 替换 api 层的异常处理(3 个文件)
- [ ] 3.3 替换 util 层的异常处理(2 个文件)
每个文件:
├── 将裸 except 替换为具体异常
├── 添加异常日志
└── 确保错误传播到全局处理器
### 阶段四:测试验证
- [ ] 4.1 单元测试:每个自定义异常
- [ ] 4.2 集成测试:异常处理中间件
- [ ] 4.3 回归测试:确保现有功能正常
## 依赖关系
阶段一 → 阶段二 → 阶段三 → 阶段四
## 风险与备选方案
- 风险:替换过程中可能遗漏某些异常处理
→ 方案:使用静态分析工具扫描所有 try-except
- 风险:新异常体系与第三方库不兼容
→ 方案:保留对第三方异常的适配层
## 预计工作量
- 新增文件:3 个
- 修改文件:10 个
- 预计时间:30-45 分钟
是否开始执行?[Y/n]5.2 计划确认与执行
# 用户确认
(opencode prompt)> Y 开始执行
# AI 逐步执行
正在执行阶段一:定义异常体系...
✅ 创建了 src/exceptions.py
✅ 创建了 src/models/error.py
正在执行阶段二:实现全局异常处理器...
✅ 创建了 src/middleware/exceptions.py
✅ 修改了 src/app.py
正在执行阶段三:替换现有异常处理...
✅ 修改了 src/services/user_service.py
✅ 修改了 src/services/order_service.py
...
正在执行阶段四:测试验证...
✅ 12 个单元测试全部通过
✅ 5 个集成测试全部通过
🎉 重构完成!共修改 10 个文件,新增 3 个文件。5.3 规划模式的进阶技巧
# 技巧 1:要求 AI 在计划中标注风险点
(opencode prompt)> 帮我设计一个缓存层,请给出详细计划,
(opencode prompt)> 特别标注可能的性能风险和一致性风险
# 技巧 2:要求 AI 分多个方案对比
(opencode prompt)> 帮我选择合适的数据库方案,请给出:
(opencode prompt)> - 方案 A:PostgreSQL
(opencode prompt)> - 方案 B:MongoDB
(opencode prompt)> - 方案 C:混合使用
(opencode prompt)> 每个方案都给出实施计划和优劣分析
# 技巧 3:要求 AI 只出计划不执行
(opencode prompt)> 请只做规划,不要执行任何代码修改
(opencode prompt)> 我需要先评审计划后再决定是否执行
# 技巧 4:计划执行中的中途调整
(opencode prompt)> 暂停当前计划
(opencode prompt)> 先修改阶段二的实现方式,改用装饰器模式
(opencode prompt)> 然后继续六、模式选择决策树
收到任务
│
▼
任务是否明确?
├── 是 → 涉及文件是否 > 3?
│ ├── 是 → 需要架构决策?
│ │ ├── 是 → 【Plan 模式】
│ │ └── 否 → 【Build 模式】
│ └── 否 → 【Build 模式】
│
└── 否 → 是否需要分步骤?
├── 是 → 【Plan 模式】
└── 否 → 先切换到 Plan 模式让 AI 分析6.1 具体场景推荐
| 任务类型 | 推荐模式 | 原因 |
|---|---|---|
| 修复单个 Bug | Build | 目标明确,改动小 |
| 添加单个函数 | Build | 简单直接 |
| 重构单个文件 | Build | 范围可控 |
| 添加完整功能模块 | Plan | 涉及多文件,需要规划 |
| 架构重构 | Plan | 影响面广,需要全局视角 |
| 技术栈迁移 | Plan | 风险高,需要详细计划 |
| 性能优化 | Plan | 需要先分析和定位 |
| 安全审计 | Plan | 需要系统性地检查 |
| 代码审查 | Build | 逐项检查即可 |
| 文档编写 | Build | 线性任务 |
七、混合使用策略
7.1 Plan → Build 渐进式工作流
# 1. 先在 Plan 模式下生成整体计划
(opencode prompt)> [Plan 模式] 帮我设计一个完整的用户认证系统
# 2. AI 生成计划后,你评审并确认
# 3. 确认后切换到 Build 模式执行具体步骤
(opencode prompt)> [Build 模式] 开始执行阶段一:创建数据模型
# 4. 每个阶段完成后,评估是否需要调整后续计划
(opencode prompt)> [Plan 模式] 阶段一已完成,阶段二的计划需要调整吗?7.2 Build → Plan 升级式工作流
# 1. 先在 Build 模式下快速验证想法
(opencode prompt)> [Build 模式] 快速写一个文件上传的原型
# 2. 原型验证可行后,切换到 Plan 模式做完整设计
(opencode prompt)> [Plan 模式] 原型可行,现在请给出完整的生产级实现计划
# 3. 确认后执行完整实现
(opencode prompt)> 开始执行八、规划模式的提示词模板
8.1 标准规划请求模板
请帮我规划以下任务:
## 任务描述
[详细描述你要完成的任务]
## 当前状态
[描述项目的当前状态、已有的相关代码]
## 约束条件
- [列出技术约束,如必须使用某个库]
- [列出时间约束]
- [列出兼容性要求]
## 期望输出
- [ ] 详细的阶段划分
- [ ] 每个阶段的具体步骤
- [ ] 涉及的文件列表
- [ ] 风险点和备选方案
- [ ] 验收标准
请只做规划,不要执行任何代码修改。8.2 评审计划时的检查清单
评审计划时,检查以下方面:
- [ ] 阶段划分是否合理?
- [ ] 是否有遗漏的步骤?
- [ ] 依赖关系是否正确?
- [ ] 风险评估是否全面?
- [ ] 是否有更好的实现方案?
- [ ] 工作量预估是否合理?
- [ ] 是否需要拆分为更小的任务?
- [ ] 是否考虑了向后兼容性?总结
本文深入解析了 OpenCode 的 Agent 双模式:
- Build 模式:直接行动,适合简单明确的任务,速度快但缺乏全局规划
- Plan 模式:先规划后执行,适合复杂任务,有全局视角但增加时间开销
- Tab 键切换:在 TUI 中快速切换模式,灵活应对不同场景
- 规划模式实战:从生成计划到逐步执行,完整的复杂任务处理流程
- 模式选择决策树:根据任务特征选择合适模式
- 混合使用策略:Plan→Build 和 Build→Plan 两种渐进式工作流
掌握双模式的使用,可以让你在不同场景下选择最合适的策略:简单任务用 Build 快速推进,复杂任务用 Plan 确保方向正确,必要时在两者之间灵活切换。