提示词的基本结构与编写原则
掌握了 LLM 的工作原理后,现在让我们学习提示词的基本结构和编写原则。一个好的提示词就像一份好的需求规格书——清晰、完整、无歧义。
提示词的四大组成部分
一个结构完整的提示词通常包含以下四个核心部分:
graph TB
A[完整的提示词结构] --> B[指令
Instruction] A --> C[上下文
Context] A --> D[输入数据
Input Data] A --> E[输出要求
Output Format] B --> B1["告诉模型要做什么
(必须有)"] C --> C1["提供背景信息
(推荐有)"] D --> D1["需要处理的数据
(视任务而定)"] E --> E1["定义输出格式和约束
(强烈推荐)"] style A fill:#ede7f6,stroke:#5e35b1,stroke-width:3px style B fill:#e3f2fd,stroke:#1976d2,stroke-width:3px style C fill:#b3e5fc,stroke:#0277bd,stroke-width:2px style D fill:#fff9c4,stroke:#f9a825,stroke-width:2px style E fill:#c8e6c9,stroke:#43a047,stroke-width:2px
Instruction] A --> C[上下文
Context] A --> D[输入数据
Input Data] A --> E[输出要求
Output Format] B --> B1["告诉模型要做什么
(必须有)"] C --> C1["提供背景信息
(推荐有)"] D --> D1["需要处理的数据
(视任务而定)"] E --> E1["定义输出格式和约束
(强烈推荐)"] style A fill:#ede7f6,stroke:#5e35b1,stroke-width:3px style B fill:#e3f2fd,stroke:#1976d2,stroke-width:3px style C fill:#b3e5fc,stroke:#0277bd,stroke-width:2px style D fill:#fff9c4,stroke:#f9a825,stroke-width:2px style E fill:#c8e6c9,stroke:#43a047,stroke-width:2px
组件详解
1. 指令(Instruction)— 必须有
指令告诉模型要完成什么任务。这是最核心的部分。
❌ 差的指令:
"邮件"
✅ 好的指令:
"请将以下客户投诉邮件翻译成英文,并保持正式的商务语气。"
2. 上下文(Context)— 推荐有
上下文提供背景信息,帮助模型理解任务的语境。
❌ 无上下文:
"写一份报告总结。"
✅ 有上下文:
"我们公司是一家SaaS初创企业,刚完成了Q4的客户满意度调查。
以下是调查的关键数据。请针对管理层撰写一份简洁的分析报告。"
3. 输入数据(Input Data)— 视任务而定
输入数据是需要模型处理的具体内容。
"以下是待分析的数据:
---
客户满意度: 4.2/5.0 (上季度 3.8)
NPS评分: +42 (上季度 +35)
客户流失率: 3.2% (上季度 4.1%)
主要投诉: 响应速度(占38%)、功能缺失(占25%)
---"
4. 输出要求(Output Format)— 强烈推荐
输出要求定义了结果的格式、结构和约束。
"请按照以下格式输出:
1. 执行摘要(不超过100字)
2. 关键指标变化(表格形式)
3. 主要发现(3-5个要点)
4. 改进建议(按优先级排序)"
完整示例
将四个部分组合起来:
prompt = """
【指令】
请分析以下客户满意度数据,生成一份面向管理层的季度报告。
【上下文】
我们是一家B2B SaaS公司,主要产品为项目管理工具。
目标市场是中小型科技团队(10-50人)。
本次数据来自Q4的客户调查,共收到 1,247 份有效回复。
【输入数据】
- 整体满意度: 4.2/5.0(Q3为3.8,环比提升10.5%)
- NPS评分: +42(Q3为+35,提升7个点)
- 客户续约率: 96.8%(Q3为95.9%)
- 主要投诉类别:
1. 客服响应速度 - 38%
2. 功能缺失 - 25%
3. 系统稳定性 - 18%
4. 定价问题 - 12%
5. 其他 - 7%
【输出要求】
请按以下结构输出,使用Markdown格式:
1. **执行摘要**:2-3句话总结(不超过100字)
2. **关键指标**:使用表格对比Q3和Q4数据
3. **主要发现**:3-5个核心洞察
4. **行动建议**:3个优先改进方向,每个包含具体措施
5. **风险提示**:需要关注的潜在问题
语言:中文
语气:专业、数据驱动、简洁
"""
六大编写原则
原则1:明确具体(Be Specific)
这是最重要的原则。模糊的指令导致模糊的输出。
graph LR
subgraph "❌ 模糊"
A1["写个故事"] --> A2["什么主题?
什么风格?
多长?"] end subgraph "✅ 明确" B1["写一个500字的科幻短篇
主角是AI机器人
故事发生在2050年
结局要出人意料"] --> B2["清晰的创作方向
模型能精准执行"] end style A1 fill:#ffcdd2,stroke:#c62828,stroke-width:2px style A2 fill:#ffcdd2,stroke:#c62828,stroke-width:2px style B1 fill:#a5d6a7,stroke:#2e7d32,stroke-width:2px style B2 fill:#a5d6a7,stroke:#2e7d32,stroke-width:3px
什么风格?
多长?"] end subgraph "✅ 明确" B1["写一个500字的科幻短篇
主角是AI机器人
故事发生在2050年
结局要出人意料"] --> B2["清晰的创作方向
模型能精准执行"] end style A1 fill:#ffcdd2,stroke:#c62828,stroke-width:2px style A2 fill:#ffcdd2,stroke:#c62828,stroke-width:2px style B1 fill:#a5d6a7,stroke:#2e7d32,stroke-width:2px style B2 fill:#a5d6a7,stroke:#2e7d32,stroke-width:3px
实践对比:
| 维度 | 模糊提示 | 明确提示 |
|---|---|---|
| 任务 | "总结这篇文章" | "用3个要点总结这篇文章的核心观点,每个要点不超过30字" |
| 语气 | "写得好一点" | "使用正式的学术语气,避免口语化表达" |
| 长度 | "简短一些" | "控制在200字以内" |
| 格式 | "给我一些建议" | "列出5条建议,每条包含标题和一句话说明" |
原则2:提供充分上下文(Provide Context)
LLM 不知道你的背景、偏好和具体情况。你认为"显而易见"的信息,对模型来说可能完全未知。
# ❌ 缺乏上下文
prompt_bad = "帮我改进这个函数的性能"
# ✅ 提供充分上下文
prompt_good = """
帮我改进以下Python函数的性能。
背景信息:
- 这个函数每秒被调用约10,000次
- 输入列表通常包含100-10,000个元素
- 运行环境: Python 3.12, Linux服务器, 16GB内存
- 目前该函数是性能瓶颈,需要降低50%以上的执行时间
当前代码:
```python
def find_duplicates(items: list[str]) -> list[str]:
duplicates = []
for i in range(len(items)):
for j in range(i + 1, len(items)):
if items[i] == items[j] and items[i] not in duplicates:
duplicates.append(items[i])
return duplicates
请提供优化后的代码,并解释优化原理和预期性能提升。 """
### 原则3:使用分隔符(Use Delimiters)
分隔符帮助模型区分提示词的不同部分,特别是区分"指令"和"待处理数据"。
常用分隔符:
~~~
--- 三横线
""" 三引号
### 三井号
=== 三等号
<<< >>> 尖括号
``` 代码围栏
【】 中文方括号
~~~
**实战示例**:
```python
prompt = """
请将以下用户评论分类为"正面"、"负面"或"中性",并给出置信度。
输出格式:JSON
---
评论1: "这个产品太棒了,完全超出预期!客服也很有耐心。"
评论2: "还行吧,中规中矩,没什么特别的。"
评论3: "等了两周才收到货,而且包装破损,太差了。"
评论4: "功能不错但界面需要优化,期待下个版本。"
---
"""
原则4:指定输出格式(Specify Output Format)
明确告诉模型你想要什么格式的输出,可以极大提高结果的可用性。
# ❌ 不指定格式——输出不可预测
prompt_bad = "分析这些销售数据"
# ✅ 指定JSON格式——输出可以直接被程序解析
prompt_good = """
分析以下销售数据并以JSON格式返回分析结果。
JSON结构要求:
{
"summary": "一句话总结",
"total_revenue": 数字,
"top_product": "产品名",
"growth_rate": "百分比字符串",
"insights": ["洞察1", "洞察2", "洞察3"],
"recommendations": [
{
"action": "行动建议",
"priority": "high/medium/low",
"expected_impact": "预期效果"
}
]
}
注意:只返回JSON,不要包含其他文字。
"""
原则5:给出正面指令(Tell What To Do)
告诉模型应该做什么,而不是列出一长串不要做什么。
graph LR
subgraph "❌ 负面指令(效果差)"
A1["不要使用被动语态
不要太长
不要用专业术语
不要遗漏关键信息"] end subgraph "✅ 正面指令(效果好)" B1["使用主动语态
控制在200字以内
用通俗易懂的语言
覆盖所有关键数据点"] end style A1 fill:#ffcdd2,stroke:#c62828,stroke-width:2px style B1 fill:#a5d6a7,stroke:#2e7d32,stroke-width:2px
不要太长
不要用专业术语
不要遗漏关键信息"] end subgraph "✅ 正面指令(效果好)" B1["使用主动语态
控制在200字以内
用通俗易懂的语言
覆盖所有关键数据点"] end style A1 fill:#ffcdd2,stroke:#c62828,stroke-width:2px style B1 fill:#a5d6a7,stroke:#2e7d32,stroke-width:2px
为什么正面指令更好?
- 减少歧义 — "不要太长"到底是多长?"控制在200字"没有歧义
- 减少认知负担 — 模型不需要推理"不做X那应该做什么"
- 提供明确方向 — 正面指令给出了清晰的执行路径
原则6:迭代优化(Iterate and Refine)
没有人能一次写出完美的提示词。提示工程是一个"编写→测试→分析→改进"的循环过程。
graph TB
A[编写初始提示词] --> B[运行测试]
B --> C{输出满足要求?}
C -->|是| D[记录并保存模板]
C -->|否| E[分析问题]
E --> F{问题类型?}
F -->|格式不对| G[增加输出格式约束]
F -->|内容不准| H[增加上下文和示例]
F -->|太长/太短| I[调整长度约束]
F -->|偏离主题| J[强化指令和边界]
G --> A
H --> A
I --> A
J --> A
style A fill:#e3f2fd,stroke:#1976d2,stroke-width:3px
style B fill:#b3e5fc,stroke:#0277bd,stroke-width:2px
style C fill:#ffe0b2,stroke:#e64a19,stroke-width:2px
style D fill:#a5d6a7,stroke:#2e7d32,stroke-width:3px
style E fill:#fff9c4,stroke:#f9a825,stroke-width:2px
迭代示例:
# 版本1:过于简单
v1 = "翻译成英文:今天天气不错"
# 版本2:添加语气要求
v2 = "将以下中文翻译成英文,使用口语化的表达:今天天气不错"
# 版本3:添加输出约束
v3 = """将以下中文翻译成英文。
要求:
- 口语化表达
- 提供2个不同的翻译版本
- 每个版本标注适用场景
原文:今天天气不错"""
# 版本4:添加示例(Golden版本)
v4 = """将以下中文翻译成英文。
要求:
- 口语化表达
- 提供2个不同的翻译版本
- 每个版本标注适用场景
示例:
原文:很高兴认识你
翻译1:Nice to meet you!(正式场合、初次见面)
翻译2:Great to meet you!(轻松场合、热情表达)
原文:今天天气不错"""
常见提示词模式
模式1:角色+任务模式
你是一位 [角色]。
请 [具体任务]。
要求:[约束条件]
---
[输入数据]
模式2:任务+格式+示例模式
任务:[具体任务描述]
输出格式:[期望格式]
示例:
输入:[示例输入]
输出:[示例输出]
---
输入:[实际输入]
模式3:背景+目标+约束模式
背景:[背景信息]
目标:[要达成的目标]
约束:
- [约束1]
- [约束2]
- [约束3]
请开始执行。
模式选择指南
| 模式 | 适用场景 | 复杂度 |
|---|---|---|
| 角色+任务 | 专业领域的咨询和分析 | ⭐⭐ |
| 任务+格式+示例 | 格式化输出、数据处理 | ⭐⭐⭐ |
| 背景+目标+约束 | 复杂的决策和方案设计 | ⭐⭐⭐⭐ |
动手练习
练习1:改进提示词
将以下模糊提示词改写为结构化、明确的提示词:
原始提示词:"帮我写一封辞职信"
改写要求: - 添加角色、上下文、格式和约束 - 考虑语气、长度、结构等因素
参考答案(尝试自己写后再看):
你是一位职业规划顾问,擅长撰写专业的商务信函。
请帮我撰写一封辞职信。
背景信息:
- 我在当前公司(一家互联网公司)工作了3年,职位是产品经理
- 辞职原因是获得了更好的发展机会
- 我希望与公司保持良好关系
要求:
- 语气:专业、感恩、正面
- 长度:300-400字
- 结构:开头说明辞职意向 → 感谢与回顾 → 交接意愿 → 祝福结尾
- 提供离职日期:一个月后
- 不要提及新公司的具体信息
练习2:格式化输出
设计一个提示词,让模型分析一段产品评论并以结构化JSON输出。自行设计JSON结构。
本章要点
- ✅ 完整的提示词包含四部分:指令、上下文、输入数据、输出要求
- ✅ 六大原则:明确具体、提供上下文、使用分隔符、指定格式、正面指令、迭代优化
- ✅ 分隔符能有效区分提示词的不同逻辑区域
- ✅ 告诉模型"做什么"比"不做什么"更有效
- ✅ 提示工程是迭代过程,没有一步到位的完美提示词
- ✅ 三种常用模式适用于不同复杂度的任务
下一步:Zero-shot 与 Few-shot 学习 🚀