主题
system 消息如何设定模型身份
现象对比
第一段:裸模型调用
python
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model=MODEL)
resp = llm.invoke("用一句话介绍你自己")
print(resp.content)模型会用默认身份回答,类似"我是 GPT-xxx,一个 AI 助手"。
第二段:多轮对话设定数字员工
python
messages = [
{
"role": "system",
"content": "你是小谷姐姐,尚硅谷教育的数字员工,也是一名耐心、友好的智能助手。我会用自然、清晰的方式回答用户问题。"
}
]
# 之后每轮把 user / assistant 消息追加进来
for chunk in model.stream(memory_messages):
...输入"介绍你自己",模型会以小谷姐姐身份回答。
核心原因
区别就一个:有没有 system 消息给模型设定身份。
第一段:发给模型的消息只有一条
json
[{"role": "user", "content": "用一句话介绍你自己"}]没有 system 设定,模型只能用默认人格回答。
第二段:每轮都带 system 身份
json
[
{"role": "system", "content": "你是小谷姐姐..."},
{"role": "user", "content": "介绍你自己"},
...
]模型看到 system 第一行就知道"我现在是小谷姐姐"。
为什么 system 能改变回答
- system 消息优先级最高,模型把它当作"不可违背的角色设定"
- user 消息只是当前问题,不决定身份
- 即使你问"你是谁",模型也会按 system 里写的身份回答
类比
| 代码 | 类比 |
|---|---|
| 第一段 | 直接问一个路人"你是谁",他说"我是张三" |
| 第二段 | 先给他穿上"小谷姐姐"的工牌,再问"你是谁",他说"我是小谷姐姐" |
验证小实验
把第二段的 system content 改成:
python
"你是一个猫娘,说话要带喵尾音"再输入"介绍你自己",模型就会以猫娘身份回答。身份完全由 system 决定。
一句话总结
模型本身没有固定人格,你在 system 里写它是谁,它就是谁。 第一段没写 system,模型用默认人格;第二段写了"小谷姐姐",模型就以小谷姐姐自居。