DeepSeek/千问推理模型思考过程获取指南
DeepSeek、千问等推理模型支持输出"思考过程"。本文介绍如何在 Microsoft.Extensions.AI 中启用推理模式,并实现流式与非流式获取推理内容。
核心概念
🧠推理内容 (Reasoning Content):模型内部的思考逻辑,独立于最终回答,用于展示思考过程或调试。
🔧JsonPatch:OpenAI SDK 提供的动态参数配置机制,用于设置
enable_thinking等非标准参数。⚙️RawRepresentationFactory:Microsoft.Extensions.AI (MEAI) 的扩展点,允许开发者直接配置底层 SDK 对象。
流程图解
关键实现
1. 启用推理模式
通过RawRepresentationFactory和JsonPatch设置底层参数:
// 创建启用推理模式的 ChatOptions var reasoningOptions = new ChatOptions() { RawRepresentationFactory = (client) => { var options = new ChatCompletionOptions(); // 使用 JsonPatch 设置 enable_thinking 参数 (适用于千问/DeepSeek部分模型) options.Patch.Set("$.enable_thinking"u8, true); return options; } };💡 提示:不同模型的参数可能不同,例如 DeepSeek Reasoner 可能需要设置thinking.type为enabled。
2. 流式获取推理内容 (推荐)
在流式响应中实时提取推理内容,实现"思考中..."效果:
var updates = client.GetStreamingResponseAsync("问题...", options: reasoningOptions); var openAIUpdates = updates.AsOpenAIStreamingChatCompletionUpdatesAsync(); awaitforeach (var update in openAIUpdates) { Console.WriteLine("[思考]"); // 提取推理内容 if (update.Patch.TryGetValue("$.choices[0].delta.reasoning_content"u8, outstring reasoning)) { Console.Write($"{reasoning}"); } // 提取最终回答 if (update.Patch.TryGetValue("$.choices[0].delta.content"u8, outstring content)) { Console.Write(content); } }3. 非流式获取
如果不需要实时展示,可在完整响应后提取:
// 需要引用 Azure.AI.OpenAI 包 using Azure.AI.OpenAI.Chat;var response = await chatClient.GetResponseAsync("问题...", reasoningOptions); var chatCompletion = response.AsOpenAIChatCompletion(); // 使用扩展方法获取推理内容 var reasoning = chatCompletion.GetMessageReasoningContent();最佳实践
✅交互体验:优先使用流式响应,实时展示模型的思考过程,减少用户等待焦虑。
⚠️参数适配:注意不同模型提供商的参数差异(如
enable_thinkingvsthinking.type)。💰成本意识:推理内容会计入 Token 消耗,生产环境请根据需求开启。
🔍调试利器:利用推理内容分析模型是如何得出结论的,有助于优化 Prompt。
总结
通过 Microsoft.Extensions.AI 的RawRepresentationFactory扩展点,我们可以灵活地支持 DeepSeek、千问等模型的推理特性。
如需获取文章配套完整代码,可扫码咨询领取。👇