多轮对话
多轮对话是大模型最常见的使用场景之一。本文介绍如何构建多轮上下文、消息格式规范以及生产环境中的历史管理策略。
工作原理
大模型 API 是无状态的——服务端不保存任何对话历史。每次请求都是独立的,模型不会"记住"之前的对话内容。
要实现多轮对话,需要在每次请求时将完整的历史消息作为输入传给模型:
第 1 轮:messages = [用户消息1]
第 2 轮:messages = [用户消息1, 助手回复1, 用户消息2]
第 3 轮:messages = [用户消息1, 助手回复1, 用户消息2, 助手回复2, 用户消息3]
每一轮的 messages 数组都包含了之前所有的对话记录,模型根据完整上下文生成回复。
备注
这意味着随着对话轮次增加,输入的 Token 数量会持续增长,直接影响调用成本和响应速度。后文的历史管理策略会介绍如何解决这个问题。
消息格式
消息列表 messages 是一个数组,每条消息包含 role(角色)和 content(内容)两个核心字段:
[
{ "role": "system", "content": "你是一个专业的翻译助手" },
{ "role": "user", "content": "把「你好」翻译成英文" },
{ "role": "assistant", "content": "Hello" },
{ "role": "user", "content": "再翻译成日文" }
]
角色说明
| 角色 | 说明 | 数量 |
|---|---|---|
system | 系统提示,设定模型的行为和背景知识 | 0 或 1 条,放在最前面 |
user | 用户输入的消息 | 至少 1 条 |
assistant | 模型的回复 | 由模型生成,多轮时需回传 |
tool | 工具调用的执行结果 | 仅工具调用场景使用 |