摘要DeepSeek-R1是中国AI的里程碑之作其显式的思维链Chain-of-Thought输出为调试和透明性带来了革命性提升。本文基于browser-use webui的特殊适配代码讲解如何在浏览器自动化Agent中充分利用R1的推理能力。一、DeepSeek-R1 vs 普通模型区别在哪普通LLM是黑盒——输入问题直接输出答案。R1则是白盒——先展示完整的思考过程再给出结论。普通模型DeepSeek-R1User普通模型DeepSeek-R1User如何预订故宫门票思考用户想预订故宫门票...需要访问官网...检查预约流程...注意提前7天规则.../思考1. 访问官网... 2. 选择日期...如何预订故宫门票1. 访问官网... 2. 选择日期...R1的输出格式think 嗯用户想要预订故宫门票。让我想想步骤 1. 首先需要访问故宫博物院官方网站 2. 找到门票预约入口 3. 选择参观日期和时间段 4. 填写参观者信息 5. 注意故宫门票需要提前7天预约 /think 以下是预订故宫门票的详细步骤 1. 访问 https://www.dpm.org.cn 2. 点击购票...二、问题LangChain默认丢弃了思维链LangChain的ChatOpenAI封装只提取.content字段think块被直接丢弃。这对调试是巨大损失——当Agent做错决策时你永远不知道它当时在想什么。browser-use webui为此编写了专门的适配类。三、源码实现提取reasoning_content3.1 API版本DeepSeekR1ChatOpenAI# src/utils/llm_provider.pyfromopenaiimportOpenAIfromlangchain_openaiimportChatOpenAIclassDeepSeekR1ChatOpenAI(ChatOpenAI): 专为DeepSeek-R1设计的ChatOpenAI子类 额外提取reasoning_content字段 def__init__(self,*args,**kwargs):super().__init__(*args,**kwargs)# 使用原生OpenAI客户端非LangChain封装self.clientOpenAI(base_urlkwargs.get(base_url),api_keykwargs.get(api_key))asyncdefainvoke(self,input,configNone,*,stopNone,**kwargs):# 1. 将LangChain消息格式转换为OpenAI格式message_history[]formsgininput:ifisinstance(msg,SystemMessage):message_history.append({role:system,content:msg.content})elifisinstance(msg,AIMessage):message_history.append({role:assistant,content:msg.content})else:message_history.append({role:user,content:msg.content})# 2. 调用原生APIresponseself.client.chat.completions.create(modelself.model_name,messagesmessage_history)# 3. 提取两个字段推理过程 正式回复reasoning_contentresponse.choices[0].message.reasoning_content contentresponse.choices[0].message.content# 4. 封装回LangChain消息格式returnAIMessage(contentcontent,reasoning_contentreasoning_content# 自定义字段)definvoke(self,input,...):# 同步版本逻辑相同...3.2 Ollama本地版本DeepSeekR1ChatOllama对于本地运行的deepseek-r1:14bOllama的输出格式略有不同classDeepSeekR1ChatOllama(ChatOllama):asyncdefainvoke(self,input,...):# 先调用父类获取原始输出org_ai_messageawaitsuper().ainvoke(inputinput)org_contentorg_ai_message.content# Ollama的R1格式think推理过程/think正式回复reasoning_contentorg_content.split(/think)[0].replace(think,)contentorg_content.split(/think)[1]# 清理可能的JSON标记if**JSON Response:**incontent:contentcontent.split(**JSON Response:**)[-1]returnAIMessage(contentcontent,reasoning_contentreasoning_content)四、在Agent中利用思维链4.1 日志记录让每次决策都有据可查asyncdefstep(self,step_info):# 调用LLM获取决策responseawaitself.llm.ainvoke(messages)# 如果使用的是R1记录推理过程ifhasattr(response,reasoning_content)andresponse.reasoning_content:logger.info(f【Step{step_info.step_number}推理过程】\n{response.reasoning_content})# 执行正式决策actionparse_action(response.content)awaitself.controller.act(action)4.2 UI展示在Chatbot中显示思考过程# 在_handle_new_step回调中formatted_output_format_agent_output(output)# 如果有reasoning_content追加到消息中ifhasattr(output,reasoning_content)andoutput.reasoning_content:reasoning_htmlf details summary 查看AI思考过程/summary pre{output.reasoning_content}/pre /details final_contentreasoning_htmlbr/formatted_outputelse:final_contentformatted_output4.3 调试分析找出Agent犯错的原因# 任务完成后分析推理过程defanalyze_failures(history):forstepinhistory:ifstep.resultandstep.result[0].error:# 该步骤出错了打印当时的推理过程ifhasattr(step.model_output,reasoning_content):print(f步骤{step.step_number}出错时的思考)print(step.model_output.reasoning_content)五、R1在浏览器自动化中的优势场景35%25%20%15%5%R1适用场景复杂多步决策异常处理推理网页结构分析任务规划分解常规简单点击场景为什么R1更强示例复杂表单填写能逐步推理字段关系税务申报、医疗预约异常页面处理分析弹窗/验证码原因遇到登录拦截时调整策略多标签页协调规划标签页切换顺序比价购物、跨系统操作失败重试策略推理失败原因并调整元素未找到时的替代方案六、注意事项与成本权衡6.1 Token成本R1的think块通常占输出的30%~60%。这意味着同样的任务R1的输入输出Token可能比普通模型多2~3倍建议设置max_input_tokens限制防止超长网页内容灌入6.2 延迟推理过程增加了首Token延迟Time to First Token。对于需要快速响应的实时交互场景建议使用deepseek-chat非reasoner版本作为主模型仅在planner_llm任务规划中使用R1# Agent Settings中的推荐配置主模型deepseek-chat快速执行 Planner模型deepseek-reasoner深度规划七、总结DeepSeek-R1的思维链不是冗余输出而是AI可解释性的重要突破。browser-use webui通过DeepSeekR1ChatOpenAI和DeepSeekR1ChatOllama两个适配类让R1的推理能力无缝融入浏览器自动化工作流。核心建议在开发和调试阶段全程开启R1上线后根据成本敏感度和延迟要求灵活切换chat/reasoner版本。