{"role": "user", "content": query}是 OpenAI / 大模型 chat 接口的标准消息格式,告诉模型"这是来自用户的一条消息,内容是 query 变量里的字符串"。
拆开看
python
{
"role": "user", # ← 谁说的
"content": query # ← 说了啥
}
| 字段 | 含义 |
|---|---|
role |
消息发送者的身份角色,固定枚举值 |
content |
消息的实际文本内容(也支持图片、工具结果等结构化内容) |
role 的四种合法值
role |
谁说的 | 示例 |
|---|---|---|
system |
系统/开发者,给模型设定身份和规则 | "你是一个写代码的助手" |
user |
用户输入 | "帮我写一个排序函数" |
assistant |
模型自己之前说过的话 | "好的,下面是代码..." |
tool |
工具执行的返回结果 | "ls 命令输出: file1.txt" |
具体场景
看主循环这段:
python
while True:
query = input("\033[36m >> \033[0m") # 用户在终端输入
...
history.append({"role": "user", "content": query}) # ← 把用户输入封装成"用户消息"
agent_loop(history) # 把整个历史传给模型
为什么要包成这个结构?因为模型 API 不接受裸字符串,它要的是一个消息列表,每条消息都必须标注角色:
python
history = [
{"role": "user", "content": "看下当前目录有啥"},
{"role": "assistant", "content": "", "tool_calls": [...]}, # 模型决定调 bash
{"role": "tool", "tool_call_id": "...", "content": "file1.txt"}, # bash 返回
{"role": "assistant", "content": "目录里有 file1.txt"}, # 模型最终回答
{"role": "user", "content": "再看下文件大小"}, # ← 你下一次输入
]
模型拿到这个列表,就能"看懂"整段对话上下文。
为什么需要 role 这个字段?
- 区分发言人:不告诉模型"这是你之前说的"还是"用户新说的",模型会混乱
- 训练时就这么对齐 :模型在训练阶段看到的就是
role + content的格式,推理时必须保持一致 - 支持多轮对话 :通过滚动追加
role: user/role: assistant形成上下文
一句话
{"role": "user", "content": query}= "这条消息是用户说的,内容是 query 这个字符串",是大模型 chat API 必备的消息封装格式。