最近几个月,随着大语言模型的持续火爆,利用其构建 AI 智能体的研究陆续进入人们的视线。AI 智能体这个概念也流行开来,不断突破人们的想象力。
先是斯坦福大学、谷歌的研究者,他们成功构建了一个「虚拟小镇」,小镇上的居民不再是人,而是 25 个 AI 智能体。它们的行为比人类角色的扮演更加真实,甚至举办了一场情人节派对。
随后商汤、清华等机构提出了能够自主学习解决任务的通才 AI 智能体 Ghost in the Minecraft (GITM),在《我的世界》中比以往所有智能体都有更优秀的表现。
图片
同一时间,英伟达开源的 VOYAGER,也给 AI 圈带来了「小小的」的震撼。作为一个大模型驱动、可以终身学习的游戏智能体,VOYAGER 在《我的世界》中玩出了高水平。这些 AI 智能体的先后涌现,甚至让人认为是未来通用人工智能(AGI)的雏形。
很多 AI 领域的大佬和科技巨头对 AI 智能体的发展产生了极大兴趣并寄予了厚望。特斯拉前 AI 总监、今年年初回归 OpenAI 的 Andrej Karpathy 在一次开发者活动上透漏,每当有新的 AI 智能体论文出现时,OpenAI 内部就会非常感兴趣,并认真地进行讨论。
图片
图源:https://twitter.com/GPTDAOCN/status/1673781206121578498
那么不禁要问,AI 智能体到底有哪些组成部分呢?它的神奇之处又具体表现在哪些方面呢?
近日,OpenAI 安全系统(Safety Systems)负责人 Lilian Weng 写了一篇关于 AI 智能体的博客。她认为 AI 智能体的核心驱动力是大语言模型,规划(Planning)、 记忆(Memory)和工具使用(Tool Use)是实现它的三个关键组件。
先前机器之心文章《GPT-4 背后的开发者:七大团队,三十余位华人》也曾介绍过 Lilian Weng,她 2018 年加入 OpenAI,在 GPT-4 项目中主要参与预训练、强化学习 & 对齐、模型安全等方面的工作。
Lilian Weng 对每个组件展开详细剖析,并提供了一些案例研究,比如科学发现智能体、生成式智能体模拟和概念验证示例。对于 AI 智能体未来将面临哪些挑战,她也给出了自己的观点。
图片
机器之心对博客的核心内容进行了编译整理。
博客链接:https://lilianweng.github.io/posts/2023-06-23-agent/
智能体系统的概念
在大语言模型(LLM)赋能的自主智能体系统中,LLM 充当了智能体的大脑,其三个关键组件分别如下:
首先是规划,它又分为以下内容:
- 子目标和分解。智能体将大型任务分解为更小、可管理的子目标,从而高效处理复杂的任务;
- 反思和完善:智能体可以对过去的行为展开自我批评和自我反思,从错误中吸取教训,并针对未来的步骤进行完善,提高最终结果的质量。
其次是记忆,分为了短期记忆和长期记忆:
- 短期记忆:作者认为所有的上下文学习(参见提示工程)都是利用模型的短期记忆来学习。
- 长期记忆:为智能体提供了长时间保留和回忆(无限)信息的能力,通常利用外部向量存储和快速检索实现。
最后是工具使用:
- 智能体学习调用外部 API 来获取模型权重中缺失的额外信息(通常在预训练后很难更改),包括当前信息、代码执行能力、对专有信息源的访问等。
下图 1 为 LLM 赋能的自主智能体系统概览。
图片
组件 1:规划
我们知道,一项复杂的任务通常涉及许多步骤。智能体必须了解任务是什么并提前进行规划。
任务分解
首先是思维链(CoT)。它已经成为增强复杂任务上模型性能的标准提示技术。在实现过程中,模型被指示「一步一步思考」,从而利用更多的测试时间计算将困难任务分解为更小、更简单的步骤。CoT 将大型任务转化为多个可管理的小任务,并解释清楚模型的思维过程。
其次是思维树(Tree of Thoughts)。它通过在每一步探索多种推理可能性来扩展 CoT。首先将问题分解为多个思考步骤,并在每个步骤中生成多个思考,创建一种树结构。搜索过程可以是广度优先搜索(BFS)或深度优先搜索(DFS),其中每个状态由分类器(通过提示)或多数 vote 进行评估。
具体地,任务分解过程可以通过以下三种方式完成:
- 基于 LLM 的简单提示,比如「XYZ 的步骤是什么?」、「实现 XYZ 的子目标是什么?」;
- 使用特定于任务的指示,比如「写一个故事大纲」;
- 人工输入。
最后一种截然不同的方法是 LLM+P,它依赖外部经典规划器来进行长期规划。该方法利用规划领域定义语言(PDDL)作为描述规划问题的中间接口。在这一过程中,LLM (1) 将问题转化为「Problem PDDL」,然后 (2) 请求经典规划器基于现有的「Domain PDDL」生成 PDDL 规划,最后 (3) 将 PDDL 规划转换回自然语言。
本质上,规划步骤被外包给了外部工具,并假设特定领域的 PDDL 和合适的规划器可用。这在某些机器人设置中很常见,而在许多其他领域并不常见。
自我反思
自我反思(Self-reflection)允许自主智能体通过完善以往行动决策和纠正以往错误来迭代改进,因而会在出现试错的现实世界任务中发挥至关重要的作用。
ReAct 通过将动作空间扩展为一个任务特定的「离散动作和语言空间的组合」,将推理和动作集成在 LLM 中。离散动作使 LLM 能够与环境交互(例如使用维基百科搜索 API),而语言空间促使 LLM 以自然语言生成推理轨迹。
ReAct 提示模板包含了 LLM 思考的明确步骤,大致格式如下所示:
Thought: ...
Action: ...
Observation: ...
... (Repeated many times)
下图 2 为知识密集型任务(如 HotpotQA、FEVER)和决策型任务(如 AlfWorld Env、WebShop)的推理轨迹示例。
图片
图源:https://arxiv.org/abs/2210.03629
实验结果显示,对于知识密集型任务和决策型任务,ReAct 的效果优于仅 Act 的基线方法,这类方法删除了「Thought: ...」步骤。
Reflexion 框架则为智能体配备了动态记忆和自我反思能力,提高了推理技能。它有一个标准的 RL 设置,其中奖励模型提供简单的二元奖励,而动作空间遵循 ReAct 中的设置。并且特定于任务的动作空间通过语言进行增强,实现复杂推理步骤。在每个动作 a_t 之后,智能体计算启发式 h_t,并选择性地根据自我反思结果来决定重置环境,从而开始新的试验。
下图 3 为 Reflexion 框架概览。
图片
图源:https://arxiv.org/abs/2303.11366
启发式功能决定轨迹何时开始效率低下或包含幻觉,以及何时应该停止。低效的规划是指花费太长时间而没有成功的轨迹。幻觉(Hallucination)被定义为遇到了一系列连续的相同动作,而这些动作导致环境中出现相同的观察。
自我反思通过向 LLM 展示 two-shot 示例来创建,每个例子都是一对失败的轨迹,它们是指导未来规划中变化的理想反思。然后反思被添加到智能体的工作记忆中,最多三个,用作查询 LLM 的上下文。
下图 4 为在 AlfWorld Env 和 HotpotQA 上的实验。其中在 AlfWorld 中,幻觉是比低效规划更常见的失败。
图源:https://arxiv.org/abs/2303.11366
Chain of Hindsight(CoH)鼓励模型通过显式地呈现一系列过去的输出(每个输出都带有反馈注释)来改进其自身的输出。人类反馈数据是的集合,其中 x 是提示,每个 y_i 是模型补全,r_i 是 y_i 的人类评分,z_i 是相应的人类提供的事后反馈。假设反馈元组按奖励排序,该过程是有监督的微调。数据的序列形式为,其中≤i≤j≤n。该模型经过微调,仅预测以序列前缀为条件的 y_n,使得模型可以根据反馈序列自我反思,从而产生更好的输出。该模型可以选择性地在测试时接受到人类注释者的多轮指令。
为了避免过拟合,CoH 添加正则化项来最大化预训练数据集的对数似然。同时为了避免捷径和复制(由于反馈序列中有很多常见单词),研究者在训练过程中随机屏蔽了 0%- 5% 的过去 token。
实验中采用的训练数据集是 WebGPT 比较、人类反馈总结以及人类偏好数据集的组合。下图 5 展示了使用 CoH 进行微调后,模型可以按照指令生成具有序列增量改进的输出。
图片
图源:https://arxiv.org/abs/2302.02676
CoH 的思路是呈现上下文中连续改进输出的历史,并训练模型产生更好输出。算法蒸馏(AD)将相同的思路应用于强化学习任务中的跨情节轨迹,其中算法被封装在长期历史条件策略中。
下图 6 为算法蒸馏的工作原理。
图片
图源:https://arxiv.org/abs/2210.14215
在算法蒸馏论文中,研究者假设任何生成一组学习历史的算法都可以通过对动作执行行为克隆来蒸馏成神经网络。历史数据由一组源策略生成,而每个源策略针对特定任务进行训练。
在训练阶段,每次 RL 运行期间,研究者都会对随机任务进行采样,并使用 multi-episode 历史的子序列进行训练,使得学习到的策略与任务无关。
实际上该模型的上下文窗口长度有限,因此 episode 应足够短以构建 multi-episode 历史。要学习近最优的上下文 RL 算法,需要 2 到 4 个 episode 的 multi-episodic 上下文。上下文 RL 的出现需要足够长的上下文。
与三个基线相比,包括 ED(专家蒸馏,用专家轨迹而不是学习历史进行行为克隆)、源策略(用于生成 UCB 蒸馏的轨迹)、RL^2( 2017 年提出的一种在线强化学习算法,作为上限进行比较)。尽管 AD 算法仅使用离线强化学习,但其性能接近 RL^2,并且学习速度比其他基线快得多。当以源策略的部分训练历史为条件时,AD 的改进速度也比 ED 基线快得多。
下图 7 为 AD、ED、源策略和 RL^2 的比较。
图片
组件 2:记忆
作者表示,这一章节借助了 ChatGPT 来帮忙起草。下面我们看看这部分具体内容。
记忆类型
记忆类型分为三类:感知记忆、短期记忆(STM)或工作记忆以及长期记忆(LTM)。
感知记忆:这是记忆的早期阶段,它能够在原始刺激结束后保持对感官信息(视觉、听觉等)的印象。感知记忆通常只能持续几秒钟。其子类包括图像记忆(视觉)、回声记忆(听觉)和触摸记忆(触感)。
短期记忆(STM)或工作记忆:短期记忆存储着我们目前所知道的信息,以及执行复杂认知任务(如学习和推理)所需要的信息。一般来讲,短期记忆持续 20-30 秒。
长期记忆:长时记忆可以将信息存储很长时间,从几天到几十年不等,其存储容量基本上是无限的。LTM 有两种子类型:
- 显式、陈述性记忆:这是对事实和事件的记忆,指的是那些可以有意识地回忆起来的记忆,包括情景记忆(事件和经过)和语义记忆(事实和概念);
- 隐式、程序性记忆:这种类型的记忆是无意识的,涉及自主执行的技能和惯例,比如骑自行车或在键盘上打字。
图片
人类记忆分类
参考人类记忆的分类,我们可以得到以下映射:
- 感知记忆作为原始输入(包括文本、图像或其他模态)的学习嵌入表示。
- 短期记忆作为上下文学习,由于受到 Transformer 有限上下文窗口长度的限制,短期记忆是短暂且有限的。
- 长期记忆作为外部向量存储,智能体可以查询、快速检索,从而进行访问。
最大内积搜索(MIPS)
外部记忆可以缓解注意力的一些限制。为了更好的处理外部记忆,一个常见的做法是将信息的嵌入表示保存到一个向量存储数据库中,该数据库可以支持快速的最大内积搜索(MIPS)。为了优化检索速度,研究者经常使用的方法是近似最近邻(ANN,approximate nearest neighbors)算法。
在加速 MIPS 中,经常用到的 ANN 算法包括:
局部敏感哈希(LSH):它引入了一个哈希函数,使得相似的输入项以高概率映射到相同的 buckets 中,其中 buckets 的数量远远小于输入的数量。
近似最近邻(ANNOY):该方法的核心数据结构是随机投影树(Random Projection Trees),它是一组二叉树,其中每个非叶节点表示一个超平面,将输入空间分割为两部分,而每个叶节点则存储一个数据点。树是独立且随机构建的,因此在某种程度上类似于哈希函数。这个想法与 KD 树(一种将空间中点分开存储的树状数据结构)密切相关,但扩展性更强。
分层可导小世界(HNSW,Hierarchical Navigable Small World):这个方法受到小世界网络(small world networks,是一种图结构)的启发,其中大多数节点可以在很少的步骤内与其他节点相连。HNSW 构建了这些小世界图的层次结构,其中底层包含实际的数据点,中间层创建了快捷方式以加速搜索。在执行搜索时,HNSW 从顶层的一个随机节点开始,并向目标节点导航,当无法再靠近目标时,它向下移动到下一层,直到达到底层。在上层进行的每一次移动都有可能在数据空间中覆盖较大的距离,而在下层进行的每一次移动都会提高搜索的精度。
Facebook AI (现 Meta AI)团队开源的库 FAISS:FAISS 运作的基本假设是,在高维空间中,节点之间的距离遵循高斯分布,因此应该存在数据点的聚类。FAISS 通过将向量空间分割成聚类并在聚类内进行量化来应用向量量化。
可扩展最近邻(ScaNN):ScaNN 的主要创新是各向异性矢量量化(Anisotropic Vector Quantization,AVQ),它将数据点 x_i 量化为,使得内积尽可能接近原始距离,从而减少了数据点之间的距离误差。
图片
MIPS 算法比较。
组件 3:使用工具
使用工具是人类的一个显著特点。我们创造、修改和利用外部物体来探索和认知现实世界。类似地,给 LLM 配备外部工具可以大幅扩展模型的能力。
一张海獭在水中漂浮时用石头敲开贝壳的照片。虽然其他一些动物也能使用工具,但其复杂性无法与人类相比。图源:Animals using tools
MRKL(Karpas et al. 2022)是一种用于自主智能体的神经 - 符号(neuro-symbolic)架构,命名来源于模块化推理(Modular Reasoning)、知识(Knowledge)和语言(Language)的简称。每个 MRKL 系统包含一些「专家」模块,通用 LLM 作为一个路由器,负责将查询路由到最合适的专家模块。这些模块可以是神经的(如深度学习模型),也可以是符号的(如数学计算器、货币转换器、天气 API)。
MRKL 的研究团队使用数学计算作为测试案例,进行了一个微调 LLM 调用计算器的实验。由于 LLM(7B Jurassic1-large 模型)未能可靠地提取基本计算的正确 argument,因此该实验表明解决口语简单阐述的数学问题比明确说明的数学问题更难。该实验结果强调了当外部符号工具能够可靠地工作时,知道何时和如何使用这些工具是至关重要的,而这由 LLM 的能力决定。
另外两项研究 TALM(Parisi et al. 2022)和 Toolformer(Schick et al. 2023)都对语言模型(LM)进行了微调,以学习使用外部工具 API。数据集则是根据新增加的 API 调用注释是否能提高模型的输出质量来扩展的。
ChatGPT 插件和 OpenAI 的 API 函数调用是 LLM 使用工具增强能力的最好实例。工具 API 的集合可以由其他开发者提供(插件)或自定义(函数调用)。
HuggingGPT(Shen et al. 2023)则是一个使用 ChatGPT 作为任务规划器的框架,根据模型描述选择 HuggingFace 平台中可用的模型,并根据执行结果归纳总结出响应。
图片
HuggingGPT 工作原理示意图。图源:Shen et al. 2023
HuggingGPT 系统由 4 个阶段组成:
(1)任务规划:LLM 作为大脑,将用户请求解析为多个任务。每个任务有四个关联属性:任务类型、任务 ID、依赖项和参数。研究团队使用少量例子来指导 LLM 进行任务解析和规划。
The AI assistant can parse user input to several tasks: [{"task": task, "id", task_id, "dep": dependency_task_ids, "args": {"text": text, "image": URL, "audio": URL, "video": URL}}]. The "dep" field denotes the id of the previous task which generates a new resource that the current task relies on. A special tag "-task_id" refers to the generated text image, audio and video in the dependency task with id as task_id. The task MUST be selected from the following options: {{ Available Task List }}. There is a logical relationship between tasks, please note their order. If the user input can't be parsed, you need to reply empty JSON. Here are several cases for your reference: {{ Demonstrations }}. The chat history is recorded as {{ Chat History }}. From this chat history, you can find the path of the user-mentioned resources for your task planning.
(2) 模型选择:LLM 会从一个模型列表中选择模型,将任务分配给专家模型。由于上下文长度有限,需要进行基于任务类型的过滤。
Given the user request and the call command, the AI assistant helps the user to select a suitable model from a list of models to process the user request. The AI assistant merely outputs the model id of the most appropriate model. The output must be in a strict JSON format: "id": "id", "reason": "your detail reason for the choice". We have a list of models for you to choose from {{ Candidate Models }}. Please select one model from the list.
(3) 任务执行:专家模型执行具体任务,并记录执行结果。
With the input and the inference results, the AI assistant needs to describe the process and results. The previous stages can be formed as - User Input: {{ User Input }}, Task Planning: {{ Tasks }}, Model Selection: {{ Model Assignment }}, Task Execution: {{ Predictions }}. You must first answer the user's request in a straightforward manner. Then describe the task process and show your analysis and model inference results to the user in the first person. If inference results contain a file path, must tell the user the complete file path.
(4) 响应生成:LLM 接收执行结果,并向用户提供总体结果。
为了将 HuggingGPT 投入实际使用,需要解决几个挑战:(1)需要提高效率,因为 LLM 推理和与其他模型的交互都会减慢进程;(2)它依赖一个长的上下文窗口来沟通复杂的任务内容;(3)提高 LLM 输出和外部模型服务的稳定性。
API-Bank(Li et al. 2023)是一个评估工具增强型 LLM 性能的基准。它包含 53 个常用的 API 工具,一个完整的工具增强型 LLM 工作流,以及涉及 568 个 API 调用的 264 个已注释的对话。API-Bank 基准中可选择的 API 相当多样化,包括搜索引擎、计算器、日历查询、智能家居控制、日程管理等等。LLM 首先可以通过 API 搜索引擎找到合适的 API 进行调用,然后使用相关文档调用 API。
图片
LLM 在 API-BANK 中进行 API 调用的伪代码。(图片来源:Li et al. 2023)
在 API-Bank 的工作流中,LLM 需要做出一些决定,包括:
- 是否需要调用 API;
- 确定要调用的正确 API:如果不够好,LLM 需要反复修改 API 输入(例如更换搜索引擎 API 的搜索关键词);
- 基于 API 结果的响应:如果结果不满意,模型可以选择优化并再次调用。
这个基准在三个层次上评估了智能体的工具使用能力:
- 调用 API 的能力:根据 API 的描述,模型需要确定是否调用给定的 API,正确地调用,并对 API 的返回结果作出正确的反应;
- 检索 API 的能力。模型需要搜索可能解决用户需求的 API,并通过阅读文档学习如何使用它们。
- 检索和调用之外规划 API 的能力。考虑到不明确的用户要求(例如安排小组会议,为旅行预订航班 / 酒店 / 餐厅),模型可能需要进行多次 API 调用来解决实际问题。
案例研究
用于科学发现的智能体
ChemCrow 是一个由大型语言模型(LLM)设计的化学智能体,旨在完成有机合成、药物发现和材料设计等任务。通过整合 17 种专家设计的工具,ChemCrow 提高了 LLM 在化学方面的性能,并衍生出新的能力。
关于 ChemCrow ,一个有趣的观察是,尽管基于 LLM 的评估结果得出的结论是 GPT-4 和 ChemCrow 的性能几乎相当,但经过专家人工评估表明,ChemCrow 在很大程度上优于 GPT-4。这意味着在需要深度专业知识的领域使用 LLM 来评估其自身的性能可能存在潜在问题。缺乏专业知识可能导致 LLM 不了解其缺陷,因此无法很好地判断任务结果的正确性。
Boiko 等人的论文则研究了用于科学发现的 AI 智能体,它被用来处理复杂科学实验的自主设计、规划和执行。这个智能体可以使用工具浏览互联网、阅读文档、执行代码、调用机器人实验 API 和利用其他 LLM。
举例来说,当智能体收到提示「develop a novel anticancer drug(开发一种新的抗癌药物)」时,其推理步骤是这样的:
- 询问当前抗癌药物发现的趋势;
- 选定目标;
- 开始寻找针对这个目标的化合物;
- 一旦确定了化合物,模型就尝试合成它。
生产式智能体
生成式智能体将 LLM 与记忆、规划和反射机制相结合,使智能体能够根据过去的经验做出反应,并与其他智能体进行交互。
生成式智能体架构图。
概念验证示例
这里作者提到了 AutoGPT(自主人工智能),有了它,人类无需插手,AutoGPT 就能自主完成任务。Andrej Karpathy 也大赞:「AutoGPT 是 prompt 工程的下一个前沿。」
具体来说,AutoGPT 相当于给基于 GPT 的模型一个内存和一个身体。有了它,你可以把一项任务交给 AI 智能体,让它自主地提出一个计划,然后执行计划。此外其还具有互联网访问、长期和短期内存管理、用于文本生成的 GPT-4 实例以及使用 GPT-3.5 进行文件存储和生成摘要等功能。AutoGPT 用处很多,可用来分析市场并提出交易策略、提供客户服务、进行营销等其他需要持续更新的任务。
此外,作者还列举了 GPT-Engineer 项目,和代码生成类工具差不多,其能根据提示生成代码库(codebase)。就像前面讲到的,只要你提出合理的要求,GPT-Engineer 都能完成。
挑战
在了解了构建以 LLM 为中心的智能体关键思想和演示之后,我们应该也看到一些限制:
有限的上下文长度:LLM 处理上下文信息的能力有限,尽管 self-reflection 等机制可以从过去的错误中学习,但更长或无限的上下文窗口将会带来很大的好处。虽然向量存储和检索可以提供对更大知识库的访问,但它们的表示能力不如全注意力(full attention)强大。
LLM 在长期规划和任务分解中的挑战:LLM 在面对意外错误时很难调整规划并进行改正,与人类可以不断试错相比,LLM 鲁棒性还是比较差的。
自然语言接口的可靠性:当前的智能体系统依赖于自然语言作为 LLM 与内存和工具等外部组件之间的接口。然而,模型输出的可靠性是值得怀疑的,因为 LLM 可能会出现格式错误,偶尔还会表现出叛逆行为(例如,拒绝遵循指令)。