查看原文
其他

LLM Agent:构建 AI 大脑的机遇与挑战

lencx 浮之静 2023-09-24
前言
内容最后可以获取进入开发者交流群的暗号,和更多朋友一起交流讨论,这个群区别于之前拉的 ChatGPT 技术交流群(差不多近万人的微信群,希望可以筛选出高质量的真正对 AI 前沿技术比较关注的用户)。 注意:只支持付费用户进群。拒绝白嫖党,设立付费门槛是最简单粗暴的方式(iOS 用户充值,会被平台收取 30% 手续费,可以考虑使用安卓充值)。

LLM 开源生态的爆炸,也迎来了自主代理类项目的大发展。作为技术人,如何拨开重重迷雾,构建自己的 AI 大脑(控制器)?译文对原文(Weng)内容进行扩展,文章包含大量参考资料,论文,项目,带你全面了解 Agent 生态。

以 LLM(大语言模型:万字长文:LLM - 大语言模型发展简史🤗 开放式 LLM 排行榜)作为核心控制器构建代理是一个很酷的概念。AutoGPT[1]GPT-Engineer[2]BabAGI[3] 都是这方面的代表。LLM 的潜力不仅仅限于生成优质的复制品、故事、论文和程序;它可以被视为一个强大的通用问题解决器。

Agent 系统概述

在一个由 LLM 驱动的自主代理(Agent)系统中,LLM 充当 Agent 的大脑,并由几个关键组件进行补充:

  • 规划

    • 子目标和分解:Agent 将大任务分解成较小、易于管理的子目标,从而有效处理复杂任务。

    • 反思和改进:Agent 可以对过去的行为进行自我批评和反思,从错误中学习,并改进未来的步骤,从而提高最终结果的质量。

  • 记忆

    • 短期记忆:所有的对话上下文学习(参考 Prompt Engineering[4])都视为模型使用短期记忆来学习。

    • 长期记忆:这让 Agent 有能力在长时间内保存和回忆(无限的)信息,一般是通过利用外部向量存储和快速检索来实现。

  • 使用工具

    • Agent 学会调用外部 API 以获取模型权重中缺失的额外信息(通常在预训练后很难更改),包括当前信息、代码执行能力、访问专有信息源等等。

LLM 驱动的自主 Agent 系统概述

组件一:规划

一个复杂的任务通常涉及多个步骤。Agent 需要知道它们是什么,并提前规划。

任务分解

思维链(CoT: Chain of thought) 已经成为提高模型在复杂任务上性能的标准提示技术。该模型被指示“逐步思考”,以利用更多的测试时间计算来将困难的任务分解为更小、更简单的步骤。CoT 将大任务转化为多个易于管理的任务,并对模型的思考过程提供了解释。

🔗 思维链提示在大型语言模型中引发推理

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models[5]

我们探索了如何生成一条思维链——一系列中间推理步骤——显著改善了大型语言模型进行复杂推理的能力。具体而言,我们展示了在足够大的语言模型中,通过一种简单的称为思维链提示的方法,这种推理能力如何自然地产生,其中在提示中提供了几个思维链示例。对三个大型语言模型的实验显示,思维链提示改善了在一系列算术,常识和符号推理任务上的表现。实证收益可以非常显著。例如,仅使用八个思维链示例来提示一个有 540B 参数的语言模型,就可以在解决 GSM8K 数学文字问题基准测试中达到最先进的精度,甚至超过了经过微调的 GPT-3 和验证器。

思维树(ToT: Tree of Thoughts) 通过在每个步骤探索多个推理可能性,扩展了 CoT。它首先将问题分解为多个思考步骤,并在每个步骤生成多个思考,从而创建一个树形结构。搜索过程可以是广度优先搜索(BFS)或深度优先搜索(DFS),每个状态由分类器(通过提示)或多数票评估。

🔗 思维树:使用大型语言模型进行深思熟虑的问题解决

Tree of Thoughts: Deliberate Problem Solving with Large Language Models[6]

语言模型越来越多地被部署用于解决一系列广泛的任务,但仍然限制在推断过程中进行令牌级别的从左到右的决策。这意味着他们在需要探索、策略性前瞻或初始决策起关键作用的任务中可能表现不佳。为了克服这些挑战,我们引入了一种新的语言模型推断框架,思维树(ToT),它在流行的思维链提示语言模型的基础上进行了一般化,并允许对作为问题解决的中间步骤的连贯文本单元(思维)进行探索。ToT 允许 LMs 通过考虑多个不同的推理路径并自我评估选择来进行深思熟虑的决策,以确定下一步行动,以及在必要时向前看或回溯以做出全局选择。我们的实验显示,ToT 显著提高了语言模型在需要非琐碎规划或搜索的三项新任务上的问题解决能力:24 点游戏,创意写作,和迷你填字游戏。例如,在 24 点游戏中,虽然使用思维链提示的 GPT-4 只解决了 4% 的任务,但我们的方法达到了 74% 的成功率。所有提示的代码仓库:princeton-nlp/tree-of-thought-llm[7]

📌 BFS & DFS

BFS(广度优先搜索)和 DFS(深度优先搜索)都是用于图和树这类数据结构中的搜索算法。

  • BFS(广度优先搜索):广度优先搜索是从图或树的根(或某一指定的开始节点)开始,并探索所有邻近节点,然后对这些邻近节点再探索他们的邻近节点,依此类推。你可以想象一种涟漪扩散的情形,从初始节点开始,向外逐渐扩散。BFS搜索的特点是每一层的节点都要访问完后,才能进入到下一层的节点。

  • DFS(深度优先搜索):深度优先搜索则是从图或树的根(或某一指定的开始节点)开始,并尽可能深地搜索,当搜索到某一条边无法继续深入时,就返回上一节点,继续搜索下一条边,直到搜索全部完成。可以想象成你在一座迷宫中行走,沿着一条路一直走到尽头,如果发现走不通,就返回上一步,选择另外一条路走。

这两种搜索方法各有优势,适用于不同的场景。DFS 因为其深入性,经常被用于需要递归或需要到达深处节点的问题中,如找出所有的解等。而 BFS 则由于其层次性,常常被用于需要寻找最短路径或是距离起点最近的问题中。

任务分解可以通过:(1) LLM 使用简单提示,如:"Steps for XYZ.\n1.""What are the subgoals for achieving XYZ?"。(2) 使用特定任务的说明,如:写小说的 "Write a story outline."。(3) 使用人类输入。

LLM+P 是另一种截然不同的方法,它依赖于外部经典规划器进行长期规划。这种方法使用规划领域定义语言(PDDL)作为中间接口描述规划问题。在这个过程中,LLM 会经历以下步骤:(1) 将问题翻译成 “Problem PDDL”。(2) 请求经典规划器根据现有的 “Domain PDDL” 生成 PDDL 计划。(3) 将 PDDL 计划翻译回自然语言。本质上,规划步骤是外包给外部工具的,假定存在特定领域的 PDDL 和适当的规划器,这在某些机器人设置中很常见,但在许多其他领域并非如此。

🔗 LLM+P:赋予大型语言模型最佳规划能力

LLM+P: Empowering Large Language Models with Optimal Planning Proficiency[8]

大型语言模型(LLMs)已经展示出了显著的零样本泛化能力:最先进的聊天机器人可以提供对日常生活中许多常见问题的合理答案。然而,到目前为止,LLMs 无法可靠地解决长期规划问题。相比之下,经典的规划器,一旦问题以格式化的方式给出,就可以使用高效的搜索算法快速确定正确的,甚至是最优的规划。为了尽可能获得两者的优势,本文介绍了 LLM+P,这是第一个将经典规划器的优势融入 LLMs 的框架。LLM+P 接收自然语言描述的规划问题,然后返回用自然语言描述的解决该问题的正确(或最优)规划。LLM+P 通过首先将语言描述转换为用规划领域定义语言(PDDL)编写的文件,然后利用经典规划器快速找到解决方案,然后将找到的解决方案翻译回自然语言来实现这一目标。与 LLM+P 一起,我们定义了来自常见规划场景的不同基准问题的多样性集合。通过对这些基准问题进行全面的实验集,我们发现 LLM+P 能够为大多数问题提供最优解决方案,而 LLMs 甚至无法为大多数问题提供可行的规划。代码和结果在这里公开可用:Cranial-XIX/llm-pddl[9]

自我反思

自我反思(Self-Reflection) 是一种至关重要的能力,它让自主代理能够通过优化过去的行动决策和纠正之前的错误来不断改进。在现实世界的任务中,尝试和错误是无法避免的,自我反思在其中起着关键作用。

ReAct 通过扩大动作空间为特定任务的离散动作和语言空间的结合,将推理和行动整合到 LLM 中。前者使 LLM 能够与环境互动(例如:使用 Wikipedia 搜索 API),后者则提示 LLM 生成自然语言的推理迹象。

🔗 ReAct: 在语言模型中融合推理和行动

ReAct: Synergizing Reasoning and Acting in Language Models[10]

虽然大型语言模型(LLMs)在语言理解和交互决策制定的任务中表现出了令人印象深刻的能力,但它们在推理(例如,链式思考提示)和行动(例如,行动计划生成)的能力主要被分别研究。在这篇论文中,我们探索了如何使用 LLMs 以交错的方式生成推理迹线和特定于任务的行动,从而使两者之间产生更大的协同作用:推理迹线帮助模型引导、跟踪和更新行动计划,处理异常,而行动则使其能够与外部资源(如知识库或环境)进行接口交互,收集额外的信息。我们将我们的方法,名为 ReAct,应用于多种语言和决策制定任务,并证明其相比于最新技术基准的有效性,以及比没有推理或行动组件的方法的人类可解释性和可信赖性的改善。具体来说,对于问题回答(HotpotQA)和事实验证(Fever),ReAct 通过与简单的 Wikipedia API 交互,克服了在链式思考推理中普遍存在的虚构和错误传播问题,并生成了比没有推理迹线的基准更可解释的人类类似的任务解决轨迹。在两个交互决策制定基准(ALFWorld 和 WebShop)上,ReAct 在只有一个或两个上下文例子的情况下,绝对成功率分别超过了模仿和强化学习方法 34% 和 10%。项目网站和代码:ysymyth/ReAct[11]

语言模型在推理方面(例如:思维链提示)和行动方面(例如:WebGPT、SayCan、ACT-1)的表现越来越好,但这两个方向仍然保持分离。ReAct 提出了一个问题:如果将这两种基本能力结合起来,会发生什么?

ReAct 的提示模板包含了让 LLM 思考的明确步骤,大致格式如下:

Thought: ...
Action: ...
Observation: ...
... (Repeated many times)
知识密集型任务(例如:HotpotQA、FEVER)和决策任务(例如:AlfWorld Env、WebShop)的推理轨迹示例

在知识密集型任务和决策任务的两个实验中,ReAct 相比只使用 Act 的基准模型(移除了 Thought: … 步骤)表现更好。

Reflexion 是一个框架,它是装备了动态记忆和自我反思能力的 Agent,以提高推理技巧。Reflexion 有一个标准的强化学习(RL)设置,其中奖励模型提供一个简单的二元奖励,动作空间遵循 ReAct 中的设置,即特定任务的动作空间被扩展到语言,以实现复杂的推理步骤。在每个行动之后,Agent 计算启发式,并可以根据自我反思的结果选择是否重置环境,开始新的尝试。

Reflexion 框架图示
🔗 Reflexion:具有口头强化学习的语言代理

Reflexion: Language Agents with Verbal Reinforcement Learning[12]

大型语言模型(LLMs)越来越多地被用于与外部环境(如游戏,编译器,API)交互作为目标驱动的代理。然而,这些语言代理要快速有效地从试错中学习仍然具有挑战性,因为传统的强化学习方法需要大量的训练样本和昂贵的模型微调。我们提出了 Reflexion,一种新的框架,用于通过语言反馈而不是通过更新权重来强化语言代理。具体来说,Reflexion 代理在任务反馈信号上进行口头反思,然后在情节记忆缓冲器中维护他们自己的反思文本,以在后续试验中诱导出更好的决策。Reflexion 足够灵活,能够融合各种类型(标量值或自由形式语言)和来源(外部或内部模拟)的反馈信号,并在多样化的任务(顺序决策制定,编码,语言推理)上获得了显著的改善。例如,Reflexion 在 HumanEval[13] 编码基准(openai/human-eval[14])上达到了 91% 的 pass@1 准确率,超过了之前最好的 GPT-4 的 80%。我们还进行了使用不同的反馈信号,反馈融合方法和代理类型的消融和分析研究,并提供了它们如何影响性能的见解。

启发式函数决定了什么时候轨迹效率低下或者包含幻觉,应该被停止。低效的规划指的是花费过长时间却无法成功的轨迹。幻觉被定义为遇到一系列连续相同的行动,这些行动在环境中产生相同的观察。

通过向 LLM 展示两个示例来创建自我反思,每个示例都是一对(失败的轨迹,理想的反思用于指导未来的计划变化)。然后,将反思添加到 Agent 的工作记忆中,最多三个,以用作查询 LLM 的上下文。

AlfWorld Env 和 HotpotQA 上的实验,在 AlfWorld 中幻觉(Hallucination)是比规划低效(Inefficient planning)更常见的失败

回顾链(CoH: Chain of Hindsight) 通过明确地向模型展示一系列过去的输出,并对每个输出进行反馈注释,来鼓励模型改进自身的输出。人类反馈数据是一个的集合,其中是提示,每个是模型的完成,的人类评级,是相应的人类提供的回顾反馈。假设反馈元组按照奖励排序。该过程是监督细调,其中数据是形式的序列,其中。在给定序列前缀的条件下,模型被微调以仅预测,以便模型可以根据反馈序列进行自我反思,以产生更好的输出。在测试时,模型可以选择接收人类注释员的多轮指导。

🔗 Chain of Hindsight:用反馈对齐语言模型

Chain of Hindsight Aligns Language Models with Feedback[15]

从人类偏好中学习对于语言模型来说是非常重要的,以使它们对人类有所帮助和有用,并与人类和社会价值观保持一致。先前的工作已经通过从人类反馈中学习来理解和遵循指示取得了显著的成功。尽管如此,这些方法要么依赖于人类注释者喜欢的手工挑选的模型生成,使得它们在数据利用方面效果不佳,且难以广泛应用,要么依赖于奖励函数和强化学习,这些方法易受到不完美的奖励函数的影响,且极其难以优化。在这项工作中,我们提出了一种新的技术,Chain of Hindsight,它易于优化,并且可以从任何形式的反馈中学习,无论其极性如何。我们的想法受到人类如何从广泛的以语言形式呈现的反馈中学习的启发。我们将所有类型的反馈转化为句子,然后用它们来微调模型,使我们能够利用语言模型的语言理解能力。我们根据一系列与反馈配对的模型生成对模型进行调节。这样,模型被训练以根据反馈生成输出,模型可以学习识别和纠正负面属性或错误。将我们的方法应用于大型语言模型,我们观察到 Chain of Hindsight 在使语言模型与人类偏好保持一致方面显著超过了之前的方法。我们观察到在摘要和对话任务上的显著改善,而且我们的方法在人类评估中明显优先。

为了避免过度拟合,CoH 添加了一个正则化项,以最大化预训练数据集的对数似然。为了避免捷径和复制(因为在反馈序列中有许多常见词),他们在训练期间随机遮挡 0% - 5% 的过去标记。

他们实验中的训练数据集是 WebGPT Comparisons[16],人类反馈的摘要(Learning to Summarize from Human Feedback[17])和人类偏好数据集(Human preference dataset[18])的组合。

在使用 CoH 进行微调后,该模型可以按照指令生成具有递增改进的输出序列

CoH 的想法是在上下文中呈现一系列逐步改进的输出,并训练模型接受这种趋势,产生更好的输出。算法蒸馏(AD: Algorithm Distillation) 将相同的想法应用到强化学习任务中的跨剧集轨迹,其中一个算法被封装在一个长历史条件的策略中。考虑到一个 Agent 多次与环境交互,并且在每个剧集中,Agent 会变得更好,AD 将这个学习历史连接起来并输入到模型中。因此,我们应该期望下一个预测的动作会比以前的尝试表现得更好。目标是学习强化学习的过程,而不是训练特定任务的策略本身。

算法蒸馏 (AD) 工作原理的图示
🔗 在上下文中强化学习与算法蒸馏

In-context Reinforcement Learning with Algorithm Distillation[19]

我们提出了算法蒸馏(AD),一种通过用因果序列模型建模其训练历史来提取强化学习(RL)算法到神经网络的方法。算法蒸馏将学习强化学习视为一个跨集合的顺序预测问题。数据集由源 RL 算法生成的学习历史构成,然后训练一个因果变换器,通过自动回归预测给定其前面的学习历史作为上下文的行动。与蒸馏后学习或专家序列的顺序策略预测架构不同,AD 能够完全在上下文中改善其策略,而无需更新其网络参数。我们证明了 AD 可以在各种具有稀疏奖励、组合任务结构和基于像素的观察的环境中强化学习,并发现 AD 学习了一个比生成源数据的 RL 算法更具数据效率的 RL 算法。

论文假设,任何生成一组学习历史的算法,都可以通过在行动上进行行为克隆,将其提炼到神经网络中。历史数据是由一组源策略生成的,每个策略都针对特定任务进行训练。在训练阶段,每次 RL 运行时,随机采样一个任务,并使用多剧集历史的子序列进行训练,使得学习到的策略是任务不可知的。

实际上,模型有限的上下文窗口长度,所以剧集应该足够短,以构建多剧集历史。学习近乎最优的上下文 RL 算法需要 2-4 剧集的上下文。上下文 RL 的出现需要足够长的上下文。

与三个基线相比,包括专家蒸馏(ED: Expert Distillation)(使用专家轨迹进行行为克隆,而不是学习历史),源策略(用于通过 UCB 生成蒸馏轨迹),RL2(作为上限,因为它需要在线 RL),AD 显示了在只使用离线 RL 的情况下,性能接近 RL2,并且学习速度比其他基线快得多。当根据源策略的部分训练历史条件化时,AD 也比 ED 基线提高得更快。

在需要记忆和探索的环境中比较 AD、ED、源策略和 RL2 仅分配二元奖励
📌 UCB

"Upper Confidence Bounds" (UCB) 是一种在多臂赌博机问题中用于决策的策略,主要用于处理探索与利用之间的平衡。这种策略常被用于强化学习中的行为选择。

在多臂赌博机问题中,你面对的是一个选择问题。你有一台赌博机,它有多个拉杆(“臂”),每个拉杆会给出不同的奖励,但是这些奖励是不确定的。你的目标是在有限的游戏次数内,获取最大的总奖励。

直观地说,"exploitation"(利用)是你选择已知最大奖励的拉杆,而 "exploration"(探索)是你选择未知的拉杆以了解其可能的奖励。利用会给你立即的奖励,但是可能会错过更大的奖励。探索可能会找到更大的奖励,但是立即的奖励可能会较小。

UCB 策略的基本思想是,你会选择那些具有最高上限信心界限的拉杆。这个界限由两部分组成:一部分是该拉杆当前的平均奖励,另一部分是一个衡量该拉杆奖励不确定性的项。这意味着,如果一个拉杆的奖励不确定性较大(例如你很少或从未尝试过它),那么其信心界限会较高,因此你可能会选择它进行探索。这种方式在一定程度上平衡了探索与利用之间的矛盾。

在强化学习中,UCB 策略也可以用于决定在给定状态下选择哪个动作,以此来平衡探索与利用之间的关系。

🔗 RL2:通过慢速强化学习实现快速强化学习

RL2: Fast Reinforcement Learning via Slow Reinforcement Learning[20]

深度强化学习(Deep RL)已经成功地自动学习了复杂的行为;然而,学习过程需要大量的试验。相反,动物可以利用他们对世界的先验知识,在只有几次试验的情况下学习新的任务。本文试图弥合这个差距。我们并没有设计一个"快速"的强化学习算法,而是将它表示为一个递归神经网络(RNN),并从数据中学习。在我们提出的方法 RL2 中,算法被编码在 RNN 的权重中,这些权重通过一个通用的("慢速")RL 算法进行缓慢学习。RNN 接收到一个典型的 RL 算法会接收到的所有信息,包括观察、行动、奖励和终止标志;并在给定的马尔可夫决策过程(MDP)中的各个阶段保持其状态。RNN 的激活存储了"快速" RL 算法在当前(以前未见过的)MDP 的状态。我们在小规模和大规模问题上对 RL2 进行实验评估。在小规模方面,我们训练它来解决随机生成的多臂老虎机问题和有限 MDPs。在 RL2 被训练后,它在新的 MDP 上的性能接近于人类设计的具有最优性保证的算法。在大规模方面,我们在一个基于视觉的导航任务上测试 RL2,并显示它可以扩展到高维问题。

组件二:记忆

记忆类型

GPT-4 Prompt:人脑中常见的记忆类型有哪些?你能告诉我这个话题吗?我是一名软件工程师,对深度学习领域非常了解,但对神经科学一无所知。一些适合我的教育的方式会很好。

记忆可以定义为获取、储存、保留和后期取回信息的过程。人脑中的记忆通常被分类为以下几种类型:

  • 感觉记忆(Sensory Memory):这是最短暂的记忆类型,能够在极短的时间内(通常在一秒以内)保持大量的感觉信息。这种记忆可以看作是感觉系统(如视觉或听觉系统)的一个扩展,它在我们接触到新的感觉刺激时立即形成,并且很快就会消失。感觉记忆根据其来源的感官系统,可分为几种不同的类型,包括:

    • 视觉感觉记忆(Iconic Memory):视觉感觉记忆可以保留大约一秒钟的视觉信息。例如,当你快速扫视一个场景时,即使你的眼睛已经转移开,你仍然能记住那个场景的细节(视觉"残影"),这就是视觉感觉记忆的体现。

    • 听觉感觉记忆(Echoic Memory):听觉感觉记忆保留的是过去几秒钟内的声音信息。例如,当你在听别人说话时,即使你在一瞬间分心,由于听觉感觉记忆的存在,你仍然能回想起那句话的大部分内容。

    • 触觉感觉记忆(Haptic Memory):触觉感觉记忆储存的是短时间内的触觉信息。例如,当你摸过一个物体后,即使你已经放开,你仍然能记住那个物体的感觉。

  • 短期记忆(Short-Term Memory):也称为工作记忆,短期记忆是对新信息的临时存储和处理。工作记忆的容量是有限的,通常被认为能够存储约 7 项(±2项)的信息。没有重复练习的短期记忆通常在几秒钟到几分钟之后就会消失。

  • 长期记忆(Long-Term Memory):长期记忆是我们存储和保留经验、知识和技能的系统,这些记忆可能持续数分钟、数小时、数天,甚至一生。长期记忆又可以细分为两个主要类型:

    • 显性/声明性记忆(Declarative Memory):又称为显性记忆,它包括我们可以明确叙述或"声明"的知识,例如事实(如世界首都的名字)和个人经验(如你昨天吃了什么晚餐)。声明性记忆又可以进一步分为语义记忆(Semantic Memory),即对事实和概念的记忆,和情景记忆(Episodic Memory),即对个人经验和特定事件的记忆。

    • 隐性/程序性记忆(Procedural Memory):这种记忆类型包括我们如何做事情的知识,即我们的技能和习惯,例如骑自行车或打字。这些记忆通常是无意识的,我们在执行这些技能时并不需要明确地回想起学习这些技能的过程。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存