Skip to content

三种消息角色

与AI对话时,消息分为三种角色:SystemUserAssistant。理解它们的区别,是掌握AI编程的关键一步。

一个形象的比喻

想象你在拍摄一部电影:

角色比喻作用
System幕后导演设定AI的身份、规则和行为准则,在对话开始前生效
User演员搭档你每次发出的消息,提出任务或问题
AssistantAI演员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消息的最佳实践

最佳实践

  1. 放在开头 - System消息应该是对话的第一条消息
  2. 简洁有力 - 规则要清晰,避免冗长
  3. 结构化 - 用列表、分隔符组织内容
  4. 可测试 - 设定后用几个问题验证效果

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消息,但你可以:

  1. 在第一条消息中设定角色

    请扮演一位资深前端工程师。从现在开始,我们的对话都按照这个身份进行。
  2. 使用自定义指令(ChatGPT)

    • 设置 → 个性化 → 自定义指令
    • 填写你希望AI如何回应
  3. 使用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的硬性格式要求。

实战练习

试试以下练习来巩固理解:

  1. 设计一个代码审查助手

    • System消息设定审查规则
    • 测试几段代码看效果
  2. 创建一个学习伴侣

    • System消息设定教学风格
    • 让AI解释你不懂的概念
  3. 构建一个格式转换器

    • 使用预填充技巧
    • 让AI稳定输出特定格式

下一步

理解了消息角色后,让我们学习 Token与上下文窗口,了解AI的"记忆容量"限制。