组织 Agent 指令
现在你的系统提示词只有一句话:You are a coding agent.那不是提示词。那是名牌。
你的工具已经在起大部分转向作用了。模块2的描述足够丰富,Agent可能会选择阅读任务read,搜索时会grep,几乎不用帮忙。那么,这个系统提示词是为了什么?
就是你写下策略的地方。而不是Agent can做什么(那是工具)。Agent should做什么,按什么顺序,用什么样的克制。名牌不能带这个。一个被分割的遗嘱提示词。
学习成果
instructions是一个分段的提示词,明确设有Agent区和护栏区块。Agent对任务进行操作(使用工具、报告结果),而不是解释假设性的功能。
快速路径
- 用切段的
You are a coding agent.替换提示词 - 添加Agent部门:使用工具,不解释,偏好专用工具胜过
bash - 添加护栏部分:改动最小,创建前搜索,未经允许新增 Deps
动手练习 3.1
在index.ts中重写instructions字段,使用结构化的多部分提示词。
要求:
- 以一句话介绍角色和工作目录
- 添加一个
# Agency部分,告诉Agent采取行动,而不是解释 - 添加一个
# Guardrails部分,包含约束(最小改动、重复使用、不新增 DEPS) - 继续使用模板文字,这样工作目录就能插值进去
实现提示:
- 分段标题(
# Agency、# Guardrails)让提示词对你和模型都能扫描 - 明确地表达负面指示(“NOT解释一下你会怎么做”)。模型默认是解释
- 请用工具名称来称呼。模型已经有描述,但提示词中指向它们会强化路线
之前
instructions: `You are a coding agent.\nWorking directory: ${cwd}`,这方法有效。Agent在被要求时读取文件,在被要求时搜索,在被要求时执行命令。但没有什么策略。让它“找到TODO所有评论并修正”,回复完全取决于模型当下的心情。也许它会起作用。也许它会生成一个计划,等待你审批。
这种模糊正是提示词存在的意义。
之后
instructions: `You are a coding agent working in: ${cwd}
# Agency
- USE your tools. Read files, search code, run commands, then answer.
- Do NOT explain what you WOULD do. Actually do it.
- Prefer grep for searching, read for viewing files.
- Use bash only for commands that aren't covered by other tools.
# Guardrails
- Prefer simple, minimal changes
- Search before creating, and reuse existing patterns
- No new dependencies without asking`,现在策略已经写下来了。Agent部门给予Agent行动许可和指示。护栏部分设定了界限。
有几点需要注意:
- “完成任务”的指令是明确的。没有它,Agent就会陷入解释。大声说“真的去做”是令人烦躁的必要
- 工具偏好和描述都存在于提示词中。重复是有意为之。我们在两个地方说,因为模型们在一个地方错过了
- “未经询问不得新增依赖”为第8模块的人机协作工作奠定了基础
具体发生了什么变化
Agent已经有工具了。它已经有描述了。新的是操作策略现在可携带。你可以把这个提示词复制到不同的Agent,用不同的工具,策略依然适用。你可以做A/B测试。你可以把一部分抬起来做子 Agent。
一句话的话提示词做不到。一个被分区的提示词。
**注意:剖面解剖**
| 部分 | 作用 |
|---|---|
| 角色线 | Agent是谁,在哪里有效 |
| Agent机构 | 允许并指示执行任务 |
| 护栏 | 如何行动:极简、重用、保守地使用deps。 |
| 工具使用(后期) | 在混合工具的使用中,使用哪种工具 |
| 通信(后期) | 如何汇报结果 |
从自主权和护栏开始。另外两位在提示词超过20行时才会获得属于自己的位置。
动手试试
在更换前后重复同一提示词,观察Agent的姿势变化:
bun run index.ts . "Find all TODO comments and tell me where they are"对于这句单句话,Agent可能会先列出自己的计划(“我用grep搜索。.....”)。有了结构化提示词,它直接进入工具调用并报告发现。
npx tsc --noEmit**注意:不要指望每次都会有戏剧性的转变**
如果你的Agent已经用一行提示词来操作(模块2的描述足够强,通常都能做到),那么明显的变化可能很细微。持久的好处是策略:你明确了操作风格,这意味着你可以更改它而不用重写整个Agent。
提交
git add index.ts
git commit -m "feat(prompt): add Agency and Guardrails sections"完成标准
- [ ]
instructions包括# Agency和# Guardrails部分 - [ ] 机构告诉Agent使用工具,而不是解释
- [ ] 护栏限制了范围(最小改动,重复使用,不新增 DEPS)
- [ ] 工作目录仍然会插入提示词
- [ ]
npx tsc --noEmit
**注意:测试提示词的边缘**
试着完全删除Agent机构部分。重复同样的任务。Agent会不会又回到解释模式?试着拆掉护栏。它会开始添加随机的NPM包吗?每个部门都在做功课。弄清楚哪个部位捕捉到哪种行为,就是整个游戏的全部。
参考实现
const agent = new ToolLoopAgent({
model: "anthropic/claude-haiku-4-5",
instructions: `You are a coding agent working in: ${cwd}
# Agency
- USE your tools. Read files, search code, run commands, then answer.
- Do NOT explain what you WOULD do. Actually do it.
- Prefer grep for searching, read for viewing files.
- Use bash only for commands that aren't covered by other tools.
# Guardrails
- Prefer simple, minimal changes
- Search before creating, and reuse existing patterns
- No new dependencies without asking`,
tools: { read, grep, bash },
stopWhen: stepCountIs(10),
});