DeepSeek API 的多轮对话要由客户端保存并重发消息历史。第二轮只发送“它叫什么名字?”而不带第一轮内容时,模型没有可靠依据知道“它”指什么。下面用两次非流式请求演示消息列表的构造与验证,面向已经能完成第一条 API 请求的 Python 开发者。
把第一轮问答加入消息列表
DeepSeek Chat Completions 接口文档把 messages 定义为当前对话的消息数组。官方思考模式指南的多轮对话小节展示了把上一轮 assistant 消息和下一轮 user 消息接到同一列表的方式。这里使用非思考模式且不传 tools,示例仅需保留用户消息和最终回答文本。

先在本机设置 DEEPSEEK_API_KEY 环境变量,并安装 openai Python 包。以下“叫小橘的猫”是演示输入,不代表真实用户资料。
import os
from openai import OpenAI
key = os.environ.get("DEEPSEEK_API_KEY")
if not key:
raise RuntimeError("请先设置 DEEPSEEK_API_KEY")
client = OpenAI(api_key=key, base_url="https://api.deepseek.com")
messages = [{"role": "user", "content": "我养了一只叫小橘的猫。请只回答收到。"}]
first = client.chat.completions.create(
model="deepseek-flash",
messages=messages,
extra_body={"thinking": {"type": "disabled"}},
)
first_answer = first.choices[0].message.content or ""
messages.append({"role": "assistant", "content": first_answer})
messages.append({"role": "user", "content": "它叫什么名字?请只回答名字。"})
second = client.chat.completions.create(
model="deepseek-flash",
messages=messages,
extra_body={"thinking": {"type": "disabled"}},
)
second_answer = second.choices[0].message.content or ""
print("第二轮:", second_answer)
print("是否包含预期名字:", "小橘" in second_answer)
怎样判断是否真的保留了上下文
运行后核对第二轮是否提到“小橘”,并查看布尔检查结果。如果结果为 False,先打印消息的角色顺序和脱敏后的内容,确认列表按 user、assistant、user 排列;不要把 API Key 打出来。模型回答可能有不同措辞,布尔检查是这个演示的快速核对,不是生产环境的通用质量测试。
第二次请求会重新携带第一轮消息,因此历史增长会增加输入 token。可以从返回的 usage.prompt_tokens 核对单次请求用量;长对话需要按任务保留关键事实、裁剪无关历史。官方接口并没有要求你把所有旧消息永久塞进同一次请求。
思考模式与工具调用的边界
上述示例明确关闭思考模式且未传 tools。官方指南说明:开启思考模式但不传 tools 时,上一轮 reasoning_content 不必回传;如果请求携带 tools,则此前的 reasoning_content 必须按指南保留,否则可能返回 400。不要把这段简化代码直接用于工具调用流程。
本文依据官方文档给出可运行的请求结构,未使用你的密钥实测。若出现鉴权、余额或网络错误,先按返回状态码处理;成功响应也要人工核对第二轮是否正确指代。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30045.html