多轮对话

多轮对话在多次交互间保持上下文。模型使用对话历史提供连贯且符合上下文的响应。

工作原理

通过追加每轮消息来构建 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)

每轮将新消息追加到数组。模型看到完整历史。

系统提示最佳实践

  1. 要具体:不用「要有帮助」,改用「你是 Python 专家。用示例清晰解释代码。」
  2. 设约束:「回答不超过 200 字」或「列表用项目符号。」
  3. 定义格式:「被要求结构化数据时始终以 JSON 返回。」

Token 预算管理

长对话消耗更多 token。考虑:

策略说明
截断旧消息接近上下文限制时删除最旧的用户/助手消息对。
总结历史用摘要替换早期轮次。
用系统提示存储持久上下文将稳定指令(如「你是编程助手」)移到系统消息中。

多轮对话中的 Thinking Mode

使用 Thinking Mode(推理模型)时:

  • 不要在下一轮消息中包含前轮的 reasoning_content
  • 只包含前一轮助手的 content(最终答案)。
  • 这样节省带宽,避免模型重新处理自己的推理过程。

Thinking Mode了解详情。

多轮中的错误处理

如果某轮失败:

  1. 记录 request_id(来自错误响应)。
  2. 重试最后一条消息(不是完整历史)。
  3. 如果重试仍失败,考虑用之前上下文的摘要开始新对话。

相关文档