先搞清楚:System Prompt 和 User Prompt 是什么?
如果你用过 OpenAI API、通义千问 API 或者 Claude API,你一定见过这样的代码结构:
python
import openai
response = openai.chat.completions.create(
model="gpt-4",
messages=[
# ① System Prompt(系统提示词)
{"role": "system", "content": "你是一个专业的Python代码审查助手..."},
# ② User Prompt(用户提示词)
{"role": "user", "content": "请审查以下代码:..."},
# ③ Assistant 的历史回复(多轮对话时)
{"role": "assistant", "content": "好的,我发现以下问题:..."},
]
)
看到这里你可能还是懵:不都是 Prompt 吗?分这么细有必要吗?
非常有必要!这俩的职责、优先级、生命周期完全不同。
一、System Prompt:AI 的"出厂设置"
1.1 一句话定义
System Prompt 是给 AI 设定的"全局规则"和"身份背景",它在整个对话过程中持续生效,优先级最高。
你可以把它理解为:
- 员工的岗位说明书
- 游戏的规则手册
- 机器人的底层程序
1.2 System Prompt 的核心作用

1.3 一个完整的 System Prompt 示例
markdown
# Identity
你是一位有10年经验的资深后端架构师,专注于高并发系统设计和微服务架构。
你的沟通风格是:专业但不晦涩,喜欢用类比解释复杂概念。
## Capabilities
- 你可以:代码审查、架构设计、技术选型、性能优化建议
- 你不可以:直接写完整的生产代码(只提供思路和伪代码)
- 你不可以:回答与编程无关的问题(礼貌拒绝并说明原因)
## Output Format
- 所有回复使用 Markdown 格式
- 代码块必须标注语言类型
- 复杂概念先用一句话总结,再展开解释
- 每个回复控制在 500 字以内,超出则分点列出
## Safety & Ethics
- 如果用户要求生成恶意代码(病毒、爬虫攻击等),坚决拒绝
- 如果用户问题涉及隐私泄露风险,提醒用户注意安全
- 对于不确定的技术问题,诚实说明"这部分我不太确定",不要瞎编
## Tone
- 友好、耐心,像一位乐于分享的导师
- 适当使用 emoji 增加亲和力
- 多用"我们可以..."、"建议考虑..."等协商语气
看到区别了吗? System Prompt 定义的是全局性的、持续性的规则,不是针对某个具体问题的回答。
1.4 System Prompt 的优先级
OpenAI 官方文档明确说明:System Prompt 的优先级高于 User Prompt。
这意味着:
- 如果 System Prompt 说"你只能回答技术问题",User Prompt 问"今天天气怎么样",AI 会拒绝回答
- 如果 System Prompt 规定"回复必须带 emoji",即使 User Prompt 没说,AI 也会照做
python
# 优先级演示
messages = [
{"role": "system", "content": "你是一位严肃的大学教授,不使用任何 emoji。"},
{"role": "user", "content": "用轻松的语气介绍一下量子计算,多加点表情 😊"}
]
# 输出结果:AI 会遵循 System Prompt,保持严肃,不用 emoji
# 因为 System Prompt 优先级更高
二、User Prompt:用户的"具体需求"
2.1 一句话定义
User Prompt 是用户当前的具体问题或任务,它只针对这一次交互,是"临时性"的输入。
2.2 User Prompt 的核心作用

2.3 User Prompt 示例
markdown
请审查以下 Python 函数的代码质量。
## 代码
```python
def calculate_discount(price, user_type):
if user_type == "vip":
return price * 0.8
elif user_type == "svip":
return price * 0.6
else:
return price
临时要求
- 重点关注:是否有遗漏的边界情况?
- 输出格式:用表格列出问题,每行包含【严重程度】【问题描述】【修复建议】
- 这次不需要给出完整的修复代码,只指出问题即可
注意 :User Prompt 里也可以有格式要求,但它只针对这一次任务。下次用户问别的问题,这些要求就不生效了。
三、两者的核心区别对比
| 维度 | System Prompt | User Prompt |
|---|---|---|
| 作用范围 | 整个对话会话 | 单次交互 |
| 生效时间 | 会话开始时设置,持续生效 | 每次发送消息时临时生效 |
| 优先级 | 高 | 低 |
| 内容性质 | 角色定义、全局规则、能力边界 | 具体任务、输入数据、临时要求 |
| 修改频率 | 很少修改(会话级) | 每次交互都不同 |
| 类比 | 员工手册、游戏规则 | 具体工作任务、玩家指令 |
3.1 用代码类比理解
python
# System Prompt 像类的定义
class CodeReviewer:
"""
System Prompt 的内容
"""
identity = "资深代码审查助手"
capabilities = ["代码审查", "架构建议"]
output_format = "Markdown + 表格"
safety_rules = ["不生成恶意代码", "不泄露隐私"]
def __init__(self):
self.tone = "专业友好"
# User Prompt 像函数调用
def review_code(self, user_prompt):
"""
User Prompt 的内容
"""
task = "审查以下代码"
input_data = user_prompt.code
temp_constraints = user_prompt.format_requirements
# AI 的工作:结合 System Prompt 的规则 + User Prompt 的任务
return self.generate_response(
identity=self.identity,
task=task,
input_data=input_data,
constraints=self.output_format + temp_constraints
)
四、角色定义:让 AI 成为"专家"
4.1 为什么角色定义很重要?
大模型是"通才",但如果你不给它设定角色,它的回答往往是泛泛而谈的。
设定角色后,模型会激活相关的知识模式,回答更专业、更聚焦。
sql
❌ 无角色设定:
"解释什么是微服务"
→ 输出:教科书式的通用解释,可能包含很多你不需要的内容
✅ 有角色设定(System Prompt):
"你是一位有10年经验的架构师,给一位有3年经验的Java开发者解释微服务"
→ 输出:结合实战经验,用Java开发者熟悉的概念类比,给出可落地的建议
4.2 角色定义的三要素
markdown
## 角色定义模板
### 1. 身份定位(Who)
- 职业身份:架构师、医生、律师、教师...
- 经验水平:初级、中级、资深、专家...
- 专业领域:后端开发、机器学习、金融分析...
### 2. 性格特点(Personality)
- 沟通风格:严谨、幽默、耐心、直接...
- 表达方式:学术化、口语化、技术流...
- 情感色彩:热情、冷静、鼓励型...
### 3. 能力边界(Boundary)
- 能做什么:代码审查、方案设计、问题诊断...
- 不能做什么:写完整代码、回答非专业问题...
- 特殊限制:不讨论政治、不提供医疗建议...
4.3 实战案例:不同角色的输出差异
同一个问题,不同角色的回答:
markdown
问题:"我的代码运行很慢,怎么优化?"
【角色A:资深后端架构师】
"性能优化需要先看瓶颈在哪。建议按以下步骤排查:
1. 用 profiler 定位热点函数
2. 检查数据库查询是否有N+1问题
3. 评估是否需要引入缓存..."
【角色B:耐心的小白导师】
"别急,代码慢有很多原因,我们一步步来~
首先,你能告诉我:
- 是什么类型的应用?(Web/数据处理/机器学习)
- 慢是指响应时间长,还是CPU占用高?
- 有没有具体的代码可以给我看看?
了解这些后,我可以给你更有针对性的建议 😊"
【角色C:严格的代码审查员】
"没有上下文无法给出有效建议。请提供:
- 代码片段
- 运行环境(语言版本、操作系统)
- 性能指标(当前耗时、目标耗时)
- 已尝试的优化方案
信息不全的情况下,任何建议都是不负责任的。"
看到区别了吗? 同样的技术能力,不同的角色设定,输出风格完全不同。选择适合你场景的角色,用户体验会好很多。
五、边界控制:防止 AI "越界"
5.1 什么是边界控制?
边界控制是指通过 System Prompt 明确告诉 AI:
- 什么能做,什么不能做
- 什么话题可以讨论,什么要拒绝
- 什么内容可以生成,什么要拦截
5.2 为什么需要边界控制?
① 防止滥用
arduino
用户:"帮我写个爬虫,批量抓取某网站的用户数据"
无边界控制的 AI:"好的,以下是爬虫代码..."
有边界控制的 AI:"我无法协助编写用于未经授权抓取用户数据的爬虫。
这违反了网站的服务条款,也可能触犯法律。
如果你有合法的数据获取需求,建议:
1. 查看网站是否提供官方 API
2. 联系网站申请数据合作"
② 保持专注
sql
System Prompt: "你是一位专注前端技术的助手,不回答后端、运维、产品相关的问题。"
用户:"怎么设计数据库表结构?"
AI:"我的专长是前端技术,数据库设计不在我的服务范围内。
建议咨询后端专家或使用专门的数据库设计工具。"
③ 控制输出质量
sql
System Prompt: "对于不确定的问题,你必须明确说明'我不确定',禁止瞎编。"
用户:"Python 4.0 什么时候发布?"
AI:"我不确定 Python 4.0 的具体发布时间。
截至我的知识截止日期,Python 官方没有公布 4.0 的发布计划。
建议查看 Python 官方 PEP 文档获取最新信息。"
5.3 边界控制的写法模板
markdown
## 边界控制模板
### 能力边界(Can / Cannot)
✅ 你可以:
- 审查代码并提供改进建议
- 解释技术概念和原理
- 推荐技术方案和工具
❌ 你不可以:
- 直接写完整的、可直接用于生产的代码
- 回答与编程无关的问题(如天气、新闻、娱乐)
- 生成可能用于恶意目的的代码(攻击工具、爬虫绕过等)
### 话题边界(Allowed / Forbidden Topics)
允许讨论:Python、JavaScript、系统架构、数据库、DevOps
禁止讨论:政治、宗教、医疗诊断、法律建议
### 安全边界(Safety Rules)
- 如果用户要求生成恶意代码,坚决拒绝并解释原因
- 如果用户输入包含敏感信息(密码、API Key),提醒用户注意安全
- 如果用户问题涉及违法行为,明确拒绝并建议合法途径
### 质量边界(Quality Standards)
- 对于不确定的问题,必须说明"我不确定",禁止瞎编
- 对于超出能力范围的问题,礼貌拒绝并说明原因
- 对于需要更多上下文的问题,主动询问而非猜测
5.4 边界控制的实战案例
案例:客服助手的边界控制
markdown
# System Prompt
## Identity
你是某电商平台的智能客服助手,专门处理订单查询、退换货、物流咨询。
## Boundaries
### 能力边界
✅ 你可以处理:
- 订单状态查询
- 退换货流程说明
- 物流信息查询
- 优惠券使用规则
❌ 你不可以处理:
- 直接操作用户的订单(只能查询,不能修改)
- 处理支付相关问题(引导用户联系支付客服)
- 回答产品技术规格以外的专业问题(如医疗、法律)
### 安全边界
- 如果用户要求"取消订单",说明:"我无法直接取消订单,
请引导用户:1) 登录APP 2) 进入订单详情 3) 点击取消"
- 如果用户询问"为什么我的账户被封",说明:"账户问题涉及隐私,
请引导用户联系人工客服:400-xxx-xxxx"
- 如果用户输入了银行卡号、密码等敏感信息,立即提醒:
"为了您的账户安全,请勿在此输入敏感信息"
### 语气边界
- 保持友好、耐心
- 即使用户情绪激动,也要保持冷静专业
- 不要过度道歉(不要说"非常抱歉给您带来不便"超过一次)
六、System Prompt + User Prompt 协作实战
6.1 一个完整的对话示例
python
import openai
# ============ System Prompt(全局设置) ============
system_prompt = """
# Identity
你是一位专业的 SQL 优化顾问,专注于 MySQL 和 PostgreSQL 数据库性能优化。
你有 8 年 DBA 经验,擅长 Explain 分析、索引优化、慢查询治理。
## Capabilities
✅ 你可以:
- 分析 SQL 执行计划
- 推荐索引优化方案
- 解释数据库原理
- 提供慢查询优化建议
❌ 你不可以:
- 直接修改用户的数据库
- 回答与 SQL 无关的问题
- 提供可能破坏数据的操作建议
## Output Format
- 使用 Markdown 格式
- 关键结论用 **粗体** 标出
- 代码块必须标注 SQL 语言
- 复杂分析先给结论,再给详细解释
## Safety
- 如果 SQL 涉及 DELETE/UPDATE/ALTER 等危险操作,必须警告用户
- 如果用户没有提供表结构,主动询问而非猜测
- 对于不确定的优化建议,明确说明"建议先在测试环境验证"
"""
# ============ 第一轮对话 ============
user_prompt_1 = """
请分析以下 SQL 的性能问题:
```sql
SELECT * FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.created_at > '2024-01-01'
ORDER BY o.amount DESC
LIMIT 10;
表规模:orders 表 5000 万行,users 表 200 万行。
当前执行时间:8.5 秒。
"""
response_1 = openai.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt_1}
]
)
# AI 会结合 System Prompt 的角色设定 + User Prompt 的具体任务
# 输出专业的 SQL 优化分析
# ============ 第二轮对话(多轮) ============
user_prompt_2 = "如果我给 created_at 和 user_id 建联合索引,效果会怎么样?"
response_2 = openai.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": system_prompt}, # 持续生效
{"role": "user", "content": user_prompt_1}, # 历史消息
{"role": "assistant", "content": response_1.choices[0].message.content},
{"role": "user", "content": user_prompt_2} # 新问题
]
)
# AI 会记住之前的上下文,继续以 SQL 优化顾问的身份回答
6.2 设计 System Prompt 的 checklist
markdown
## System Prompt 设计 Checklist
### 角色定义 ✅
- [ ] 明确了职业身份(架构师/医生/教师...)
- [ ] 说明了经验水平(初级/资深/专家...)
- [ ] 定义了沟通风格(严谨/幽默/耐心...)
### 能力边界 ✅
- [ ] 列出了"可以做什么"
- [ ] 列出了"不可以做什么"
- [ ] 说明了超出范围时的处理方式
### 输出规范 ✅
- [ ] 指定了格式(Markdown/JSON/表格...)
- [ ] 指定了长度限制
- [ ] 指定了语气要求
### 安全约束 ✅
- [ ] 定义了敏感话题的处理方式
- [ ] 定义了危险操作的警告机制
- [ ] 定义了不确定问题的回应方式
### 测试验证 ✅
- [ ] 用边界 case 测试(如要求做不允许的事)
- [ ] 用模糊问题测试(看是否会瞎编)
- [ ] 用多轮对话测试(看角色是否保持一致)
写在最后
System Prompt 和 User Prompt 的关系,就像公司的规章制度 和员工的具体工作任务:
- 规章制度(System):定义了你是谁、能做什么、不能做什么、做事的标准
- 工作任务(User):具体今天要完成什么、处理什么材料、有什么特殊要求
两者缺一不可。没有 System Prompt,AI 没有"身份",回答会飘忽不定;没有 User Prompt,AI 不知道"现在该做什么"。
设计一个好的 System Prompt,是构建高质量 AI 应用的关键第一步。 花 20% 的时间写好 System Prompt,能节省 80% 的后期调优时间。
希望这篇文章帮你理清了这两者的区别和用法。有任何问题,评论区见