:Reasoning与Planning - 让模型想清楚再动手)
AI 开发基础第4篇Reasoning 与 Planning - 让模型想清楚再动手适合读者已读完第3篇Agent Loop想让Agent处理更复杂的任务预计阅读时间35分钟代码示例全部可运行Python 3.10前言为什么Agent需要思考第3篇的Agent有个问题它是一步一步试的。用户帮我订北京到上海的机票最便宜的上午出发国航或东航 没有推理能力的Agent → 调用搜索机票API参数可能传错 → 收到结果发现不是最便宜的 → 再调一次参数又错了 → 反复试3-4次才对有推理能力的Agent→ 先想用户要求北京→上海最便宜上午国航/东航 → 拆解成4个过滤条件 → 一次调用API传对参数 → 直接拿到正确结果**Reasoning推理**让模型想清楚**Planning规划**让模型安排好顺序。两者结合Agent才能处理复杂任务。一、Reasoning模型如何思考1.1 两种思考模式模式特点类比System 1快思考直觉、快速、不需要显式推理你看到23直接答5System 2慢思考分析、分步、显式推理你看到237×418需要一步步算默认情况下LLM用System 1。但复杂任务需要System 2。1.2 Chain-of-Thought思维链核心思想让模型把思考过程写出来再给出最终答案。不用CoTmessages[{role:user,content:一个旅馆有6层每层12个房间。如果已经入住了78位客人还有多少空房间}]用CoTmessages[{role:user,content:一个旅馆有6层每层12个房间。如果已经入住了78位客人还有多少空房间 请一步步思考。}]区别加了一句请一步步思考。为什么有效LLM生成Token是顺序的。不用CoT时它从问题直接跳到答案中间可能跳过关键步骤。用CoT后它必须先生成推理过程Token推理过程本身成了额外的上下文帮助后续Token生成更准确。实测对比importtimefromopenaiimportOpenAI clientOpenAI(api_keyyour-key,base_urlhttps://api.deepseek.com)question小明有25个苹果给了小红1/3又买了8个又给了小华总数的20%最后还剩多少个# 不用CoTresp_no_cotclient.chat.completions.create(modeldeepseek-chat,messages[{role:user,content:question}],temperature0.0,)print(f无CoT:{resp_no_cot.choices[0].message.content})# 用CoTresp_cotclient.chat.completions.create(modeldeepseek-chat,messages[{role:user,content:f{question}\n\n请一步步计算。}],temperature0.0,)print(f有CoT:{resp_cot.choices[0].message.content})典型结果无CoT直接给答案可能算错有CoT25÷3≈8.33… → 25-8.3316.67… → 16.67824.67 → 24.67×0.819.73CoT在数学、逻辑推理上的提升非常显著。1.3 在Agent中使用CoT第3篇的Agent Loop CoTsystem_prompt你是一个任务执行助手。 思考规则 1. 收到用户需求后先分析需求拆解成子任务 2. 确定每个子任务需要调用哪个工具 3. 考虑子任务之间的依赖关系安排执行顺序 4. 如果某个工具调用失败思考替代方案 5. 完成所有子任务后整合结果给出最终回复 请先在think标签中写出你的思考过程然后再调用工具或给出回复。messages[{role:system,content:system_prompt},{role:user,content:帮我订北京到上海最便宜的上午机票国航或东航}]responseclient.chat.completions.create(modeldeepseek-chat,messagesmessages,toolstools,)# 检查LLM是否在回复中包含了思考过程contentresponse.choices[0].message.contentifthinkincontent:print(LLM的思考过程已输出)# 实际项目中可以解析think标签用于调试和审计效果Agent不再是乱调工具而是先想清楚再动手工具调用的准确率提升明显。1.4 自我纠错Self-Correction更强的推理能力模型能发现自己之前的错误并修正。system_prompt你是一个严谨的分析助手。 工作流程 1. 先给出初步答案 2. 然后检查答案是否正确 3. 如果发现错误修正并给出最终答案 4. 如果没有错误确认答案 输出格式 - 初步分析... - 自检... - 最终答案...messages[{role:system,content:system_prompt},{role:user,content:一个项目预算100万人力成本占60%其中前端占人力30%后端占50%测试占20%。前端的具体预算是多少}]输出示例- 初步分析总预算100万人力成本100×60%60万前端60×30%18万 - 自检30%50%20%100%人力成本分配合理。60万×30%18万计算正确。 - 最终答案前端预算18万。真实项目经验在CSDN文章生成项目中LLM有时会编造不存在的API参数。加上自我纠错提示后它会先写出代码然后检查一遍发现编造的部分并标注需要确认。二、Reasoning 模式对比2.1 OpenAI o1/o3 的内置推理2024年底开始OpenAI推出了o系列模型o1、o3它们内置了推理能力不需要你手动加请一步步思考。# o3模型自动推理不需要CoT提示responseclient.chat.completions.create(modelo3-mini,messages[{role:user,content:237 × 418 ?}],)# o3内部会自动思考输出直接是答案vs 手动CoT对比项手动CoT普通模型提示词内置推理o3等推理质量中等依赖提示词质量高模型专门训练过推理Token可见在输出中不可见内部消耗成本低只付输出Token高内部推理Token也计费速度快慢内部推理需要时间适用场景简单推理任务复杂数学、编程、逻辑2.2 DeepSeek-R1 的推理模式DeepSeek也推出了推理模型有两种模式# 普通模式快速不推理response_normalclient.chat.completions.create(modeldeepseek-chat,messagesmessages,)# 推理模式慢强推理response_reasonerclient.chat.completions.create(modeldeepseek-reasoner,messagesmessages,)真实项目中的选择策略任务类型推荐模型原因简单问答、聊天deepseek-chat快、便宜数学计算、逻辑推理deepseek-reasoner推理准确代码生成deepseek-chat CoT性价比高复杂分析、多步推理o3-mini 或 deepseek-reasoner推理质量优先三、Planning先想清楚再动手3.1 ReActReasoning ActingReAct是目前最主流的Agent推理模式。核心思想每一步都先想Reason再执行Act。用户北京有哪些值得去的博物馆 Thought 1: 用户想了解北京的博物馆我需要搜索北京的博物馆信息 Action 1: search_poi(keyword博物馆, city北京) Observation 1: [故宫博物院、国家博物馆、首都博物馆...] Thought 2: 搜索结果很多用户可能需要了解每个博物馆的特色。我加上评分和简介信息。 Action 2: get_poi_detail(name故宫博物院) Observation 2: 故宫博物院评分4.9中国最大的古代文化艺术博物馆... Thought 3: 我已经有了足够的信息可以给用户推荐了。 Answer: 北京最值得去的博物馆推荐...代码实现defrun_react_agent(user_input:str,max_steps:int10):ReAct模式Agentmessages[{role:system,content:你是一个ReAct风格的Agent。 每一步按以下格式输出 Thought: 你的思考过程 Action: 工具名称(参数) 当你有足够信息时输出 Thought: 我已经收集到足够信息 Answer: 最终回复},{role:user,content:user_input},]forstepinrange(max_steps):responseclient.chat.completions.create(modeldeepseek-chat,messagesmessages,temperature0.0,)contentresponse.choices[0].message.content messages.append({role:assistant,content:content})print(f\n[Step{step1}])print(content)# 解析ActionifAnswer:incontent:# 提取最终答案answercontent.split(Answer:)[-1].strip()returnanswerifAction:incontent:# 解析工具调用action_linecontent.split(Action:)[-1].strip()# 简单解析tool_name(args)# 实际项目中用更健壮的解析方式tool_name,args_straction_line.split((,1)args_strargs_str.rstrip())argsjson.loads(args_str)ifargs_strelse{}resulttool_map[tool_name](**args)# 将观察结果加入对话messages.append({role:user,content:fObservation:{result}})return达到最大步数限制3.2 Plan-and-Execute先规划全部再逐步执行ReAct的问题是每步只看当前不规划全局。如果任务有5个子任务ReAct可能走弯路。Plan-and-Execute先一次性规划好所有步骤再按顺序执行。defrun_plan_execute_agent(user_input:str):Plan-and-Execute模式Agent# 第1步规划Planningplan_messages[{role:system,content:你是一个任务规划专家。 分析用户需求拆解成有序的步骤列表。 每步格式步骤N: [工具名称] 描述 最后一步必须是总结},{role:user,content:f帮我规划一个任务{user_input}}]plan_responseclient.chat.completions.create(modeldeepseek-chat,messagesplan_messages,temperature0.0,)planplan_response.choices[0].message.contentprint(f 任务计划\n{plan}\n)# 第2步逐步执行Execution# 实际项目中这里需要解析plan逐步调用工具# 简化示例直接用plan作为上下文让Agent执行execute_messages[{role:system,content:f你是一个任务执行助手。按以下计划执行{plan}每完成一步输出进度和结果。如果某步失败尝试替代方案。},{role:user,content:请开始执行计划。}]# 用Agent Loop执行复用第3篇的代码returnrun_agent_loop(execute_messages,tools,tool_map,max_rounds10)对比模式优点缺点适用场景ReAct灵活可以中途调整可能走弯路探索性任务Plan-and-Execute全局最优效率高计划可能不准不灵活步骤明确的任务3.3 实际项目中的选择智能行程规划助手的经验第一版用ReActAgent经常搜完景点就忘了查天气第二版改Plan-and-Execute先列出查天气→搜景点→搜餐厅→算路线→生成行程的完整计划再执行最终方案混合模式。简单任务用ReAct如查个天气复杂任务用Plan-and-Execute如规划3天行程defsmart_agent(user_input:str):根据任务复杂度自动选择推理模式# 先判断复杂度complexity_promptf判断以下任务的复杂度。 任务{user_input}如果任务需要3个以上步骤或有依赖关系输出complex。 否则输出simple。 只输出一个词。judgmentclient.chat.completions.create(modeldeepseek-chat,messages[{role:user,content:complexity_prompt}],temperature0.0,).choices[0].message.content.strip()ifcomplexinjudgment:print( 复杂任务使用Plan-and-Execute模式)returnrun_plan_execute_agent(user_input)else:print(⚡ 简单任务使用ReAct模式)returnrun_react_agent(user_input)四、推理能力的量化评估4.1 怎么知道推理有没有用简单方法对比有推理和无推理的正确率。importjsondefevaluate_reasoning(questions:list):评估推理能力results{no_reasoning:[],cot:[],plan_execute:[]}forqinquestions:# 无推理resp1client.chat.completions.create(modeldeepseek-chat,messages[{role:user,content:q[question]}],temperature0.0,)answer1resp1.choices[0].message.content# CoTresp2client.chat.completions.create(modeldeepseek-chat,messages[{role:user,content:f{q[question]}\n\n请一步步思考。}],temperature0.0,)answer2resp2.choices[0].message.content# 判断正确性简化检查是否包含预期答案results[no_reasoning].append(q[expected]inanswer1)results[cot].append(q[expected]inanswer2)# 汇总totallen(questions)print(f评测结果共{total}题)print(f 无推理正确率{sum(results[no_reasoning])/total*100:.0f}%)print(f CoT正确率{sum(results[cot])/total*100:.0f}%)# 示例评测questions[{question:小王有100元买了3本书每本15元又买了2支笔每支8元还剩多少,expected:46},{question:一个水池有两个水管A管6小时注满B管4小时注满两管同时开几小时注满,expected:2.4},]evaluate_reasoning(questions)4.2 推理Token的成本推理不是免费的。CoT的思考过程也要消耗Token。场景无CoT Token消耗有CoT Token消耗增加比例简单问答~200~500150%数学题~300~1200300%复杂分析~500~3000500%优化建议简单任务不用CoT省Token判断任务复杂度后再决定是否启用推理见3.3节的smart_agent推理模型的内部Token也计费注意控制使用场景五、常见误区与最佳实践5.1 误区误区真相“CoT总是有用的”简单任务加CoT反而增加延迟和成本不提升准确率“推理模型一定比普通模型好”简单对话用推理模型是浪费钱速度还慢“Plan-and-Execute总是最优”如果任务有不确定性固定计划反而限制灵活性“CoT提示词越长越好”过长的提示词会占用上下文窗口效果不一定更好5.2 最佳实践先判断复杂度再选择推理模式CoT提示词要具体不要只说思考要说按以下步骤分析1… 2… 3…推理模型用于关键决策如代码审查、数据分析、方案评估普通模型用于日常任务如聊天、翻译、格式化混合模式最实用简单任务ReAct复杂任务Plan-and-Execute六、本章总结你学到了什么System 1 vs System 2LLM默认用快思考复杂任务需要慢思考Chain-of-Thought让模型写出思考过程简单有效一个提示词就生效推理模型o3、DeepSeek-R1等内置推理能力不需要手动CoT但更贵更慢ReAct每步先想再做适合探索性任务Plan-and-Execute先规划全局再执行适合步骤明确的复杂任务混合模式根据任务复杂度自动选择推理策略最实用关键公式ReAct Thought → Action → Observation → Thought → ... → Answer Plan-and-Execute Plan(全部步骤) → Execute(逐步) → Review下一篇预告第5篇Skills 与 MCP - Agent的能力扩展你会学到怎么把Agent的能力模块化、标准化让不同模型复用同一套工具参考资料Chain-of-Thought论文https://arxiv.org/abs/2201.11903ReAct论文https://arxiv.org/abs/2210.03629Plan-and-Execute综述https://arxiv.org/abs/2308.11439Self-Correction in LLMshttps://arxiv.org/abs/2303.11351上一篇第3篇 Agent Loop 与 Tool Use下一篇第5篇 Skills 与 MCP