在智能Agent系统中,规划能力是完成复杂多步任务的核心。请系统介绍当前主流的提升大语言模型规划能力的方法,如思维链(CoT)、思维树(ToT)、图思维(GoT)等,深入分析它们的原理、适用场景,并对比各自的优缺点与实际应用中的局限性。
Agent 规划能力决定了它能否将复杂任务合理分解并高效执行。核心技术从低到高:CoT(单路径推理)-> 结构化 Planner(JSON 执行计划)-> ToT(多路径探索)。工业主流是 LLM Planner 生成 JSON 格式执行计划,明确每步用什么工具和参数,实现规划和执行的解耦。
规划能力的三个层次
Layer 1: 简单规划(CoT)单路径思考链,逐步推导
适用:数学题、逻辑推理
Layer 2: 结构化规划(LLM Planner)
输出 JSON 格式执行计划,明确每步工具和参数
适用:多步骤任务、需要工具组合的场景
Layer 3: 探索性规划(ToT / MCTS)
多路径并行探索,选最优路径
适用:搜索空间大、最优解不唯一的复杂任务
LLM Planner 实现(拓业智询真实代码)
class PlannerNode:def __call__(self, state: AgentState) -> dict:
prompt = (
f"制定执行计划\n"
f"问题: {state['query']}\n"
f"意图: {state['intent']}\n"
"可用工具:\n"
"- text2sql: 查询数据库(自然语言转 SQL)\n"
"- code_executor: 执行 Python 代码\n"
"- web_search: 搜索网络\n"
"- rag_search: 检索知识库\n\n"
'JSON格式: {"plan": [{"step": 1, "action": "...",'
'"tool": "...", "params": {}}]}'
)
result = json.loads(self.llm.simple_chat(prompt))
return {"plan": result["plan"], "current_step": 0}
计划示例(分析银行股 PE)
plan = [{
"step": 1,
"action": "查询所有银行股的 PE 比率",
"tool": "text2sql",
"params": {"question": "查询 A 股银行板块所有股票的 PE 比率,按升序排列"}
},
{
"step": 2,
"action": "对 PE 数据进行统计分析并生成柱状图",
"tool": "code_executor",
"params": {
"use_previous_data": True, # 使用 Step 1 的查询结果
"task": "计算均值/中位数,绘制银行股 PE 对比柱状图,标注行业平均线"
}
},
{
"step": 3,
"action": "搜索近期银行股估值相关新闻",
"tool": "web_search",
"params": {"query": "A股银行板块 PE 估值 2024 分析"}
}
]
CoT vs ToT 对比
CoT(思维链):单路径,逐步推导问题 -> 思考1 -> 思考2 -> 思考3 -> 答案
优点:简单高效;缺点:走错一步全错
ToT(思维树):多路径并行,择优
问题 -> 思路A -> 展开A1, A2, A3 -> 评估选最优
-> 思路B -> 展开B1, B2, B3 -> 剪枝
优点:全局最优;缺点:token 消耗是 CoT 的 3-5 倍
适用:难度大、解空间复杂的任务
在 Prompt 中加入「请一步步思考」或 few-shot 示例(给出 2-3 个带思考步骤的示例),可显著提升 LLM 规划质量。对于 7B 以下小模型效果尤为明显,是最低成本的规划能力提升方法。
ToT 适合解空间很大、最优解不唯一的任务(创意写作、策略规划)。但 token 消耗是 CoT 的 3-5 倍,实时交互场景慎用。可以用「采样多条 CoT 路径取最多数答案(Self-Consistency)」替代,效果接近但成本更低。
当某步骤执行失败时,Reflector 节点可以触发重规划——将失败原因告知 Planner,让它生成调整后的新计划,而不是简单重试原计划。这是 Agent「自愈能力」的高级体现。
拓业智询实践:计划步骤控制在 3-7 步,每步用 1-2 个工具。步骤太多(>10)导致 Context 过长;步骤太少(<3)导致每步过于复杂,code_executor 生成的代码容易出错。
被问Agent 如何处理复杂任务的规划,不要只说用 CoT 分步推理。正确答案:我们用 LLM Planner 生成 JSON 格式执行计划,每步明确指定工具名和参数。关键设计是 use_previous_data 标志——当 code_executor 需要使用前一步 SQL 查询结果时,Executor 自动从 tool_results 中取出数据传入,实现步骤间数据流传递。此外,当某步失败时,Reflector 触发重规划,把失败原因告知 Planner 生成新计划,而不是简单重试,这让系统对工具失败有一定的自愈能力。实测单次请求平均步数从 8 步降到 5 步,成本降低 37%。