多轮对话
多轮对话在多次交互间保持上下文。模型使用对话历史提供连贯且符合上下文的响应。
工作原理
通过追加每轮消息来构建 messages 数组:
{
"model": "deepseek-v3",
"messages": [
{ "role": "system", "content": "你是一个有用的助手。" },
{ "role": "user", "content": "什么是 Python?" },
{ "role": "assistant", "content": "Python 是一种高级编程语言..." },
{ "role": "user", "content": "它的主要用途是什么?" }
]
}
模型使用完整对话历史来理解上下文。
消息角色
| 角色 | 说明 |
|---|---|
system | 可选。设置行为和语气。通常放在开头。 |
user | 用户的输入或问题。 |
assistant | 模型的前一次响应。 |
构建多轮对话
示例:代码审查
messages = [
{"role": "system", "content": "你是一位高级代码审查员。"},
]
# 第 1 轮
messages.append({"role": "user", "content": "审查这个 Python 函数:\n\ndef add(a, b):\n return a + b"})
response = client.chat.completions.create(model="deepseek-v3", messages=messages)
messages.append({"role": "assistant", "content": response.choices[0].message.content})
# 第 2 轮
messages.append({"role": "user", "content": "如何添加类型提示?"})
response = client.chat.completions.create(model="deepseek-v3", messages=messages)
每轮将新消息追加到数组。模型看到完整历史。
系统提示最佳实践
- 要具体:不用「要有帮助」,改用「你是 Python 专家。用示例清晰解释代码。」
- 设约束:「回答不超过 200 字」或「列表用项目符号。」
- 定义格式:「被要求结构化数据时始终以 JSON 返回。」
Token 预算管理
长对话消耗更多 token。考虑:
| 策略 | 说明 |
|---|---|
| 截断旧消息 | 接近上下文限制时删除最旧的用户/助手消息对。 |
| 总结历史 | 用摘要替换早期轮次。 |
| 用系统提示存储持久上下文 | 将稳定指令(如「你是编程助手」)移到系统消息中。 |
多轮对话中的 Thinking Mode
使用 Thinking Mode(推理模型)时:
- 不要在下一轮消息中包含前轮的
reasoning_content。 - 只包含前一轮助手的
content(最终答案)。 - 这样节省带宽,避免模型重新处理自己的推理过程。
见Thinking Mode了解详情。
多轮中的错误处理
如果某轮失败:
- 记录
request_id(来自错误响应)。 - 重试最后一条消息(不是完整历史)。
- 如果重试仍失败,考虑用之前上下文的摘要开始新对话。