模型: claude-opus-4-6 (anthropic/claude-opus-4-6) 生成日期: 2026-02-18
前两节我们分别从 OpenCode 和 oh-my-opencode 的角度提炼了设计智慧。本节将这些经验整合,形成一套可操作的最佳实践指南——如果你要从零构建一个 AI 编程助手,这些就是最值得遵循的原则。
18.3.1 Prompt 工程最佳实践
System Prompt 的分层架构
OpenCode 的 System Prompt 不是一个整块——它由多个层级拼接而成(第 6.4.3 节):
最终 System Prompt = [
基础 Prompt (anthropic.txt / beast.txt / ...) ← 模型适配层
+ Agent 专属 Prompt ← Agent 角色层
+ 环境信息 (OS, Shell, 工作目录, Git 状态) ← 运行时上下文层
+ 项目指令 (AGENTS.md / CLAUDE.md / CONTEXT.md) ← 用户指令层
+ Plugin 注入 (experimental.chat.system.transform) ← 扩展层
]
这种分层设计的好处:
实践建议:将 System Prompt 拆分为独立维护的层级。每个层级有明确的职责和变更频率,避免一个巨大的单体 Prompt。
不同 LLM 对 Prompt 的理解存在显著差异。OpenCode 为主流模型家族维护了独立的基础 Prompt:
Claude 系列(anthropic.txt):充分利用 XML 标签结构化指令
GPT 系列(beast.txt):适配 OpenAI 的系统消息风格
Gemini 系列(gemini.txt):适配 Google 模型的特点
其他模型(qwen.txt):通用的精简版本,去掉了某些模型不支持的特性(如 Todo 工具)
实践建议:不要假设一套 Prompt 适用所有模型。至少按模型家族维护不同版本,特别关注:
是否支持 Tool Use / Function Calling
指令遵循的风格偏好(XML 标签 vs Markdown vs 纯文本)
LLM 选择使用哪个工具、如何传递参数,完全依赖工具的 description 字段。OpenCode 中每个工具都有精心编写的描述文本(存储在 .txt 文件中)。
一个好的工具描述应该包含:
以 OpenCode 的 read 工具为例,它的描述不只是"读取文件",而是详细说明了行号格式、图片文件的处理、PDF 页码限制等细节。这些信息帮助 LLM 做出正确的决策。
实践建议:投入足够的精力编写工具描述。工具描述的质量直接决定了 AI Agent 的行为质量。一个含糊的描述会导致 LLM 频繁误用工具。
OpenCode 的权限系统(第 9 章)遵循严格的最小权限原则:
关键设计:
Bash 命令需要按命令内容匹配权限(bash("rm *") ≠ bash("ls"))
文件写入需要按路径匹配权限(写 src/ ≠ 写 /etc/)
.env 文件有特殊保护——即使 Agent 有 read 权限,读取 .env 也需要额外确认
外部目录访问有专门的 external_directory 权限控制
实践建议:
对敏感操作(文件删除、外部访问、密钥读取)设置额外保护层
OpenCode 通过以下机制限制 AI 对文件系统的影响范围:
file/ignore.ts 解析 gitignore 规则
实践建议:永远假设 AI 会尝试做"意料之外"的事情。建立多层防护,即使某一层被绕过,其他层仍然有效。
OpenCode 的 Snapshot 系统(第 10.1 节)是最后一道安全防线:
实践建议:在 AI 修改任何文件之前,都应该有可回滚的机制。Snapshot 的成本极低(本质上是 git add + git commit),但价值极高——它让用户敢于让 AI 做大规模的代码修改。
上下文窗口是 LLM 最宝贵的资源。OpenCode 通过三级策略管理它(第 4.5 节):
第一级:Prune(修剪)
Prune 是"非破坏性"的——它只压缩工具输出,不删除消息本身。
第二级:Compaction(压缩)
Compaction 是"有损压缩"——旧消息的细节会丢失,但关键信息通过摘要保留。
第三级:Preemptive Compaction(先发制人压缩,oh-my-opencode)
实践建议:
工具输出是上下文的最大消费者——优先对工具输出进行截断和摘要
实现渐进式的上下文管理(Prune → Compaction),而非一步到位的粗暴截断
为 Compaction 的摘要 Prompt 投入足够的设计精力——摘要的质量决定了压缩后 AI 的"记忆"质量
每一个 Token 都有成本。以下是 OpenCode 和 oh-my-opencode 中的 Token 节约实践:
truncation.ts、tool-output-truncator Hook
oh-my-opencode 的 Explore Agent 使用便宜模型
实践建议:像管理内存一样管理 Token。每次向上下文中添加内容时,都问自己:这些信息对 AI 的下一步决策真的必要吗?
OpenCode 的 batch 工具(第 5.3.2 节)允许 AI 同时执行多个独立的工具调用:
oh-my-opencode 更进一步——通过后台 Agent 系统(第 15.6.1 节)实现了 Agent 级别的并行执行。
实践建议:识别可以并行的操作并提供并行执行的能力。这不仅节约时间,还节约 Token(减少了"等待上一步结果"的循环轮次)。
AI 的响应时间可能很长(几秒到几十秒)。OpenCode 通过流式输出让用户看到"AI 正在思考":
关键体验细节:
文本逐 Token 流式输出(text-delta 事件)
工具调用的进度可见(tool-call-start → running → completed)
思考链可见(reasoning-start → reasoning-delta → reasoning-end)
实践建议:永远不要让用户面对一个"空白等待"。即使只是显示"正在思考…"的旋转动画,也比什么都没有好。流式输出是 AI 产品最重要的 UX 特性之一。
当 AI 执行复杂任务时,用户需要知道"它在做什么、做到哪了":
TodoWriteTool + TodoReadTool
实践建议:让 AI 的工作过程透明可见。用户对 AI 的信任来源于"我能看到它在做什么",而非"我相信它会做对"。
当 AI 出错时(比如编辑失败),系统应该:
oh-my-opencode 的错误恢复 Hook 不只是捕获错误——它还会向 AI 注入修复建议,让 AI 能够自主尝试修复。
实践建议:
这些最佳实践的共同主题是:尊重 AI 的不确定性,同时最大化它的价值。好的 AI 编程助手不是一个"永不犯错的超级程序员",而是一个"偶尔需要纠正、但整体高效可靠的编程伙伴"。系统设计的目标是让 AI 在犯错时快速恢复,在正确时充分发挥。