2024年2月的综述《 Understanding the planning of LLM agents: A survey》提供了基于LLM的的agent的规划(planning)能力的系统视角,总结了近年来提高规划能力的工作。
规划(planning)到底是在干什么呢?通俗来讲就是将一个任务分解为一系列行为或动作的过程。设时间步记为
t
t
t,将环境记为
E
E
E,动作空间记为
A
A
A,任务目标记为
g
g
g,时间步
t
t
t处的动作则为
a
t
∈
A
a_t \in A
at∈A,大模型的参数记为
Θ
\Theta
Θ,完成任务的prompt记为
P
\mathcal{P}
P,用LLM做规划可以表示为生成一系列的动作:
p
=
(
a
0
,
a
1
,
⋯
,
a
t
)
=
plan
(
E
,
g
;
Θ
,
P
)
p = (a_0, a_1, \cdots, a_t) = \text{plan}(E, g; \Theta, \mathcal{P})
p=(a0,a1,⋯,at)=plan(E,g;Θ,P)
综述将现有的基于LLM的agent的规划(planning)能力分为五个方向:task decomposition、multi-plan selection、external module-aided planning、reflection and refinement、 memory-augmented planning。
-
任务分解(Task Decomposition):主要采用分而治之(divide and conquer)的思想,将复杂任务分解为几个子任务,然后按顺序对每个子任务进行规划。
( g 0 , g 1 , ⋯ , g n ) = plan ( E , g ; Θ , P ) p i = ( a 0 i , a 1 i , ⋯ , a m i ) = sub-plan ( E , g i ; Θ , P ) (g_0, g_1, \cdots, g_n) = \text{plan}(E, g; \Theta, \mathcal{P}) \\ p^i = (a_0^i, a_1^i, \cdots, a_m^i) = \text{sub-plan}(E, g_i; \Theta, \mathcal{P}) (g0,g1,⋯,gn)=plan(E,g;Θ,P)pi=(a0i,a1i,⋯,ami)=sub-plan(E,gi;Θ,P)
-
多计划选择(Multi-plan Selection): 让LLM 更深地去"思考(think)",对一个任务生成多个可替代计划,接着任务相关的搜索算法选择一个计划来执行。(下式中的 F \mathcal{F} F表示搜索策略,例如树搜索算法)
P = ( p 1 , p 2 , ⋯ , p n ) = plan ( E , g ; Θ , P ) p ∗ = select ( E , g , P ; Θ , F ) P = (p_1, p_2, \cdots, p_n) = \text{plan}(E, g; \Theta, \mathcal{P}) \\ p^* = \text{select}(E, g, P; \Theta, \mathcal{F}) P=(p1,p2,⋯,pn)=plan(E,g;Θ,P)p∗=select(E,g,P;Θ,F)
-
外部规划器辅助规划(External Planner-Aided Planning):用外部规划器来提升规划过程,目的是为了解决生成计划的效率和不可行问题,LLM主要承担定义任务的角色。(下式中的 Φ \Phi Φ是外部规划器模块,h代表形式化的信息)
h = formalize ( E , g ; Θ , P ) p = plan ( E , g , h ; Θ ) h = \text{formalize}(E, g; \Theta, \mathcal{P}) \\ p = \text{plan}(E, g, h; \Theta) h=formalize(E,g;Θ,P)p=plan(E,g,h;Θ) -
反思和改进(Reflection and Refinement):强调通过反思和改进来提高规划能力,鼓励LLM对失败进行反思并改进计划。
p 0 = plan ( E , g ; Θ , P ) r i = reflect ( E , g , p i ; Θ , P ) p i + 1 = refine ( E , g , p i , r i ; Θ , P ) p_0 = \text{plan}(E, g; \Theta, \mathcal{P}) \\ r_i = \text{reflect}(E, g, p_i; \Theta, \mathcal{P}) \\ p_{i+1} = \text{refine}(E, g, p_i,r_i; \Theta, \mathcal{P}) \\ p0=plan(E,g;Θ,P)ri=reflect(E,g,pi;Θ,P)pi+1=refine(E,g,pi,ri;Θ,P) -
记忆增强规划(Memory-augmented Planning):用额外的记忆模块来增强LLM的规划能力,通常将有价值的信息如常识知识、过去的经验、领域知识等存储起来,在LLM做规划时去检索这些信息作为辅助信号。(下式中的 M \mathcal{M} M是记忆模块)
m = retrieve ( E , g ; ( M ) ) p = plan ( E , g , m ; Θ , P ) m = \text{retrieve} (E, g; \mathcal(M)) \\ p = \text{plan}(E, g, m; \Theta, \mathcal{P}) m=retrieve(E,g;(M))p=plan(E,g,m;Θ,P)
这5个方向不是互斥的,而是互相联系的。下图是这个任务的一个汇总总结。
接下里对这个五个方向进行更详细的讨论。
任务分解
任务分解的主要思路是“分而治之”,通常涉及到两个关键步骤:1. 分解复杂任务,即“decompose”步骤。2. 对子任务进行规划,即“sub-plan"步骤。 目前任务分解主要分为两类:分解优先(decomposition-first)和交替分解(interleaved decomposition),如下图所示。
任务分解方向面临的挑战:
- 由任务分解过程带来的额外开销,将任务分解为多个子任务要求更多推理和生成步骤,导致额外的时间和计算成本。
- 对于特别复杂的任务,如果需要分解10多个以上的子任务,会使规划受限于LLM的上下文长度,可能导致前面的轨迹被遗忘。
分解优先方法
分解优先方法如上图a所示先将任务分解成子目标,再相继地对每个子目标进行规划。代表性的工作有:
- HuggingGPT:利用Huggingface Hub中的各种多模态模型来构建agent解决多模态任务。LLM作为一个指挥者,负责将人类的输入的任务进行分解,选择相应的模型,并生成最后的相应输出。HuggingGPT显式地指导LLM将给定任务分解为相互依赖的子任务。
- Plan-and-Solve:将Zero-shot CoT的prompt语句”Let’s think step-by-step“变成两步prompt 指令:“Let’s first devise a plan"和"Let’s carry out the plan”。
- ProgPrompt:将任务的自然语言描述翻译成编码问题(coding problems)。通过编码将环境中的agent的动作空间和对象符号化:将动作定义为函数,将对象表示成变量;这样将任务规划转变成函数生成问题。在执行任务时,agent生成由function callings组成的计划,然后一步一步地执行它们。
优点:强调了任务和子任务之间的相关性,可减少任务遗忘和幻觉的风险。
缺点:因为在一开始就分解了任务,需要有调整机制不然其中一个步骤出错就会导致整个结果出错。
交替分解方法
交替优先方法如上图b所示先将任务分解子目标规划交替进行,也就是在当前状态下每次分解只会涉及到一个或两个子任务。代表性的工作有:
- CoT:通过几个推理轨迹示例来指导LLM进行复杂问题的推理。
- Zero-shot CoT:利用LLM的zero-shot推理能力,prompt 指令:”Let’s think step-by-step“。
- ReAct:将推理和规划解耦,交替进行推理(Thought step)和规划(Action step)。
- Visual ChatGPT:利用ReAct机制,并让LLM利用视觉模型,使agent有了图像处理能力。
- PAL:利用LLM的编码能力来提升CoT,指导LLM在推理过程中生成代码,并让代码解释器来执行这些代码获得答案。
- Program-of-Thought(PoT):将推理问题定义为编码问题,并利用CodeX模型的能力来解决数学和金融问题。
优点:交替分解和子任务规划可利用环境反馈,提高容错率。
缺点:对于复杂任务,过长的轨迹可能会使LLM产生幻觉,忘记了初始目标。
多计划选择
LLM生成的单个计划可能是次优的或不可行的,所以多计划选择就应运而生了,一般分为两个主要步骤:多计划生成和最优计划选择。
多计划生成: 多计划生成需要生成多条计划路径来组成候选计划集,主流的方法是利用生成式模型在解码过程中的不确定性。
- Self-consistency:利用解码过程中的采样策略如温度采样、top采样等生成多条不同的推理路径。
- Tree-of-Thought(ToT):使用采样(sample)和提议(propose)两种策略,采样与Self-consistency一致,提议通过few-shot prompt显式地让LLM生成多种计划。
- Graph-of-Thought(GoT):通过新增thoughts的转变(transformation)来扩展ToT(支持任意thought的聚合)
- LLM-MCTS/RAP:利用LLM作为蒙特卡洛搜索树(Monte Carlo Tree Search, MCTS)的启发式策略函数,通过多次函数调用获得多个可能的动作。
最优计划选择:为了在候选计划集中选择最优计划,可采用多种策略作为启发式搜索算法。
- Self-consistency:采用多数投票策略,将获得最多投票的计划作为最优选择。
- Tree-of-Thought(ToT):利用树搜索算法如BFS和DFS。在选择要扩展的节点时,用LLM来评估多个动作并选择一个最优的。
- LLM-MCTS/RAP:利用蒙特卡洛搜索树(Monte Carlo Tree Search, MCTS)算法来搜索。
- LLL A*:利用经典的A*搜索算法来辅助LLM搜索,在选择最优路径时,将当前位置到目标位置的Chebyshev距离作为启发式代价函数。
优点:多计划选择的可扩展性强,但这个优势涉及到权衡,因为会增加计算成本。
缺点:依赖LLM来评估,而LLM在排序方面的表现目前尚未有充分研究;LLM自带的随机性给选择增加了随机性,可能会影响所选计划的一致性和可靠性。
外部规划器辅助规划
外部规划器辅助规划一般可以归类为符号规划器(symboic planners)和神经网络规划器(neural planners)。在这些方法里,LLM主要是支持性角色,主要来解析文本反馈和提供用来辅助规划的推理信息。
符号规划器:符号规划器类方法一般基于完善的符号形式化模型,如PDDL模型,利用符号推理来识别从初始状态到想要的目标状态的最优路径。
-
LLM+P:通过结合基于PDDL模型的符号规划器来增强LLM的规划能力。设计prompt让LLM将指定的任务及动作组织成PDDL语言形式,接着用Fast-Downward求解器完成规划过程。
-
LLM-DP:基于LLM+P,主要针对动态交互环境设计。从环境中获得反馈后,LLM将这些信息转变成PDDL语言,再用BFS求解器来生成一个计划。
-
LLM+PDDL:同样用PDDL语言来形式化任务,在规划时,用LMM生成的计划作为初始启发式答案来加速局部搜索规划器如LPG的搜索过程。
-
LLM+ASP:将LLM描述的的自然语言问题转化为原子事实(atomic facts)后将问题转化为ASP问题;接着使用ASP求解器CLINGO来生成计划。
神经网络求解器:神经网络求解器是指用强化学习或模仿学习技术在收集的规划数据上训练的深度模型,它们在特定领域有高效的规划能力,但它们对于复杂问题或不常见的问题泛化能力不足,因此有一些方法探索将LLM与轻量的神经网络求解器结合。
- CALM: 语言模型(是2020年的工作,所以还是不是用LLM)处理文本环境信息,生成一系列候选动作作为先验信息;DRRN策略网络排序这些候选动作并选择一个最优动作。
- SwiftSage:利用了认知心理学里的双过程理论(Dual-process theory),将规划过程分为慢思考和快思考。用基于模仿学习训练的DT模型作为快思考模型来进行快速的规划,在计划执行过程出现错误后,agent切换到慢思考过程,由LLM基于当前状态来进行推理和规划。
反思和改进
几种方法Self-refine、Reflexion、CRITIC参考之前的笔记。
记忆增强规划
记忆是agent增强规划能力及增长潜力的关键路径。记忆可分为两大类:RAG-based memory和embodied memory。
RAG-based memory是将一些知识和经验存储起来在需要的时候检索,比如MemoryBank使用向量来编码记忆。REMEMBER将历史记忆存储为Q值表,每一条记录都是(环境,任务,动作,Q值)元祖,在检索时,基于环境和任务相似度来检索正向和负向记忆后提供给LLM生成计划。
embodied memory是使用agent的历史经验样本来微调LLM,比如AgentTuning将各种任务的计划轨迹组织为对话形式后微调LlaMa模型,在未见过的规划任务上表现出了显著的提升效果。
评估
主流的基准评估方法如以下几类:
- 交互式游戏环境(Interactive Gaming Environments):游戏环境基于agent的动作可提供即时的多模态反馈如文本或视觉反馈。最常用的游戏环境是Minecraft,它要求agent收集材料来创建工具获得更多的奖励,agent创建的工具的质量被当做评估指标。另一类是基于文本的交互环境如ALFWorld和ScienceWorld等,成功率或奖励被当做评估指标。
- 交互式检索环境(Interactive Retrieval Environments):它们模拟人类在现实生活中的信息检索和推理过程。在这些环境中,agent可以与搜索引擎或其他web服务交互,获取问题的答案或者完成信息检索任务。常见的检索环境有:基于Wikipedia引擎的问答任务如HotPotQA和Fever,找指定信息的网络浏览任务如WebShop, Mind2Web, WebArena等。任务成功率被当做评估指标。
- 交互式编程环境(Interactive Programming Environments):它们模拟程序员与电脑之间的交互,测试agent在解决电脑相关问题的规划能力。agent需要编码代码或指令来与电脑交互并解决问题,agent会收到如编译或运行错误信息、执行结果等作为反馈。流行的环境有Agent Bench,MiniWoB++等。
这些环境的一个缺点是缺乏细粒度的评估,表现通常以最后的成功率来评估。另一个缺点是对于一个问题只有一条标志着任务的完成的"golden"路径。
综述作者做了一些试验来验证一些代表性工作的表现,结果如下图所示。
试验有如下几个结论:
- 随着开销的增加性能会提升。ReAct, Reflexion等工作涉及到多个计划、额外的思考和反思,所以执行时的开销更大但也带来了性能提升。
- 对复杂任务建议使用Fewshot例子。ZeroShot-CoT有推理能力,但是在两个QA任务上相比于few-shot CoT性能下降了很多。
- 反思对于提高成功率很重要,特别是复杂任务而言。 Reflexioin相比ReAct消耗更多的token,但是在复杂任务上的性能也好很多。