Skip to content

目标是不靠“灵感调参”,而是建立可复用、可验证的模板体系。 注:本文为“1 月份重点篇”,提供工程化的模板组织方法与样例。

🎯 文章目标

  • 建立提示模板的结构化组织与版本管理
  • 让输出“可执行、可校验、可回放”
  • 给出跨场景可复用的提示片段库

📚 背景/前置

  • 提示组成:System 指南 + 角色/风格 + 任务约束 + 输入变量 + 输出格式
  • 模板来源:重复场景归纳、失败样本回放、对比实验沉淀
  • 版本化:prompt 也要版本号,与模型/数据一起记录

🔧 核心内容

1) 模板设计要点

  • 约束优先:明确输入边界、输出格式(JSON/Markdown/表格)
  • 拆分任务:复杂任务 → 分步提示(plan → act → reflect)
  • 少样本示例:挑选“边界样本”和“错误对”作为 few-shot
  • 反事实样本:提醒模型避免常见错法

2) 模板管理与组织

  • 目录结构建议:
    • prompts/
      • taskA/
        • system.md
        • user.hbs(Handlebars 模板)
        • examples.json
      • taskB/
  • 元数据:
  • 观测:模板命中率/失败样本/回滚记录

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、类型校验

💭 总结

  • 用“模板化 + 版本化 + 校验”替代“玄学调参”
  • 把失败样本回放与模板演进打通,持续优化