Prompt设计基础
1. Prompt工程概述
Prompt工程是设计和优化输入文本以引导大语言模型(LLM)产生期望输出的系统方法。好的Prompt设计可以显著提升模型性能,无需修改模型参数。
1.1 为什么Prompt工程重要
- 零成本优化: 无需训练或微调,仅通过修改输入即可改善输出
- 快速迭代: 秒级反馈,快速验证想法
- 通用性: 适用于所有LLM,技能可迁移
- 第一道防线: 在考虑微调之前,先穷尽Prompt优化
1.2 Prompt的基本结构
[System Prompt] ← 角色定义、行为约束
[Context/Examples] ← 背景信息、示例
[User Input] ← 用户实际请求
[Output Format] ← 期望输出格式
2. 基础Prompt模式
2.1 Zero-Shot Prompting
直接给出任务描述,不提供任何示例:
将以下文本分类为"正面"、"负面"或"中性":
"这家餐厅的菜品味道很好,但服务速度太慢了。"
适用场景:
- 任务描述清晰明确
- 模型对该任务有充分的预训练知识
- 简单分类、翻译、摘要等常见任务
局限性:
- 复杂任务可能输出不稳定
- 无法通过示例传达细微的判断标准
2.2 Few-Shot Prompting
提供少量示例来引导模型理解任务模式:
将以下文本分类为情感类别。
文本:"今天天气真好!" → 正面
文本:"这个产品完全不能用。" → 负面
文本:"会议改到了下午三点。" → 中性
文本:"虽然价格贵了点,但质量确实不错。" →
最佳实践:
- 示例数量: 3-5个通常足够
- 示例多样性: 覆盖不同类别和边界情况
- 示例顺序: 最相关的示例放在最后(近因效应)
- 格式一致: 所有示例保持相同格式
注意事项:
- 避免示例中的偏差(如类别分布不均)
- 示例质量比数量更重要
- 过多示例可能超出上下文窗口
2.3 Chain-of-Thought (CoT) Prompting
引导模型展示推理过程,逐步得出答案:
Q: 一个商店有32个苹果。如果每箱装8个苹果,需要多少箱?
请一步步思考。
A: 让我一步步来解决:
1. 商店总共有32个苹果
2. 每个箱子可以装8个苹果
3. 需要的箱子数 = 总苹果数 ÷ 每箱苹果数
4. 32 ÷ 8 = 4
所以需要4个箱子。
触发方式:
- 简单触发: "让我们一步步思考" / "Let's think step by step"
- 结构化触发: "请按以下步骤分析:1. 理解问题 2. 分析条件 3. 推导答案"
- Few-shot CoT: 提供带推理过程的示例
适用场景:
- 数学推理
- 逻辑推理
- 多步骤问题分析
- 需要解释决策过程
3. System Prompt设计
3.1 角色定义
你是一位资深的Python开发者,专注于代码审查和最佳实践。
你的回答应该:
- 简洁准确
- 包含代码示例
- 指出潜在问题和改进建议
- 遵循PEP 8规范
3.2 行为约束
规则:
1. 只回答与编程相关的问题
2. 如果不确定,明确说明而不是猜测
3. 不要生成有害或不安全的代码
4. 使用中文回答
3.3 System Prompt最佳实践
- 明确角色: 定义专家身份和专业领域
- 设定边界: 明确什么该做、什么不该做
- 指定格式: 定义输出风格和结构
- 优先级: 当规则冲突时,明确优先级
- 保持简洁: 避免过长的System Prompt
4. 模板工程
4.1 模板设计原则
# Python示例:使用模板引擎
from string import Template
prompt_template = Template("""
你是一位$role专家。
背景信息:
$context
用户问题:
$question
请按以下格式回答:
1. 简要回答
2. 详细解释
3. 示例(如果适用)
""")
prompt = prompt_template.substitute(
role="机器学习",
context="用户正在学习深度学习基础",
question="什么是反向传播?"
)
4.2 变量管理
# 使用Jinja2模板
from jinja2 import Template
template = Template("""
分析以下{{ items | length }}条数据:
{% for item in items %}
- {{ item.name }}: {{ item.value }}
{% endfor %}
请提供:
{% if include_summary %}
1. 总结摘要
{% endif %}
2. 关键发现
3. 建议行动
""")
4.3 模板版本化
- 使用Git管理Prompt模板
- 记录每次修改的原因和效果
- 关联评估结果和版本号
- 支持A/B测试不同版本
5. 输出格式控制
5.1 JSON模式
请以JSON格式输出分析结果:
{
"sentiment": "正面/负面/中性",
"confidence": 0.0-1.0,
"keywords": ["关键词1", "关键词2"],
"summary": "一句话总结"
}
注意:只输出JSON,不要添加任何其他文本。
技巧:
- 提供完整的JSON schema示例
- 明确字段类型和取值范围
- 使用"只输出JSON"等约束指令
- 利用API的JSON mode(如OpenAI的
response_format)
5.2 结构化输出
请按以下格式输出:
## 标题
[一行简要标题]
## 关键发现
- 发现1
- 发现2
- 发现3
## 详细分析
[2-3段分析文字]
## 建议
1. 建议1
2. 建议2
5.3 表格输出
请以Markdown表格格式比较以下框架:
| 框架 | 优势 | 劣势 | 适用场景 |
|------|------|------|---------|
6. 温度与采样参数
6.1 Temperature
控制输出的随机性:
| Temperature | 效果 | 适用场景 |
|---|---|---|
| 0.0 | 确定性最高,总是选择最可能的token | 分类、提取、数学计算 |
| 0.3-0.5 | 低随机性,略有变化 | 摘要、翻译 |
| 0.7-0.9 | 中等随机性 | 创意写作、对话 |
| 1.0+ | 高随机性 | 头脑风暴、诗歌创作 |
6.2 Top-p (Nucleus Sampling)
top_p = 0.9 # 从累积概率90%的token池中采样
- top_p = 0.1: 只考虑最可能的少数token → 更确定
- top_p = 0.9: 考虑大部分token → 更多样
- 通常调节temperature或top_p之一即可,不建议同时调节
6.3 其他参数
- max_tokens: 控制输出长度上限
- frequency_penalty: 减少重复(0-2)
- presence_penalty: 鼓励话题多样性(0-2)
- stop sequences: 定义输出终止条件
7. 不同任务的Prompt示例
7.1 文本分类
System: 你是一个文本分类专家。
请将用户的文本分类为以下类别之一:
- 技术问题
- 产品反馈
- 账号问题
- 一般咨询
只输出类别名称,不要添加任何解释。
User: 我的密码忘记了,怎么重置?
7.2 信息提取
从以下文本中提取所有提到的实体,以JSON格式输出:
文本:"{text}"
输出格式:
{
"people": ["姓名列表"],
"organizations": ["组织列表"],
"locations": ["地点列表"],
"dates": ["日期列表"]
}
7.3 代码生成
System: 你是一位高级Python开发者。生成的代码应该:
- 包含类型注解
- 包含docstring
- 处理边界情况
- 遵循PEP 8
请为以下需求编写代码:
{requirement}
输出格式:
1. 代码实现
2. 使用示例
3. 注意事项
7.4 摘要生成
请对以下文章生成摘要:
文章:
{article}
要求:
- 长度:100-150字
- 保留关键数据和结论
- 使用客观的第三人称
- 不要添加原文没有的信息
8. 最佳实践总结
8.1 设计原则
- 明确性: 指令越具体,输出越可控
- 分步骤: 复杂任务拆分为多个步骤
- 给示例: 示例比描述更直观
- 设约束: 明确输出格式、长度、风格
- 迭代优化: Prompt设计是迭代过程
8.2 常见陷阱
- 过于模糊: "写点关于AI的东西" → 输出不可控
- 过于冗长: 指令过多导致模型忽略部分内容
- 矛盾指令: 不同约束之间冲突
- 缺乏格式: 未指定输出格式导致不一致
- 忽略边界: 未考虑异常输入情况
8.3 调试技巧
- 逐步添加/删除指令,观察影响
- 使用多个测试用例验证稳定性
- 记录每次修改及其效果
- 对比不同Temperature设置的输出
- 使用评估框架量化Prompt质量
参考资料
- OpenAI Prompt Engineering Guide
- Anthropic Prompt Engineering Guide
- 高级Prompt技术 — 更高级的Prompt优化方法
- Prompt安全 — Prompt安全与防护