LATS
前面几种范式都只探索一条轨迹——LATS 把左到右的一次性生成换成可回溯、价值引导的树搜索,并把 ReAct、Reflexion 收成其中的两个部件。
模型侧背景,取自 LATS 原论文(Zhou et al., 2023,arXiv:2310.04406,“Language Agent Tree Search Unifies Reasoning, Acting and Planning in Language Models”,ICML 2024)。它是 foundations 这一组范式的合流点——把 CoT、 ReAct、Reflexion 装进一个 MCTS 框架,因此本章可当作前几章的综合, 与 harness 综述“把各机制组合成控制系统”的视角对读。
方法
LATS 针对的问题,比“推理器 vs 行动者”那层老对立更深一层。此前的语言 agent——无论是 ReAct 的单条轨迹、 还是 Reflexion 的线性重试——本质上都是从左到右一次性把一条路走到底:走错了要么将错就错,要么整条推倒重来, 没有在中途保留多个候选分支、按价值择优、并在需要时回溯到更早节点的能力。这正是棋类 AI 早已解决、而语言 agent 一直缺席的东西:深思式搜索(deliberate search)。 LATS 的主张就是把蒙特卡洛树搜索(MCTS)搬进“推理+真实行动”的联合空间,让 agent 像 AlphaGo 权衡落子那样权衡下一步。
树里每个节点是一条部分轨迹(状态 s)——从 root 到该节点的一串 thought / action / observation。一次迭代循环执行六个操作:
-
选择(selection):从 root 出发,反复选置信上界(UCT)最高的子节点,直到到达一个可扩展节点。UCT 在“已知高价值”与“探索少访问分支”之间平衡:
UCT(s) = V(s) + w · sqrt( ln N(p) / N(s) ) # w = 1(全部实验)其中
V(s)是节点价值,N(s)/N(p)是该节点/其父节点的访问次数。 -
扩展(expansion):以 ReAct 式 reasoning + acting 从当前状态采样
n个候选动作(论文常取n=5), 每个都在环境中实际执行、收集真实 observation,生成n个子节点。 -
评估(evaluation):给新状态打分。价值函数由两部分线性组合——LM 自评与自洽频次:
V(s) = λ · V_LM(s) + (1−λ) · V_SC(s) # λ = 0.5(推理)/ 0.8(编码、WebShop)V_LM(s)是让 LM 推理该状态、在推理末尾吐出一个“这条轨迹有多可能正确”的分数;V_SC(s)是自洽启发式——在同一状态被反复采样到的动作得分更高。 与 Tree-of-Thought 的关键差别:LATS 这个价值是在拿到环境反馈之后才给的,因而对交互决策任务更准。 -
模拟(simulation):从选中节点按“价值优先”一路 rollout 到终止状态,得到回报
r。命中成功即终止搜索。 -
回传(backpropagation):把回报沿路径回传,逐节点更新访问次数与均值价值:
N(s) ← N(s) + 1 V(s) ← ( V(s)·N_old(s) + r ) / N(s) -
反思(reflection):失败轨迹触发 Reflexion 式语言反思——用“轨迹 + 最终回报”提示 LM 写出一段 “错在哪、下次怎么改”的复盘,存入记忆,作为额外上下文注入后续迭代,指导整棵树的走向。
一次搜索的动态长什么样
以 LATS 的头号战场编程任务(HumanEval)为例,勾勒一轮循环的动态(示意,非论文原图):
root: 函数规格(docstring + 签名)
│ expansion:采样 n=5 个「思路 + 首版实现」候选 A…E
│ evaluation:LM 价值 + 自洽 → A:0.7 B:0.4 C:0.8 D:0.5 E:0.3
│
├─ 选择 UCT 最高的 C(0.8) → simulation:补全实现 → 跑自生成单元测试
│ Observation: 3/5 测试失败(环境反馈)→ 回报 r 低
│ reflection: 「边界情况 n=0 未处理,且把索引从 1 起算了」→ 写入记忆
│ backpropagation: C 子树价值被下调,root 下 C 分支不再最优
│
└─ 下一轮 selection 转向 A(0.7);带着上一条反思,A 的补全避开了同类错误
Observation: 5/5 测试通过 → 命中,搜索终止
三处是纯 ReAct/Reflexion 都拿不到的:一是同时保留 A…E 五个候选而非押注一条; 二是C 走死后能回溯到兄弟节点 A,而不是从头重来;三是价值函数让搜索有方向——不是盲目枚举,而是优先展开被判为有前景的分支。
本质:把左到右生成换成价值引导的深思搜索
LATS 最容易被读成“ReAct 上面套个树”。它真正的洞见是:把语言 agent 的生成方式从“贪心地把一条轨迹走到底”改成“在一棵显式的树上做价值引导的搜索与回溯”—— 这是给语言 agent 补上一套“System 2”。看懂这一点,前面几章就在这里各就各位。它把 foundations 的四个范式收成四个可组合部件:
| 范式 | 在 LATS 里承担的角色 |
|---|---|
| CoT | 节点内部的显式推理链 |
| ReAct | 扩展一步的原语:reasoning + acting,并在环境中真实执行取得 observation |
| Reflexion | 失败轨迹触发的语言反思,作为跨迭代记忆注入后续搜索 |
| 树搜索(MCTS) | 把上述三者组织成可回溯、价值引导的深思搜索——LATS 的外骨架 |
而“把 MCTS 搬进语言空间”这一步,是一次逐项的对号入座——棋类里每个部件,它都在语言 agent 里找到了对应物:
| MCTS(棋类 / AlphaGo) | LATS 的语言化对应 |
|---|---|
| 状态 | 一条部分轨迹(root→当前的 thought / action / observation 序列) |
| 动作 | 一个 ReAct 式步骤 |
| 状态转移 | 在环境中执行动作、追加真实 observation |
| 价值网络 | LM 价值函数 V(s) = λ·V_LM + (1−λ)·V_SC(无需训练) |
| 随机 rollout | LM 引导、按价值优先的模拟到终止 |
| (棋类没有这一项) | reflection——把失败轨迹蒸馏成语言教训注入下一轮 |
一处反直觉、也最该记住的证据来自消融(见下):在 LATS 里,“会评估”远比“会反思”重要。去掉反思,HotpotQA 只从 0.63 掉到 0.58; 但去掉 LM 价值函数,直接崩到 0.37。这与 Reflexion 强调“诊断比重试重要”恰成对照——因为 LATS 的搜索空间是多路径的, 一个不靠谱的价值函数会让树搜索退化成昂贵的暴力枚举。先有可信的价值信号,搜索才有意义。
论文与实验结果
-
设置:编程 HumanEval / MBPP、交互问答 HotpotQA、网页交互 WebShop、数学 Game of 24;基座为冻结的 GPT-3.5 / GPT-4,全程无梯度微调。
-
相对基线的增益(LATS 均取 SOTA 或近 SOTA):
基准(基座) ReAct Reflexion ToT / RAP LATS HotpotQA(GPT-3.5,acting) 0.32 0.51 0.39 / 0.54 0.63 HumanEval pass@1(GPT-3.5) 56.9 68.1 — 83.8 HumanEval pass@1(GPT-4) — 91.0 — 92.7 MBPP(GPT-3.5) — 70.0 71.4(RAP) 81.1 WebShop 分 / 成功率(GPT-3.5) 53.8 / 28% 64.2 / 35% — 75.9 / 38% Game of 24(GPT-3.5) — — 0.20 / 0.40 0.44 论文强调这种无梯度表现可与需要梯度微调的方法(如 WebShop 上的 IL / RL agent)相当。HotpotQA 上把 CoT 也叠进来(
LATS(CoT+ReAct))可进一步到 0.71。 -
消融(HotpotQA,
n=5,k=50)——每个部件都不可省:配置 准确率 相对满配 完整 LATS 0.63 — 去掉反思 0.58 −0.05 去掉 LM 价值启发 0.37 −0.26 用 DFS 替代 MCTS 0.42 −0.21 ToT(ReAct)基线 0.39 −0.24 两条结论:价值函数是承重件(去掉掉最多);MCTS 的价值引导回溯本身也是承重件(换成朴素 DFS 掉 0.21)。反思是真实但较小的增量。
-
贡献:给出一个把规划(搜索)、推理、行动、反思纳入单一 MCTS 框架的通用 agent 算法,借助 LM 的 in-context 能力免于训练,并在多个基准取得 SOTA。
局限
LATS 是这组范式里最强也最贵的一端,代价集中在三处:
- 算力与延迟:LM 调用次数随分支
n× 迭代k× 轨迹深度增长,每个节点还要额外一次价值评估、失败还要一次反思。它是“为高价值任务投入算力换可靠性”的重型方案,不适合低延迟或一次性场景。 - 回溯假设环境状态可复原:树搜索的全部威力来自“走死了退回上一个节点重选”。这在纯推理(Game of 24)、或可重置的沙箱里成立;但带副作用的真实环境(已经发出的邮件、已经写入的数据库、已扣的款)无法回溯——这类环境里 MCTS 的“重来”这一步根本不可用。这是 LATS 在工程落地时最硬的边界,远比“太贵”更根本。
- 收益上限由价值函数的信噪比决定:价值信号若不可靠,搜索会朝错误方向深挖,越搜越偏;自洽项(
V_SC)能缓解但不能根治。这也是它在编程任务(有单元测试这种确定性反馈)上最强的原因。论文亦自陈:LATS 没有成功的形式保证,依赖 LM 的自评估能力。
对 agent 设计的价值
可迁移原则,分四条:
- 只在任务价值足以 justify 反复搜索 + 外部验证时才启用。LATS 的每一分收益都用大量 token 与环境交互换来;对一次性、低价值、或延迟敏感的任务,一个 ReAct 循环就够。
- 瓶颈是价值信号,不是搜索本身。消融直接证明:没有可信的价值函数,树搜索退化成昂贵枚举(0.63→0.37)。启发:给 agent 加搜索/择优能力前,先把验证 (V) 那一层做扎实——优先接确定性验证器(测试、编译、类型检查)当价值信号,其可靠性直接封顶整个搜索的收益。
- 回溯只在状态可复原时可用——这决定了树搜索在 harness 里的适用面。启发:把带副作用的动作(对外发送、写库、扣款)与可回溯的“思考/试算”分离;只在后者上做搜索,前者用别的机制(确认、幂等、补偿)兜底。这与 生命周期 (L) 对副作用与可重放性的处理相扣。
- 它示范了“把机制当可组合构件拼装控制器”。LATS 把 ReAct 式行动、Reflexion 式反思与树搜索当作独立部件拼出更强的控制器——这与 harness 综述“把各机制组合成控制系统”的视角一致:单个范式不是终点,组合方式才是。