提示词工程
提示词工程(Prompt Engineering)是设计清晰、结构化的指令以引导大模型生成高质量输出的系统性方法。核心原则是"说人话"——用自然语言精确描述期望,辅以结构化框架约束输出格式。
核心原则
提示词设计三要素
| 要素 | 说明 | 示例 |
|---|---|---|
| 角色(Role) | 定义模型的身份和专业背景 | "你是一位资深前端架构师" |
| 任务(Task) | 明确要完成的具体工作 | "根据需求设计组件架构" |
| 约束(Constraint) | 限定输出格式、范围、风格 | "以 JSON 格式输出,包含组件名、props、事件" |
基本书写原则
- 说人话:大参数模型具备理解复杂自然语言的能力,清晰表达比花哨技巧更重要
- 具体化:避免模糊指令,用具体描述替代抽象要求
- 分步骤:复杂任务拆解为有序步骤,逐步引导
- 给示例:通过 Few-shot 示例明确期望的输出格式和质量
结构化提示词框架
Role-Task-Result(RTR)
最基础的结构化框架,适用于大多数场景:
markdown
你是一位曾经就职于互联网头部企业的资深软件工程师和IT教育专家,
擅长用通俗易懂的语言来给初学者讲解技术概念。
根据用户的输入,整理一门入门级技术课程的大纲,要求:
1. 注重基本概念和原理,为学员打下扎实基础
2. 具有实操性,注重实用性
3. 内容不要求大而全,要循序渐进,适合初级学员掌握
4. 准备的案例简单而兼具趣味与挑战
5. 展望未来,适当介绍一些新技术和技术趋势CRISPE 框架
适用于需要精细控制的复杂场景:
| 字母 | 含义 | 说明 |
|---|---|---|
| C | Capacity/Role | 模型扮演的角色和能力 |
| R | Request | 具体请求内容 |
| I | Input | 输入数据和上下文 |
| S | Style | 输出风格和语气 |
| P | Pattern | 输出格式和结构 |
| E | Exception | 异常处理和边界条件 |
Chain-of-Thought(CoT)
引导模型逐步推理,显著提升复杂逻辑任务的准确率:
markdown
请一步步分析以下问题:
1. 首先,识别问题的核心约束条件
2. 然后,列出所有可能的解决方案
3. 接着,逐一评估每个方案的优缺点
4. 最后,给出最优方案及理由
问题:如何设计一个支持百万并发的实时消息推送系统?JSON 结构化输出
通过示例约束输出格式
利用语义化的 JSON 模板引导模型输出结构化数据:
markdown
根据用户{input}要求,解释科学内容,用中文以 JSON 格式回复。
输出格式:
{
"topic": "主题",
"sections": [
{
"section": 1,
"subtopic": "子主题",
"explanation": "详细解释",
"key_points": ["要点1", "要点2"]
}
],
"summary": "总结",
"next_question": "引导下一个问题"
}工程中的 JSON 输出配置
OpenAI 兼容 API 支持通过 response_format 参数强制 JSON 输出:
typescript
const response = await fetch(`${endpoint}/chat/completions`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${apiKey}`,
},
body: JSON.stringify({
model: 'gpt-4o',
messages: [
{
role: 'system',
content: '你是一个数据提取助手,始终以 JSON 格式回复。',
},
{ role: 'user', content: '提取这段文本中的人名和职位' },
],
response_format: { type: 'json_object' },
}),
});强化推理的隐藏字段技巧
在 JSON 输出中增加"对后续无直接用途但能强化推理"的字段:
typescript
// 让 AI 输出 intent 字段,虽然后续模块不直接使用,
// 但强制 AI 先分析意图再生成内容,显著提升输出质量
const outputSchema = {
intent: '用户意图分析(强化推理用)',
querys: ['搜索关键词1', '搜索关键词2'],
result: '最终生成内容',
};高级技巧
Few-shot 示例
通过 2-3 个输入输出示例明确期望:
markdown
将用户评论分类为正面/负面/中性。
示例1:
输入:"这个产品太好用了,强烈推荐!"
输出:{"sentiment": "正面", "confidence": 0.95}
示例2:
输入:"一般般吧,没什么特别的。"
输出:{"sentiment": "中性", "confidence": 0.80}
现在请分类:
输入:"{{user_input}}"
输出:系统提示词 vs 用户提示词
| 类型 | 用途 | 特点 |
|---|---|---|
| System Prompt | 定义角色、规则、全局约束 | 整个对话生效,优先级最高 |
| User Prompt | 传递具体任务和数据 | 每轮变化,携带动态信息 |
| Assistant Prompt | 模型历史回复 | 维护对话连贯性 |
温度与采样参数
| 参数 | 范围 | 效果 | 适用场景 |
|---|---|---|---|
temperature | 0-2 | 越高越随机/创造性 | 创意写作(1.0+)、代码生成(0-0.3) |
top_p | 0-1 | 核采样概率阈值 | 与 temperature 二选一调整 |
max_tokens | 1-N | 最大输出长度 | 控制成本和响应时间 |
frequency_penalty | -2~2 | 降低重复 | 长文本生成 |
presence_penalty | -2~2 | 鼓励新话题 | 对话多样性 |
工作流中的提示词编排
在复杂 AI 工作流中,通常存在多级提示词链:
图表渲染中…
多级 Prompt 设计原则
- 单一职责:每个 Prompt 只完成一个明确任务
- 上下文传递:前一级输出作为后一级输入,通过模板变量
{{input}}注入 - 角色递进:从分析师→写作者→编辑,逐步精炼
- 质量门控:关键节点增加自检 Prompt("检查以上内容是否满足...")
常见问题与陷阱
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 输出格式不稳定 | 提示词约束不够明确 | 使用 response_format + 严格 JSON Schema |
| 幻觉/编造事实 | 模型缺乏相关知识 | 结合 RAG 提供上下文、要求标注不确定内容 |
| 忽略部分指令 | 提示词过长/结构混乱 | 使用编号列表、重要指令加粗或重复 |
| 过度冗长 | 未限定输出长度 | 明确字数要求或段落数 |
| 角色偏移 | 多轮对话中角色淡化 | 在 system prompt 中强化角色,定期重申 |
最佳实践
- 版本管理:将 Prompt 作为代码管理,使用 Git 追踪变更
- A/B 测试:对关键 Prompt 进行对比实验,量化效果
- 模板化:抽取通用 Prompt 模板,通过变量注入适配不同场景
- 防御性设计:增加"如果无法回答,请说明原因"等兜底指令
- 持续迭代:根据实际输出质量持续优化 Prompt