【AI面试临阵磨枪-27】CoT、ToT、Plan-and-Solve、Plan-and-Execute 分别是什么?适用场景?
一、面试题目
请你分别说明 CoT、ToT、Plan-and-Solve、Plan-and-Execute 四种大模型推理范式的核心定义,并对比各自的适用业务场景。
二、知识储备
1. CoT(Chain-of-Thought 思维链)
核心定义最简单的线性推理范式,引导模型不直接给出答案,而是拆分问题、分步写出中间推理过程,单路径串行思考,无分支、无回溯、无自我评估。核心特点轻量化、低耗时、单次线性推导、Prompt 简单、资源消耗低。适用场景通用简答、基础逻辑推理、简单数学运算、常识问答、文本摘要、日常对话;适合短步骤、低难度、对延迟敏感的轻量化任务。
2. ToT(Tree-of-Thought 思维树)
核心定义在 CoT 基础上升级为树状多分支推理,模型同步生成多条思考路径,自主评估每条分支的合理性,择优推进、支持错误分支剪枝与回溯试错。核心特点多路径探索、可回溯、自我校验、多轮择优、推理精度高、开销更高。适用场景复杂奥数推理、逻辑谜题、策略博弈、创意设计、多方案决策、复杂难题求解;适合高难度、需要试错择优、允许较高推理耗时的高阶任务。
3. Plan-and-Solve(规划求解)
核心定义强结构化双阶段范式:先一次性输出完整固定步骤规划,再严格依照规划逐条执行推理计算,规划全程不修改、不动态调整。核心特点先规划、后执行、计划固化、逻辑强约束、防止模型跳步与幻觉。适用场景多步数学应用题、公式推导、结构化统计计算、固定流程分析、理科计算题;适合步骤固定、逻辑闭环、不需要中途变更方案的标准化任务。
4. Plan-and-Execute(规划与执行分离)
核心定义Agent 级长流程范式,将规划器与执行器完全解耦:顶层生成宏观任务计划,子任务逐个落地执行,根据执行反馈动态修正、迭代更新计划。核心特点规划 / 执行解耦、闭环反馈、动态调优、支持工具调用、超长链路任务。适用场景AI Agent 复杂任务拆解、多工具串联调用、长文本创作、数据分析、自动化办公、复杂业务流程编排;适合长时序、多阶段、环境多变、需要实时反馈调整的落地级复杂任务。
三、破局之道
在面试中,用这段话展现你对大模型推理范式的深层掌控力:回答这四种推理范式的区别,本质上是展示你对LLM 思考模式与任务复杂度匹配关系的掌控程度。
你可以告诉面试官:CoT 是大模型基础推理的底座,解决简单线性问题;ToT 打开了模型深度思考的上限,通过多路径试错突破复杂逻辑瓶颈;Plan-and-Solve 用前置固化规划约束模型行为,杜绝跳步与逻辑混乱;Plan-and-Execute 则是 AI Agent 落地的核心骨架,依靠规划执行解耦与动态反馈,支撑超长、多工具、强交互的复杂业务闭环。工程落地中,简单业务轻量化选用 CoT,高难度决策使用 ToT,标准化计算场景采用 Plan-and-Solve,而所有长流程、自动化、多步骤的 Agent 场景,都必须依赖 Plan-and-Execute 做全局调度。单纯依靠原生生成只能做简单对话,分层选用推理范式,才能让大模型从 “随口回答” 升级为 “可控、可靠、可落地” 的生产力工具。
四、代码实现
1. Python 版本
# 1. CoT 线性思维链 def cot_inference(question: str): prompt = f""" 请一步步逐步推理,再给出答案: 问题:{question} 推理过程: """ return llm(prompt) # 2. ToT 思维树 多路径择优 def tot_inference(question: str): path1 = llm(f"思考路径1:{question}") path2 = llm(f"思考路径2:{question}") score1 = llm(f"评估该推理合理性:{path1}") score2 = llm(f"评估该推理合理性:{path2}") return path1 if score1 > score2 else path2 # 3. Plan-and-Solve 先定计划再执行 def plan_and_solve(question: str): plan = llm(f"列出完整固定解题步骤:{question}") result = llm(f"严格按照以下步骤解答:\n{plan}\n问题:{question}") return result # 4. Plan-and-Execute 规划执行、动态调整 def plan_and_execute(goal: str): # 第一步:生成整体规划 plan = llm(f"拆解复杂任务,生成阶段化执行计划:{goal}") steps = plan.split("\n") current_context = "" # 分步执行 + 动态修正计划 for step in steps: exec_res = llm(f"执行当前任务:{step}\n上下文:{current_context}") current_context += exec_res # 根据结果更新后续计划 plan = llm(f"基于当前执行结果,更新后续计划:{current_context}") return current_context2. JavaScript 版本
// 1. CoT async function cotInference(question) { const prompt = `请一步步逐步推理,再给出答案:问题:${question}`; return await llm(prompt); } // 2. ToT async function totInference(question) { const path1 = await llm(`思考路径1:${question}`); const path2 = await llm(`思考路径2:${question}`); const s1 = await llm(`评估合理性:${path1}`); const s2 = await llm(`评估合理性:${path2}`); return s1 > s2 ? path1 : path2; } // 3. Plan-and-Solve async function planAndSolve(question) { const plan = await llm(`列出完整固定解题步骤:${question}`); const res = await llm(`严格按步骤解答:${plan} 问题:${question}`); return res; } // 4. Plan-and-Execute async function planAndExecute(goal) { let plan = await llm(`拆解任务并生成执行计划:${goal}`); let context = ""; const steps = plan.split("\n"); for (const step of steps) { const res = await llm(`执行:${step} 上下文:${context}`); context += res; plan = await llm(`基于结果更新后续计划:${context}`); } return context; }