接入过DeepSeek推理模型的开发者应该都注意到了,接口返回的数据里除了常规的content,还多了一个reasoning_content字段。这个字段保存的是模型在给出最终答案之前的完整思考过程,也就是所谓的推理链(Chain of Thought)。与普通模型只能拿到一个干巴巴的结论不同,推理模型的这段中间数据能让你看清楚模型是如何一步步拆解问题、排除错误方向、最终收敛到答案的。这篇文章就来详细说说这个字段的结构、提取方式,以及实际使用中容易踩到的坑。

reasoning_content字段与content字段有什么区别
DeepSeek的推理模型(如deepseek-reasoner)在响应结构上做了扩展。传统聊天补全接口返回的choices[0].message里只有一个content字段,而推理模型会多出一个reasoning_content字段。两者在数据层面是并列关系:reasoning_content对应思考阶段,content对应最终回答阶段。从官方文档的定义来看,reasoning_content里的内容不会被计入模型的最终输出,也不会作为上下文在多轮对话中原样传回,它的定位更接近调试和分析用的附加信息。
有一个细节值得注意:这个字段只在推理模型上存在。如果你把model参数设为deepseek-chat这类非推理模型,无论怎么调整请求参数,返回的message对象里都不会有reasoning_content。另外,官方明确说明该字段不支持通过思维链提示词(比如在用户消息里要求模型输出思考过程)的方式间接生成,它是模型架构层面自动产生的,属于硬编码行为。理解了这一点,就明白为什么有些开发者尝试用提示词去引导输出推理过程,结果拿到的内容却混在content里且格式混乱。
下面是一个典型的非流式响应结构,可以看到两个字段的位置关系:
{
"choices": [
{
"message": {
"role": "assistant",
"content": "最终回答内容",
"reasoning_content": "模型内部的思考过程..."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 10,
"completion_tokens": 500
}
}需要说明的是,推理阶段的token消耗同样计入completion_tokens,但通过max_tokens参数可以单独控制最终回答的长度上限,这也是为什么有时候会看到reasoning_content很长而content很短的情况。
非流式模式下的提取方法
非流式调用是最简单的场景,因为整段推理链会在响应完成时一次性返回,直接从JSON结构中取值即可。用Python的requests库写一个基础示例如下:
import requests
url = "https://api.deepseek.com/chat/completions"
headers = {
"Authorization": "Bearer 你的API密钥",
"Content-Type": "application/json"
}
data = {
"model": "deepseek-reasoner",
"messages": [
{"role": "user", "content": "一个袋子里有3个红球和5个蓝球,随机取出两个,至少一个红球的概率是多少?"}
]
}
resp = requests.post(url, headers=headers, json=data)
result = resp.json()
message = result["choices"][0]["message"]
reasoning = message.get("reasoning_content", "")
answer = message.get("content", "")
print("推理过程:")
print(reasoning)
print("最终答案:")
print(answer)这里用get方法配合空字符串默认值是有意为之的写法。虽然推理模型正常情况下都会返回该字段,但在异常降级、模型切换或接口版本变化时,直接用message["reasoning_content"]取值会抛出KeyError,导致整个解析流程中断。防御性的取值方式能让代码在字段缺失时优雅降级,只输出最终答案。
拿到推理链之后,一个常见用途是做提示词优化。比如你发现模型在思考阶段反复纠结某个无关条件,说明提示词里可能存在干扰信息;如果思考过程直接跳到结论,可能问题过于简单或者提示词引导不足。把reasoning_content落库保存,配合后续的分析脚本,可以系统地评估不同提示词版本对模型思考路径的影响,这比单纯对比最终答案的准确率要细致得多。
流式模式下的增量拼接处理
流式调用的情况要复杂一些。当设置stream为true时,服务端会分片推送数据,此时每个chunk里的delta对象会分别携带两种增量内容:delta.reasoning_content表示本次新增的思考片段,delta.content表示最终回答的片段。两者不会出现在同一个chunk里,而是按时间顺序先后推送,先推完所有推理片段,再推最终回答片段。提取的思路就是分别用两个缓冲区累积拼接:
from openai import OpenAI
client = OpenAI(
api_key="你的API密钥",
base_url="https://api.deepseek.com"
)
stream = client.chat.completions.create(
model="deepseek-reasoner",
messages=[
{"role": "user", "content": "解释一下为什么0.1 + 0.2在浮点数运算中不等于0.3"}
],
stream=True
)
reasoning_buffer = []
answer_buffer = []
for chunk in stream:
delta = chunk.choices[0].delta
if delta is None:
continue
rc = getattr(delta, "reasoning_content", None)
if rc:
reasoning_buffer.append(rc)
print(rc, end="", flush=True)
if delta.content:
answer_buffer.append(delta.content)
print()
print("完整推理链长度:", sum(len(s) for s in reasoning_buffer))
print("最终回答:", "".join(answer_buffer))代码里用getattr获取delta上的reasoning_content属性,原因和前面类似:流式场景下部分chunk的delta结构不完整,有些只有role字段,有些是结束标记,直接按字典或属性访问容易报错。另外要注意拼接时不要在片段之间额外添加换行或空格,服务端推送的片段本身就是连续文本的一部分,随意插入分隔符会导致最终拼出的推理链与原文不一致。
如果是用JavaScript在浏览器端处理SSE流,判断逻辑相同,核心都是根据每个增量里是否存在对应字段来分流到不同的缓冲区。前端做推理链实时展示时,建议给思考阶段和回答阶段设计不同的视觉样式,比如思考内容用浅色斜体折叠显示,回答内容正常渲染,用户体验会好很多。
常见问题排查:字段为空、内容重复与多轮对话
实际接入中反馈最多的问题有三类。第一类是reasoning_content字段为空。遇到这种情况先检查model参数,确认用的是deepseek-reasoner而不是deepseek-chat,这是最常见的原因。其次检查是否在请求里开启了某些过滤或精简选项。还有一种可能是问题过于简单,模型判断不需要深度思考,此时推理链本身就可能很短甚至为空,换个复杂一点的问题验证即可排除。
第二类问题是内容重复或交错。有的开发者把delta.content和delta.reasoning_content混在一个缓冲区拼接,或者在前端渲染时错误地同时展示两路内容,导致看起来模型在重复说话。排查方法很简单:确认两个字段始终写入独立的缓冲区,渲染层也分别对应独立的DOM节点,不要复用同一个容器交替追加。
第三类问题出在多轮对话。按照官方约定,上一轮assistant消息中的reasoning_content不应被回传到下一轮请求的messages里,传入后接口会直接报400错误。正确的做法是构造下一轮上下文时只保留role和content字段,剥离掉reasoning_content:
# 构造多轮对话历史时剥离推理字段
history = []
for msg in conversation:
clean_msg = {"role": msg["role"], "content": msg["content"]}
history.append(clean_msg)
# 不要这样传,会触发400错误
# history.append({
# "role": "assistant",
# "content": "...",
# "reasoning_content": "..."
# })如果业务上确实需要保留推理历史用于展示,应该把它存在自己的业务数据库里,与请求上下文解耦,而不是试图塞回API请求。这个设计其实也符合推理链的定位——它是给你看的分析材料,而不是模型的工作记忆。处理好这些细节,reasoning_content就能稳定地为调试、可视化和数据分析提供高质量的中间过程数据。
DeepSeek APIreasoning_content推理链提取修改时间:2026-09-16 01:58:34