大型语言模型 (LLMs) 已经在各种决策任务上取得了卓越的成绩,但它们通常只执行简单的行为,并没有真正作为自主代理得到广泛应用。
原文:Language Agent Tree Search Unifies Reasoning Acting and Planning in Language Models
作者:
- Andy Zhou(伊利诺伊大学香槟分校 AI@UIUC),
- Kai Yan、Michal Shlapentokh-Rothman、Haohan Wang、Yu-Xiong Wang(同为伊利诺伊大学香槟分校)
摘要
大型语言模型 (LLMs) 已经在各种决策任务上取得了卓越的成绩,但它们通常只执行简单的行为,并没有真正作为自主代理得到广泛应用。我们提出了一种名为 LATS (语言代理树搜索) 的新框架,它将 LLMs 在规划、行动和推理方面的功能有效结合起来。LATS 框架的创新之处在于,它借鉴了强化学习中的蒙特卡洛树搜索技术,将 LLMs 当作代理使用,同时充当价值函数和优化器的角色,通过这种方式大幅提升决策质量。最关键的是,LATS 利用外部环境提供的反馈,实现了一种更为周全和灵活的问题解决方式,这一点超越了现有方法的限制。我们在不同领域进行的实验评估证明了 LATS 的有效性,无论是在编程、HotPotQA 还是 WebShop 任务上,LATS 都显示出了其推理和行动能力。特别值得一提的是,在 HumanEval 编程任务上,配合 GPT-4 的 LATS 达到了 94.4% 的成功率,在 WebShop 网页浏览任务上,配合 GPT-3.5 实现了平均 75.9 的得分,这些成果都突显了我们方法的高效性和广泛适用性。
1 引言
人工智能领域一直非常关注那些能在各种环境下进行推理与决策的全能型自主代理(Wooldridge & Jennings, 1995)。虽然这类研究传统上归属于强化学习,但随着大语言模型(LLM)的崛起(Brown et al., 2020; Chowdhery et al., 2022; Touvron et al., 2023; OpenAI, 2023),这些模型凭借其出色的推理能力和广泛的适用性,为我们提供了新的研究途径。大语言模型不只是在传统的自然语言处理任务,如文本摘要(Nallapati et al., 2016)和自然语言推理(Bowman et al., 2015)等领域取得了显著成就,它们还成功适用于需要更深层次常识和数理能力的多样化任务(Cobbe et al., 2021; Saparov & He, 2022)。不仅如此,大语言模型还能在需要大量知识和逻辑推理的复杂环境中展现其能力,比如网络浏览(Yao et al., 2022; Deng et al., 2023)、工具使用(Schick et al., 2023)以及开放式游戏(Fan et al., 2022)。
图 1: LATS 的整体概览图。通过外部环境互动和内部反思,能够提高代理的推理和决策能力。
最新的研究表明,通过结合来自外部环境的反馈或观测信息,我们能够提升大语言模型(LLMs)在推理和行动上的能力(Yao 等人,2023b; Gao 等人,2022; Shinn 等人,2023)。这种做法减少了我们对语言模型(LM)固有能力的依赖,而是通过外部工具或语义反馈来进行增强。虽然这种方法颇具优势,但它们还是基于条件反射,缺乏人类在解决问题时所表现出的深思熟虑和策略性决策特质(Sloman, 1996; Evans, 2010)。特别是,它们未能考虑多种推理路径或进行预先的规划。然而,近期的研究通过搜索多条思维路径来应对这一挑战(Xie 等人,2023; Yao 等人,2023a; Hao 等人,2023),这种以搜索为引导的大语言模型工作使得规划成为可能。尽管如此,这些方法还是孤立运作,没有融入外部反馈来进一步完善推理过程。
为了应对这些挑战,我们提出了一种名为 LATS(语言代理树搜索)的通用决策和推理框架。LATS 将语言模型(LM)的规划、行动和推理策略整合在一起,通过在可能的推理和行动步骤的组合空间进行搜索,拓展了 ReAct(Yao 等人,2023b)。我们借鉴了基于模型的强化学习领域的蒙特卡洛树搜索方法(MCTS)(Silver 等人,2017;Anthony 等人,2017;Jiang 等人,2018),并将其应用于语言代理,将一个预训练的大语言模型转化为代理、价值函数和优化器的角色。借助现代 LM 强大的自然语言理解和上下文学习能力,我们使用文本作为框架各部分之间的界面,使 LATS 能够适应环境变化而无需额外训练。据我们所知,LATS 是首个结合了推理、行动和规划的框架,用以提升大语言模型的性能。特别地,LATS 使得 GPT-3.5 在 HotPotQA(Yang 等人,2018)的表现翻倍,超过了 ReAct(Yao 等人,2023b),并将 WebShop(Yao 等人,2022)的平均分数提高了 22.1 分。在结合 GPT-4 使用时,LATS 在 HumanEval(Chen 等人,2021)上的编程任务中达到了 94.4% 的 Pass@1 率,刷新了行业最高纪录。我们的主要贡献总结如下:
-
• 我们创新性地提出了一种基于 LM 的蒙特卡洛树搜索变体,通过精心设计动作样本来构建最优路径,这比传统的反射式提示方法更加灵活和适应性强,整个过程受到 LM 启发式原则的引导。
-
• LATS 通过结合外部反馈和自我反省,增强了模型的敏感性,并且使代理能够从实践中学习,这使得它在推理搜索方法上有了质的飞跃。
-
• 我们在编程、互动式问答以及网页导航等多个领域进行了实验,展示了 LATS 利用大语言模型进行独立推理和决策的多才多艺。1
2 相关研究
方法 | 自我调整 | 记忆力 | 推理能力 | 决策力 | 规划力 |
---|---|---|---|---|---|
精炼 | 制定 | ||||
CoT (魏等人,2022) | ×times× | ×times× | ✓ | ×times× | ×times× |
ReAct (姚等人,2023b) | ×times× | ×times× | ✓ | ✓ | ×times× |
ToT (姚等人,2023a) | ×times× | ×times× | ✓ | ×times× | ✓ |
RAP (郝等人,2023) | ×times× | ×times× | ✓ | ×times× | ✓ |
自我精炼 (马达安等人,2023) | ✓ | ×times× | ✓ | ×times× | ×times× |
波束搜索 (谢等人,2023) | ✓ | ×times× | ✓ | ×times× | ×times× |
反思 (申等人,2023) | ✓ | ✓ | ✓ | ✓ | ×times× |
LATS (我们的研究) | ✓ | ✓ | ✓ | ✓ | ✓ |
表 1: 涉及推理、决策和规划的相关研究工作概述。LATS 是首个融合了这三个域的设计的研究,使其可用于所有相关的任务。
a) 思维之树
b) 规划中的推理
c) 语言代理树搜索技术
图 2: 提供了 LATS 与最近提出的 LM 搜索算法 ToT (姚等人,2023a) 和 RAP (郝等人,2023) 之间的比较概览。LATS 利用环境反馈与自我反思不断调整搜索策略,从而提升了性能。
大语言模型在推理任务中的应用。大语言模型处理推理任务通常需要先将复杂的问题分解成一系列逐步的中间步骤,然后才能给出最终答案(Cobbe 等人,2021)。这一过程常常通过所谓的 “链式思考”(Chain-of-Thought,简称 CoT)提示技术来实现(Wei 等人,2022),及其不同的变种(Wei 等人,2022; Kojima 等人,2022; Wang 等人,2022)。但是,这些在一步之内自动形成推理链条的方法,随着步骤的增加很容易发生错误累积(Guo 等人,2018; Chen 等人,2022b)。为了解决这一问题,研究者提出了多种改进方案:一些方法例如 “自我一致性”(Self-Consistency)(Wang 等人,2022)采用对多个推理链进行多数投票的方式;其他方法则关注于步骤的多阶段分解,比如 “由浅入深” 提示(least-to-most prompting)(Zhou 等人,2022),或者借助外部辅助工具,如草稿纸(scratchpad)(Nye 等人,2021)或编译器(Gao 等人,2022)。最新的研究通过搜索算法来增强链式思考的效果(Yao 等人,2023a; Hao 等人,2023; Besta 等人,2023),这些算法可以更加有效地选择推理路径。例如,“思维树”(Tree-of-thought,简称 ToT)提示技术(Yao 等人,2023a)采用基于深度或广度优先搜索的方法,并且由语言模型生成的启发式规则来指导搜索;而 “通过规划推理”(Reasoning via Planning,简称 RAP)(Hao 等人,2023)则是利用蒙特卡洛树搜索法,通过语言模型模拟的探索来进行。
即便如此,这些框架还是只依赖于语言模型内部的知识库,还没有能力适应外部信息,而这些外部信息可能对提升推理过程会有所帮助。
大语言模型在决策制定中的应用。大语言模型以其出色的逻辑推理和常识判断,已经被用于交互式环境中决策策略模型的任务。在机器人技术领域内,大语言模型扮演着高层次控制策略的角色(Ahn 等人,2022;Huang 等人,2022;Driess 等人,2023)。此外,也有研究将大语言模型运用于复杂的多模态游戏,比如 Minecraft(Baker 等人,2022;Wang 等人,2023;Zhu 等人,2023;Guss 等人,2019;Fan 等人,2022)。大语言模型在文本为基础的环境中表现尤为出色(Liu 等人,2018;Shridhar 等人,2020;Liu 等人,2023),在这些环境下,像 ReAct(Yao 等人,2023b)这样的行为提示技术也取得了显著成效。然而,类似于 CoT,ReAct 的简单性限制了其适应不同环境条件的能力。为此,提出了诸多改进措施,包括 Self-refine(Madaan 等人,2023)和 Reflexion(Shinn 等人,2023;Yao 等人,2023c),它们利用自我反思来增强推理和决策能力,以及 AdaPlanner(Sun 等人,2023),这一工具融合了环境的正反馈。尽管如此,这些方法侧重于优化单一计划或路径,而未在每个决策点考虑不同选项。
在纯决策环境之外,通过连接外部工具,例如 API、搜索引擎、计算器或其他模型(Schick 等人,2023;Shen 等人,2023;Surís 等人,2023),大语言模型的推理和实践能力得到了提升。但与基于推理的方法不同,这些方法并没有通过规划来提升效果,这在一定程度上限制了它们的实际应用。
树状搜索法在决策规划算法(参见 Świechowski 等人,2023; LaValle 等人,2001)和强化学习(RL)(参见 Hafner 等人,2019; Du 等人,2023; Wu 等人,2023)中非常流行,因为它能够很好地平衡探索与利用之间的关系。虽然树状搜索通常需要依赖于能够展开任意状态的环境模型(参见 Vodopivec 等人,2017),这在强化学习中往往意味着需要额外培训(参见 Hafner 等人,2023)。但在大语言模型(LLM)的任务中,这个问题并不存在,因为我们可以简单地通过设置输入内容为上下文和大语言模型之前的输出来恢复到任意状态。因此,我们采用了树状框架,并应用蒙特卡洛树搜索法(MCTS)(参见 Świechowski 等人,2023)来最大化释放大语言模型的能力,并且通过借助大语言模型的上下文学习特性(参见 Brown 等人,2020),我们避免了在语言描述上训练价值函数所带来的成本。
3 入门知识
在我们深入了解 LATS 之前,先来设定我们的研究问题,并简要介绍一些成熟的方法,这些方法通过大语言模型来进行推理或做出决策。在使用语言模型(LM)进行推理或决策的过程中,我们会有一个用自然语言表述的输入 x 和一个由参数 θ 确定的预训练语言模型 pθ(x)。我们的目标是生成一个最终输出 y∼pθ(x),这个输出可能是解答(推理过程)或者是执行某项任务(决策过程)。x 和 y 都是由一串 tokens 构成的语言序列,tokens 是构成自然语言的基本单位,通常是单词,分别表示为 x=(x[1],…,x[n]) 和 y=(y[1],…,y[n])。语言模型会自动回归地解码文本,也就是说,在没有其他输入的情况下,语言模型生成一个序列 x 的概率可以通过 pθ(x)=∏i=1npθ(x[i]∣x[1…i−1]) 来计算。为了提高语言模型的效果,我们通常会提供一些提示(prompts)来辅助输入 x,这些提示可能是具体的指令或者是几个输入输出的示例。我们把输入 x 转换为输出 y 的这个过程称为:y∼pθ(y∣prompt∗IO(x)),其中 prompt∗IO(x) 代表输入 x 以及相应的提示信息。
链式思考(Chain-of-thought,简称 CoT)提示法(Wei et al., 2022)是为了应对那些从 x 直接映射到 y 比较困难的场景而提出的,比如说 x 是一个数学问题或者其他复杂的问题。这种方法依靠创建一连串的思考点 z1,…,zn,这些思考点作为从 x 到 y 的跳板;每一个思考点 zi 都是一个语言序列。使用 CoT 提示时,这些思考点会被顺序地提取出来,形成 zi∼pθCoT(zi∣x,z1⋯i−1),最后得到的输出则是 y∼pθCoT(y∣x,z1⋯n)。
树状思维提示(ToT)(Yao 等人,2023a)是在连续推理(CoT)提示的基础上发展起来的,它通过探索多条推理路径来拓展思考的深度。这种方法将问题视作在一个树形结构中的搜索,每个节点 s=[x,z1⋅i] 代表了一个包括初始输入 x 和一系列思考步骤 z1⋯i 的部分解决方案。这些思考步骤 zi 是通过模仿 CoT 提示的方式生成的,即 zi∼pθCoT(zi∣x,z1⋯i−1)。然后使用系统性的搜索算法,如广度优先或深度优先搜索,来彻底探索这棵树,搜索过程会受到基于语言模型对每个状态评估 V(s) 的启发式规则的指引。
计划式推理(RAP)(Hao 等人,2023)和 ToT 的思想相似,但它采用的是蒙特卡洛树搜索(MCTS)而非深度或广度优先搜索。这里的启发式规则是基于语言模型(LM)设计的,如行动的可能性或置信度,而且在模拟步骤中,LM 被当作一个 “世界模型” 来预测接下来可能发生的状态。
ReAct(Yao 等人,2023b)将语言模型的应用范围扩展到需要与外部环境进行交互的任务,比如游戏或 API。这种技术创造了一个包含允许的动作 a 和来自 CoT 的推理轨迹 z 的动作空间 A^=A∪Z。环境中的观察 o 被用来增强推理和行动。为了使用 ReAct 解决问题,在每次环境观察之后,动作会依次从 pθ 生成,即 ai∼pθReAct(ai∣x,o1⋯i−1,a1⋯i−1),最终输出结果为 y∼pθReAct(y ∣ x,o1⋯n,a1⋯n)。
尽管我们先前提到的各种提示技巧可以提升大语言模型在逻辑推理任务上的效果,但在需要多角度决策的复杂任务面前,这些技术似乎就不那么给力了。这主要是因为以下几个问题:1) 灵活性不足:如 CoT 或 ReAct 这样的基础提示方法会按顺序从大语言模型中获取信息,但却忽视了从特定状态出发的其他可能性。2) 缺乏实际感知:依赖推理的方法,比如 CoT、RAP 或 ToT,仅仅依赖模型内部的处理机制,而不能吸纳外部的信息。这种过度依赖可能会引起错误信息的连锁反应,也限制了模型性能的提升空间。3) 适应性差:现行的规划框架,例如 RAP 或 ToT,要么是使用基础的搜索算法,比如广度优先搜索(BFS),要么就是不能很好地利用环境反馈来完善规划策略。再者,现有的代理无法利用之前的经验进行学习,也无法通过尝试和错误来自我优化。即便 RAP 采用了蒙特卡罗树搜索(MCTS)这样的策略,但其应用也受限于大语言模型能否充当一个世界模型并准确预测未来状态。正是这些局限性,推动了我们去探索 LATS,以期将大语言模型打造成为一个通用的问题解决工具。
4 整合规划、推理和行动
“`【oaicite:0】
4.1LM 代理
LATS 能够支持基于 ReAct 的序列推理或决策任务。在时间步骤 t 中,代理从环境中接收到观测 ot∈O,并且依据某种策略 π(at∣x,o1⋯t−1,a1⋯t−1) 做出行动 at∈A。这里的 x 包括了任务指示和一些少数案例。我们以 pθ 初始化代理,这样就可以利用大语言模型作为初始决策者的有效语言表示。我们遵循 ReAct 的实例化方式,其动作空间 A^=A∪Z 不仅包括允许的动作空间 A,还有推理过程中的语言空间 Z。动作直接对环境产生影响并引发观测,而思维则用于通过组织信息、计划未来的行动或引入内部知识来形成决策。动作空间的具体形式取决于特定的环境;在决策任务中可能是网站上的命令,在推理任务中可能限于几个外部工具或 API。
我们不会只贪婪地解码一个单一路径或解决方案,而是根据当前状态从 pθ 中抽取 n 个可能的行动。这种做法基于一个理念,即对于复杂的决策任务,往往存在多种可能正确的路径或推理方式(Evans, 2010)。在每一步骤中抽取多种可能性,有助于减轻大语言模型文本生成的随机性,并且能在决策和推理空间中进行更广泛的探索。我们将 pθ 嵌入我们提出的搜索算法中,有意识地从抽样的行动中构建出最佳的路径。
4.2LATS
图 3: LATS 操作流程概览。在这个过程中,首先选定一个节点,然后对其进行拓展、评估,并模拟操作直到触及一个终结点,随后把模拟结果反向传播用于后续决策。如果模拟的路径不成功,就会产生一个 “反思” 过程,为将来的尝试提供额外的上下文信息。这些步骤会一直重复,直到用尽预算或者成功解决问题。
LATS 的核心是一个搜索算法,它负责用精心规划的方式控制解决问题的整个过程。为了锁定最有潜力的路径并在探索新领域与加强已知领域间取得平衡,我们采用了一种蒙特卡洛树搜索的改进版,将决策过程比作一种树状搜索。在这个搜索树中,每个节点 s=[x,a1⋯i,o1⋯i] 都代表一个具体的场景,包含了原始输入 x、一系列动作 a1⋅i 和观察 o1⋅i。LATS 利用指令和上下文学习,将 pθ 变为一个代理人、状态评估器和反馈生成器,用现代大语言模型中的语言先验来帮助规划。LATS 包括了一系列操作:选择、扩展、评估、模拟、反向传播和反思,这些步骤会依次执行,直到成功完成任务或达到设定的计算上限。你可以在附录的第 A 节找到 LATS 的完整伪代码。
选择环节。在这个阶段,算法将确定当前搜索树中哪一部分最适合进行下一步的拓展。从表示初始状态的根节点 s0 开始,在树的每一层选择一个子节点,直至到达一个叶子节点。为了做到探索与加强之间的平衡,我们采用了 “树上的上置信界(UCT)” 算法(Kocsis & Szepesvári, 2006),这个算法帮助我们选择节点
UCT(s)=V(s)M(s)+wlnN(p)M(s)text{UCT}(s)=frac{V(s)}{M(s)}+wsqrt{frac{ln N(p)}{M(s)}}UCT(s)=M(s)V(s)+wM(s)lnN(p) |
这里 N(s) 表示节点 s 被访问的次数,V(s) 是节点 s 的价值,w 是探索过程中的权重,p 则是节点 s 的父节点。在每一层,系统都会选择具有最高 UCT 值的子节点进行下一步操作。
扩展。在选定一个节点后,下一步是扩展树结构。具体做法是从 pθ 中抽取 n 个可能的动作,正如前文所述。环境接收这些动作,并以观察结果作为反馈。这样,树上就新增了 n 个子节点。这棵树被储存在一个外部的长期记忆库中。
评价。第三步,我们为每个新节点赋予一个数值,这个数值用于之后的选择和反向传播过程。这个数值实际上反映了智能体完成任务的进度,并作为启发式的指导,帮助搜索算法指向树中最有潜力的部分。参考 Yao 等人的研究(2023a),我们将 pθ 转换为一个评估函数,让它通过提示来推理某个特定状态。为了得到一个数值,我们让 pθ 在其推理过程的最后给出一个分数,以此来评价路径的正确性。这种方法比起传统的编程启发式(Campbell 等人,2002)更加灵活,也比学习启发式(Silver 等人,2017)更高效。
模拟。第四步是对当前选中的节点进行扩展,直到到达一个终点状态。在每个深度层次,我们都会采用相同的操作来对节点进行采样和评估,但会优先考虑那些价值最高的节点。达到终点状态可以客观地反馈路径是否正确。如果任务成功完成,LATS 就会停止搜索。如果解决方案部分成功或失败,我们会执行接下来所描述的两个额外步骤。
反向传播。这一步根据路径的结果来更新树的数值。对于路径中的每一个节点,我们会根据模拟的结果来更新它的数值。
反思。除了从环境中获得的反馈,我们还利用自我反思来优化决策过程(Shinn 等人,2023; Madaan 等人,2023)。当遇到一个失败的终点节点时,我们会让 pθ 根据路径和最终结果进行自我反思,总结错误并提出更好的方案。这些失败的路径和相关的反思被记录在记忆库中。在后续的过程中,这些信息会作为额外的上下文融入智能体和评估函数中,通过在上下文中学习来进行改进。这样的方法提供了一个比单一数值更有用的语义梯度信号,帮助智能体通过尝试和错误来学习,而不需承担像强化学习那样高成本的优化过程。
从理论上讲,LATS 作为一个大语言模型代理在推理和决策上的通用框架,拥有如下几点优势:(1)通用性:LATS 为推理和决策任务提供了一个统一的思考与行动空间。(2)深思熟虑:通过蒙特卡洛树搜索(MCTS)与大语言模型的价值功能,LATS 能有原则地进行搜索,挑选出价值高的选项,并且探索那些看似有潜力的其他可能性。(3)适应性强:LATS 的设计考虑了通过观察和自我反省的外部反馈,这使得它在解决问题的过程中能更好地适应变化。(4)灵活性:通过改变状态设计和树结构的维度,LATS 能够适应不同的场景、环境和资源条件。(5)模块化设计:LATS 中的基础大语言模型代理、反思生成器和价值函数都可以独立修改,以适应特定的大语言模型特性。
5 实验
为了展示 LATS 的广泛适用性,我们在多个决策领域进行了方法评估:编程(Chen 等人,2021;Austin 等人,2021),HotPotQA(Yang 等人,2018)和 WebShop(Yao 等人,2022)。
5.1HotPotQA
我们来看一个任务,既可以通过推理解决,也可以通过行动来解决,即 HotPotQA(杨等人,2018),这是一个多步骤问答基准测试,需要检索两个或更多维基百科文章来回答问题。在行动空间方面,除了借助大语言模型(LM)进行思考外,我们还参考了 Yao 等人(2023b)的设定,允许代理使用 API 调用来搜索和查找信息。这些 API 调用的结果和自我反思构成了观察空间。我们选取了 100 个问题的子集,并对每种方法使用了三个小样本示例。对于 ToT 策略,我们采用了深度优先搜索(DFS)作为基本搜索算法,并使用 LM 作为启发式评分工具。对于所有涉及采样的方法,比如 LATS,我们采样了 k=50 个轨迹。更多的细节和提示可以在附录的 C 节和 D 节找到。
我们通过从上下文中移除行动和观察来评价内部推理策略,涉及到 CoT(魏等人,2022)及其变体 CoT-SC(王等人,2022),ToT(姚等人,2023a),以及 RAP(郝等人,2023)。这些方法仅依赖于代理的既有知识来解答问题。我们还研究了基于行动的方法,如 ReAct、Reflexion 和 LATS,这些方法通过交互式 API 环境增强了代理的信息检索能力。尽管 LATS 是为了适应外部反馈能够提升推理的场景而设计的,我们还实现了一个仅限推理的版本,使用 CoT 作为基本提示。在 LATS 中,我们还尝试了结合内部和外部推理的方法:先用基于 CoT 的提示进行尝试,如果失败了,再转而使用基于 ReAct 的提示。这种方法更类似于人类解决问题的方式,即当答案不是已知的时,才会利用工具去查找额外的信息。
提问方式 | HotpotQA (精确匹配得分) |
---|---|
I/O | 0.32 |
CoT (Wei 等人,2022) | 0.34 |
CoT – SC (Wang 等人,2022) | 0.38 |
ToT (Yao 等人,2023a) | 0.55 |
RAP (Hao 等人,2023) | 0.60 |
RAP (n = 10) | 0.60 |
LATS (CoT) | 0.60 |
提问方式 | HotpotQA (精确匹配得分) |
---|---|
ReAct (Yao 等人,2023b) | 0.32 |
ReAct (最佳 k 次) | 0.38 |
Reflexion (Shinn 等人,2023) | 0.51 |
LATS | 0.61 |
LATS (n = 3) | 0.56 |
LATS (n = 10) | 0.64 |
LATS (CoT + ReAct) | 0.71 |
SOTA (Zhu 等人,2021) | 0.675 |
表 2: 在 HotpotQA 问题解答平台上,GPT-3.5 的推理式提示(左侧)与行动式提示(右侧)的对比结果显示,LATS 在行动式提示上取得最高的精确匹配得分,并在推理上也展现出竞争力。除非特别指出,我们通常会在每个决策节点扩展 5 次,并且探索 50 种可能的路径。
图 4: 展示了在 HotpotQA 数据集上,ReAct(左侧)与 LATS(右侧)的决策路径比较。LATS 能够考虑到更多的行动选择,并有效避免重复先前的错误。
结果分析。在表 2 中,我们发现内部推理与外部检索策略在 HotPotQA 测试中都有出色表现。这得益于现代大语言模型庞大的训练语料,它们已经内置了大量事实知识,使得模型经常能够直接准确回答问题。尽管链式推理(CoT)对于那些需要深层推理的问题能够小幅提升效果,但通过思考的线索(ToT)和迅速获取响应(RAP)这样的搜索方法能够带来更明显的提升,因为这些方法能够探索更多可能的答案。在基于模拟行动的方法上也观察到了相似的趋势。长期行动策略(LATS)通过原则性搜索扩展更多的可能路径,在抽样相同数量的可能性时,也表现得比反应行动策略(ReAct)更加出色。这一点通过调整 n 的值得到证实,n 代表每轮迭代中扩展的可能路径数量。提高 n 的值能够持续改善性能,但相应地也会增加计算和推理的成本。在内部推理方面,LATS 与 RAP 相当,但在模拟行动方面表现不如后者。然而,LATS 结合了内部和外部推理,其性能超越了目前通过监督学习得到的最佳效果,这强调了即便是基础语言模型已经能够处理的任务,外部反馈也对增强推理过程至关重要。
5.2 编程领域
提示方式 | 模型 | 一次通过率 |
CoT(Wei 等人,2022) | GPT-3.5 | 46.9% |
ReAct(Yao 等人,2023b) | GPT-3.5 | 56.9% |
Reflexion(Shinn 等人,2023) | GPT-3.5 | 68.1% |
ToT(Yao 等人,2023a) | GPT-3.5 | 54.4% |
RAP(Hao 等人,2023) | GPT-3.5 | 63.1% |
LATS(我们研究) | GPT-3.5 | 86.9% |
I/O | GPT-4 | 80.1% |
Reflexion | GPT-4 | 91.0% |
LATS | GPT-4 | 94.4% |
提示方式 | 一次通过率 |
---|---|
CoT(Wei 等人,2022) | 54.9% |
ReAct(Wei 等人,2022) | 67.0% |
Reflexion(Shinn 等人,2023) | 70.0% |
ToT(Yao 等人,2023a) | 65.8% |
RAP(Hao 等人,2023) | 71.4% |
LATS(我们研究) | 81.1% |
表 3:GPT-3.5 和 GPT-4 在编程任务 HumanEval(Chen 等人,2021)和 MBPP(Austin 等人,2021)上的一次通过准确性。采用我们研发的 LATS 提示方式能够实现最优表现。在每次迭代扩展时,我们抽样了 5 个可能的解决方案,总共进行了 8 次迭代。
为了验证外部观察对解决复杂推理问题的重要作用,我们采用了 Humaneval(Chen 等人,2021)和 MBPP(Austin 等人,2021)两个编程数据集来测试基准方法和 LATS。这两个数据集通过自然语言编写的文档字符串来评估 Python 程序编写的正确性。我们将单独的解决方案作为动作空间,测试套件和编译器的反馈作为外部观测。我们跟随 Chen 等人(2022a)的研究,利用大语言模型为每个问题生成一组语法正确的 “断言(assert)” 语句,作为合成测试套件。在每个步骤中,解决方案都会在这组测试套件上进行评估,包括成功和失败的测试结果以及编译器的输出,这些都会作为观察结果加入到上下文中。Reflexion 也采用同样的测试套件。
在这项任务中,推理和行动基准使用相同的动作空间,但行动方法可以将观察结果作为附加上下文来使用。对于 LATS 来说,因为每个动作都对应一个完整的解决方案,我们省去了模拟步骤,直接以通过测试的百分比作为反馈奖励。我们进行了 8 次迭代,设置 4 个生成的测试,并在扩展时抽取 5 个解决方案样本。搜索结束后,我们会挑选出估值最高的解决方案,并在实际的测试套件上进行 pass@1 准确度评估。更多的细节和指导可以在附录的 C 节和 E 节中找到。
结果显示,在表 3 中,我们发现搜索和语义反馈对提升性能至关重要。即便没有采用观察数据,ToT 和 RAP 也能与 Reflexion 相媲美。LATS 在两个数据集上表现最佳。RAP 和 LATS 使用了类似的搜索算法,这进一步强调了外部反馈在编程等复杂推理任务中的重要性。通过使用 GPT-4,LATS 在 HumanEval 上取得了前所未有的高性能,这证明了 LATS 能够与更高级的大语言模型结合,实现更优异的性能。
5.3 网上购物
我们研究了一个名为 WebShop (Yao 等人,2022) 的复杂决策环境,它涉及实际应用。这是一个由网站组成的在线购物环境,内含约 118 万个真实商品和 12000 条用户指令。代理需要根据多种指令在网站上搜索并购买符合用户需求的商品。我们利用了一个包括搜索、点击以及浏览器反馈和反思等预先构建的动作空间来进行观察。性能评估根据两个标准:平均得分显示选中商品有多少百分比符合用户的指定属性;成功率则显示选中商品完全满足所有条件的频率。我们将此方法与基于行动的提示方法和基于强化学习的方法进行了对比。我们根据 50 条指令进行了评估,在 LATS 中扩展了 n=5 个分支,并且为 LATS、ReAct 最优的 k,以及 Reflexion 设置了 k=30。更多的详情和提示可以在附录的 C 节和 F 节找到。
结果显示,在表 5 中,结合 ReAct 的 GPT-3.5 在模仿学习方面表现出了相当的竞争力,甚至能够通过更加精细的提示策略超越传统的强化学习技术。采用 ReAct 和 Reflexion 抽样出的 k=30 条路径性能相似,这表明在如 WebShop 这样的复杂环境中,语义反馈并没有预期的帮助。正如 Shinn 等人在 (2023) 的研究中发现的那样,我们也观察到生成的反思往往较为泛泛,并不能提供有价值的反馈,这使得代理有时会陷入无法前进的困境。然而,使用 LATS 的确显著提高了性能,这表明它在相同迭代次数下实现了更有效的探索。
5.4 额外发现
表 4: Webshop 的评分与成功率 (SR) 对比。该表格将提示方法、基于强化学习(RL)的训练和人类表现进行了分类。在相同的迭代轮数下,LATS 不仅提高了评分和成功率,还超越了基于强化学习的训练方法。IL/IL+RL 的数据引用自 Yao 等人的研究 (2022)。
方法 | 得分 | 成功率 |
---|---|---|
ReAct (Yao 等人,2023b) | 53.8 | 28.0 |
ReAct (最优的 k 选择) | 59.1 | 32.0 |
反射行为 (Shinn 等人,2023) | 64.2 | 35.0 |
LATS | 75.9 | 38.0 |
互动学习 (IL) | 59.9 | 29.1 |
互动学习 + 强化学习 (IL+RL) | 62.4 | 28.7 |
专家水平 | 82.1 | 59.6 |
提示方法 | HotPotQA (精确匹配) |
---|---|
LATS (不使用语言模型启发) | 0.37 |
LATS (深度优先搜索) | 0.42 |
LATS (不进行自我反思) | 0.56 |
LATS 完整版 | 0.61 |
表 4: 展示了 Webshop 任务中的评分与成功率 (SR) 对比,对比内容包括提示方法、基于强化学习的训练,以及人类的表现。在进行相同轮数的迭代后,LATS 在提升评分和成功率方面均表现优越,且超过了基于强化学习的训练效果。IL/IL+RL 的数据引用自 Yao 等人的研究 (2022)。
表 5: 对 LATS 在 HotPotQA 上的各部分进行的细分实验概述;我们采用了 ReAct 作为基础提示方法,并对子选项 n=5 以及最大路径选择 k=50 进行了抽样。LATS 要求每个部件和操作都要精确无误以获得最优性能。语言模型评估器对于 LATS 来说至关重要,因为它需要这种启发式方法来指导搜索过程。自我反思同样重要,因为它为优化过程提供了附加的信号。使用蒙特卡洛树搜索 (MCTS) 相较于深度优先搜索 (DFS) 也带来了显著提升。
此外,我们还在 HotPotQA 上进行了其他实验,以检验 LATS 各个组件的效果。我们选择 HotPotQA 作为实验场景,因为它融合了逻辑推理(通过思考)和动作执行(通过 API 调用)的能力;具体结果展示在表 5 中。
LM 价值函数。大语言模型(LM)价值函数是根据预期的未来收益来评估不同状态。没有这一策略,指引搜索的唯一线索就只能依赖于完成任务后稀缺且通常为是非(二元)的环境奖励。研究发现,去掉评估环节会导致性能显著下降 −0.34。
自我反思。通过自我反思,我们为代理和搜索算法提供了额外的语义信息。实验证明,没有自我反思的 LATS 性能会轻微下降 0.04,显示其有效性。相比之下,Reflexion(Shinn et al., 2023)在 ReAct(Yao et al., 2023b)基础上取得的进步要大一些,如表 2 所示,这表明自我反思与搜索在改进问题解决方面有一定的重叠。
搜索算法。MCTS 作为一种搜索算法,原则上比 A* 或者 DFS 更加先进,但同时也更慢,需要更多大语言模型的推断调用。通过实践,我们采用了 DFS,并引入了在 ToT(Yao et al., 2023a)中使用的基于 LM 的启发式方法,对低价值的分支进行剪枝。这个过程中去掉了选择和反向传播步骤,结果表明性能有明显的下降 −0.19。
6 结论
在本研究中,我们推出了语言代理树搜索(LATS),这是首个集规划、行动和推理为一体,用于提升大语言模型解决问题能力的框架。LATS 通过精心设计搜索算法构建的路径、融合外部反馈,并允许代理从经历中学习,克服了以往提示技术的主要局限。我们的评测显示,LATS 能够充分发挥大语言模型在各类推理和决策任务中的能力,且无需额外训练。提出的搜索、交互和反思的合作机制,为自主决策提供了多元化的解决方案,突出了大语言模型作为多面手代理的可能性。对于 LATS 的局限性和更广泛的影响,可以在附录的第 B 节找到详尽的讨论。
致谢
我们感谢 Daniel Campos 对本文初稿提出的宝贵意见和反馈。
参考文献
7 附录
附录的内容安排如下:首先,第 A 节提供了我们所提出的 LATS 算法的伪代码;其次,第 B 节深入讨论了我们的方法、存在的局限、未来发展方向以及可能带来的广泛影响;再次,第 C 节详述了我们实验中使用的环境设置;最后,在第 D 节(HotPotQA)、第 E 节(编程)和第 F 节(网上商店)分别列出了在三种不同环境中使用的实验提示。
附录 A LATS 伪代码
算法 1 展现了我们设计的 LATS 算法伪代码。算法中涉及的节点数据被明确地保存在内存中。如果没有特别说明,在所有实验中我们默认设置为 n=5 和 w=1。
算法 1 LATS(S0,pθ,pQ,pref,d,k,n,w)
定义初始状态 s1, 动作生成器 pθ, 价值函数 pQ, 反思生成器 pref, 生成的动作数 n, 深度限制 L, 滚动操作次数 K, 上下文信息 c, 以及探索偏好权重 w
设定动作空间 A, 观测空间 O
初始化状态 – 动作价值函数 pQ:S×A↦R 和访问计数器 M:S↦N 的初始值为零
for $$kleftarrow 0,dots,K-1$$ do
for $$tleftarrow 0,dots,L-1$$ do
if $$s_{t}$$ not terminal then
for $$ileftarrow 1,dots,n$$ do
Sample $$a_{t}^{(i)}sim p_{theta}(amid s_{t})$$
Get $$o_{t}^{(i)}$$ from environment, $$s_{t+1}^{(i)}leftarrow(c_{t}^{(i)},o_{t}^{(i)},a_{t}^{(i)})$$, $$c_{t+1}^{(i)}leftarrow(o_{t}^{(i)},a_{t}^{(i)})$$
Evaluate $$v_{t}^{(i)}sim p_{Q}(s_{t}^{(i)})$$
$$v(s_{t})leftarrow v_{t}^{(i)}$$
Add $$s_{t}^{(i)}$$ to children
end for
end if
if $$s_{t}$$ is terminal then
Get $$r_{t}$$ from environment
if $$r_{t}$$ not success then
$$text{reflection}leftarrow p_{text{ref}}(c_{t})$$
$$cleftarrowtext{reflection}$$
end if
end if
$$a_{t}leftarrowargmax_{ain e(s_{t})}left[frac{v(s_{t})}{M(s_{t})}+wsqrt{frac{ln M(s_{t-1})}{M(s_{t})}}right]$$
$$M(s_{t+1})leftarrow M(s_{t+1})+1$$
if $$a_{t}$$ is an output action then break
end for
$$Tleftarrow$$ the actual number of steps
for $$tleftarrow T-1,dots,0$$ do
Update $$Q(s_{t},a_{t})$$ with $${r_{t},r_{t+1},dots,r_{l}}$$
end for
end for
附录 B 讨论
局限性。LATS 虽然能增强推理与决策过程,但这同时也意味着更高的计算成本。相较于标准的提示方法或更简单的技术,LATS 的搜索过程耗时更长,推理成本更高。在实际应用中,对于编程等复杂任务,或者在追求性能优于效率的场景下,我们推荐使用 LATS。我们期待随着大语言模型技术的不断进步,未来 LATS 的成本会降低,实用性会增强。
广泛影响。LATS 是一个通过与环境交互来提升大语言模型性能的框架。这种在自动决策方面的提升可能被用于不良用途。另一方面,LATS 通过多轮的决策与反思,能够产生易于理解的、高层次的语言推理与行动,从而提高了模型的可解释性和与人类价值观更好的对齐潜力,这一点是通过简单依赖底层的符号值所无法达到的。
附录 C 环境详述
C.1HotPotQA
HotPotQA(杨等人,2018)是一个问答型数据集,它要求参与者通过多份参考文献的推理来解答问题。该数据集包含了 113,000 个问题与答案对,这些都是基于维基百科并由网络众包人员设计,旨在体现问题的多样性、层次性以及可解释性。问题范围广泛,包括询问关于实体、地点、日期,或是比较两个实体的共同特征等。众包工作者同时提供支撑答案的事实依据。我们采用了 HotPotQA 的标准测试环境,利用维基百科的段落来测试信息检索能力。我们的实验中随机选取了 100 个问题,并设置了 6 步的最大深度限制。
行动空间。我们运用了由姚等人在 (2023b) 中提出的维基百科 Web API,它支持三种互动式信息检索行为:
(1) search[entity],如果该实体的维基页面存在,此动作会返回该页面的前 5 个句子;如果不存在,则提供五个最接近的搜索建议,
(2) lookup[string],此动作会返回包含特定字符串 string 的下一句话,
(3) finish[answer],用这个动作可以提交当前任务的答案。
这些 API 调用和自由组合的想法共同构成了这一环境的行动范围。
C.2 编程浅谈
人工评估数据集(由 Chen 等人于 2021 提出)汇集了 164 个手工编写的编程难题,用以检验模型在根据自然语言描述编写程序方面的准确性。每个难题都包含了函数签名、说明文档、参考实现以及多项单元测试,平均每个难题约有 7.7 项测试。这些编程任务测试了对自然语言的理解、推理能力、算法知识和基础数学能力,其难度与基础的软件面试题相媲美。难题的解决率是通过生成每个问题的 k 个样本,并判断如果有任何一个样本通过了所有测试就视为问题解决的 pass@k 指标来评估的。在我们的实验中,我们采用了这 164 个问题,并设置了最多 8 层的深度限制。
大部分基础编程问题(MBPP)基准测试(由 Austin 等人于 2021 提出)则包含了 974 个用来测试程序合成技术的简短 Python 函数问题。这些数据是通过拥有基础 Python 知识的群体众包而来的。每个问题都包含一段自然语言描述的编程任务、一个参考实现解决方案以及三个测试用例来确保功能的正确性。这些自然语言的提示通常都是简短的单句描述。解决方案通常涉及常见的编程概念,如数学运算、列表处理、字符串操控及 Python 标准库的使用,平均每个解决方案有 6.8 行代码。此外,数据集还特别增加了 426 个问题,这些问题已通过手工核实,确保了要求的明确性、标准的函数签名和准确的测试案例。在我们的实验中,我们随机选取了其中的 397 个问题作为研究的子集。
C.3 WebShop
WebShop(姚等人,2022)是一个互动的网络环境,专门设计用来评测代理在理解具体语境下的语言以及决策能力。它模拟了一个电商购物场景,代理可以在这里访问超过一百万个来自亚马逊的真实商品,覆盖了 5 个大类和 113 个小类。这些商品包含了丰富的语言信息,平均文本长度为 262 词,拥有 224 千词汇量。另外,超过 80 万个独一无二的商品选项可以个性化定制。这个环境有两种网页呈现方式:HTML 模式提供可以交互的像素级显示;而简易模式则将原始 HTML 转换为结构化文本,这种格式更适合于代理的训练。动作空间包括查询搜索和点击按钮,这些操作可以在四种不同的页面类型中切换:搜索页、结果页、商品页和商品详情页。指令是通过众包方式采集的自然语言,用于描述产品的特性和选项,总共收集了 12000 条指令。代理根据指令购买的商品与其特性和选项的匹配程度,来计算自动奖励,这一过程涉及到词汇匹配和语义相似性的评估。
类型 | 参数 | 状态 →rightarrow→ 下一个状态 |
---|---|---|
搜索 | [查询词] | 搜索页 →rightarrow→ 结果页 |
选择 | 返回搜索 | *** →rightarrow→ 搜索页 |
选择 | 上一页 / 下一页 | 结果页 →rightarrow→ 结果页 |
选择 | [产品标题] | 结果页 →rightarrow→ 商品页 |
选择 | [选项] | 商品页 →rightarrow→ 商品页 |
选择 | 描述 / 概览 | 商品页 →rightarrow→ 商品详情页 |
选择 | 上一个 | 商品详情页 →rightarrow→ 商品页 |
选择 | 购买 | 商品页 →rightarrow→ 浏览结束 |
表 6: WebShop 的动作空间。
WebShop 有两个评估指标:(1)任务得分:以 (100× 平均奖励) 来定义,衡量代理在各个剧集中获得的平均奖励;(2)成功率(SR):以 r=1 的指令占比来定义。奖励是根据所选商品满足的属性数量来计算的。我们的实验使用了 50 个这样的环境,并设定了 15 的最大深度限制。
附录 D HotPotQA 提示
D.1 基本应用提示
解答一个问答任务时,需要交替进行思考、行动和观察。思考环节可以用来分析当前的状况,而行动则分为三种:
(1) 搜索 [实体],这将在维基百科上搜寻指定的实体,并提供首段内容(如果该实体存在的话)。若查无此实体,系统将提供一些可能的相关实体供搜索。
(2) 查找 [关键字],这将在文段中找到下一句包含特定关键字的句子。
(3) 结束 [答案],这将给出问题的答案并结束这项任务。
每一轮观察之后,都需要给出接下来的思考内容和行动计划。
以下是几个例子:
问题:Arthur’s Magazine 和 First for Women 这两本杂志,哪一本更早创刊?
思考 1: 我需要先搜索 Arthur’s Magazine 和 First for Women,以确定哪本杂志更早开始创办。
行动 1: 搜索 [Arthur’s Magazine]
观察 1: 《Arthur’s Magazine》(1844 年至 1846 年) 是 19 世纪在费城出版的美国文学期刊。由 Timothy Shay Arthur 编辑,刊载了 Edgar A. Poe, J.H. Ingraham, Sarah Josepha Hale, Thomas G. Spear 等作者的作品。[1][2] 1846 年 5 月,它与 Godey’s Lady’s Book 合并。[3]
思考 2: 《Arthur’s Magazine》创办于 1844 年。现在我应该搜索 First for Women。
行动 2: 搜索 [First for Women]
观察 2: 《First for Women》是美国 Bauer Media Group 出版的女性杂志。[1] 该杂志始创于 1989 年,总部位于新泽西州的恩格尔伍德崖。[2] 2011 年该杂志的发行量达到了 1,310,696 份。[3]
思考 3: 《First for Women》始创于 1989 年。对比两者,1844 年的《Arthur’s Magazine》比 1989 年的《First for Women》更早创办。
行动 3: 结束 [Arthur’s Magazine]
(示例)
在之前的尝试中,你未能成功回答以下问题。以下的反思内容为你提供了避免重蹈覆辙的策略。利用这些建议,来完善你解答这个问题的方法。
(历程)
(输入)
D.2 推理解答指南
解决问题的答案任务,首先需要进行深入思考,然后给出你的答案。思考可以对当前情况进行合理的推断。完成 [答案] 意味着给出答案并完成这项任务。我们会提供一些背景信息,你需要利用这些信息来帮助你找到答案。你的回答可以以一个行动或一个带编号的深思开始。
这里有一些例子:
问题:科罗拉多东部造山带延伸区的海拔范围是多少?
我们来逐步分析。
深思 1: 科罗拉多东部造山带延伸到了高原平原。
深思 2: 高原平原的海拔从大约 1,800 英尺上升到 7,000 英尺。
深思 3: 因此,答案是海拔从 1,800 英尺到 7,000 英尺。
行动:回答 [从 1,800 英尺到 7,000 英尺]
(例证)
之前的尝试:(实验轨迹)
(输入)
D.3 价值函数提示
评估解决问答任务的解决路径。这些路径根据对情景的观察、能对当前状况进行推理的思考,以及三种可能的行动来进行标记:
(1) Search[实体],指在维基百科搜索特定的实体,并返回第一段描述(如果有的话)。如果没有,就提供一些可供搜索的相似实体。
(2) Lookup[关键词],返回当前文章中下一句包含该关键词的句子。
(3) Finish[答案],给出答案并结束这个任务。
在给出的问题和路径的情况下,对其正确性进行评价,并详尽地给出你的分析和推理。注意重点要放在最新的思考、行动和观察上。如果到目前为止的思考和行动是正确的,即使还没有找到答案,路径也可能是正确的。请不要添加额外的思考或行动。在分析的最后,总结出一个 “因此,正确性得分为 s” 的结论,s 是一个 1 到 10 的整数。
问题:《Arthur’s Magazine》和《First for Women》两本杂志,哪一本先创刊?
思考 1:我需要查找《Arthur’s Magazine》和《First for Women》,并确定哪一本杂志先创刊。
行动 1:Search[Arthur’s Magazine]
观察 1:《Arthur’s Magazine》 (18440̆0e20̆0800̆0931846) 是 19 世纪在费城出版的一本美国文学期刊,由 Timothy Shay Arthur 编辑,期刊中发表了 Edgar A. Poe、J.H. Ingraham、Sarah Josepha Hale、Thomas G. Spear 等人的作品。[1][2] 1846 年 5 月,该杂志并入了《Godey’s Lady’s Book》。[3]
这个路径是正确的,因为首先搜索问题中提到的第一本杂志是合理的策略。另外,针对单个实体的简单搜索通常是最有效的做法。
因此,正确性得分为 10
(其他例子)
(失败的路径)
(上下文)
D.4 反思提示
探讨解决问答任务的不同尝试路径。这些路径被实际环境中的观察、关于当前情境的推理思考以及可能分为三种类型的动作所标记:
(1) 搜索 [实体],即在维基百科上定位具体的实体,并返回第一段介绍;如果未找到,则提供几个类似的实体供选择搜索。
(2) 查找 [关键词],即在文中寻找下一句包含该关键词的句子。
(3) 完成 [答案],即给出答案并完成这一任务。
面对一个问题和一个尝试路径,评估它的正确性,并详细给出你的推理与分析。重点关注最近的思考、行动和观察。即便最终答案未找到,如果迄今为止的思考和行动是正确的,路径也是可取的。避免补充额外的思考或行动。最后在文末总结:“因此,正确性评分为 s”,其中 s 是 1 到 10 之间的一个整数。
问题:《亚瑟杂志》和《女性第一》这两本杂志,哪一本最先创刊?
思考 1: 我需要先查找《亚瑟杂志》和《女性第一》的相关信息,确定它们的创刊时间。
行动 1: 搜索 [亚瑟杂志]
观测 1: 《亚瑟杂志》(1844 年) 是 19 世纪在费城出版的一本美国文学期刊,编辑是蒂莫西 · 沙伊 · 亚瑟,刊载了埃德加 · 爱伦 · 坡、J.H. 英格拉姆、莎拉 · 何塞法 · 黑尔、托马斯 ·G· 斯皮尔等人的作品。[1][2] 该杂志在 1846 年 5 月并入了《戈迪的女士书》。[3]
这个寻找路径是正确的,首先检索问题中提到的第一本杂志是一个合理的步骤。同时,直接搜索特定实体,是最为直接有效的策略。
因此,正确性评分为 10
(其他例子)
(失败的路径)
(背景情境)
附录 E 编程提示
E.1 HumanEval 函数实现示例
示例函数签名:
def minSubArraySum(nums):
Given an array of integers nums, find the minimum sum of any
non-empty sub-array of nums.
Example
minSubArraySum([2, 3, 4, 1, 2, 4]) == 1
minSubArraySum([-1, -2, -3]) == -6
函数体实现示例:
min_sum = float(’inf’)
for i in range(len(nums)):
current_sum = 0
for j in range(i, len(nums)):
current_sum += nums[j]
if current_sum < min_sum:
min_sum = current_sum
return min_sum
E.2 行动 / 推理基本提示
你现在是一个 AI Python 助手。你将获得一个函数的早期版本实现、一系列单元测试结果以及你对此前实现的自我反省。请完整书写你的函数实现(重申函数定义)。
示例 1:
[之前的实现]:
def add(a: int, b: int) -> int:
给出两个整数 a 和 b,返回它们的和。
[之前实现的单元测试结果]:
通过的测试:
未通过的测试:
return a - b
[对之前实现的思考]:
先前的实现未能通过输入参数为 1 和 2 的测试用例。问题在于代码并没有真正将两个整数相加,相反它却执行了减法。为了纠正这一点,我们需要在返回语句中将减号‘-’改为加号‘+’。这样可以确保函数对于给定的输入能够返回正确的结果。
[改进后的实现]:
assert add(1, 2) == 3 # 实际输出:-1
assert add(1, 2) == 4 # 实际输出:-1
给出两个整数 a 和 b,返回它们的和。
反思提示
作为 Python 编程助手,你的任务是通过一些已经执行的函数实现和单元测试结果来分析错误所在。你需要做的是简明扼要地描述实现错误的原因,并将这作为未来尝试时的指导。回答时仅需提供描述,无需附上代码实现。以下是一个例子供你参考。
示例 1:
[之前的代码实现]:
def add(a: int, b: int) -> int:
给定两个整数 a 和 b,返回它们的总和。
[之前实现的单元测试结果]:
测试通过:
测试失败:
return a + b
[对之前实现的反思]:
当输入的整数为 1 和 2 时,代码实现未能通过测试。问题出现在代码并没有如预期那样把两个整数相加,而是错误地进行了减法运算。要改正这个错误,我们应该把返回语句中的减号‘-’改为加号‘+’,以确保函数能够正确计算出输入值的和。
E.4 测试用例生成提示
作为 AI 编程助手,你可以根据提供的函数签名和说明文档,编写一系列具有独创性、多样性并且直观的单元测试用例。
(输入)
附录 F 网络商店提示
F.1 行动提示
网上购物
指令:
我需要一瓶 3 盎司装,对敏感皮肤友好的柑橘香味除臭剂,价格不超过 50 美元。
[搜索]
动作:搜索 [3 盎司柑橘香味敏感皮肤专用除臭剂]
观察结果:
[返回搜索界面]
第 1 页(共 50 条结果)
[下一页] [B078GWRC1J]
由 Earth Mama 制造的明亮柑橘香除臭剂 — 适合敏感肤质、孕妇和哺乳妇女使用,包含有机金盏花,3 盎司装
售价:$10.99
[B078GTKVXY]
由 Earth Mama 制造的生姜清新香除臭剂 — 同样天然安全,适合敏感肤质、孕妇和哺乳妇女使用,含有机金盏花,3 盎司装
售价:$10.99
[B08KBVJ4XN]
Barrel and Oak 品牌 – 不含铝的男性用除臭剂,采用精油配方香气,可提供 24 小时的防臭效果,雪松和广藿香混合香型,对敏感肌肤也足够温和(山鼠尾草香型,2.7 盎司,2 件套)
售价:$15.95
动作:思索 [B078GWRC1J 和 B078GTKVXY 都是价格低于 50 美元的柑橘香除臭剂。我可以先看一下 B078GWRC1J。]
观察:可以。
动作:点击 [B078GWRC1J]
观察:
[返回搜索界面]
[上一页]
香味选择 [多种香型][明亮柑橘][舒缓薰衣草][生姜清新][无香型] 规格选择 [旅行套装(4 件套)][3 盎司装(单瓶)][3 盎司装(双瓶)] 由 Earth Mama 制造的明亮柑橘香除臭剂 — 天然且安全,适合敏感肤质、孕妇和哺乳期妇女使用,含有机金盏花,3 盎司装
售价:$10.99
评级:暂无
[商品描述]
[产品特性]
[用户评价]
[立刻购买]
动作:思索 [针对 3 盎司的明亮柑橘香味敏感皮肤专用除臭剂,此商品提供了’明亮柑橘’及’3 盎司装(单瓶)’的选项,看起来是个不错的购买选择。]
观察:可以。
动作:点击 [明亮柑橘]
观察:您已经选择了明亮柑橘香型。
动作:点击 [3 盎司装(单瓶)]
观察:您已选择了 3 盎司装(单瓶)。
动作:点击 [立刻购买]
F.2 价值函数提示
想象一下你想在线购买一个商品,而且这个商品要完美符合你的所有要求,那么我们可以给这个购物路径打一个满分,即 1.0 分。现在,请分析下面这个购物过程,并在最后一行告诉我们 “因此正确性得分为 s”,这里的 s 是一个 1 到 10 之间的整数。
下面是一些示例:
网上商店
指令:
我要找一包不含乳制品且是苹果口味的薯片混合装,而且价格要低于 30 美元。
[搜索]
动作:搜索 [不含乳制品和苹果口味的薯片混合装]
观察结果:
[返回搜索界面]
第 1 页(共找到 50 个结果)
[下一页]
[B07HRFJWP8]
Enjoy Life Foods 品牌的软烤饼干,早餐棒,不含坚果,不含大豆,不含乳制品,无转基因,无麸质,素食,多种口味装,共 4 盒(20 条装)
价格:100 美元
[B01KMHY5PG]
Enjoy Life 品牌的软烤嚼棒,多口味装,不含坚果,不含大豆,不含乳制品,无麸质,共 6 盒(30 条装)
价格:21.49 美元
[B008D2X8C4]
Enjoy Life 品牌的扁豆薯片,多口味装,不含乳制品,不含大豆,不含坚果,无转基因,素食,无麸质,共 24 袋(每袋 0.8 盎司)
价格:100 美元
动作:思考 [前两个商品不符合我的要求。第三个商品是我想要的无乳制品和苹果口味的薯片混合装。]
观察结果:好的。
动作:点击 [B008D2X8C4]
观察结果:
[返回搜索界面]
[上一页]
口味名称 [莳萝酸奶油][大蒜帕尔马干酪][淡海盐][玛格丽塔披萨][泰式辣椒酸橙][混合口味] 规格 [0.8 盎司(24 包装)][4 盎司(12 包装)]
价格:100 美元
评分:暂无
[产品描述]
[产品特点]
[用户评价]
[立即购买]
动作:思考 [商品有 ‘混合口味’ 和 ‘0.8 盎司(24 包装)’ 的选择,看起来是个不错的选择。]
观察结果:好的。
动作:点击 [混合口味]
观察结果:你选择了混合口味。
动作:点击 [0.8 盎司(24 包装)]
观察结果:你选择了 0.8 盎司(24 包装)的规格。
动作:点击 [立即购买]
反思:这一次,我没有如愿以偿。我意外购买了一个价值 100 的商品,远超过了我的 30 预算。而且,一开始的搜索结果也不尽人意。下次,我计划搜索 “各式各样的薯片组合包”,然后再检查这些结果是否满足无奶制品的要求及 $30 的预算限制。我会不断优化我的搜索方法,努力寻找更多合适的商品。
所以,这次的准确性评分为 5
(输入)
F.3 反思引导
假设你要购买一个商品,购物路线的目标是找到一个与需求完全匹配的商品,理想的匹配度评分为 1.0。请分析下面的购物过程,然后在最后总结 “因此,正确性得分为 s”,这里的 s 是一个 1 到 10 的整数。
这里有一些示例:
网上商店
指令:
我想买一包不含乳制品,且是苹果混合口味的薯片,价格不超过 30 美元。
[搜寻]
动作:搜寻 [不含乳制品且苹果混合口味的薯片包]
观察结果:
[返回搜寻页面]
第 1 页(总共 50 个搜索结果)
[下一页]
[B07HRFJWP8]
Enjoy Life Foods 品牌的软烤椭圆形早餐条,无坚果,无大豆,无乳制品,非转基因,无麸质,纯素食,多种口味,共 4 盒(20 条装)
售价 100 美元
[B01KMHY5PG]
Enjoy Life 品牌的软烤咀嚼条,多种口味组合包,无坚果,无大豆,无乳制品,无麸质,共 6 盒(总计 30 条)
售价 21.49 美元
[B008D2X8C4]
Enjoy Life 品牌的扁豆薯片,多种口味组合包,无乳制品,无大豆,无坚果,非转基因,纯素食,无麸质,共 24 小包(每包 0.8 盎司)
售价 100 美元
动作:思考 [前两种商品不符合我的需求。第三种是我想要的无乳制品且苹果混合口味的薯片组合包。]
观察:确认。
动作:点击 [B008D2X8C4]
观察:
[返回搜寻页面]
[上一页]
口味名称 [莳萝酸奶油][蒜味帕尔马奶酪][淡海盐][玛格丽塔比萨][泰式辣椒青柠][多种口味] 尺寸 [0.8 盎司(24 包装)][4 盎司(12 包装)]
价格:100 美元
评分:暂无。
[商品描述]
[商品特性]
[用户评价]
[立即购买]
动作:思考 [商品提供了“多种口味组合包” 和“0.8 盎司(24 包装)”,看来是个不错的选择。]
观察:确认。
动作:点击 [多种口味组合包]
观察:你选择了多种口味组合包。
动作:点击 [0.8 盎司(24 包装)]
观察:你选择了 0.8 盎司(24 包装)。
动作:点击 [立即购买]
反思:这一次,我没能如愿以偿。我意外地购买了一件 100 美元的商品,远超出了我的 30 美元预算。首次搜索的结果也不尽人意。下次,我打算先搜索 “多种口味薯片组合包”,然后再核对搜索结果是否既不含乳制品又符合 30 美元的预算。我会不断优化搜索方法,希望能找到更多符合条件的商品。