articleweb_search:1#10web_search:1#6web_search:1#7web_search:1#9web_search:2#0web_search:2#3
第2章 规划模块基础:任务分解与子目标级联的单路径推理
建议位置:第1章之后,现有第4章之前
本章定位:从宏观架构切入,逐层剥开Agent规划模块的内部机理,建立对"单路径推理"的完整认知框架。
2.1 为什么Agent需要"先规划再行动"?
你有没有想过,为什么早期的端到端LLM在面对"帮我订一张从北京到纽约的机票,要中转少、价格低,且在我会议结束后出发"这类指令时,会像无头苍蝇一样来回折腾?它明明拥有世界知识,却总在"搜索航班"和"检查日历"之间反复横跳,最后给你一个看似合理却无法执行的方案。
别急,这不是模型不够聪明,而是缺乏一个专门的规划模块来充当它的"前额叶皮层"。
2.1.1 从端到端到模块化架构
想象一下全连接层的工作方式:输入一个巨大的向量,经过矩阵乘法,输出另一个向量。所有信息都在一次前向传播中完成。这种"一步到位"的模式在处理简单分类任务时非常高效,但面对多步骤决策问题时,它就像试图用一张静态地图导航动态交通——信息过载,且无法中途调整。
现在的Agent架构借鉴了认知科学中的双系统理论:System 1负责快速直觉反应(比如工具调用),System 2负责缓慢、 deliberative 的推理(也就是规划)。在2025年的主流设计中,规划模块被视为Agent的"System 2"组件,它让Agent能够在不" wandering "的情况下解决多阶段问题。citeweb_search:1#10
如果把这个架构画成图,它长这样:
注意这个循环:规划模块不是一次性抛出一个完美计划就消失,而是在每个子目标执行后,根据环境反馈重新评估。这就像我们人类旅行时,不会只在出发前看一次地图,而是每到一个中转站就重新确认下一程的路线。
2.1.2 单路径推理:为什么先讲它?
听起来抽象对吧?让我们先用一个玩具例子建立直觉。
假设你有一个极其简单的任务:“计算 (3 + 5) × 2”。你的大脑会怎么做?它不会同时尝试所有可能的运算顺序,而是沿着一条确定的路径推进:先算括号内,再算乘法。这就是单路径推理(Single-Path Reasoning)——Chain-of-Thought(CoT)的核心思想。citeweb_search:1#4
与之相对的是多路径推理(Tree-of-Thought, ToT),它像蒙特卡洛树搜索一样,在每个决策点分叉出多个可能路径,最后选择得分最高的那条。citeweb_search:1#10 多路径当然更强大,但它消耗的token和计算资源也成倍增长。在建立基础认知时,我们先理解单路径——它是所有复杂规划的"最小可运行单元"。
现在我们已经了解了规划模块在Agent中的位置和单路径推理的基本形态,接下来看看:这条路径上的每一步具体是怎么被"制造"出来的?
2.2 任务分解:从抽象指令到可执行步骤
还记得我们刚才提到的旅行规划例子吗?"帮我订一张机票"这个高层目标,对人类来说会自动拆解成:查日历→搜航班→比价→填信息→支付确认。但对LLM来说,这种拆解并非天生就会。它需要一个显式的**任务分解(Task Decomposition)**过程。
2.2.1 分解的本质:把不可约问题变成可约问题
别急,分解不是什么神秘操作。你可以把它想象成RNN处理序列时的"时间步展开"——一个长序列被切分成一个个时间步,每个时间步只处理当前输入和隐状态。任务分解做的是类似的事情:把一个复杂目标 G 切分成子目标序列 {g1, g2, …, gn},使得每个 gi 都足够简单,可以被底层策略直接解决。
在神经符号规划的文献中,这种分解被形式化为:给定初始状态 s0 和目标状态 sgoal,分解器生成一个子目标序列 SZ = {sz1, …, szK},其中每个子目标都是从前一个子目标"可达"的。citeweb_search:1#6
大脑的前额叶皮层(anterior PFC)在神经科学中被认为专门负责这种任务分解。受此启发,MAP(Modular Agentic Planner)架构中专门设置了一个TaskDecomposer模块,它接收起始状态和目标状态,通过链式思考(Chain-of-Thought)示例来识别有效的子目标。citeweb_search:1#9
2.2.2 分解的两种范式:先分解再规划 vs 交错分解
在继续之前,我们需要区分两种分解策略。想象你在写一篇文章:
- 先分解再规划(Decomposition-first):你先列出完整的大纲(所有章节标题),然后逐章写作。这对应于HuggingGPT、Plan-and-Solve等方法,它们先把任务拆成子任务,再为每个子任务分配模型或生成执行计划。citeweb_search:1#5
- 交错分解(Interleaved):你写一段,看看效果,再决定下一段写什么。这就是ReAct的做法——Thought、Action、Observation三步交替,每一步只揭示当前的一两个子任务。citeweb_search:1#5
对于单路径推理,我们先聚焦先分解再规划的模式,因为它更容易理解和调试。就像写代码时先画流程图再写函数体,结构清晰。
2.2.3 代码示例:一个极简的任务分解器
好了,概念说得够多了。让我们看看一个玩具级别的分解器长什么样。假设我们有一个LLM客户端,它能根据提示生成文本:
class TaskDecomposer:
"""
任务分解器:将高层目标拆解为有序子目标序列
类比:RNN的序列生成器,但输出的是'子目标token'而非词向量
"""
def __init__(self, llm_client):
self.llm = llm_client
def decompose(self, goal: str, context: dict) -> list[str]:
"""
输入: 自然语言目标 + 环境上下文
输出: 有序子目标列表 [g_0, g_1, ..., g_n]
就像RNN逐个生成时间步的输出,
这里我们逐个生成子目标节点。
"""
prompt = f"""
You are a TaskDecomposer module in an agentic system.
Given the high-level goal and current environment state,
decompose the goal into a STRICTLY SEQUENTIAL list of subgoals.
Each subgoal must be concrete, verifiable, and reachable from the previous one.
Goal: {goal}
Current State: {context}
Output format:
1. [First subgoal]
2. [Second subgoal]
...
"""
response = self.llm.generate(prompt, temperature=0.3)
return self._parse_subgoals(response)
def _parse_subgoals(self, text: str) -> list[str]:
"""解析LLM的输出为结构化列表"""
lines = [l.strip() for l in text.split('\n') if l.strip()]
subgoals = []
for line in lines:
# 匹配 "1. xxx" 或 "Step 1: xxx" 格式
if line[0].isdigit() and '. ' in line:
subgoals.append(line.split('. ', 1)[-1])
elif ': ' in line and any(k in line.lower() for k in ['step', 'goal']):
subgoals.append(line.split(': ', 1)[-1])
return subgoals
# ========== Toy Example ==========
if __name__ == "__main__":
# 模拟一个极简的LLM客户端
class DummyLLM:
def generate(self, prompt, temperature=0.3):
# 在真实场景中,这里调用GPT-4/Claude等
return """
1. Check user's calendar for availability
2. Search for flights from Beijing to New York
3. Filter flights by price and layover constraints
4. Select the optimal flight option
5. Complete booking with passenger details
"""
decomposer = TaskDecomposer(DummyLLM())
subgoals = decomposer.decompose(
goal="Book a flight from Beijing to New York, low price, few layovers, after my meeting",
context={"user_location": "Beijing", "meeting_end": "2026-05-20T18:00"}
)
print("=== Decomposed Subgoals ===")
for i, sg in enumerate(subgoals):
print(f" g<sub>{i}</sub>: {sg}")
这个例子很小,对吧?但它揭示了分解的核心机制:高层目标 → 提示工程 → 结构化输出 → 验证可达性。在真实规模的系统中,分解器可能需要处理数百个token的上下文,并输出包含条件分支、循环甚至并行子任务的复杂计划。citeweb_search:2#9
现在我们已经了解了如何把一个大目标切成小块,接下来的问题是:这些小块怎么被串联起来执行?如果中间一块碎了,整串项链会怎么散架?
2.3 子目标级联:顺序执行的链式结构
想象你正在组装宜家家具。说明书上写着:第一步装腿,第二步装桌面,第三步拧螺丝固定。你不能在腿还没装好的时候就去固定桌面——每一步都依赖前一步的完成。这就是**子目标级联(Subgoal Cascading)**的直觉:一个严格有序的依赖链,状态像流水一样从一个子目标流向下一个。
2.3.1 级联的数学本质:状态转移与可达性
听起来抽象对吧?让我们把它翻译成更熟悉的语言。
在强化学习中,我们熟悉状态转移方程:st+1 = f(st, at)。子目标级联把这个概念扩展到了"宏时间步"层面。定义第 i 个高层决策时间步为 ti = ti-1 + kti-1,其中 k 是到达子目标所需的低层步数。citeweb_search:2#0
换句话说,子目标不是"瞬间完成"的魔法节点,而是需要一段低层执行过程才能抵达的 waypoint(路标)。从当前状态 st 到子目标 gt,低层策略 pil 需要顺序执行一系列原始动作,直到抵达目标区域。
2.3.2 严格子目标执行:为什么顺序很重要
在继续之前,我们需要理解一个关键设计选择:严格子目标执行(Strict Subgoal Execution, SSE)。在SSE框架中,如果Agent未能成功到达当前子目标,整个episode会被终止,而不是让它带着错误继续执行后续步骤。citeweb_search:2#0
为什么要这么严格?想想看:如果你在"查日历"这一步就搞错了会议时间,后续所有航班搜索都是建立在错误假设上的。错误会像滚雪球一样越滚越大。SSE的设计理念是**“早发现,早止损”**——通过强制每个子目标必须被验证通过,防止错误级联到下游。
这就像全连接网络中的Batch Normalization:如果某一层的输入分布已经漂移,不加以校正,后续所有层都会受到影响。SSE相当于在宏时间步上设置了"检查点归一化"。
2.3.3 代码示例:级联执行器与检查点机制
让我们把刚才的概念翻译成代码。下面的CascadingExecutor实现了严格的顺序级联执行,并在每个子目标成功后保存检查点:
class SubgoalFailure(Exception):
"""子目标未达成异常"""
pass
class CascadingExecutor:
"""
子目标级联执行器
类比:RNN的序列展开,但每个时间步(子目标)
内部包含多个低层动作(类似一个子RNN的展开)。
"""
def __init__(self, low_level_policy, checkpoint_store):
"""
low_level_policy: 底层策略 pi<sup>l</sup>,负责原始动作生成
checkpoint_store: 检查点存储,用于保存/恢复状态
"""
self.policy = low_level_policy
self.checkpoints = checkpoint_store
def execute_cascade(self, subgoals: list[str], initial_state) -> dict:
"""
严格顺序执行子目标级联链
执行逻辑:
Step 1: 从初始状态出发,执行第1个子目标
Step 2: 验证是否达成,若达成则保存检查点
Step 3: 以新状态为起点,执行第2个子目标
...
Step n: 验证最终目标
"""
state = initial_state
trajectory = []
for idx, subgoal in enumerate(subgoals):
print(f"\n[Macro-step {idx}] Pursuing subgoal: '{subgoal}'")
# === 低层执行:从当前状态到达子目标 ===
state, steps_taken = self._reach_subgoal(
state, subgoal, max_steps=50
)
# === 严格验证:子目标必须被满足 ===
if not self._verify_subgoal(state, subgoal):
raise SubgoalFailure(
f"Failed at subgoal {idx}: '{subgoal}'. "
f"State drift detected. Aborting cascade."
)
# === 级联检查点:保存成功状态 ===
self.checkpoints.save(checkpoint_id=idx, state=state)
trajectory.append({
"subgoal_idx": idx,
"subgoal_text": subgoal,
"state": state,
"low_level_steps": steps_taken
})
print(f" ✓ Subgoal {idx} reached in {steps_taken} low-level steps.")
print(f" ✓ Checkpoint {idx} saved.")
return {
"final_state": state,
"trajectory": trajectory,
"total_macro_steps": len(subgoals)
}
def _reach_subgoal(self, state, subgoal, max_steps: int):
"""
低层策略执行:像RNN逐个生成动作,直到抵达子目标
参数:
state: 当前环境状态 s<sub>t</sub>
subgoal: 当前子目标 g<sub>i</sub>
max_steps: 最大尝试步数(防止无限循环)
返回:
(new_state, steps_taken)
"""
steps = 0
while steps < max_steps:
# 底层策略根据当前状态和子目标生成动作
action = self.policy.act(state, subgoal)
# 环境步进
state = self.policy.step(state, action)
steps += 1
# 提前终止:如果已达成子目标
if self._verify_subgoal(state, subgoal):
break
return state, steps
def _verify_subgoal(self, state, subgoal) -> bool:
"""
验证子目标是否达成
在真实系统中,这可能调用LLM或规则引擎进行验证
"""
# 简化示例:检查状态中是否包含子目标关键词
return subgoal.lower() in str(state).lower()
# ========== Toy Example ==========
class DummyLowLevelPolicy:
"""模拟底层策略:假装在执行动作"""
def act(self, state, subgoal):
return f"action_toward_{subgoal.replace(' ', '_')}"
def step(self, state, action):
# 模拟状态更新:将子目标标记为已包含
new_state = dict(state) if isinstance(state, dict) else {}
new_state["completed"] = new_state.get("completed", []) + [action]
return new_state
class SimpleCheckpointStore:
def __init__(self):
self.store = {}
def save(self, checkpoint_id, state):
self.store[checkpoint_id] = dict(state)
def load(self, checkpoint_id):
return self.store.get(checkpoint_id)
if __name__ == "__main__":
executor = CascadingExecutor(
low_level_policy=DummyLowLevelPolicy(),
checkpoint_store=SimpleCheckpointStore()
)
subgoals = [
"Check calendar availability",
"Search flights Beijing to New York",
"Filter by price and layover",
"Complete booking"
]
result = executor.execute_cascade(
subgoals=subgoals,
initial_state={"user": "Alice", "location": "Beijing"}
)
print("\n=== Cascade Execution Summary ===")
print(f"Total macro steps: {result['total_macro_steps']}")
print(f"Final state keys: {list(result['final_state'].keys())}")
这段代码展示了级联执行的三个核心机制:顺序依赖、严格验证、检查点保存。在真实系统中,_verify_subgoal可能需要一个独立的验证器(甚至另一个LLM)来判断状态是否真正满足了子目标的语义条件。
现在我们已经了解了子目标是如何被串联执行的,但还有一个关键问题没解决:如果链条中间的一环断了,怎么办?
2.4 级联规划中的错误传播与回溯
假设你正在执行那个订机票的任务。前两个子目标"查日历"和"搜航班"都顺利完成了,但在"比价筛选"这一步,你发现之前搜到的航班已经全部售罄。这时候,级联链条上出现了一道裂缝。如果你不管不顾继续执行"完成预订",结果必然是失败。这就是级联错误(Cascading Failure)。
2.4.1 错误传播:为什么小错会变成大错
别急,让我们先看看错误是怎么在单路径链条中传播的。
想象一个全连接网络:如果某一层的权重更新出现了偏差,这个偏差会通过反向传播影响前面所有层。在级联规划中,错误传播的方向正好相反——它是前向传播的。第 i 步的微小偏差(比如搜到了错误的航班列表)会成为第 i+1 步的输入,导致第 i+1 步在错误的基础上做决策,偏差被放大。citeweb_search:2#3
ReCAPA框架提出了两个诊断指标来量化这种现象:
- 错误传播率(Error Propagation Rate, EPR):量化错误在未来步骤中的复合程度
- 传播衰减系数(Propagation Attenuation Coefficient, PAC):衡量系统从错误中恢复的速度citeweb_search:2#3
2.4.2 预测性校正:在错误滚雪球之前拦住它
在继续之前,让我们引入一个更聪明的机制:层级预测校正(Hierarchical Predictive Correction, HPC)。
ReCAPA框架的核心思想是:不要等错误发生了再补救,而是在执行每个子目标之前,先"预测"执行后的状态应该长什么样,然后在执行过程中持续比对预测与实际的偏差。一旦发现偏差超过阈值,立即触发校正。citeweb_search:2#3
这就像在RNN中引入注意力机制:模型不再盲目地逐词生成,而是在每个时间步回顾上下文,确保当前输出与整体语义一致。HPC在三个层级上同时运作:
- 轨迹级(Trajectory-level):整体执行路径是否与原始意图对齐?
- 子目标级(Subgoal-level):当前子目标的预测状态与实际状态是否一致?
- 动作级(Action-level):底层动作的累积效果是否朝着正确的子目标推进?
2.4.3 代码示例:带预测性校正的鲁棒级联规划器
让我们把错误处理和预测校正整合到一个更完整的规划器中。这个例子展示了如何在级联执行中检测错误、量化偏差,并触发回溯:
class RobustCascadePlanner:
"""
鲁棒级联规划器:带预测性校正和错误传播的级联执行
类比:在RNN中引入'残差连接'和'梯度裁剪',
防止误差在链式结构中无限放大。
"""
def __init__(self, decomposer, executor, corrector):
"""
decomposer: 任务分解器(生成子目标链)
executor: 级联执行器(顺序执行子目标)
corrector: 预测校正器(检测并修正偏差)
"""
self.decomposer = decomposer
self.executor = executor
self.corrector = corrector
def plan_and_execute(self, goal: str, initial_state: dict) -> dict:
"""
完整的规划-执行-校正闭环
流程:
Step 1: 分解高层目标为子目标链
Step 2: 对每个子目标进行预测性对齐
Step 3: 执行并监控偏差
Step 4: 若偏差过大,触发回溯或局部重规划
"""
# === Phase 1: 任务分解 ===
subgoals = self.decomposer.decompose(goal, initial_state)
print(f"[Planner] Goal decomposed into {len(subgoals)} subgoals")
state = initial_state
execution_log = []
for i, subgoal in enumerate(subgoals):
print(f"\n[Step {i}] Subgoal: '{subgoal}'")
# === Phase 2: 预测性对齐 ===
# 在执行前,先预测执行后的理想状态
predicted_state = self.corrector.predict(state, subgoal)
print(f" [Predictor] Expected state signature computed")
# === Phase 3: 执行子目标 ===
try:
state, exec_info = self.executor.execute_single_subgoal(
state, subgoal
)
except SubgoalFailure as e:
print(f" [Executor] Subgoal failed: {e}")
state = self._handle_failure(i, subgoals, state, error_type="execution")
continue
# === Phase 4: 偏差检测与校正 ===
drift = self.corrector.compute_drift(predicted_state, state)
print(f" [Monitor] Drift = {drift:.3f} (threshold = {self.corrector.threshold})")
if drift > self.corrector.threshold:
# 级联错误 detected! 计算EPR
epr = self._compute_epr(drift, i, len(subgoals))
print(f" [ALERT] Cascade drift detected! EPR = {epr:.3f}")
# 触发校正策略
state = self._handle_cascade_failure(i, subgoals, state, drift)
execution_log.append({
"subgoal_idx": i,
"subgoal": subgoal,
"drift": drift,
"epr": epr,
"corrected": True
})
else:
execution_log.append({
"subgoal_idx": i,
"subgoal": subgoal,
"drift": drift,
"epr": 0.0,
"corrected": False
})
return {
"final_state": state,
"execution_log": execution_log,
"success": all(not log["corrected"] or log.get("recovered", False)
for log in execution_log)
}
def _compute_epr(self, current_drift, step_idx, total_steps):
"""
计算错误传播率 (Error Propagation Rate)
简化模型:假设误差按指数增长
EPR = drift × exp(α × remaining_steps)
"""
import math
alpha = 0.5 # 传播系数
remaining = total_steps - step_idx - 1
return current_drift * math.exp(alpha * remaining)
def _handle_cascade_failure(self, failed_idx, subgoals, current_state, drift):
"""
处理级联失败:回溯到上一个检查点,并重规划剩余子目标
策略选择:
- 若 drift < 0.8: 局部重试当前子目标
- 若 drift ≥ 0.8: 回退到检查点,重新生成后续子目标链
"""
if drift < 0.8 and failed_idx > 0:
# 轻度漂移:回退一步重试
print(f" [Recovery] Mild drift. Backtracking to checkpoint {failed_idx-1}")
checkpoint = self.executor.checkpoints.load(failed_idx - 1)
return self.executor.execute_single_subgoal(
checkpoint, subgoals[failed_idx]
)[0]
else:
# 重度漂移:从上一个检查点重新规划
print(f" [Recovery] Severe drift. Replanning from checkpoint {failed_idx-1}")
checkpoint = self.executor.checkpoints.load(failed_idx - 1)
remaining_goals = subgoals[failed_idx:]
# 重新分解剩余任务(可能发现新的路径)
new_subgoals = self.decomposer.replan(
current_state=checkpoint,
remaining_goal_description=" + ".join(remaining_goals)
)
# 用新的子目标链继续执行
result = self.executor.execute_cascade(new_subgoals, checkpoint)
return result["final_state"]
def _handle_failure(self, failed_idx, subgoals, current_state, error_type):
"""处理执行失败(非漂移类错误)"""
print(f" [Recovery] Handling {error_type} failure at step {failed_idx}")
# 简化处理:返回当前状态,由上层决定是否终止
return current_state
# ========== Toy Example ==========
class DummyCorrector:
"""模拟预测校正器"""
def __init__(self, threshold=0.5):
self.threshold = threshold
def predict(self, state, subgoal):
# 模拟:预测状态应该包含子目标关键词
return {"predicted_contains": subgoal.lower().split()[0]}
def compute_drift(self, predicted, actual):
# 模拟:随机生成一个漂移值(真实系统中基于语义嵌入距离)
import random
return random.uniform(0.0, 0.9)
class DummyExecutorWithCheckpoints:
"""带检查点的模拟执行器"""
def __init__(self):
self.checkpoints = {}
self.checkpoint_id = 0
def execute_single_subgoal(self, state, subgoal):
new_state = dict(state)
new_state["last_action"] = subgoal
self.checkpoints[self.checkpoint_id] = dict(new_state)
self.checkpoint_id += 1
return new_state, {"steps": 3}
def checkpoints(self):
return self
def load(self, cid):
return self.checkpoints.get(cid, {})
def save(self, cid, state):
self.checkpoints[cid] = dict(state)
if __name__ == "__main__":
# 组装完整系统
planner = RobustCascadePlanner(
decomposer=TaskDecomposer(DummyLLM()),
executor=CascadingExecutor(DummyLowLevelPolicy(), SimpleCheckpointStore()),
corrector=DummyCorrector(threshold=0.6)
)
result = planner.plan_and_execute(
goal="Book a flight from Beijing to New York",
initial_state={"user": "Alice", "budget": 1000}
)
print("\n=== Final Report ===")
print(f"Success: {result['success']}")
for log in result['execution_log']:
status = "✓" if not log['corrected'] else "↻ corrected"
print(f" Step {log['subgoal_idx']}: {status} (drift={log['drift']:.2f})")
这段代码虽然简化,但包含了级联规划中最关键的三个防御机制:
- 预测性对齐:执行前建立预期基准线
- 漂移检测:量化实际与预期的偏差
- 分层恢复:轻度漂移局部重试,重度漂移回退重规划
2.5 闭环:从原理到实践
好了,我们已经一起走过了从宏观架构到微观错误处理的全过程。让我们停下来,回顾一下这张认知地图。
2.5.1 本章核心脉络
我们从Agent的模块化架构出发,理解了规划模块作为"System 2"的角色。然后聚焦到单路径推理,学习了任务分解如何把不可约的高层目标变成可约的子目标序列。接着深入子目标级联的执行机制,理解了严格顺序执行和检查点保存的重要性。最后,我们面对了级联规划中最现实的挑战——错误传播,并引入了预测性校正和分层回溯作为防御手段。
2.5.2 这在实际使用中意味着什么
如果你正在构建一个LLM Agent,本章的原理直接对应以下工程决策:
-
不要跳过分解:即使你的模型很强,也要显式引入分解步骤。研究表明,将自然语言计划转换为伪代码风格的结构化计划(P-code Plan)可以显著提升泛化能力和执行效率。citeweb_search:2#9 伪代码的显式控制流(if/else、for、return)比自然语言的模糊描述更容易被精确执行。
-
检查点是必须的:在长程任务(long-horizon tasks)中,没有检查点的级联就像没有BatchNorm的深度网络——误差会无限放大。PseudoAct框架通过"Control-Flow Executor"在执行前合成伪代码计划,明确分离了"规划者"和"执行者"的职责,避免了反应式Agent每步重建计划的不稳定性。citeweb_search:2#9
-
预测优于补救:ReCAPA的实验表明,在 embodied agent 基准测试(VisualAgentBench、MineDojo、AI2-THOR)上,引入层级预测校正可以分别带来 +5.65%、+9%、+7% 的成功率提升。citeweb_search:2#3 这说明在执行过程中持续比对"预期"与"现实",比等到彻底失败后再重启要高效得多。
2.5.3 延伸阅读
如果你想继续深入,以下方向值得探索:
-
多路径推理(Tree-of-Thought / MCTS):当你需要处理高风险的决策场景(比如医疗诊断、金融交易),单路径的贪心策略可能不够。Yao et al. (2023) 提出的ToT框架允许Agent在内部模拟多条路径,通过奖励模型评分后选择最优分支。citeweb_search:1#10
-
神经符号融合(Neuro-Symbolic Planning):如果你需要形式化保证(formal guarantees),可以探索将LLM作为L-Model进行子目标分解,再用传统符号规划器(如Fast Downward)或MCTS求解每个子目标。这种混合架构在机器人任务规划中已被证明能显著减少规划时间。citeweb_search:1#6
-
记忆增强规划(Memory-augmented Planning):在长程交互中,Agent需要记住过去的成功和失败模式。REMEMBER和MemoryBank等框架通过向量数据库存储经验,并在规划时检索相关记忆来指导新任务的分解策略。citeweb_search:1#4
-
脑启发架构(Brain-inspired Architectures):MAP框架将规划过程映射到前额叶皮层的不同功能区(任务分解、动作提议、状态预测、错误监控),通过多个专门的LLM模块协同完成规划。这种模块化设计虽然计算成本更高,但在Tower of Hanoi等需要严格逻辑的任务上显著优于单一LLM的CoT或ToT方法。citeweb_search:1#9
在继续下一章之前,建议你动手修改上面的代码示例:试着在DummyCorrector中实现一个基于简单规则的真实漂移检测(比如检查状态中是否包含预期关键词),或者在TaskDecomposer中接入一个真实的OpenAI/Anthropic API,看看它如何分解你日常生活中的复杂任务。理论只有在被亲手调试过之后,才会真正成为你的直觉。
我们下一章见。
407



被折叠的 条评论
为什么被折叠?



