在大模型的 API 调用中,System Prompt、User Prompt 和 Assistant Prompt的区别
在大模型(如 OpenAI 的 GPT-4、Anthropic 的 Claude 等)的 API 调用中,目前的标准交互格式是基于角色(Role-based)的消息列表。
为了让大模型更好地理解对话的语境,API 将输入划分为了三种不同的角色提示词:System Prompt(系统提示词)、User Prompt(用户提示词) 和 Assistant Prompt(助手提示词)。
它们的核心区别在于作用、权重和代表的身份。以下是详细的解析:
1. System Prompt(系统提示词)
- 身份:全局设定者 / 导演。
- 作用:用于设定 AI 的人设、背景、核心规则、语气以及输出格式。它是整个对话的基调,通常放在消息列表的第一位。
- 模型权重:通常拥有最高的指令权重。模型会优先遵循 System Prompt 中的规则,即使后面的 User Prompt 试图引导它违背这些规则(防越狱)。
- 生活类比:就像电影开拍前,导演对演员说:“你现在扮演一个脾气暴躁的资深程序员,不管别人问什么,你都要先用嘲讽的语气反问,然后再给出专业的 Python 代码,绝对不能说废话。”
- 常见用法:
- 设定角色:“你是一个资深的法律顾问...”
- 规定格式:“所有的回答必须以 JSON 格式输出...”
- 设定边界:“禁止回答任何涉及医疗诊断的问题...”
2. User Prompt(用户提示词)
- 身份:最终用户 / 提问者。
- 作用:代表人类用户向 AI 提出的具体问题、任务指令或提供的输入文本。这是推动对话前进的核心动力。
- 模型权重:代表当前需要解决的即时任务。模型会根据 System 设定的规则,来处理 User 提供的内容。
- 生活类比:就像电影中与演员(AI)对戏的另一个人,他提出具体的台词或动作:“请帮我看看这段代码哪里报错了?”
- 常见用法:
- 提问:“量子力学是什么?”
- 下达具体任务:“帮我把下面这段英文翻译成中文:[文本]”
3. Assistant Prompt(助手提示词)
- 身份:大模型自己 / AI 助手。
- 作用:代表 AI 过去的回答。主要用于构建历史对话上下文(Memory),或者用于提供示例(Few-Shot Prompting)以引导 AI 接下来的输出。
- 模型权重:它让模型知道“我之前是怎么回答的”。模型会为了保持前后一致性,模仿 Assistant Prompt 里的语气和逻辑继续回答。
- 生活类比:演员(AI)回忆自己前几场戏是怎么演的,以确保现在的表演在情绪和逻辑上是连贯的。
- 常见用法:
- 携带多轮对话历史:让 AI 记住上下文,比如上一轮用户问“北京天气”,这轮问“那上海呢?”,AI 根据历史知道你在问上海的天气。
- 少样本提示(Few-Shot):人为地伪造一段对话历史,教 AI 如何回答。
💡 API 调用代码示例(以 OpenAI 为例)
通过下面这个 JSON 消息列表(Message Array),可以清晰看到三者的协作配合:
python
messages = [
# 1. System: 设定整体规则
{"role": "system", "content": "你是一个只懂用文言文回答问题的历史学者。"},
# --- 下面是 Few-Shot(少样本提示)的用法 ---
{"role": "user", "content": "苹果是什么?"},
{"role": "assistant", "content": "此乃西洋之果,甘甜多汁,红如朱砂。"}, # 伪造的AI回答,作为示范
# --- 下面是真实的当前请求 ---
{"role": "user", "content": "手机是什么?"} # 2. User: 提出当前问题
]
# 3. 最终大模型生成的回答(也是 Assistant 角色):
# "此乃千里传音之奇物,方寸之间,可连通四海。"
总结对比表
| 维度 | System Prompt (系统) | User Prompt (用户) | Assistant Prompt (助手) |
|---|---|---|---|
| API Role 参数 | "role": "system" |
"role": "user" |
"role": "assistant" |
| 核心功能 | 设定全局角色、规则、约束和格式。 | 提出具体的任务、问题或输入内容。 | 提供上下文记忆,或作为回答的模板/示例。 |
| 出现位置 | 通常只在对话列表的最开始出现一次。 | 在对话中频繁出现,通常是最后一条消息。 | 在多轮对话中与 User 交替出现。 |
| 决定了什么 | AI “是谁” 以及 “怎么做”。 | AI “现在需要做什么”。 | AI “之前做了什么” 以及 “保持什么风格”。 |
高级技巧(Prefilling):
在某些大模型 API(如 Anthropic Claude)中,你可以通过在最后人为传入一个未完成的 Assistant Prompt 来强制规定输出的开头。
例如,用户问了问题后,你加一条 {"role": "assistant", "content": "{\n \"result\":"},模型就会被强制顺着这个开头,直接输出纯净的 JSON 格式,而不会带上“好的,这是你的JSON”等废话。