Agent Engineering 101|12|Prompt Templates
Prompt Templates 是用户可控的工作流入口。它们把重复任务的起点模板化,但不替代 Agent Loop、Tools 或 Context Builder。
核心结论
配套代码仓库: github.com/llm-101/mini-agent-harness
读完本文,你应该能回答
- Prompt Template 解决的是哪类重复任务?
- 它和 Skill、Tool、Memory 的边界在哪里?
- 模板为什么不应该替代 Agent Loop?
- 一个好模板应该固定什么、留空什么?
本篇在系列中的位置
- 上一篇:11 Skills 把任务知识包装成运行时资源。
- 本篇:本文讨论用户如何用模板启动可重复工作流。
- 下一篇:13 Extensions 会把能力扩展到更通用的 hook / primitive 层。
贯穿例子
本系列会反复使用同一个任务来连接各章:
用户说:“帮我修复这个 repo 里的 failing tests。”
在这个任务里,Prompt Template 可以把“修测试”启动成一个稳定入口:要求先定位失败、再最小修改、最后验证。读者要关注的是:模板负责把任务开好头,后续判断仍然交给 Agent Loop 和工具结果。
- Prompt Template 是带变量的入口文本。它把用户意图、固定约束和动态参数组合成一次标准化的初始输入。
- 用户经常重复启动同类任务:代码审查、测试计划、文档总结、发布检查。每次手写 prompt 容易遗漏约束。
- 在
mini-agent-harness中,Prompt Template 是用户启动任务的入口层,不是执行层,也不是状态层。
定义
Prompt Template 是带变量的入口文本。它把用户意图、固定约束和动态参数组合成一次标准化的初始输入。
为什么要单独看这一层?
很多任务不是全新问题,而是重复启动的工作流。Prompt Templates 让起点稳定下来,同时保留运行时根据工具结果继续判断的空间。

边界
这一层的职责可以拆成几个稳定部分:
- Template:name、description、content
- Variables:{{ key }} 占位符
- Render:变量缺失时替换为空字符串
- Entrypoint:作为用户输入进入 stream()
- Not State:模板不保存会话状态
- Not Tool:模板不执行外部动作
这一层的边界可以用一个问题检验:如果它的内部实现变化,模型适配、工具执行、状态存储和产品外壳是否都不需要跟着重写?如果答案是否定的,说明这个边界还没有真正收束变化。
代码锚点
本篇主要对应这些模块:
src/prompts/prompt-template.ts
阅读代码时建议先看类型,再看运行路径。
类型定义告诉你这一层暴露什么 contract;运行路径告诉你这个 contract 在 Agent 执行中何时被消费、何时被写回、何时被产品层看见。
运行流程

一次典型执行可以概括为:
- Choose Template:用户选择任务入口
- Bind Variables:填充参数
- Render Prompt:生成文本
- Agent Stream:进入 harness
- Session:作为 user message 保存
- Repeatability:减少遗漏
- Governance:固定约束
- UX:降低启动成本
这里最容易被忽略的是“中间态”。生产级 Agent 不是只关心最终答案;它还要在运行过程中展示进度、捕获错误、记录 usage、允许取消,并把可恢复状态写回 session。
读者抓手:模板适合固定什么
| 模板场景 | 固定部分 | 留给用户/运行时的部分 |
|---|---|---|
| 写 review | 检查维度、输出格式 | 目标文件、风险重点 |
| 修 failing tests | 调试顺序、验证要求 | 具体 repo、失败日志 |
| 发布文章 | frontmatter、验证清单 | 标题、正文、图片 |
| 做研究摘要 | 信息源优先级、引用格式 | 研究问题、时间范围 |
Prompt Template 的价值是让任务有一个好起点,而不是把后续判断写死。
可迁移伪实现:Prompt Template 渲染
下面的伪代码是机制抽象,不对应真实 API 或文件结构。它只用来说明这一层的控制点:
function renderPromptTemplate(template, variables) {
return template.content.replace(/{{\s*([a-zA-Z0-9_-]+)\s*}}/g, (_m, key) => variables[key] ?? "");
}
这个草图的价值在于说明控制点,而不是提供可复制的库代码。
真正的工程实现还要处理错误、取消、并发、token 预算、日志、权限、序列化和 provider 差异。
工程原则
将这一层从 Agent 系统中拆出来,通常带来四个直接收益。
第一,可替换。
外部系统、模型 provider、工具集合或产品外壳变化时,核心运行时不必整体重写。
第二,可观测。
边界清晰后,事件、trace、usage、错误和状态迁移都有稳定落点。
第三,可恢复。
只要状态写入 session,运行时就可以在进程重启、工具失败或长任务中断后继续推理。
第四,可治理。
权限、脱敏、审批、路径保护和执行策略可以放在稳定 hook 或 runtime boundary 上,而不是只靠 prompt 约束。
和 Agent Harness 的关系
Agent = Model + Harness 这个公式的重点,不是把模型之外的所有东西都称为“工程杂活”。
相反,它提示我们:模型之外存在一套必须被设计的运行时系统。
Prompt Templates 就是这套系统中的一个切面。它不替代模型能力,也不替代产品体验;它让模型能力可以被组织成可执行、可观察、可恢复、可治理的任务流程。
小结
Prompt Templates 的核心价值,是把一类容易扩散的复杂性收束到明确边界中。
在 mini-agent-harness 中,这个边界被刻意写得较小,方便阅读和教学。但它对应的问题并不小:只要一个 Agent 要长期运行、调用工具、管理上下文、支持 UI、保存状态并处理失败,这个边界就会出现。
下一步可以继续沿着系列计划,把这些边界组合成完整 Agent Harness:模型边界、工具边界、状态边界、上下文边界、扩展边界和产品外壳边界。