目标是不靠“灵感调参”,而是建立可复用、可验证的模板体系。 注:本文为“1 月份重点篇”,提供工程化的模板组织方法与样例。
🎯 文章目标
- 建立提示模板的结构化组织与版本管理
- 让输出“可执行、可校验、可回放”
- 给出跨场景可复用的提示片段库
📚 背景/前置
- 提示组成:System 指南 + 角色/风格 + 任务约束 + 输入变量 + 输出格式
- 模板来源:重复场景归纳、失败样本回放、对比实验沉淀
- 版本化:prompt 也要版本号,与模型/数据一起记录
🔧 核心内容
1) 模板设计要点
- 约束优先:明确输入边界、输出格式(JSON/Markdown/表格)
- 拆分任务:复杂任务 → 分步提示(plan → act → reflect)
- 少样本示例:挑选“边界样本”和“错误对”作为 few-shot
- 反事实样本:提醒模型避免常见错法
2) 模板管理与组织
- 目录结构建议:
- prompts/
- taskA/
- system.md
- user.hbs(Handlebars 模板)
- examples.json
- taskB/
- taskA/
- prompts/
- 元数据:
- 观测:模板命中率/失败样本/回滚记录
3) 结构化输出与校验
- JSON Schema/正则/自定义校验器
- 尽量减少“自由文本”,并为下游提供解析器
💡 实战示例:Node.js 模板调用(OpenAI 兼容)
javascript
import fs from 'node:fs/promises'
import OpenAI from 'openai'
import Handlebars from 'handlebars'
const client = new OpenAI({ baseURL: process.env.OPENAI_API_BASE, apiKey: process.env.OPENAI_API_KEY })
const tpl = await fs.readFile('prompts/taskA/user.hbs', 'utf-8')
const render = Handlebars.compile(tpl)
const msg = [
{ role: 'system', content: await fs.readFile('prompts/taskA/system.md', 'utf-8') },
{ role: 'user', content: render({ topic: 'RAG 的关键步骤', bullets: 3 }) }
]
const resp = await client.chat.completions.create({
model: process.env.CHAT_MODEL,
messages: msg,
temperature: 0.2
})
console.log(resp.choices[0].message.content)
示例 user.hbs:
hbs
请围绕“\{\{topic\}\}”输出要点,要求:
- 以无序列表输出 \{\{bullets\}\} 条
- 每条不超过 20 字
- 若无依据请拒答
📊 对比/取舍(速查)
- 大而全 vs 细而专:通用模板易失准;按场景拆分更稳
- 少样本 vs 零样本:边界场景多时,少样本更可控
- 规则约束 vs 自由生成:工程落地优先规则约束
🧪 踩坑与经验
- 模板漂移:内容/变量命名随意更改会导致回放失败;务必版本化
- 过度 few-shot:示例过多会稀释约束,增加成本
- 输出不稳:增加“不可编造”“必须引用上下文”等显式规则
📎 参考与延伸
- 提示模式:Chain-of-Thought、ReAct、Plan-and-Solve
- 模板引擎:Handlebars、EJS、Jinja2
- 结构化输出:JSON Schema、类型校验
💭 总结
- 用“模板化 + 版本化 + 校验”替代“玄学调参”
- 把失败样本回放与模板演进打通,持续优化