一句话定义
消息角色(Role)是对话接口里贴在每条消息上的身份标签,用来说明「这句话是谁说的、以什么身份说的」——通常是 system、user、assistant、tool 四选一。
为什么需要它
大模型本身没有记忆。每次调用,你都要把整段对话历史重新发一遍,模型读完再预测下一句。如果把历史拍平成一段纯文本,模型就分不清哪句是用户说的、哪句是自己上一轮答的,用户随便来一句「你刚才明明答应了」就可能被带跑。角色标签相当于给对话分了声道:内容一样,但来源清清楚楚。
打个比方:多轮对话像一份会议纪要,每条记录前面都挂着发言人的名牌。模型看到的不是一大段字,而是一列「带名牌的条目」,于是它知道接下来该轮到自己(assistant)说话了。
四个常见取值大致是这样分工的:
| 角色 | 谁在说话 | 典型内容 |
|---|---|---|
| system | 调用方 / 开发者 | 人设、规则、输出格式、可用工具清单 |
| user | 终端用户 | 提问、指令、粘贴进来的材料 |
| assistant | 模型自己 | 上一轮回复,以及发起工具调用的请求 |
| tool | 外部程序 | 函数或接口执行后返回的结果 |
tool 这一项值得多说一句。模型说「我要查一下天气」,这不是给人看的回答,而是一个结构化的调用请求,它同样以 assistant 的身份发出;真正执行的是外部程序,结果再以 tool 角色回填进对话,模型接着往下写。整个链路里,每个环节都有名牌,模型才知道「这条数据不是我编的,是工具给的」。
和相邻概念的区别
角色不等于人格(persona)。在 system 里写「你是一位资深律师」是设定人设,而角色标签本身只负责区分来源,两者常一起出现,但不是一回事。
角色也不等于微调(fine-tuning)。它只是推理时输入内容的一部分,不进模型权重,改一句话就立刻生效,也能按请求随时换掉。
system 更不等于永久记忆。它只是这次请求里排在最前面的一条普通消息,这次发、这次有效,下次不带就没有了。
对从业者意味着什么
第一,别把用户粘贴的文本塞进 system 里,那等于把外来内容提级成「系统指令」,是提示注入(prompt injection)最常见的入口。第二,前端拼历史记录时不要图省事丢掉 role 字段,那会直接改变模型对上下文的理解。第三,长对话需要裁剪时,system 一般保留,中间轮次可以按需丢弃。
具体字段名和各家支持的取值,以官方 API 文档为准,不同平台的写法并不完全一致。
