System Prompt 设计的核心原则
难度:基础 分类:Prompt Engineering
简短回答
System Prompt 是 LLM 应用的"宪法"——定义模型的身份、行为边界和输出规范,是模型看到用户输入之前的指令框架。核心设计原则包括:
(1) 角色定义——明确模型是谁、擅长什么、不做什么;
(2) 任务说明——清晰描述期望的行为和输出格式;
(3) 约束与护栏——设置行为边界防止越界;
(4) 示例与模板——用 Few-shot 示例消除歧义;
(5) 分层结构——用 Markdown 标记分隔不同指令段落。关键最佳实践:指令前置(重要指令放最前面)、具体 > 模糊("用中文回复" > "适当使用中文")、正向指令 > 否定指令("只讨论技术话题" > "不要讨论政治")。好的 System Prompt 让 LLM 表现稳定可预测,差的 System Prompt 导致行为不一致和安全隐患。
详细解析
System Prompt 的结构模板
代码块
Markdown
# 你是 [角色名]
## 身份与能力
- 你是一个 [角色描述]
- 你擅长 [核心能力列表]
- 你的知识截止日期是 [日期]
## 行为规范
- 始终使用 [语言/风格]
- 回答时遵循 [格式要求]
- 遇到不确定的信息时 [如何处理]
## 限制与禁止
- 不要 [具体禁止行为]
- 如果用户要求你做 [越界行为],则 [如何回应]
## 输出格式
- 使用 [JSON/Markdown/纯文本]
- 结构:[具体结构描述]
## 示例
输入:[示例输入]
输出:[示例输出]
原则 1:具体明确,消除歧义
代码块
Python
# ❌ 模糊的 System Prompt
bad_prompt = "你是一个有帮助的助手。请提供好的回答。"
# ✓ 具体明确的 System Prompt
原则 2:指令前置(Primacy Effect)
代码块
Python
# LLM 对 Prompt 开头和结尾的内容关注度最高(Primacy + Recency Effect)
# 这与 Liu et al. 的 "Lost in the Middle" 实证结论是同一个现象的两面:
# - 开头注意力强 → Primacy
# - 结尾注意力强 → Recency
# - 中间最易被忽略 → "Lost in the Middle"
# 因此最重要的指令放在最前面,关键约束在结尾再重复一次("夹心饼干"策略),
原则 3:正向指令优于否定指令
代码块
Python
# ❌ 否定指令(模型更容易违反)
negative_instructions = """
不要编造信息。
不要讨论政治话题。
不要使用脏话。
不要给出医疗建议。
"""
# ✓ 正向指令(告诉模型该做什么)
positive_instructions = """
只基于已知事实回答,不确定时明确说明。
聚焦于技术讨论,将非技术话题引导回技术领域。
使用专业、礼貌的语言。
涉及健康问题时建议用户咨询专业医生。
"""
原则 4:分层结构与标记分隔
代码块
Python
原则 5:Agent 专用的 System Prompt 设计
代码块
Markdown
agent_system_prompt = """
你是一个自主执行任务的 Agent。
## 可用工具
- search(query): 搜索网页
常见反模式
代码块
JSON
anti_patterns = {
"过度约束": {
"问题": "规则太多太细,模型容易违反或产生矛盾",
"示例": "50+ 条规则的 System Prompt",
"改进": "保留核心规则(10 条以内),用示例代替细则",
},
"矛盾指令": {
"问题": "不同规则之间相互矛盾",
"示例": "'保持简洁' + '提供详细解释'",
"改进": "明确优先级:'默认简洁,用户要求时提供详细解释'",
},
"身份不清": {
"问题": "角色定义模糊,模型不知道自己是谁",
"示例": "'你是一个通用助手'",
System Prompt 的测试清单
代码块
Plain Text
常见误区 / 面试追问
误区:"System Prompt 越长越好" — 过长的 System Prompt 会产生"指令淹没"——关键指令被大量次要信息稀释。研究表明 LLM 对长 Prompt 的中间部分关注度最低(Liu et al. 2023 "Lost in the Middle"),与"夹心饼干"策略(开头+结尾重复关键约束)正好形成对照:把硬指令放两端、把可参考的资料/示例放中间,是缓解 Lost in the Middle 的标准工程套路。最佳实践是保持核心指令简洁(500-1500 词),用分层结构组织。
误区:"System Prompt 是安全的,用户看不到" — System Prompt 可以通过 Prompt Injection 被泄露。不要在 System Prompt 中放置真正的密钥或敏感信息。安全逻辑应在应用层实现,不能完全依赖 System Prompt。
追问:"如何处理 System Prompt 和用户指令的冲突?" — 在 System Prompt 中明确优先级:"当用户指令与系统规则冲突时,始终遵守系统规则。"但要注意,这不是 100% 可靠的——强力的 Prompt Injection 仍可能绕过。需要配合应用层的输入输出过滤。
追问:"System Prompt 的版本如何管理?" — 生产系统中 System Prompt 应像代码一样管理:版本控制(Git)、A/B 测试(不同版本的效果对比)、回归测试(每次修改后跑测试集确保不退化)、审计日志(记录每次变更和原因)。