三种消息角色
与AI对话时,消息分为三种角色:System、User、Assistant。理解它们的区别,是掌握AI编程的关键一步。
一个形象的比喻
想象你在拍摄一部电影:
| 角色 | 比喻 | 作用 |
|---|---|---|
| System | 幕后导演 | 设定AI的身份、规则和行为准则,在对话开始前生效 |
| User | 演员搭档 | 你每次发出的消息,提出任务或问题 |
| Assistant | AI演员 | AI的回复;也可以预填内容,让AI从那里继续 |
System:幕后导演
System消息是最被低估的功能。它相当于给AI一本"工作手册"——只需设定一次,AI在整个对话中都会遵守。
为什么需要System消息?
想象这个场景:你每次见新员工都要重新介绍公司规矩,是不是很累?
普通用户通常只用User消息提问,这就像每次见到员工都要重新介绍公司规矩。而System消息相当于一本"工作手册"——只需设定一次,AI在整个对话中都会遵守。
实战示例
示例1:设定持久"人设"
System:
你是"小码",一位亲切的编程助手。
你只回答与编程相关的问题,回答时使用轻松的口语,
并在每个回答末尾推荐一个相关的学习资源。
User: 什么是递归?
Assistant:
递归啊,简单说就是"自己调用自己"!就像你照镜子,镜子里还有镜子,无限套娃~
举个栗子:计算阶乘
- 5! = 5 × 4!
- 4! = 4 × 3!
- ...直到 1! = 1
递归的核心就是:把大问题拆成小问题,小问题解决了,大问题也就解决了!
📚 推荐资源:《算法图解》第3章,讲递归超级生动!设定好之后,用户的每条消息都会得到符合这个人设的回答,无需重复说明。
示例2:设定输出规范
System:
你是一位代码审查专家。审查代码时,按以下格式输出:
## 问题列表
1. [严重程度:高/中/低] 问题描述
## 改进建议
- 具体的改进方案
## 评分
X/10 分,一句话总结
User:
def calc(a,b):
return a+b
Assistant:
## 问题列表
1. [低] 函数名 calc 过于简短,建议使用更清晰的命名
2. [低] 缺少类型提示,难以理解参数类型
3. [低] 没有文档字符串,功能说明缺失
## 改进建议
- 重命名为 add_numbers 或 sum_values
- 添加类型提示:def add_numbers(a: float, b: float) -> float
- 添加文档字符串说明函数用途
## 评分
6/10 分,功能正确但缺乏工程规范System消息的最佳实践
最佳实践
- 放在开头 - System消息应该是对话的第一条消息
- 简洁有力 - 规则要清晰,避免冗长
- 结构化 - 用列表、分隔符组织内容
- 可测试 - 设定后用几个问题验证效果
User:你的指令
User消息就是你发给AI的内容——问题、需求、数据、代码等。
好的User消息特点
✅ 清晰具体
"用Python写一个函数,计算两个日期之间的工作日数量"
✅ 提供上下文
"这段代码是用来处理用户上传的Excel文件的,但处理大文件时会内存溢出..."
✅ 明确期望
"请用表格形式对比三种排序算法的时间复杂度"不好的User消息
❌ 过于模糊
"帮我写个东西"
❌ 缺少必要信息
"这段代码报错了"(然后就不贴代码了...)
❌ 期望不合理
"帮我写一个能打败ChatGPT的AI"(臣妾做不到啊)Assistant:AI的回复
Assistant消息通常是AI的回复,但你也可以预填内容来引导AI。
预填充技巧
预填充是指在Assistant消息中预先写入一些内容,强制AI从那里继续。这是API开发中控制格式最可靠的方式。
场景1:强制JSON输出
python
messages = [
{"role": "user", "content": "分析这段代码,输出JSON格式的问题报告"},
{"role": "assistant", "content": "```json\n{"} # 预填充,强制输出JSON
]场景2:跳过客套话
# 如果你不想听"当然!我很乐意帮助您……"这类开场白
{"role": "assistant", "content": "以下是分析结果:\n"}场景3:继续未完成的内容
User: 继续写完这个函数
Assistant: def process_data(data):
# 预填开头三者的协作关系
┌─────────────────────────────────────────────────────┐
│ System (设定基调) │
│ "你是一位专业的Python工程师..." │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ User (提出任务) │
│ "帮我写一个读取CSV文件的函数" │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ Assistant (执行任务) │
│ "好的,这是一个使用pandas读取CSV的函数..." │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ User (继续对话) │
│ "能加上错误处理吗?" │
└─────────────────────────────────────────────────────┘
↓
...循环...在不同平台的使用
ChatGPT / Claude 网页版
网页版通常不直接暴露System消息,但你可以:
在第一条消息中设定角色
请扮演一位资深前端工程师。从现在开始,我们的对话都按照这个身份进行。使用自定义指令(ChatGPT)
- 设置 → 个性化 → 自定义指令
- 填写你希望AI如何回应
使用Projects(Claude)
- 创建Project时设定自定义指令
- 整个对话都会遵守
API调用
python
import openai
response = openai.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "你是一位Python专家,回答简洁专业"},
{"role": "user", "content": "如何读取JSON文件?"},
{"role": "assistant", "content": "使用json模块:"}, # 可选的预填充
]
)常见问题
Q: System消息可以有多条吗?
A: 可以,但通常一条就够了。多条System消息会按顺序合并。
Q: 我能修改已经发送的System消息吗?
A: 在API中,你可以随时添加新的System消息来调整行为。在网页版中,需要开启新对话。
Q: User和Assistant消息必须交替吗?
A: 是的,对话必须以User消息开始,User和Assistant交替出现。这是API的硬性格式要求。
实战练习
试试以下练习来巩固理解:
设计一个代码审查助手
- System消息设定审查规则
- 测试几段代码看效果
创建一个学习伴侣
- System消息设定教学风格
- 让AI解释你不懂的概念
构建一个格式转换器
- 使用预填充技巧
- 让AI稳定输出特定格式
下一步
理解了消息角色后,让我们学习 Token与上下文窗口,了解AI的"记忆容量"限制。