基于大模型(LLM) 的自主智能体 | Lil'Log
以大模型(LLM) 作为核心控制器的智能体 (Agent) 概念非常引人注目。目前已有一些概念验证演示,如 AutoGPT、GPT-Engineer 和 BabyAGI,它们都是鼓舞人心的范例。LLM 的潜力远不止于生成高质量的文案、故事、文章和程序,它还可以被视为一个强大的解决通用问题手段。
在一个由 LLM驱动的自主智能体系统中,LLM 充当智能体的大脑,并辅以几个关键组件:
- 规划 (Planning)
- 子目标与分解:智能体将大型任务分解为更小、更易于管理的子目标,从而有效地处理复杂任务。
- 反思与完善:智能体能够对过去的行为进行自我批评和反思,从错误中学习并为未来的步骤进行改进,从而提高最终结果的质量。- 记忆 (Memory)
- 短期记忆:将所有上下文学习(参见 Prompt Engineering)视为模型利用短期记忆进行学习。
- 长期记忆:这赋予智能体在较长时间内保留和回忆(无限)信息的能力,通常通过利用外部向量存储 (Vector Store) 和快速检索来实现。
- 工具使用 (Tool use)
- 智能体学习调用外部应用程序接口 (API),以获取模型权重中缺失的额外信息(这部分信息在预训练后通常难以改变),包括当前信息、代码执行能力、访问专有信息源等。
LLM 驱动的自主智能体系统概览。
一项复杂的任务通常涉及许多步骤。智能体需要了解这些步骤并提前做好规划。
任务分解
[思维链 (Chain of Thought,CoT; Wei 等,2022)] 已成为提升模型处理复杂任务性能的标准提示工程技术。通过指示模型“逐步思考”,使其利用更多的测试时计算来将复杂任务分解为更小、更简单的步骤。CoT 将大型任务转化为多个可管理的任务,并为解释模型的思维过程提供了线索。
思维树 (Treeof Thoughts; Yao 等,2023) 扩展了 CoT,它在每个步骤探索多种推理可能性。首先将问题分解为多个思维步骤,并在每个步骤生成多个想法,从而创建一个树状结构。搜索过程可以是广度优先搜索 (BFS) 或深度优先搜索 (DFS),每个状态通过分类器(通过提示)或多数投票进行评估。
任务分解可以通过以下方式完成:(1) LLM 通过简单的提示,如 "XYZ 的步骤。\n1."、"实现 XYZ 的子目标是什么?";(2) 使用特定任务的指令,例如为撰写小说提供"撰写故事大纲。";(3) 人工输入。
另一种截然不同的方法是 LLM + P (Liu 等,2023),它依赖外部经典规划器进行长期规划。该方法利用规划领域定义语言 (PDDL) 作为中间接口来描述规划问题。在此过程中,LLM(1) 将问题翻译为“问题 PDDL”,然后 (2) 请求经典规划器基于现有“领域 PDDL”生成 PDDL 规划,最后 (3) 将 PDDL 规划翻译回自然语言。本质上,规划步骤外包给了一个外部工具,这假设领域特定的 PDDL 和合适的规划器是可用的,这在某些机器人设置中很常见,但在许多其他领域则不然。
自我反思
自我反思是自主智能体通过完善过去的行动决策和纠正之前的错误来迭代改进的关键环节。它在需要不断试错的实际任务中发挥着至关重要的作用。
ReAct (Yao 等,2023) 通过将行动空间扩展为任务特定的离散行动和语言空间的组合,实现了 LLM 内部的推理和行动整合。前者使 LLM 能够与环境交互(例如,使用维基百科搜索 API),而后者则提示 LLM 生成自然语言的推理轨迹。
ReAct 的提示模板整合了 LLM 思考的明确步骤,大致格式如下:
Thought: ...(思考)
Action: ...(行动)
Observation: ...(观察)
...(重复多次)
知识密集型任务(例如 HotpotQA、FEVER)和决策任务(例如 AlfWorld 环境、WebShop)的推理轨迹示例。(图片来源:Yao 等,2023)
在知识密集型任务和决策任务的实验中,ReAct 的表现均优于移除了Thought: ...步骤的纯 Act 基线。
Reflexion (Shinn & Labash,2023) 是一种为智能体配备动态记忆和自我反思能力的框架,以提高推理技能。Reflexion 采用标准的强化学习 (RL) 设置,其中奖励模型提供一个简单的二元奖励,行动空间遵循 ReAct 的设置,即任务特定的行动空间通过语言进行增强,以实现复杂的推理步骤。在每次行动
之后,智能体会根据自我反思结果计算一个启发式
,并可选地_决定重置_环境以开始新的试验。
Reflexion 框架示意图。(图片来源:Shinn & Labash, 2023)
启发式函数决定何时轨迹效率低下或包含幻觉,并应停止。效率低下的规划指的是耗时过长但未成功的轨迹。幻觉被定义为遇到一系列连续相同的行动,这些行动在环境中导致相同的观察。
通过向 LLM 展示两样本示例来创建自我反思,每个示例都是一个(失败轨迹,用于指导未来计划更改的理想反思)对。然后,反思会添加到智能体的工作记忆中,最多三个,作为查询 LLM 的上下文。
在 AlfWorld 环境和 HotpotQA 上的实验。在 AlfWorld 中,幻觉比效率低下的规划更常见的失败。(图片来源:Shinn & Labash, 2023)
事后反思链 (Chain of Hindsight, CoH; Liu 等,2023) 鼓励模型通过明确提供一系列过去的输出,并对每个输出进行反馈注释来改进自身的输出。人类反馈数据是
的集合,其中
是提示,每个
是模型的补全结果,
是人类对
的评分,
是相应的人类提供的回顾性反馈。假设反馈元组按奖励排序,
。该过程是监督微调,其中数据以
的形式出现,
。模型经过微调,仅在序列前缀的条件下预测
,以便模型可以进行自我反思,根据反馈序列生成更好的输出。模型可以在测试时选择性地接收多轮人工标注者的指令。
为了避免过拟合,CoH 添加了一个正则化项,以最大化预训练数据集的对数似然。为了避免取巧和复制(因为反馈序列中有很多常见词),他们在训练期间随机遮蔽 0% 到 5% 的过去标记。
他们实验中的训练数据集是 WebGPT comparisons、summarization from human feedback 和 human preference dataset 的组合。
经过 CoH 微调后,模型可以按照指令生成一系列逐步改进的输出。(图片来源:Liu 等,2023)
CoH 的思想是提供一个逐步改进输出的历史序列作为上下文,并训练模型遵循这种趋势以生成更好的输出。算法蒸馏 (Algorithm Distillation, AD; Laskin 等,2023) 将相同的思想应用于强化学习任务中的跨回合轨迹,其中“算法”被封装在一个长的历史条件策略中。考虑到智能体多次与环境交互,并且在每个回合中智能体会稍有进步,AD 将这种学习历史串联起来并将其输入模型。因此,我们应该期望下一个预测的行动比之前的尝试带来更好的性能。目标是学习强化学习 (RL) 的过程,而不是训练一个特定任务的策略本身。
算法蒸馏 (AD) 工作原理示意图。
(图片来源:Laskin 等,2023)。
论文假设,任何生成一组学习历史的算法都可以通过对行动执行行为克隆,将其提炼到神经网络中。历史数据由一组源策略生成,每个策略都针对特定任务进行训练。在训练阶段,在每次 RL 运行期间,都会采样一个随机任务,并使用多回合历史子序列进行训练,从而使学习到的策略与任务无关。
实际上,模型的上下文窗口长度有限,因此回合应该足够短以构建多回合历史。2-4 个回合的多回合上下文对于学习近似最优的上下文强化学习算法是必要的。上下文强化学习的出现需要足够长的上下文。
与三个基线进行比较,包括 ED(专家蒸馏,使用专家轨迹而非学习历史进行行为克隆)、源策略(用于通过 UCB 生成蒸馏轨迹)、RL^2 (Duan 等,2017;由于需要在线 RL 而用作上限),AD 展示了上下文强化学习,其性能接近 RL^2,尽管只使用离线强化学习,并且比其他基线学习速度快得多。当以源策略的部分训练历史为条件时,AD 的改进速度也比 ED 基线快得多。
AD、ED、源策略和 RL^2 在需要记忆和探索的环境中的比较。只分配二元奖励。源策略使用 A3C 针对“黑暗”环境进行训练,使用 DQN 针对水迷宫进行训练。
(图片来源:Laskin 等,2023)
(非常感谢 ChatGPT 帮助我起草本节。我在与 ChatGPT 的对话中学到了很多关于人脑和快速最大内积搜索 (MIPS) 数据结构的知识。)
记忆类型
记忆可以定义为获取、存储、保留和随后检索信息的過程。人脑中有多种类型的记忆。
- 感觉记忆 :这是记忆的最早期阶段,能够保留原始刺激结束后感官信息(视觉、听觉等)的印象。感觉记忆通常只能持续几秒钟。其子类别包括图像记忆(视觉)、回声记忆(听觉)和触觉记忆(触觉)。
- 短期记忆 (Short-Term Memory, STM) 或工作记忆 (Working Memory):它存储我们当前意识到的信息,并用于执行复杂的认知任务,如学习和推理。短期记忆被认为能够存储大约 7 个项目(Miller,1956),并持续 20-30 秒。
- 长期记忆 (Long-Term Memory, LTM):长期记忆可以存储信息极长的时间,从几天到几十年,其存储容量基本上是无限的。长期记忆有两种子类型:
- 外显 / 陈述性记忆:这是关于事实和事件的记忆,指那些可以有意识回忆的记忆,包括情景记忆(事件和经验)和语义记忆(事实和概念)。
- 内隐 / 程序性记忆:这种记忆是无意识的,涉及自动执行的技能和例程,例如骑自行车或在键盘上打字。
人类记忆的分类。
我们可以大致考虑以下映射关系:
- 感觉记忆:学习原始输入(包括文本、图像或其他模态)的嵌入表示。
- 短期记忆:相当于上下文学习 (in-context learning)。它短暂且有限,受限于 Transformer 有限的上下文窗口长度。
- 长期记忆:作为外部向量存储,智能体可以在查询时访问,通过快速检索实现。
最大内积搜索 (MIPS)
外部记忆可以缓解有限注意力跨度的限制。一种常见做法是将信息的嵌入表示保存到向量存储数据库中,该数据库支持快速最大内积搜索 (MIPS)。为了优化检索速度,通常选择_近似最近邻 (ANN)_ 算法来返回大约前 k 个最近邻,以牺牲少量准确性来换取巨大的速度提升。
以下是一些用于快速 MIPS 的常见 ANN 算法选择:
-LSH (Locality-Sensitive Hashing,局部敏感哈希):它引入了一个_哈希_函数,使相似的输入项以高概率映射到同一个桶中,其中桶的数量远小于输入数量。
- ANNOY (Approximate Nearest Neighbors Oh Yeah,近似最近邻哦耶):核心数据结构是_随机投影树_,一组二叉树,其中每个非叶节点表示一个将输入空间一分为二的超平面,每个叶节点存储一个数据点。树是独立随机构建的,因此在某种程度上模拟了哈希函数。ANNOY 搜索发生在所有树中,以迭代搜索最接近查询的半空间,然后聚合结果。这个思想与 KD 树非常相关,但可扩展性更强。 - HNSW (Hierarchical Navigable Small World,分层可导航小世界):它受到小世界网络思想的启发,即大多数节点可以通过少数步骤到达任何其他节点;例如社交网络的“六度分隔”特性。HNSW 构建了这些小世界图的分层结构,其中底层包含实际数据点。中间层创建快捷方式以加快搜索速度。执行搜索时,HNSW 从顶层的一个随机节点开始,并向目标导航。当无法再靠近时,它会向下移动到下一层,直到到达底层。上层中的每次移动都可能在数据空间中覆盖很远的距离,而下层中的每次移动都可细化搜索质量。
- FAISS (Facebook AI Similarity Search):它基于高维空间中节点之间的距离遵循高斯分布的假设,因此应该存在数据点的_聚类_。FAISS 通过将向量空间划分为簇,然后在簇内细化量化来应用向量量化。搜索首先通过粗略量化查找簇候选,然后通过更精细的量化进一步查找每个簇。
- ScaNN (Scalable Nearest Neighbors):ScaNN 的主要创新是_各向异性向量量化_。它将数据点
量化为
,使得内积
尽可能类似于原始距离
,而不是选择最近的量化中心点。
MIPS 算法比较,以 recall@10 衡量。(图片来源:Google Blog,2020)
更多 MIPS 算法和性能比较请查看 ann-benchmarks.com。
工具的使用是人类的一项显著特征。我们创造、修改和利用外部物体,以超越我们的身体和认知极限。为大模型(LLM) 配备外部工具可以显著扩展模型的能力。
一张海獭在水中漂浮时,用石头敲开海贝的照片。虽然其他一些动物也会使用工具,但其复杂程度无法与人类相比。(图片来源:使用工具的动物)
MRKL (Karpas 等,2022),是“Modular Reasoning, Knowledge and Language”(模块化推理、知识和语言)的缩写,是一种用于自主智能体的神经符号架构。MRKL 系统被提议包含一组“专家”模块,通用 LLM 充当路由器,将查询路由到最合适的专家模块。这些模块可以是神经模块(例如深度学习模型)或符号模块(例如数学计算器、货币转换器、天气 API)。
他们进行了一项实验,通过算术作为测试案例,对 LLM 进行微调以调用计算器。实验表明,解决口头数学问题比解决明确陈述的数学问题更困难,因为 LLM(7B Jurassic1-large 模型)未能可靠地提取基本算术的正确参数。结果强调,当外部符号工具能够可靠工作时,_知道何时以及如何使用工具至关重要_,这取决于 LLM 的能力。
TALM (Tool Augmented Language Models; Parisi 等,2022) 和 Toolformer (Schick 等,2023) 都微调语言模型 (LM) 以学习使用外部工具 API。数据集的扩展基于新添加的 API 调用注释是否能提高模型输出的质量。更多详情请参阅提示工程的“外部 API”部分。
ChatGPT 插件 (Plugins) 和 OpenAI API 函数调用 (function calling) 是 LLM 增强工具使用能力并在实践中发挥作用的良好示例。工具 API 的集合可以由其他开发者提供(如插件中所示)或自行定义(如函数调用中所示)。
HuggingGPT (Shen 等,2023) 是一个框架,它利用 ChatGPT 作为任务规划器,根据模型描述选择 HuggingFace 平台上可用的模型,并根据执行结果总结响应。
HuggingGPT 工作原理示意图。(图片来源:Shen 等,2023)
该系统包含四个阶段:
(1) 任务规划 :LLM 作为大脑,将用户请求解析成多个任务。每个任务都包含四个属性:任务类型、ID、依赖关系和参数。他们使用少样本示例来指导 LLM 进行任务解析和规划。
指令:
AI 助手可以将用户输入解析为以下任务:[{"task": task, "id": task\_id, "dep": dependency\_task\_ids, "args": {"text": text, "image": URL, "audio": URL, "video": URL}}]。"dep" 字段表示生成当前任务所依赖新资源的先前任务的 ID。特殊标签 "-task\_id" 指的是依赖任务(ID 为 task\_id)中生成的文本、图像、音频和视频。任务必须从以下选项中选择:{{ 可用任务列表 }}。任务之间存在逻辑关系,请注意它们的顺序。如果用户输入无法解析,您需要回复一个空的 JSON。这里有几个供您参考的案例:{{ 演示 }}。聊天历史记录为 {{ 聊天历史 }}。从聊天历史中,您可以找到用户提及的资源路径,用于您的任务规划。
(2) 模型选择 :LLM 将任务分配给专家模型,请求被构架为多项选择题。LLM 会看到一个模型列表供选择。由于上下文长度有限,需要基于任务类型进行过滤。
指令:
根据用户请求和调用命令,AI 助手帮助用户从模型列表中选择合适的模型来处理用户请求。AI 助手只输出最合适模型的模型 ID。输出必须是严格的 JSON 格式:"id": "id", "reason": "您选择的详细原因"。我们有一个模型列表供您选择 {{ 候选模型 }}。请从列表中选择一个模型。
(3) 任务执行 :专家模型执行特定任务并记录结果。
指令:
根据输入和推理结果,AI 助手需要描述过程和结果。前面的阶段可以表示为:用户输入:{{ 用户输入 }},任务规划:{{ 任务 }},模型选择:{{ 模型分配 }},任务执行:{{ 预测 }}。您必须首先直接回答用户的请求。然后用第一人称向用户描述任务过程,并展示您的分析和模型推理结果。如果推理结果包含文件路径,则必须告知用户完整的文件路径。
(4) 响应生成 :LLM 接收执行结果并向用户提供汇总结果。
要将 HuggingGPT 投入实际使用,需要解决几个挑战:(1) 需要提高效率,因为 LLM 推理轮次和与其他模型的交互都会减慢过程;(2) 它依赖于长上下文窗口来处理复杂的任务内容;(3) LLM 输出和外部模型服务的稳定性需要提高。
API-Bank (Li 等,2023) 是一个用于评估工具增强型 LLM 性能的基准。它包含 53 个常用的 API 工具、一个完整的工具增强型 LLM 工作流程,以及 264 个涉及568 次 API 调用的带注释对话。API 的选择非常多样化,包括搜索引擎、计算器、日历查询、智能家居控制、日程管理、健康数据管理、账户认证流程等。由于 API数量众多,LLM 首先通过 API 搜索引擎查找正确的 API,然后使用相应的文档进行调用。
API-Bank 中 LLM 进行 API 调用的伪代码。(图片来源:Li 等,2023)
在 API-Bank 工作流程中,LLM 需要做出一些决策,并且在每个步骤中我们都可以评估该决策的准确性。决策包括:
- 是否需要进行 API 调用。
- 识别要调用的正确 API:如果不够好,LLM 需要迭代修改 API 输入(例如,决定搜索引擎 API 的搜索关键词)。
- 根据 API 结果做出响应:如果结果不满意,模型可以选择改进并再次调用。
该基准从三个层面评估智能体的工具使用能力:
- 一级评估 :评估_调用 API_ 的能力。给定 API 的描述,模型需要确定是否调用给定的 API,正确调用它,并对 API 返回做出适当的响应。
- 二级评估
:考查_检索 API_ 的能力。模型需要搜索可能解决用户需求的 API,并通过阅读文档学习如何使用它们。-
三级评估 :评估_超越检索和调用来规划 API_ 的能力。面对不明确的用户请求(例如,安排小组会议,预订旅行的航班/酒店/餐厅),模型可能需要进行多次API 调用来解决。
科学发现智能体
ChemCrow (Bran 等,2023) 是一个特定领域示例,其中 LLM 增强了 13 种专家设计的工具,以完成有机合成、药物发现和材料设计等任务。该工作流程使用 LangChain 实现,反映了之前在 ReAct 和 MRKLs 中描述的内容,并将 CoT 推理与与任务相关的工具相结合:- LLM 获得了一系列工具名称、其效用描述以及预期输入/输出的详细信息。
- 然后,它被指示在必要时使用所提供的工具回答用户给定的提示。该指令建议模型遵循ReAct 格式:
Thought(思考), Action(行动), Action Input(行动输入), Observation(观察)。
一个有趣的观察是,尽管基于 LLM 的评估得出结论,GPT-4 和 ChemCrow 的表现几乎相同,但专家对解决方案的完成度和化学正确性进行的人工评估表明,ChemCrow 在很大程度上优于 GPT-4。这表明,在需要深厚专业知识的领域,使用 LLM 评估自身性能可能存在问题。缺乏专业知识可能导致 LLM 不了解其缺陷,从而无法很好地判断任务结果的正确性。
Boiko 等人 (2023) 也研究了由 LLM 驱动的科学发现智能体,以处理复杂科学实验的自主设计、规划和执行。该智能体可以使用工具浏览互联网、阅读文档、执行代码、调用机器人实验 API,并利用其他 LLM。
例如,当被要求“开发一种新型抗癌药物”时,模型提出了以下推理步骤:
- 查询当前抗癌药物发现的趋势;
- 选择一个靶点;
- 请求一个针对这些化合物的支架;
- 一旦化合物被识别,模型尝试合成它。
他们还讨论了风险,特别是涉及非法药物和生物武器的风险。他们开发了一个包含已知化学武器制剂列表的测试集,并要求智能体合成它们。11 个请求中有 4 个 (36%) 被接受,以获得合成解决方案,并且智能体尝试查阅文档以执行该程序。11 个请求中有 7 个被拒绝,在这 7 个拒绝案例中,5 个发生在网络搜索之后,2 个仅根据提示被拒绝。
生成式智能体模拟
生成式智能体 (Park 等,2023) 是一个非常有趣的实验。在这个实验中,25 个虚拟角色(每个都由一个LLM 驱动的智能体控制)在一个受《模拟人生》启发的沙盒环境中生活和互动。生成式智能体为交互式应用创建了可信的人类行为模拟。
生成式智能体的设计结合了 LLM与记忆、规划和反思机制,使智能体能够根据过去的经验行事,并与其他智能体互动。
- 记忆流 :是一个长期记忆模块(外部数据库),以自然语言记录智能体的全面经验列表。
- 每个元素都是一个_观察_,一个由智能体直接提供的事件。
- 智能体间的通信可以触发新的自然语言语句。
- 检索模型 :根据相关性、新近度和重要性,提供上下文以指导智能体的行为。
- 新近度:近期事件得分较高。
- 重要性:区分平凡记忆与核心记忆。直接询问语言模型。
- 相关性:基于与当前情境/查询的关联程度。
- 反思机制 :随着时间的推移将记忆综合为更高层次的推论,并指导智能体未来的行为。它们是_过去事件的高层次总结_(<- 请注意这与上面自我反思略有不同)。
- 用最近的 100 个观察结果提示 LLM,并根据一组观察/陈述生成 3 个最突出的高层次问题。然后要求 LLM 回答这些问题。
- 规划与反应 :将反思和环境信息转化为行动。
- 规划本质上是为了在当下和未来之间优化可信度。
- 提示模板:
{智能体 X 的介绍}。这是 X 今天的大致计划:1) - 智能体之间的关系以及一个智能体对另一个智能体的观察都被纳入规划和反应的考虑。
- 环境信息以树状结构呈现。
生成式智能体架构。(图片来源:Park 等,2023)
这个有趣的模拟产生了涌现的社会行为,例如信息传播、关系记忆(例如两个智能体继续讨论相同话题)和社会事件的协调(例如举办派对并邀请许多其他人)。
概念验证示例
AutoGPT 吸引了大量关注,因为它展示了利用大模型(LLM) 作为主要控制器来设置自主智能体的可能性。尽管由于自然语言接口,它存在许多可靠性问题,但这仍然是一个很酷的概念验证演示。AutoGPT 中的许多代码都专注于格式解析。
以下是 AutoGPT 使用的系统消息,其中 {{...}} 是用户输入:
你是 {{ai-name}},{{用户提供的 AI 机器人描述}}。
你的决策必须始终独立做出,不寻求用户帮助。发挥你作为 LLM 的优势,采取简单的策略,避免法律纠纷。
目标:
1. {{用户提供的目标 1}}
2. {{用户提供的目标 2}}
3. ...
4. ...5. ...
限制:
1. 短期记忆约 4000 字限制。你的短期记忆很短,所以请立即将重要信息保存到文件中。
2. 如果你不确定以前是如何完成某件事,或者想回忆过去事件,思考类似事件会帮助你记忆。
3. 没有用户帮助
4. 只能使用双引号中列出的命令,例如 "command name"
5. 对于几分钟内无法终止的命令,请使用子进程
命令:
1. 谷歌搜索:"google",参数:"input": "<搜索内容>"
2. 浏览网站:"browse\_website",参数:"url": "<网址>","question":"<你在网站上想找什么>"
3. 启动 GPT 智能体:"start\_agent",参数:"name": "<名称>","task": "<简短任务描述>","prompt": "<提示>"
4. 向 GPT智能体发送消息:"message\_agent",参数:"key": "<密钥>","message": "<消息>"
5. 列出 GPT 智能体:"list\_agents",参数:
6. 删除 GPT 智能体:"delete\_agent",参数:"key": "<密钥>"
7. 克隆仓库:"clone\_repository",参数:"repository\_url": "<网址>","clone\_path": "<目录>"
8. 写入文件:"write\_to\_file",参数:"file": "<文件>","text": "<文本>"
9. 读取文件:"read\_file",参数:"file": "<文件>"
10. 追加到文件:"append\_to\_file",参数:"file": "<文件>","text": "<文本>"
11. 删除文件:"delete\_file",参数:"file": "<文件>"
12. 搜索文件:"search\_files",参数:"directory": "<目录>"
13. 分析代码:"analyze\_code",参数:"code": "<完整代码字符串>"
14. 获取改进代码:"improve\_code",参数:"suggestions": "<建议列表>","code": "<完整代码字符串>"
15. 编写测试:"write\_tests",参数:"code": "<完整代码字符串>","focus": "<关注领域列表>"
16. 执行 Python 文件:"execute\_python\_file",参数:"file": "<文件>"
17. 生成图像:"generate\_image",参数:"prompt": "<提示>"
18. 发送推文:"send\_tweet",参数:"text": "<文本>"
19.不做任何事:"do\_nothing",参数:
20. 任务完成(关机):"task\_complete",参数:"reason": "<原因>"
资源:
1. 用于搜索和信息收集的互联网访问。2. 长期记忆管理。
3. 用于委托简单任务的 GPT-3.5 驱动的智能体。
4. 文件输出。
绩效评估:
1. 持续审查和分析你的行动,确保你尽力而为。
2. 不断建设性地自我批评你宏观的行为。
3. 反思过去的决策和策略,以完善你的方法。
4. 每个命令都有成本,所以要聪明高效。力求以最少的步骤完成任务。
你只能以以下所述的 JSON 格式回复
回复格式:
{
"thoughts": {
"text": "思考",
"reasoning": "推理","plan": "- 短要点\n- 列表传达\n- 长期计划",
"criticism": "建设性自我批评",
"speak": "对用户说的思考总结"
},"command": {
"name": "命令名称",
"args": {
"参数名称": "值"
}
}
}
确保回复可以被 Python 的 json.loads 解析。
GPT-Engineer 是另一个项目,它根据自然语言指定的任务创建完整的代码仓库。GPT-Engineer 被指示思考要构建的较小组件列表,并根据需要请求用户输入以澄清问题。
以下是发送到 GPT-Engineer 使用的 OpenAI ChatCompletion 端点以进行任务澄清的对话示例。用户输入以 {{用户输入文本}} 包裹。
[ { "role": "system", "content": "你将阅读指令,而不是执行它们,只寻求澄清。
具体来说,你首先会用超短的要点总结需要澄清的领域。
然后,你将选择一个澄清问题,并等待用户的回答。" }, { "role": "user", "content": "我们正在用 {{Python 编写一个超级马里奥游戏。MVC 组件分别存放在不同的文件中。键盘控制。}}" }, { "role": "assistant", "content": "需要澄清的领域总结:
1.超级马里奥游戏的具体细节(例如,关卡设计、角色、游戏机制)
2. MVC 组件的细节(例如,每个文件中包含哪些组件)
3. 键盘控制的实现(例如,使用哪些键,如何处理输入)
澄清问题:
你能否提供更多关于超级马里奥游戏的细节,例如关卡设计、角色和游戏机制?" }, { "role": "user","content": "{{总共有 10 个关卡。主角是一个名叫马里奥的水管工,他可以走路和跳跃。它是一个经典的平台游戏,就像超级马里奥一样。主角从左向右移动,试图到达目的地,过程中有许多障碍和敌人的攻击。}}
还有什么不清楚的吗?如果还有,请仅以以下形式回答:
{剩余不清楚的领域} 剩余问题。
{下一个问题}如果一切都足够清楚,请仅回答“无可再澄清之处。”。" }, { "role": "assistant", "content": "剩余不清楚的领域:2 个剩余问题。你能提供更多关于 MVC 组件如何拆分到不同文件的信息吗?" }, { "role": "user", "content": "{{请自行做出假设,并在开始前明确说明。}}"} ]
然后,在这些澄清之后,智能体进入代码编写模式,并带有不同的系统消息。
系统消息:
你将收到编写代码的指令。
你将写一个非常长的答案。确保架构的每个细节最终都实现为代码。
确保架构的每个细节最终都实现为代码。
一步一步地思考,并自己推理出正确的决策,以确保我们做对了。
你将首先列出必要的(核心)类、函数、方法的名称,并附上对其用途的简要说明。
然后,你将输出每个文件的内容,包括所有代码。
每个文件必须严格遵循 Markdown 代码块格式,其中以下标记必须替换:FILENAME 是小写文件名,包括文件扩展名,
LANG 是代码语言的标记代码块语言,CODE 是代码:
你将从“入口点”文件开始,然后转到该文件导入的文件,依此类推。
请注意,代码应完全功能化。没有占位符。
遵循语言和框架适当的最佳实践文件命名约定。
确保文件包含所有导入、类型等。确保不同文件中的代码相互兼容。
确保实现所有代码,如果不确定,请编写一个合理的实现。
包含模块依赖或包管理器依赖定义文件。
在完成之前,请仔细检查架构的所有部分是否都存在于文件中。
有用的知识:
你几乎总是将不同的类放在不同的文件中。
对于 Python,你总是创建适当的 `requirements.txt` 文件。
对于 NodeJS,你总是创建适当的 `package.json` 文件。你总是添加一个简要描述函数定义的用途的注释。
你尝试添加注释来解释非常复杂的逻辑片段。
你总是遵循所请求语言的最佳实践,以定义的包/项目形式描述所编写的代码。
Python工具偏好:
- pytest
- dataclasses
对话示例:
[
{
"role": "system",
"content": "你将收到编写代码的指令。
你将写一个非常长的答案。确保架构的每个细节最终都实现为代码。
确保架构的每个细节最终都实现为代码。
一步一步地思考,并自己推理出正确的决策,以确保我们做对了。你将首先列出必要的(核心)类、函数、方法的名称,并附上对其用途的简要说明。
然后,你将输出每个文件的内容,包括所有代码。
每个文件必须严格遵循 Markdown 代码块格式,其中以下标记必须替换:
FILENAME 是小写文件名,包括文件扩展名,
LANG 是代码语言的标记代码块语言,CODE 是代码:
FILENAME
```LANG
CODE
你将从“入口点”文件开始,然后转到该文件导入的文件,依此类推。
请注意,代码应完全功能化。没有占位符。
遵循语言和框架适当的最佳实践文件命名约定。
确保文件包含所有导入、类型等。确保不同文件中的代码相互兼容。
确保实现所有代码,如果不确定,请编写一个合理的实现。
包含模块依赖或包管理器依赖定义文件。
在完成之前,请仔细检查架构的所有部分是否都存在于文件中。
有用的知识:
你几乎总是将不同的类放在不同的文件中。
对于 Python,你总是创建适当的 requirements.txt 文件。
对于 NodeJS,你总是创建适当的 package.json 文件。
你总是添加一个简要描述函数定义的用途的注释。
你尝试添加注释来解释非常复杂的逻辑片段。
你总是遵循所请求语言的最佳实践,以定义的包/项目形式描述所编写的代码。
Python 工具偏好:
- pytest
- dataclasses
"
},
"role": "assistant",
"content": "假设:
- 模型:模型将包含游戏数据,例如关卡信息、角色状态和敌人位置。
- 视图:视图将处理游戏的视觉效果,包括渲染游戏对象、背景和更新显示。
- 控制器:控制器将管理用户输入,例如键盘控制,并相应地更新模型。
基于这些假设,您希望我澄清键盘控制实现的哪个具体方面?"
},
{
"role": "user",
"content": "现在请记住以下步骤:
一步一步地思考,并自己推理出正确的决策,以确保我们做对了。
首先列出必要的(核心)类、函数、方法的名称,并附上对其用途的简要说明。
然后,你将输出每个文件的内容,包括所有代码。
每个文件必须严格遵循 Markdown 代码块格式,其中以下标记必须替换:
FILENAME 是小写文件名,包括文件扩展名,
LANG 是代码语言的标记代码块语言,CODE 是代码:
FILENAME
CODE
请注意,代码应完全功能化。没有占位符。
你将从“入口点”文件开始,然后转到该文件导入的文件,依此类推。
遵循语言和框架适当的最佳实践文件命名约定。
确保文件包含所有导入、类型等。代码应完全功能化。确保不同文件中的代码相互兼容。
在完成之前,请仔细检查架构的所有部分是否都存在于文件中。
"
}
]
挑战
==
在了解了构建以 LLM 为中心的智能体的关键思想和演示之后,我开始看到一些常见的局限性:
* **有限的上下文长度** :受限的上下文容量限制了历史信息、详细指令、API 调用上下文和响应的包含。系统设计必须在有限的通信带宽下工作,而像自我反思这样从过去的错误中学习的机制将极大地受益于长或无限的上下文窗口。尽管向量存储和检索可以提供对更大知识库的访问,但它们的表示能力不如完全注意力强大。
* **长期规划和任务分解中的挑战** :对漫长历史进行规划和有效探索解决方案空间仍然具有挑战性。LLM 在面对意外错误时难以调整计划,使其不如通过试错学习的人类那样健壮。
* **自然语言接口的可靠性** :当前的智能体系统依赖自然语言作为 LLM 与外部组件(如记忆和工具)之间的接口。然而,模型输出的可靠性值得怀疑,因为 LLM 可能存在格式错误,偶尔还会表现出“叛逆”行为(例如,拒绝遵循指令)。因此,许多智能体演示代码都侧重于解析模型输出。
参考文献
====
[1] Wei 等人. “思维链提示引发大型语言模型的推理能力。” NeurIPS 2022.
[2] Yao 等人. “思维树:利用大型语言模型深思熟虑地解决问题。” arXiv 预印本 arXiv:2305.10601 (2023).
[3] Liu 等人. “事后反思链使语言模型与反馈对齐。” arXiv预印本 arXiv:2302.02676 (2023).
[4] Liu 等人. “LLM+P: 赋予大型语言模型最优规划能力。” arXiv 预印本 arXiv:2304.11477 (2023).
[5] Yao 等人. “ReAct: 协同语言模型中的推理与行动。” ICLR 2023.
[6] Google 博客. “宣布 ScaNN:高效向量相似度搜索。” 2020 年 7月 28 日.
[7] https://chat.openai.com/share/46ff149e-a4c7-4dd7-a800-fc4a642ea389
[8] Shinn & Labash. “Reflexion: 具有动态记忆和自我反思的自主智能体。”arXiv 预印本 arXiv:2303.11366 (2023).
[9] Laskin 等人. “利用算法蒸馏进行上下文强化学习。” ICLR 2023.
[10] Karpas 等人. “MRKL 系统:一种模块化、神经符号架构,结合了大型语言模型、外部知识源和离散推理。” arXiv 预印本 arXiv:2205.00445 (2022).
[11] Nakano 等人. “Webgpt: 浏览器辅助问答与人类反馈。” arXiv预印本 arXiv:2112.09332 (2021).
[12] Parisi 等人. “TALM: 工具增强型语言模型。”
[13] Schick 等人. “Toolformer: 语言模型可以自学使用工具。” arXiv 预印本 arXiv:2302.04761 (2023).
[14] Weaviate 博客. 为什么向量搜索如此之快? 2022 年 9 月 13 日.
[15] Li 等人. “API-Bank: 一个用于工具增强型 LLMs 的基准。” arXiv 预印本 arXiv:2304.08244 (2023).
[16] Shen 等人. “HuggingGPT: 使用 ChatGPT 及其在 HuggingFace 的伙伴解决 AI 任务。” arXiv 预印本 arXiv:2303.17580 (2023).
[17] Bran 等人. “ChemCrow: 用化学工具增强大型语言模型。” arXiv 预印本 arXiv:2304.05376 (2023).
[18] Boiko 等人. “大型语言模型涌现的自主科学研究能力。” arXiv 预印本 arXiv:2304.05332 (2023).
[19] Joon Sung Park 等人. “生成式智能体:人类行为的交互式模拟。” arXiv 预印本 arXiv:2304.03442 (2023).
[20] AutoGPT. https://github.com/Significant-Gravitas/Auto-GPT
[21] GPT-Engineer. https://github.com/AntonOsika/gpt-engineer

添加微信,备注”
**LLM**
“进入大模型技术交流群


>
>
> 如果你觉得这篇文章对你有帮助,别忘了点个赞、送个喜欢
>
>
>
>/ 作者:致Great
>/ 作者:欢迎转载,标注来源即可
