分享

大模型下一站,OpenAI 万字长文解读AI Agents

 天承办公室 2023-10-07 发布于北京

图片

导读
AI Agent 被认为是 OpenAI 发力的下一个方向。OpenAI 联合创始人 Andrej Karpathy 在近期的公开活动上说 “ 相比模型训练方法,OpenAI 内部目前更关注 Agent 领域的变化,每当有新的 AI Agents 论文出来的时候,内部都会很兴奋并且认真地讨论 ” 。
本文翻译自 Lilian 的个人博客[0],Lilian 现在是OpenAI的安全系统主管,同时在OpenAI领导应用研究。
Lilian Weng的这篇文章是你探索人工智能的未来,理解LLM如何驱动AI Agent工作原理,不容错过的阅读材料。这篇文章深入浅出地解释了如何使用LLM构建AI Agent,以及这个过程中涉及的各种关键组件和技术。
Lilian Weng详细介绍了LLM如何作为AI Agent 的大脑,配合规划记忆工具使用等关键组件,将大任务分解为小的、可管理的子目标,从而有效地处理复杂任务。
文章还提到了一些具体的技术和框架,如Chain of Thought (CoT)、Tree of Thoughts、ReAct、Reflexion、Chain of Hindsight (CoH)和Algorithm Distillation (AD)等,这些都是当前人工智能领域的最新研究成果。
无论你是人工智能的研究者,还是对人工智能有兴趣的读者,这篇文章都将为你提供深入的洞见和启发。让我们一起探索LLM在AI Agent的发展,开启人工智能的新篇章。

目录

  • AI Agent 是什么
  • 组件一:规划
  • 组件二:记忆
  • 组件三:工具使用
  • Agent 实战案例
  • Agent 概念验证示例
  • Agent 的挑战

以LLM(大语言模型)作为核心控制器构建代理是一个很酷的概念。AutoGPT、GPT-Engineer 和 BabyAGI 等几个概念验证演示都是鼓舞人心的示例。LLM的潜力不仅仅限于生成写得好的副本、故事、论文和程序;它可以被视为一个强大的通用问题解决器。

01

AI Agent System 是什么

在 LLM 支持的AI Agent 系统中,LLM 充当AI Agent 的大脑,并由几个关键组件进行补充:

图片

Planning 规划

  • 子目标和分解:AI Agent 将大型任务分解为更小的、可管理的子目标,从而能够有效处理复杂的任务。

  • 反思和完善:Agent可以对过去的行为进行自我批评和自我反思,从错误中吸取教训,并针对未来的步骤进行完善,从而提高最终结果的质量。

Memory 记忆

  • 短期记忆:所有的上下文学习(参见提示工程)都是利用模型的短期记忆来学习。

  • 长期记忆:这为AI Agent提供了长期保留和调用无限信息的能力,通常是通过利用外部向量存储和快速检索来实现。

Tool use 工具使用

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

图片

图 1. LLM 驱动 的AI Agents System 概览

 我创建了AI交流群,里面会实时分享AI最新有用的信息,群里信息密度和新鲜度非常高,交流氛围也很好,欢迎感兴趣的朋友可以后台回复关键词【微信】,扫码入群。


02

组件一:任务规划

一项复杂的任务通常涉及许多步骤。Agent 需要了解它们是什么,并提前计划。

任务分解  Task Decomposition 


思想链 Chain of thought

思想链 Chain of thought(CoT;Wei et al. 2022)[1] 已成为增强复杂任务模型性能的标准提示技术。它让指示模型“一步一步思考”,以利用更多的测试时间,将困难任务分解为更小、更简单的步骤。CoT 将大型任务转化为多个可管理的任务,并阐明模型思维的过程,从而提高模型性能。这种技术使得模型更易于理解任务,也更容易获得更好的任务结果。

思维树 Tree of Thoughts

思维树 Tree of Thoughts(Yao et al. 2023)[2]通过在每一步探索多种推理可能性来扩展 CoT。它首先将问题分解为多个思考步骤,并在每个步骤中生成多个思考,从而创建树结构。搜索过程可以是 BFS(广度优先搜索)或 DFS(深度优先搜索),每个状态由分类器(通过提示)或多数投票进行评估。

在处理任务时,可以通过以下几种方式来实现任务分解:

  1. 通过给LLM 模型进行简单的提示,如 'Steps for XYZ.\n1.' , 'What are the subgoals for achieving XYZ?' 

  2. 通过使用特定任务的指令;例如 'Write a story outline.' 

  3. 人工输入

LLM + P 

另一种截然不同的方法是 LLM+P(Liu et al. 2023)[3],涉及依赖外部经典规划器(External classical planner)来进行长期规划。该方法利用规划领域定义语言(Planning Domain Definition Language,PDDL) 作为描述规划问题的中间接口。

在这个过程中,LLM 需要完成以下几个步骤:

  1. 将问题转化为“Problem PDDL”

  2. 请求经典规划器基于现有的“Domain PDDL”生成 PDDL 计划,

  3. 将 PDDL 计划转化回自然语言。

本质上,规划步骤被外包给外部工具,假设特定领域的 PDDL 和合适的规划器可用,这在某些机器人设置中很常见,但在许多其他领域并不常见。

自我反思 Self-Reflection 

自我反思(Self-reflection)是一个重要的方面,它允许AI Agent 通过完善过去的行动决策和纠正以前的错误来迭代改进。在现实世界的任务中,试错(trial and error)是必不可少的,因而自我反思在其中扮演着至关重要的角色。

ReAct

ReAct(Yao et al. 2023)[4]通过将动作空间扩展为特定于任务的离散动作和语言空间的组合,将推理和动作集成在LLM中。前者(任务特定的离散动作)使LLM能够与环境交互(例如使用维基百科搜索API),而后者(语言空间)则促使LLM生成自然语言的推理轨迹。

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

Thought: ...Action: ...Observation: ...... (Repeated many times)

图片

图 2. 知识密集型任务(例如 HotpotQA、FEVER)和决策任务(例如 AlfWorld Env、WebShop)的推理轨迹示例。(图片来源:Yao 等人,2023)。

在知识密集型任务和决策任务的两个实验中, ReAct 比删除了 Thought: … 步骤的仅 Act 基线效果更好。

Reflexion

Reflexion (Shinn & Labash 2023)[5] 是一个为AI Agent 配备动态记忆和自我反思能力以提高推理技能的框架。Reflexion 有一个标准的 RL 设置,其中奖励模型提供简单的二元奖励,而动作空间遵循 ReAct 中的设置,其中特定于任务的动作空间通过语言进行增强,以实现复杂的推理步骤。在每个操作 at 之后,AI Agents 会计算一个启发式值 ht 并根据自我反思的结果来选择是否重置环境以开始新的实验。

图片

启发式函数(heuristic function)用来帮助确定轨迹是否低效或者包含幻觉(hallucination),进而决定是否要停止任务。低效的规划是指花费过长时间而没有成功的轨迹;幻觉是指遇到一系列连续相同的动作,导致环境中出现相同的观察结果。

自我反思(Self-reflection)是通过向LLM展示一个 two-shot 的示例来创建的,每个示例都成对出现,即“失败的轨迹——指导未来计划变化的理想反映”。随后将该反思添加到 AI Agents 的短期工作记忆(短期记忆)中,最多不超过三个,以作为查询 LLM 的上下文。

图片

图 4. AlfWorld Env 和 HotpotQA 上的实验。幻觉是比低效规划更常见的失败。(图片来源:Shinn & Labash,2023)

Chain of Hindsight

Chain of Hindsight(CoH;Liu et al. 2023)[6]鼓励模型通过明确地呈现一系列过去的输出(每个输出都带有反馈注释)来改进其自身的输出。

其中人类反馈数据是一个集合 Dh = {(x,yi,ri,zi)n1=1},其中 x 是提示,每个 y代表一个模型补全,r是人类对 y的评分,ri、yi、z是相互对应的关系,z代表人类对模型输出提供的事后反馈(Hindsight feedback)。假设反馈元组按奖励排名,较好的输出会得到更高的奖励值,如 rn≥rn-1≥...≥r1。该过程将在有监督条件下进行微调,数据格式为 tn=(x,zi,yi,zj,...,zn,yn),其中 ≤i≤j≤n,以便让模型去学习如何根据反馈序列生成更好的输出。

模型经过微调后,将已知的输出序列作为训练数据,令模型能够预测在给定序列前缀(sequence prefix)条件下的 yn,以便在反馈序列(feedback sequence)的基础上进行自我反思,从而产生更高质量的输出。在测试时,该模型可以选择性地接收带有人类注释者的多轮指令,即人类提供的反馈注释,从而进一步提高模型的性能和准确性。

为了避免过度拟合,CoH 添加了正则化项(Regularization Term),以最大化预训练数据集的对数可能性。这个正则化项可以帮助模型更好地泛化和适应新的数据,避免过度拟合现有的数据。此外,由于反馈序列中有许多常用词,为了避免模型在训练过程中依赖于这些词,CoH 在训练期间随机屏蔽了 0%-5% 的历史 token。

他们实验中的训练数据集是 WebGPT 比较、人类反馈总结和人类偏好数据集的组合。

图片

图 5. 使用 CoH 进行微调后,模型可以按照指令生成具有序列增量改进的输出。 

算法蒸馏(Algorithm Distillation)

CoH 的想法是呈现上下文中输出连续改进的历史,并训练模型以适应产生更好输出的趋势。算法蒸馏(AD;Laskin 等人,2023)[7]将相同的想法应用于强化学习任务中的跨情节轨迹( cross-episode trajectories ),其中算法被封装在长期历史条件策略中。考虑到AI agent与环境进行多次交互,并且每一次AI agent都会变得更好一些,AD 会将此学习历史连接起来并将其输入到模型中。

因此,这样就可以实现下一个预测的行动会带来比之前的试验更好的性能。AD的目标是学习强化学习的过程,而不是训练特定于任务的策略本身。通过将算法封装在长期历史条件策略中,AD 可以捕获模型与环境交互的历史记录,从而使得模型能够更好地学习和改进自己的决策和行动,从而提高任务完成的效率和质量。

图片

图 6. 算法蒸馏 (AD) 工作原理的图示。

In-context Reinforcement Learning with Algorithm Distillation 该论文假设任何生成一组学习历史的算法都可以通过对动作执行行为克隆来提炼成神经网络。历史数据由一组源策略生成,每个源策略针对特定任务进行训练。在训练阶段,在每次 RL 运行期间,都会对随机任务进行采样,并使用多集历史的子序列进行训练,从而使学习到的策略与任务无关。

实际上,该模型的上下文窗口长度有限,因此剧集(episodes)应该足够短以构建多剧集历史数据。在强化学习中,通常需要 2-4 集的多情节上下文来学习接近最佳的上下文强化学习算法,这是因为在上下文中,强化学习的发生往往需要足够长的上下文来提供背景和意义。

论文使用了三个基线进行对比,,包括 ED(专家蒸馏,用专家轨迹而不是学习历史进行行为克隆)、源策略(用于生成 UCB 蒸馏的轨迹[8])、RL2 2017 年提出的一种在线强化学习算法,作为上限进行比较)[9]。尽管 AD 算法仅使用离线强化学习,但其性能仍接近作为上限对比的 RL2,并且学习速度比其他基线快得多。此外,在使用源策略的部分训练历史记录的条件下,AD 的改进速度也比 ED 基线快得多。这些结果表明,AD 算法在上下文强化学习方面具有很好的性能,并且比其他基线更快地学习和改进。

图片

图 7. 在需要内存和探索的环境中 AD、ED、源策略和 RL^2 的比较。其中,环境仅分配二元奖励(0/1)。源策略使用 A3C 算法针对“黑暗”环境进行训练,使用 DQN 算法针对水迷宫进行训练。Resource:Algorithm Distillation 论文

03

组件二:记忆

Memory 记忆的类型

Memory  记忆可以定义为用于获取、存储、保留以及随后检索信息的过程。人脑中有多种记忆类型。这部分内容来自chatGPT[28]。

  • Sensory Memory 感觉记忆 :这是记忆的最早阶段,提供在原始刺激结束后保留感觉信息(视觉、听觉等)印象的能力。感觉记忆通常只能持续几秒钟。子类别包括图像记忆(视觉)、回声记忆(听觉)和触觉记忆(触摸)。

  • 短期记忆/工作记忆(Short-Term Memory, STM/ Working Memory)它存储了我们当前知道的以及执行学习和推理等复杂认知任务所需的信息。短期记忆被认为具有大约 7 个项目的容量(Miller 1956)[10]并且持续 20-30 秒。

  • 长期记忆(Long-Term Memory ,LTM)长期记忆可以存储信息相当长的时间,从几天到几十年不等,存储容量基本上是无限的。LTM 有两种亚型:

  • 外显/陈述性记忆(Explicit / declarative memory):这是对事实和事件的记忆,是指那些可以有意识地回忆起来的记忆,包括情景记忆(事件和经历)和语义记忆(事实和概念)。

  • 内隐/程序性记忆(Implicit / Procedural memory):这种类型的记忆是无意识的,涉及自动执行的技能和例程,例如骑自行车或在键盘上打字。

图片

图 8. 人类记忆的分类

参考人类记忆的分类,我们可以有一个粗略的映射:

感觉记忆作为原始输入的学习嵌入表示,包括文本、图像或其他形式;

短期记忆作为情境学习。它是短且有限的,因为它受到 Transformer 有限上下文窗口长度的限制。

长期记忆作为AI Agents 在查询时可以处理的外部向量存储,可通过快速检索进行访问。

最大内积搜索 (MIPS)

外部记忆可以缓解有限注意力(Finite Attention Span)广度的限制。标准做法是将信息的嵌入表示保存到向量存储数据库中,该数据库可以支持快速最大内积搜索(MIPS)。为了优化检索速度,常见的选择是近似最近邻 (ANN)算法,返回大约前 k 个最近邻,以牺牲一点精度来换取巨大的加速,这种方法可以减轻模型处理大量历史信息时的计算负担,提高模型的效率和性能。

几种常见的 ANN 算法,可用于快速的执行 MIPS:

  • 局部敏感哈希 LSH(Locality-Sensitive Hashing)[11]:它引入了一种哈希函数,使得相似的输入项以高概率映射到相同的存储桶中,其中存储桶的数量远小于输入的数量。

  • 近似最近邻搜索算法(Approximate Nearest Neighbors Oh Yeah,ANNOY )[12]:核心数据结构是随机投影树,一组二叉树,其中每个非叶节点代表一个将输入空间分成两半的超平面,每个叶存储一个数据点。树是独立且随机构建的,因此在某种程度上,它模仿了哈希函数。ANNOY 搜索发生在所有树中,迭代地搜索最接近查询的一半,然后聚合结果。这个想法与 KD 树非常相关,但更具可扩展性。

  • 分层可导航小世界(Hierarchical Navigable Small World,HNSW)[13]它受到小世界网络思想的启发,其中大多数节点可以在少量步骤内被任何其他节点到达;例如社交网络的“六度分离”特征。HNSW 构建这些小世界图的层次结构,其中底层包含实际数据点。中间的层创建快捷方式以加快搜索速度。执行搜索时,HNSW 从顶层的随机节点开始,导航至目标。当它无法靠近时,它会向下移动到下一层,直到到达最底层。上层中的每个移动都可能覆盖数据空间中的很长一段距离,而下层中的每个移动都可以细化搜索质量。

  • FAISS(Facebook AI相似性搜索)[14]:它的运行假设是在高维空间中,节点之间的距离遵循高斯分布,因此应该存在数据点的聚类。FAISS 通过将向量空间划分为簇,然后在簇内细化量化来应用向量量化。搜索首先使用粗量化来查找簇候选,然后进一步使用更精细的量化来查找每个簇。

  • 可扩展最近邻(Scalable Nearest Neighbors,ScaNN)[15]:Scalable Nearest Neighbors(ScaNN)是一种可扩展的最近邻搜索工具,适用于高维向量空间中的最近邻搜索。

图片

图 9. MIPS 算法的比较,以召回率@10 进行测量。(图片来源:谷歌博客,2020)

04

组件三:使用工具

工具的使用是人类的一个显着而显着的特征。我们创造、修改和利用外部物体来完成超出我们身体和认知极限的事情。为LLM配备外部工具可以显着扩展模型功能。

图片

图 10:海獭漂浮在水中时使用岩石敲开贝壳的照片。虽然其他一些动物也可以使用工具,但其复杂性却无法与人类相比。(图片来源:使用工具的动物)

MRKL架构

MRKL(Karpas et al. 2022)[16] Modular Reasoning,  Knowledge and Language 是“模块化推理、知识和语言”的缩写,是一种用于AI agent的神经符号架构。MRKL 系统包含一组“专家”模块,通用 LLM 作为路由器将查询路由到最合适的专家模块。这些模块可以是神经模块(例如深度学习模型)或符号模块(例如数学计算器、货币转换器、天气 API)。

在测试中,MRKL 的作者团队对语言模型(7B Jurassic1-large 模型)进行了微调,使用算术问题作为测试用例来调用计算器。实验结果表明,相比于明确陈述的数学问题,解决口头数学问题更加具有挑战性,因为 LLM 未能可靠地提取基本算术的正确参数。这些结果强调了外部符号工具可靠工作的重要性,知道何时以及如何使用这些工具取决于 LLM 的功能。

TALM

TALM(工具增强语言模型;Parisi 等人,2022 年)[17]和 Toolformer(Schick 等人,2023 年)[18]都对 LLM 进行微调,以学习调用外部工具 API。根据新添加的API调用注释是否可以提高模型输出的质量来扩展数据集。请参阅 Prompt Engineering 的“外部 API”部分了解更多详细信息。

ChatGPT 插件和 OpenAI API 函数调用是LLM在实践中通过工具使用能力增强的很好的例子。工具API的集合可以由其他开发者提供(如在插件中)或自定义(如在函数调用中)。

HuggingGPT

HuggingGPT(Shen et al. 2023)[19]是一个使用 ChatGPT 作为任务规划器的框架,根据模型描述选择 HuggingFace 平台中可用的模型,并根据执行结果总结响应。

图片

图 11. HuggingGPT 工作原理图解。(图片来源:Shen 等人,2023)

该系统包括4个阶段:

1)任务规划 Task planning

LLM作为大脑,将用户请求解析为多个任务。每个任务有四个关联的属性:任务类型、ID、依赖项和参数。他们使用少量的例子来指导LLM进行任务解析和规划。

Instruction 指令如下:

The AI assistant can parse user input to several tasks: AI助手可以将用户输入解析为多个任务:[{'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. “dep”字段表示前一个任务的id,该任务生成当前任务所依赖的新资源。A special tag 'task_id' refers to the generated text image, audio and video in the dependency task with id as task_id. 特殊标签“task_id”是指id为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. 如果用户输入无法解析,则需要回复空JSONHere are several cases for your reference: {{ Demonstrations }}. 这里有几个案例供大家参考:{{演示}}。The chat history is recorded as {{ Chat History }}. 聊天记录记录为{{ Chat History }}。From this chat history, you can find the path of the user-mentioned resources for your task planning.从这段聊天记录中,您可以找到用户提到的资源的路径,以便您规划任务。

2)模型选择 Model selection

LLM将任务分配给专家模型,其中请求被构建为多项选择题。LLM 提供了可供选择的模型列表。由于上下文长度有限,需要基于任务类型的过滤。

Instruction 指令如下:

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. 给定用户请求和调用命令,AI助手帮助用户从模型列表中选择合适的模型来处理用户请求。
The AI assistant merely outputs the model id of the most appropriate model. AI助手仅输出最合适模型的模型id
The output must be in a strict JSON format: 'id': 'id', 'reason': 'your detail reason for the choice'. 输出必须采用严格的 JSON 格式:“id”:“id”,“reason”:“您选择的详细原因”。
We have a list of models for you to choose from {{ Candidate Models }}. 我们有一个模型列表供您从{{候选模型}}中进行选择。
Please select one model from the list.请从列表中选择一种模型。

3) 任务执行Task execution

专家模型执行特定任务并记录结果。

Instruction 指令如下:

With the input and the inference results, the AI assistant needs to describe the process and results. 有了输入和推理结果,AI助手需要描述过程和结果。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) 响应生成 Response generation:

LLM接收执行结果并向用户提供汇总结果。

为了将 HuggingGPT 投入到现实世界中,需要解决几个挑战:

  • 需要提高效率,因为 LLM 推理轮次和与其他模型的交互都会减慢流程; 

  • 依赖长上下文窗口来进行复杂任务内容的通信;

  • LLM产出和外部模型服务的稳定性提升。

API-Bank

API-Bank(Li et al. 2023)[20]是评估工具增强LLM性能的基准。它包含 53 个常用的 API 工具、完整的工具增强的 LLM 工作流程以及涉及 568 个 API 调用的 264 个带注释的对话。

API的选择相当多样化,包括搜索引擎、计算器、日历查询、智能家居控制、日程管理、健康数据管理、账户认证工作流程等等。由于API数量较多,LLM首先要访问API搜索引擎找到合适的API进行调用,然后使用相应的文档进行调用。

图片

图12. LLM 如何在 API-Bank 中进行 API 调用的伪代码。(图片来源:Li et al.2023)

在 API-Bank 工作流程中,LLM需要做出几个决定,在每一步我们都可以评估该决定的准确性。决定包括:

  1. 是否需要API调用。

  2. 确定要调用的正确 API:如果不够好,LLM需要迭代修改 API 输入(例如,确定搜索引擎 API 的搜索关键字)。

  3. 基于API结果的响应:如果结果不满意,模型可以选择细化并再次调用。

该基准测试从三个层面评估代理的工具使用能力:

Level-1评估调用API的能力。给定API 的描述,模型需要确定是否调用给定的 API、正确调用它并正确响应 API 返回。

Level-2 检查检索 API 的能力。模型需要搜索可能解决用户需求的API,并通过阅读文档来学习如何使用它们。

Level-3 评估除了检索和调用之外规划 API 的能力。考虑到不明确的用户请求(例如安排小组会议、预订旅行的航班/酒店/餐厅),模型可能必须进行多个 API 调用来解决它。

05

AI Agents 实践

科学研究领域的应用

ChemCrow(Bran 等人,2023)[21]是一个特定领域的示例,其中LLM通过 13 个专家设计的工具进行了增强,以完成有机合成、药物发现和材料设计等任务。在 LangChain[22] 中实现的工作流程反映了之前在 ReAct 和 MRKL 中描述的内容,并将 CoT 推理与与任务相关的工具相结合:

LLM 提供了工具名称列表、其实用程序的描述以及有关预期输入/输出的详细信息。

然后,系统会指示它在必要时使用提供的工具来回答用户给出的提示。该指令建议模型遵循 ReAct 格式 - Thought, Action, Action Input, Observation 。

一个有趣的观察结果是,虽然基于 LLM 的评估得出的结论是 GPT-4 和 ChemCrow 的表现几乎相当,但专家针对解决方案的完成度和化学正确性进行的人工评估表明,ChemCrow 的性能大幅优于 GPT-4。这表明使用LLM来评估其自身在需要深厚专业知识的领域的表现存在潜在问题。专业知识的缺乏可能会导致LLM不知道其缺陷,从而无法很好地判断任务结果的正确性。

Boiko et al. (2023) [23] 还研究了LLM科学发现的AI Agents,以处理复杂科学实验的自主设计、规划和执行。该Agents可以使用工具浏览互联网、阅读文档、执行代码、调用机器人实验 API 并利用其他LLM。

例如,当请求 'develop a novel anticancer drug' 时,模型提出以下推理步骤:

  1. 询问抗癌药物发现的当前趋势;

  2. 选择了一个目标;

  3. 要求针对这些化合物的支架;

  4. 一旦化合物被识别,模型就会尝试合成。

他们还讨论了风险,特别是非法药物和生物武器的风险。他们开发了一套测试装置,其中包含一系列已知的化学武器制剂,并要求该制剂合成它们。11 项请求中有 4 项 (36%) 被接受以获得合成解决方案,并且AI Agents尝试查阅文档来执行该程序。11 件中有 7 件被拒绝,这 7 件被拒绝的案例中,有 5 件是在网络搜索后发生的,2 件是仅根据提示被拒绝的。

生成式代理 Generative Agents

Generative Agents(Park 等人,2023)[24]是一个超级有趣的实验,其中 25 个虚拟角色,每个角色都由 LLM 支持的Agents控制,在沙盒环境中生活和交互,其灵感来自《模拟人生》。生成式Agents为交互式应用程序创建可信的人类行为模拟。

生成式代理的设计将 LLM 与记忆、规划和反射机制相结合,使代理能够根据过去的经验进行行为,并与其他代理进行交互。

记忆流Memory stream:是一个长期记忆模块(外部数据库),用自然语言记录智能体经验的完整列表。

  • 每个元素都是一个观察结果,一个由Agents直接提供的事件。- Agents间通信可以触发新的自然语言语句。

检索模型 Retrieval model:根据相关性、新近度和重要性,呈现上下文以告知Agents的行为。

  • 新近度 Recency:最近发生的事件得分较高

  • 重要性 Importance:区分平凡记忆和核心记忆。直接问LM。

  • 相关性 Relevance:基于它与当前情况/查询的相关程度。

反射机制 Reflection mechanism随着时间的推移将记忆合成更高层次的推论,并指导智能体未来的行为。它们是对过去事件的更高层次的总结(<-注意,这与上面的自我反思[25]有点不同)

规划和反应 Planning & Reacting:将反思和环境信息转化为行动

  • 规划Planning本质上是为了优化当前与时间的可信度。
  • 提示模板:{Intro of an agent X}. Here is X's plan today in broad strokes: 
  • 规划和反应时都会考虑主体之间的关系以及一个主体对另一个主体的观察。
  • 环境信息以树形结构呈现。

图片

图 13.生成式代理架构(图片来源:Park 等人,2023)

这种有趣的模拟会导致新兴的社交行为,例如信息传播、关系记忆(例如两个代理继续对话主题)和社交活动的协调(例如举办聚会并邀请许多其他人)。

06

AI Agent 概念验证示例

AutoGPT

AutoGPT[26] 引起了人们对建立以 LLM 作为主控制器的AI Agents的可能性的广泛关注。考虑到自然语言界面,它存在很多可靠性问题,但仍然是一个很酷的概念验证演示。AutoGPT 中的很多代码都是关于格式解析的

以下是 AutoGPT 使用的系统消息,其中 {{...}} 是用户输入:

You are {{ai-name}}, {{user-provided AI bot description}}.你是{{ai-name}},{{用户提供的AI机器人描述}}。Your decisions must always be made independently without seeking user assistance. Play to your strengths as an LLM and pursue simple strategies with no legal complications.你的决策必须始终独立进行,无需寻求用户的帮助。发挥你作为LLM的优势,追求没有法律复杂性的简单策略。

GOALS:目标:
1. {{user-provided goal 1}} {{用户提供的目标1}}2. {{user-provided goal 2}} {{用户提供的目标2}}3. ...4. ...5. ...
Constraints:约束:
1. ~4000 word limit for short term memory. Your short term memory is short, so immediately save important information to files.短期记忆的字数限制约为4000字。你的短期记忆很短,所以立即将重要信息保存到文件中。2. If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember.如果你不确定你之前是如何做某事的,或者想回忆过去的事件,思考类似的事件会帮助你记住。3. No user assistance不得寻求用户帮助4. Exclusively use the commands listed in double quotes e.g. 'command name'仅使用双引号中列出的命令,例如'命令名称'5. Use subprocesses for commands that will not terminate within a few minutes对于几分钟内无法结束的命令,使用子进程
Commands:命令:1. Google Search: 'google', args: 'input': '<search>'Google搜索:'google',参数:'input': '<搜索>'2. Browse Website: 'browse_website', args: 'url': '<url>', 'question': '<what_you_want_to_find_on_website>'浏览网站:'browse_website',参数:'url': '<url>', 'question': '<你想在网站上找到什么>'3. Start GPT Agent: 'start_agent', args: 'name': '<name>', 'task': '<short_task_desc>', 'prompt': '<prompt>'启动GPT Agent:'start_agent',参数:'name': '<名称>', 'task': '<简短任务描述>', 'prompt': '<提示>'4. Message GPT Agent: 'message_agent', args: 'key': '<key>', 'message': '<message>'向GPT Agent发送消息:'message_agent',参数:'key': '<键>', 'message': '<消息>'5. List GPT Agents: 'list_agents', args:列出GPT Agents:'list_agents',参数:6. Delete GPT Agent: 'delete_agent', args: 'key': '<key>'删除GPT Agent:'delete_agent',参数:'key': '<键>'7. Clone Repository: 'clone_repository', args: 'repository_url': '<url>', 'clone_path': '<directory>'克隆仓库:'clone_repository',参数:'repository_url': '<url>', 'clone_path': '<目录>'8. Write to file: 'write_to_file', args: 'file': '<file>', 'text': '<text>'写入文件:'write_to_file',参数:'file': '<文件>', 'text': '<文本>'9. Read file: 'read_file', args: 'file': '<file>'读取文件:'read_file',参数:'file': '<文件>'10. Append to file: 'append_to_file', args: 'file': '<file>', 'text': '<text>'追加到文件:'append_to_file',参数:'file': '<文件>', 'text': '<文本>'11. Delete file: 'delete_file', args: 'file': '<file>'删除文件:'delete_file',参数:'file': '<文件>'12. Search Files: 'search_files', args: 'directory': '<directory>'搜索文件:'search_files',参数:'directory': '<目录>'13. Analyze Code: 'analyze_code', args: 'code': '<full_code_string>'分析代码:'analyze_code',参数:'code': '<完整代码字符串>'14. Get Improved Code: 'improve_code', args: 'suggestions': '<list_of_suggestions>', 'code': '<full_code_string>'获取改进的代码:'improve_code',参数:'suggestions': '<建议列表>', 'code': '<完整代码字符串>'15. Write Tests: 'write_tests', args: 'code': '<full_code_string>', 'focus': '<list_of_focus_areas>'编写测试:'write_tests',参数:'code': '<完整代码字符串>', 'focus': '<关注点列表>'16. Execute Python File: 'execute_python_file', args: 'file': '<file>'执行Python文件:'execute_python_file',参数:'file': '<文件>'17. Generate Image: 'generate_image', args: 'prompt': '<prompt>'生成图像:'generate_image',参数:'prompt': '<提示>'18. Send Tweet: 'send_tweet', args: 'text': '<text>'发送推文:'send_tweet',参数:'text': '<文本>'19. Do Nothing: 'do_nothing', args:无操作:'do_nothing',参数:20. Task Complete (Shutdown): 'task_complete', args: 'reason': '<reason>'任务完成(关闭):'task_complete',参数:'reason': '<原因>'

Resources:资源:1. Internet access for searches and information gathering.用于搜索和信息收集的互联网访问权限。2. Long Term memory management.长期记忆管理。3. GPT-3.5 powered Agents for delegation of simple tasks.由GPT-3.5驱动的Agents,用于委派简单任务。4. File output.文件输出。
Performance Evaluation:性能评估:1. Continuously review and analyze your actions to ensure you are performing to the best of your abilities.持续审查和分析你的行动,确保你尽可能地发挥出你的能力。2. Constructively self-criticize your big-picture behavior constantly.不断地对你的大局行为进行建设性的自我批评。3. Reflect on past decisions and strategies to refine your approach.反思过去的决策和策略,以改进你的方法。4. Every command has a cost, so be smart and efficient. Aim to complete tasks in the least number of steps.每个命令都有成本,所以要聪明和高效。目标是以最少的步骤完成任务。
You should only respond in JSON format as described below你应该只以下面描述的JSON格式回应Response Format: //回应格式:{ 'thoughts': { 'text': 'thought', 'reasoning': 'reasoning', 'plan': '- short bulleted\n- list that conveys\n- long-term plan', 'criticism': 'constructive self-criticism', 'speak': 'thoughts summary to say to user' }, 'command': { 'name': 'command name', 'args': { 'arg name': 'value' } }}Ensure the response can be parsed by Python json.loads确保回应可以被Python json.loads解析

GPT-Engineer

GPT-Engineer [27]是另一个项目,用于根据自然语言指定的任务创建整个代码存储库。为了实现这个目标,GPT 工程师需要考虑构建哪些较小的组件,并在必要时与用户进行交互以澄清问题或获取更多信息。也就是说,将最接近真实意图的自然语言任务转化为可执行的代码,以确保任务需求得到正确理解和实现。

以下是发送到 GPT-Engineer 使用的 OpenAI ChatCompletion 端点的用于说明任务的示例对话。用户输入包含在 {{user input text}} 中。

[{'role''system', // “角色”:“系统”'content': 'You will read instructions and not carry them out, only seek to clarify them.\nSpecifically you will first summarise a list of super short bullets of areas that need clarification.\nThen you will pick one clarifying question, and wait for an answer from the user.\n' // 你将阅读指令但不执行它们,只寻求澄清它们。具体来说,你首先会总结出需要澄清的领域的超短小结。然后你会选择一个澄清问题,并等待用户的回答。},{'role': 'user',// “角色”:“用户”'content': 'We are writing {{a Super Mario game in python. MVC components split in separate files. Keyboard control.}}\n' // 我们正在编写{{一个用Python编写的超级马里奥游戏。MVC组件分割在不同的文件中。键盘控制。}}},{'role''assistant',// “角色”:“助理”'content': 'Summary of areas that need clarification:\n1. Specifics of the Super Mario game (e.g. level design, characters, gameplay mechanics)\n2. Details about the MVC components (e.g. which components are in each file)\n3. Keyboard control implementation (e.g. which keys to use, how to handle input)\n\nClarifying question:\nCan you provide more details about the Super Mario game, such as level design, characters, and gameplay mechanics?' // 需要澄清的领域的总结:\n1. 超级马里奥游戏的具体情况(例如,关卡设计、角色、游戏机制)\n2. 关于MVC组件的细节(例如,每个文件中有哪些组件)\n3. 键盘控制实现(例如,使用哪些键,如何处理输入)\n\n澄清问题:\n你能否提供更多关于超级马里奥游戏的细节,如关卡设计、角色和游戏机制?},{'role': 'user', // “角色”:“用户”'content': '{{There are 10 levels in total. The main character is a plumber named Mario, who can walk and jump. It is a classical platform game just like Super Mario. The main character moves from left to right, trying to get to the destination, where there are many obstacles and attacks from enemies in the process.}}\n\nIs anything else unclear? If yes, only answer in the form:\n{remaining unclear areas} remaining questions.\n{Next question}\nIf everything is sufficiently clear, only answer 'Nothing more to clarify.'.' // {{总共有10个关卡。主角是一个叫马里奥的水管工,他可以走和跳。这是一个和超级马里奥一样的经典平台游戏。主角从左向右移动,试图到达目的地,过程中有许多障碍和敌人的攻击。}}\n\n还有什么不清楚的吗?如果有,只能以以下形式回答:\n{剩余不清楚的领域} 剩余的问题。\n{下一个问题}\n如果一切都足够清楚,只需要回答“没有更多需要澄清的。”。},{'role': 'assistant', // “角色”:“助理”'content': 'Remaining unclear areas: 2 remaining questions.\nCan you provide more information about how the MVC components are split into separate files?' // 剩余不清楚的领域:2个剩余的问题。\n你能提供更多关于MVC组件如何分割到不同文件的信息吗?},{'role''user', // “角色”:“用户”'content': '{{Make your own assumptions and state them explicitly before starting}}' // {{在开始前做出你自己的假设,并明确地陈述它们}}}]

随后,一旦 GPT 工程师与用户澄清了任务需求,AI Agents 会进入代码编写模式,并使用不同的系统消息来执行编写代码的任务,系统消息如下

You will get instructions for code to write. 你将得到编写代码的指令。You will write a very long answer. Make sure that every detail of the architecture is, in the end, implemented as code. Make sure that every detail of the architecture is, in the end, implemented as code.你将写一个非常长的答案。确保最后每一个架构的细节都被实现为代码。Think step by step and reason yourself to the right decisions to make sure we get it right. 逐步思考,通过自我推理做出正确的决策,以确保我们做得正确。You will first lay out the names of the core classes, functions, methods that will be necessary, as well as a quick comment on their purpose.你首先会列出必要的核心类、函数、方法的名称,以及对它们的目的的简短注释。
Then you will output the content of each file including ALL code. 然后,你将输出每个文件的内容,包括所有的代码。Each file must strictly follow a markdown code block formatwhere the following tokens must be replaced such that FILENAME is the lowercase file name including the file extension, LANG is the markup code block language for the code’s languageand CODE is the code:每个文件必须严格遵循markdown代码块格式,其中以下标记必须被替换,使得FILENAME是小写的文件名,包括文件扩展名,LANG是代码语言的标记代码块语言,CODE是代码:
FILENAME 文件名CODE
You will start with the “entrypoint” file, then go to the ones that are imported by that file, and so on. 你将从'入口点'文件开始,然后转到由该文件导入的文件,依此类推。Please note that the code should be fully functional. No placeholders.请注意,代码应该是完全功能的。没有占位符。

Follow a language and framework appropriate best practice file naming convention. 遵循适合语言和框架的最佳实践文件命名规范。Make sure that files contain all imports, types etc. Make sure that code in different files are compatible with each other. 确保文件包含所有的导入、类型等。确保不同文件中的代码是相互兼容的。Ensure to implement all code, if you are unsure, write a plausible implementation. 确保实现所有的代码,如果你不确定,写一个合理的实现。Include module dependency or package manager dependency definition file. 包括模块依赖或包管理器依赖定义文件。Before you finish, double check that all parts of the architecture is present in the files.在你完成之前,再次检查所有的架构部分是否都在文件中。
Useful to know: 有用的知识:You almost always put different classes in different files. 您几乎总是将不同的类放在不同的文件中。For Python, you always create an appropriate requirements.txt file. 对于Python,您始终创建适当的requirements.txt 文件。For NodeJS, you always create an appropriate package.json file. 对于 NodeJS,您始终创建适当的 package.json 文件。You always add a comment briefly describing the purpose of the function definition. 您始终添加一条注释,简要描述函数定义的目的。You try to add comments explaining very complex bits of logic. 您尝试添加注释来解释非常复杂的逻辑。You always follow the best practices for the requested languages in terms of describing the code written as a defined package/project.你总是遵循请求的语言的最佳实践,以描述代码被写为一个定义的包/项目。
Python toolbelt preferences:工具带首选项:Python
pytest py测试dataclasses 数据类

Conversatin samples: 对话样本:

[ {    'role': 'system', # “角色”:“系统” 'content': 'You will get instructions for code to write.\nYou will write a very long answer. Make sure that every detail of the architecture is, in the end, implemented as code.\nMake sure that every detail of the architecture is, in the end, implemented as code.\n\nThink step by step and reason yourself to the right decisions to make sure we get it right.\nYou will first lay out the names of the core classes, functions, methods that will be necessary, as well as a quick comment on their purpose.\n\nThen you will output the content of each file including ALL code.\nEach file must strictly follow a markdown code block format, where the following tokens must be replaced such that\nFILENAME is the lowercase file name including the file extension,\nLANG is the markup code block language for the code's language, and CODE is the code:\n\nFILENAME\n```LANG\nCODE\n```\n\nYou will start with the \'entrypoint\' file, then go to the ones that are imported by that file, and so on.\nPlease note that the code should be fully functional. No placeholders.\n\nFollow a language and framework appropriate best practice file naming convention.\nMake sure that files contain all imports, types etc. Make sure that code in different files are compatible with each other.\nEnsure to implement all code, if you are unsure, write a plausible implementation.\nInclude module dependency or package manager dependency definition file.\nBefore you finish, double check that all parts of the architecture is present in the files.\n\nUseful to know:\nYou almost always put different classes in different files.\nFor Python, you always create an appropriate requirements.txt file.\nFor NodeJS, you always create an appropriate package.json file.\nYou always add a comment briefly describing the purpose of the function definition.\nYou try to add comments explaining very complex bits of logic.\nYou always follow the best practices for the requested languages in terms of describing the code written as a defined\npackage/project.\n\n\nPython toolbelt preferences:\n- pytest\n- dataclasses\n' # 即上面那一段系统消息 }, #  … same conversation as earlier, ended with 'Make your own assumptions and state them explicitly before starting'.  # ...与之前的对话相同,以'明确地表述你自己的假设并开始'结束。 
{    'role': 'assistant', # “角色”:“助理” 'content': 'Assumptions:\n1. Model: The model will contain the game'# 假设# 1.模型:模型将包含游戏的数据,如关卡信息、角色状态和敌人位置。# 2.视图:视图将处理游戏的视觉效果,包括渲染游戏对象、背景和更新显示。# 3. 控制器:控制器将管理用户输入,如键盘控制,并相应地更新模型。# 有了这些假设,你是否希望我澄清键盘控制实现的任何特定方面? }, { 'role': 'user', # “角色”:“用户” 'content': 'Please now remember the steps:\n\nThink step by step and reason yourself to the right decisions to make sure we get it right.\nFirst lay out the names of the core classes, functions, methods that will be necessary, As well as a quick comment on their purpose.\n\nThen you will output the content of each file including ALL code.\nEach file must strictly follow a markdown code block format, where the following tokens must be replaced such that\nFILENAME is the lowercase file name including the file extension,\nLANG is the markup code block language for the code's language, and CODE is the code:\n\nFILENAME\n```LANG\nCODE\n```\n\nPlease note that the code should be fully functional. No placeholders.\n\nYou will startwith the \'entrypoint\' file, then go to the ones that are imported by that file, and so on.\nFollow a language and framework appropriate best practice file naming convention.\nMake sure that files contain all imports, types etc. The code should be fully functional. Make sure that code in different files are compatible with each other.\nBefore you finish, double check that all parts of the architecture is present in the files.\n'# 请现在记住这些步骤:#逐步思考,通过自我推理做出正确的决策,以确保我们做得正确。#首先列出必要的核心类、函数、方法的名称,以及对它们的目的的简短注释。#然后,你将输出每个文件的内容,包括所有的代码。#每个文件必须严格遵循markdown代码块格式,其中以下标记必须被替换,使得FILENAME是小写的文件名,包括文件扩展名,LANG是代码语言的标记代码块语言,CODE是代码:#请注意,代码应该是完全功能的。没有占位符。#你将从'入口点'文件开始,然后转到由该文件导入的文件,依此类推。#遵循适合语言和框架的最佳实践文件命名规范。#确保文件包含所有的导入、类型等。代码应该是完全功能的。#确保不同文件中的代码是相互兼容的。#在你完成之前,再次检查所有的架构部分是否都在文件中。
}]

07

LLM Agents 的挑战

在了解了构建以 LLM 为中心的代理的关键想法和演示之后,我开始看到一些常见的限制:
上下文长度有限 Finite context length:
上下文容量有限,限制了历史信息、详细说明、API 调用上下文和响应的包含。系统的设计必须适应这种有限的通信带宽,而从过去的错误中学习的自我反思等机制将从长或无限的上下文窗口中受益匪浅。尽管向量存储和检索可以提供对更大知识库的访问,但它们的表示能力不如充分关注那么强大。
长期规划和任务分解的挑战Challenges in long-term planning and task decomposition:
长期规划和有效探索解决方案空间仍然具有挑战性。法学硕士在遇到意外错误时很难调整计划,这使得它们与从试错中学习的人相比不太稳健。
自然语言接口的可靠性 Reliability of natural language interface:
当前的代理系统依赖自然语言作为法学硕士与外部组件(例如内存和工具)之间的接口。然而,模型输出的可靠性值得怀疑,因为法学硕士可能会出现格式错误,并且偶尔会表现出叛逆行为(例如拒绝遵循指示)。因此,大部分代理演示代码都专注于解析模型输出。
“ 我创建了AI交流群,里面会实时分享AI最新有用的信息,群里信息密度和新鲜度非常高,交流氛围也很好,欢迎感兴趣的朋友可以后台回复关键词【微信】,扫码入群。”

References 参考

[0] LLM Powered Autonomous Agents https://lilianweng./archives/

[1] 思想链 Chain of thought(CoT;Wei et al. 2022) https:///abs/2201.11903

[2]思维树 Tree of Thoughts(Yao et al. 2023) https:///abs/2305.10601

[3] LLM+P(Liu et al. 2023) https:///abs/2304.11477

[4]ReAct(Yao et al. 2023) https:///abs/2210.03629

[5]Reflexion (Shinn & Labash 2023)  https:///abs/2303.11366

[6]Chain of Hindsight(CoH;Liu et al. 2023) https:///abs/2302.02676

[7]算法蒸馏(AD;Laskin 等人,2023) https:///abs/2210.14215

[8]https://lilianweng./posts/2018-01-23-multi-armed-bandit/#upper-confidence-bounds

[9]https:///abs/1611.02779

[10]https://lilianweng./posts/2023-06-23-agent/psychclassics.yorku.ca/Miller/

[11]https://en./wiki/Locality-sensitive_hashing

[12]https://github.com/spotify/annoy

[13]https:///abs/1603.09320

[14]https://github.com/facebookresearch/faiss

[15]https://github.com/google-research/google-research/tree/master/scann

[16]MRKL https:///abs/2205.00445

[17]https:///abs/2205.12255

[18]https:///abs/2302.04761

[19]https:///abs/2303.17580

[20]https:///abs/2304.08244

[21]https:///abs/2304.05376

[22]https://github.com/hwchase17/langchain

[23]https:///abs/2304.05332

[24]https:///abs/2304.03442

[25]https://lilianweng./posts/2023-06-23-agent/#self-reflection

[26]https://github.com/Significant-Gravitas/Auto-GPT

[27]https://github.com/AntonOsika/gpt-engineer

[28]https://chat./share/46ff149e-a4c7-4dd7-a800-fc4a642ea389

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多