OpenAI采用流模式时,思考过程也是通过流式输出的。
这意味着可以像接收最终回答一样,实时逐片段获取模型思考过程,实现边推理边展示的效果。
这里尝试基于网络资料,尝试解锁这一过程的具体实现方式。
1 实现示例
OpenAI流模式下思考过程的获取的具体的实现方法,是在处理流式响应时,从数据块的 delta 字段中提取 reasoning_content 属性,而不是用于最终回答的 content 属性。
以下是一个基于OpenAI库的示例,展示了如何并打印出模型的思考过程和最终回答。
from openai import OpenAI
client = OpenAI()
# 以支持推理的模型为例,如 o1 系列或 DeepSeek-R1 等
stream = client.chat.completions.create(
model="deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", # 或 "o1-mini" 等
messages=[{"role": "user", "content": "9.11 和 9.8 哪个更大?"}],
stream=True,
)
print("开始流式接收...")
for chunk in stream:
# 获取思考过程的增量
if hasattr(chunk.choices[0].delta, 'reasoning_content') and chunk.choices[0].delta.reasoning_content:
reasoning_content = chunk.choices[0].delta.reasoning_content
print(f"【思考】: {reasoning_content}", end="", flush=True) # 实时打印思考过程
# 获取最终回答的增量
elif hasattr(chunk.choices[0].delta, 'content') and chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
print(f"【回答】: {content}", end="", flush=True) # 实时打印最终回答
2 核心要点
2.1 关键字段
流式数据块ChatCompletionChunk中,使用choices[0].delta.reasoning_content获取思考过程。在有的实现中比如VLLM,思考过程有可能是reasoning字段,所以需要依据具体框架文档决定。
2.2 参数控制
对于 OpenAI 的 o1 或 o3 等推理模型,还可以通过 reasoning_effort 参数来控制模型思考的深入程度,例如 low、medium、high。部分模型或工具如 Vercel AI SDK也支持 reasoningSummary 参数来获取更精炼的思考摘要。
2.3 模型差异
需要注意的是,并非所有模型都支持输出思考过程。这一功能主要针对专门的推理模型,例如 OpenAI 的 o1 系列、o3 ,以及 DeepSeek-R1 等第三方推理模型。普通的 GPT 模型如 gpt-4o在标准 API 调用中通常不提供此字段。
reference
OpenAI Reasoning
https://vercel.com/docs/ai-gateway/capabilities/reasoning/openai
OpenAI 聊天補全與推理流式傳輸
使用openai库进行流式输出时,到底发生了什么