之前的一些研究更加注重算法设计和训练策略,而忽视了模型固有的通用能力的发展,如知识记忆、长期规划、有效泛化和高效互动等。事实证明,增强模型固有能力是推动智能代理进一步发展的关键因素。
如果将 NLP 到 AGI 的发展路线分为五级:语料库、互联网、感知、具身和社会属性,那么目前的大型语言模型已经来到了第二级,具有互联网规模的文本输入和输出。
在这个基础上,如果赋予 LLM-based Agents 感知空间
和行动空间
,它们将达到第三、第四级。进一步地,多个代理通过互动、合作解决更复杂的任务,或者反映出现实世界的社会行为,则有潜力来到第五级 —— 代理社会
Agent的框架主要由三个部分组成:
控制端(Brain)、感知端(Perception)和行动端(Action)
作者们用一个例子来说明来了 LLM-based Agent 的工作流程:
- 当人类询问是否会下雨时,感知端(Perception)将指令转换为 LLMs 可以理解的表示。
- 然后控制端(Brain)开始根据当前天气和互联网上的天气预报进行推理和行动规划。
- 最后,行动端(Action)做出响应并将雨伞递给人类。
- 通过重复上述过程,智能代理可以不断获得反馈并与环境交互。
语言是沟通的媒介,其中包含着丰富的信息。得益于 LLMs 强大的自然语言生成和理解能力,智能代理能够通过自然语言与外界进行多轮交互,进而实现目标。
奖励建模
的主要方法之一是根据反馈推断奖励,主要以比较的形式呈现(可能还会补充原因),以及无约束的自然语言。(判断是否正确,正确反馈Success,错误反馈Failed)基于大批量语料训练的 LLMs,拥有了存储海量知识(Knowledge)的能力。
虽然 LLMs 其本身仍然存在知识过期、幻觉等问题,现有的一些研究通过知识编辑或调用外部知识库等方法,可以在一定程度上得到缓解。
在本文框架中,记忆模块(Memory)储存了代理过往的观察、思考和行动序列。通过特定的记忆机制,代理可以有效地反思并应用先前的策略,使其借鉴过去的经验来适应陌生的环境
。
两个主要的挑战:
1) 历史对话记录的长度。直接把历史对话记录拼接到子对话的前面会让超过模型的max squence length
2)获取最相关的记忆信息。模型存储轮非常多的abservation和action,如何在上下文中获取最相关的topic信息。
通常用于提升记忆能力的方法有三种:
扩展 Backbone 架构的长度限制:针对 Transformers 固有的序列长度限制问题进行改进。(改进模型)
文本截断
、分段输入
和强调文本的关键部分
。其他一些方法修改注意机制以减少复杂性,从而适应更长的序列。总结记忆(Summarizing):对记忆进行摘要总结,增强代理从记忆中提取关键细节的能力。(改进Prompt)
压缩记忆(Compressing):通过使用向量或适当的数据结构对记忆进行压缩,可以提高记忆检索效率。(改进向量数据库)
记忆的检索方法也很重要,只有检索到合适的内容,代理才能够访问到最近、最相关和准确的信息,可以通过这三个角度给一个分数来评估。(LLM自己生存技能描述的Text作为index以此来做检索增强)
推理:
一些人认为语言模型在预训练或微调过程中就具备了推理能力,而另一些人则认为它在达到一定规模后才会出现。具体而言,代表性的思维链(CoT)方法(通过在输出答案之前引导大型语言模型生成推理依据,可以激发其推理能力)
一些策略来提高大型语言模型的性能,例如自一致性、自我优化、自我改进和选择推理。
规划:
计划的制定:1) 一次性生成整个计划 2)分成若干个子任务,一次执行一个子任务 3)将任务进行层级划分类似树状(路径规划的思想,选一条最优的路径执行)
给大模型添加垂直领域的知识会表现更好
计划反思: 反馈机制。在制定计划后,可以进行反思并评估其优劣。这种反思一般来自三个方面:1)借助LLM的内部反馈机制;2)与人类互动获得反馈;3)从环境中获得反馈。
对未知任务的泛化:随着模型规模与训练数据的增大,LLMs 在解决未知任务上涌现出了惊人的能力。通过指令微调的大模型在 zero-shot 测试中表现良好,在许多任务上都取得了不亚于专家模型的成绩。
情景学习(In-context Learning):大模型不仅能够从上下文的少量示例中进行类比学习,这种能力还可以扩展到文本以外的多模态场景,为代理在现实世界中的应用提供了更多可能性。
持续学习(Continual Learning):持续学习的主要挑战是灾难性遗忘,即当模型学习新任务时容易丢失过往任务中的知识。专有领域的智能代理应当尽量避免丢失通用领域的知识。
作为 LLMs 最基础的能力,这里不再赘述。
LLMs 本身并不具备视觉的感知能力,只能理解离散的文本内容。而视觉输入通常包含有关世界的大量信息,包括对象的属性,空间关系,场景布局等等。常见的方法有:
听觉也是人类感知中的重要组成部分。由于 LLMs 有着优秀的工具调用能力,一个直观的想法就是:代理可以将 LLMs 作为控制枢纽,通过级联的方式调用现有的工具集或者专家模型,感知音频信息。
此外,音频也可以通过频谱图(Spectrogram)的方式进行直观表示。频谱图可以作为平面图像来展示 2D 信息,因此,一些视觉的处理方法可以迁移到语音领域,例如AST (Audio Spectrogram Transformer)。
现实世界中的信息远不止文本、视觉和听觉。作者们希望在未来,智能代理能配备更丰富的感知模块,例如触觉、嗅觉等器官,用于获取目标物体更加丰富的属性。同时,代理也能对周围环境的温度、湿度和明暗程度有清楚的感受,采取更 Environment-aware 的行动。
此外,还可以为代理引入对更广阔的整体环境的感知:
尽管 LLMs 拥有出色的知识储备和专业能力,但在面对具体问题时,也可能会出现鲁棒性问题、幻觉等一系列挑战。
知识遗忘和幻觉死循环。尽管基于LLM的代理程序具有强大的知识库和专业知识,但它们没有能力记住每一条训练数据。由于上下文提示的影响,它们可能无法引导到正确的知识,甚至可能生成虚假的知识。
容易受到对抗性攻击,对于轻微的输入修改的鲁棒性不足。
工具是专门为各自的使用场景设计的,利用这些工具的代理程序更能处理轻微的输入修改,并且对抗性攻击的韧性更强。
理解工具:
所谓Tools的使用方式:
学习使用工具的方法:
具体工具如何使用?
例如,一个代理程序可以借助视觉模型进行图像处理和生成 [328]。在航空航天工程领域,研究人员正在探索使用代理程序建模物理和解决复杂的微分方程 [356];在机器人领域,代理程序需要规划物理操作并控制机器人执行 [179];等等。能够通过工具以及以多模态方式与环境或世界动态交互的代理程序可以称为数字化体现的 [94]。代理程序的体现性已经成为体现学习研究的核心关注点。下面我们将深入讨论代理程序的体现行动。
具身行动:具身(Embodyment)是指代理与环境交互过程中,理解、改造环境并更新自身状态的能力。具身行动(Embodied Action)被视为虚拟智能与物理现实的互通桥梁。
传统的强化学习由于建模动态且常常含糊不清的真实环境或者过于依赖精确的奖励信号表示,强化学习算法在数据效率、泛化能力和复杂问题推理方面存在限制。
利用在LLM预训练期间获得的丰富内部知识可以有效缓解这些问题:
成本低。强化学习需要不断的收集数据来更新策略,而利用LLM的内在知识,像PaLM-E这样的代理程序可以联合训练机器人数据和通用视觉语言数据,从而在体现任务中实现显著的迁移能力,同时也展示了几何输入表示可以提高训练数据效率的优点
泛化能力强。大多数强化学习算法都是为特定任务训练和评估相关技能而设计的,LLM展示出了显著的跨任务泛化能力。
行动规划。具有新兴推理能力的LLM[26]可以以零样本或少样本的方式无缝应用于复杂任务。此外,来自环境的外部反馈可以进一步提升基于LLM的代理程序的规划性能。
Navigation 要求智能代理根据任务目标变换自身位置并根据环境信息更新自身状态,以及基于当前探索的长期操纵。在导航之前,具身代理程序建立起关于外部环境的先验内部地图非常重要,这些地图通常采用拓扑地图、语义地图或占据地图的形式
未来:
基于LLM的具身行动被视为虚拟智能与物理世界之间的桥梁,使代理程序能够像人类一样感知和修改环境。然而,仍然存在一些限制,例如物理世界机器人操作员的高成本和具身数据集的稀缺性,这促使人们对在Minecraft等模拟环境中研究代理程序的具身行动产生越来越大的兴趣。通过利用Mineflayer [387] API,这些研究可以成本效益地检查各种具身代理程序的操作,包括探索、规划、自我改进,甚至终身学习[190]。尽管取得了显著进展,但由于模拟平台和物理世界之间存在显著差异,实现最佳的具身行动仍然是一个挑战。为了在真实世界场景中有效部署具身代理程序,对于与真实世界条件密切相符的具身任务范例和评估标准的需求越来越大[358]。另一方面,为代理程序学习语言基础也是一个障碍。例如,“像猫一样跳下来”这样的表达主要传达一种轻盈和宁静的感觉,但这种语言的隐喻需要足够的世界知识[30]。[340]尝试将文本提炼与回顾式经验重放(HER)相结合,构建一个数据集作为训练过程的监督信号。然而,在各个领域中,具身行动在人类生活中发挥着越来越重要的作用,因此仍然需要进一步研究具身数据集的基础。
参考文章列表;
VOYAGER 包括 3 个部分:
1)一种最大化探索的自动课程
2)一个不断增长的可执行代码的技能库,用于存储和检索复杂行为
3)一种新的迭代式 prompting 机制,能够结合环境反馈、执行误差和自我验证以改善程序。
浩然大佬的见解:
Ask-Answer-Summary-Decomposition。这种ask-answer的架构非常符合GPT模型的交互习惯,给予充分的引导以及时间,能够更好地发挥模型的潜能。这样的架构比起直接问“What’s your next task”的效果的提升是毋庸置疑的。
Self-Coding。使用action给定模板输出代码+迭代prompt机制+critic评价的机制,实现了成功率较高的GPT4的代码自动编写。这简直听起来是不可思议的事情——GPT4能自己写新的代码了,并且堪用程度还不错,更并且如果生成有错误的代码还能够自己检查自己提升,而不是报错中断。这是否意味着硅基生命的细胞分化与分裂呢?
Skill list可以重用技能。这一点大多数prompt engineering的工作都有提到,类似于其他工作中的”记忆机制“,毕竟想要模仿人类智慧首先要保留有记忆,才有进化的可能。但是这篇工作采用的skill机制,是直接整理成复用性更高的代码级别的skill,效果比记忆更好。
我的理解是Agent通过(GPT4)来进行学习,反馈,执行,也就是用LLM决策代替RL。Voyager 通过GPT-4提出的自动课程来解决日益困难的任务。通过从较简单的程序中综合复杂的技能,代理程序不仅可以迅速提升其能力,还可以有效地对抗灾难性遗忘。
基于大型语言模型(LLM)的智能体利用预训练蕴藏的世界知识(world knowledge)来生成一致的行动规划或可执行的策略,在最近取得了进展。他们被应用于像游戏和机器人这样的实体任务,以及 NLP 那样不需要实体的任务中。然而,这些智能体无法进行终身学习(lifelong learning)无法在不同的时间阶段逐步获取、更新、积累以及迁移知识。
VOYAGER 试图解决由自动课程提出的越来越难的任务,这需要考虑探索进度和智能体的状态。课程的设计由 GPT-4 基于「尽可能探索更多的事物」这一个根本目标来完成。
Skill Labiary: 把学习到的有用的技能存储下来,解决知识灾难性遗忘问题
VOYAGER 通过储存有助于成功完成任务的动作程序,逐步建立起一个技能库。每个程序会通过其文字描述的 embedding 建立索引,在未来遇到类似情况的时候,就可以快速检索出来。
复杂的技能可以通过组合简单程序来生成,这样随着时间推移可以快速建构起 VOYAGER 的能力并且减少其它持续学习方法中的灾难性遗忘问题。
Itertor Prompt Learning: 学正确有效的知识
LLMs 很难一次就生成正确的动作代码。为了解决这个问题,我们提出了一种迭代式的 prompting 机制:
其实就是让GPT4给出推理过程,方便下一轮纠错或者优化
Q:输入数据从哪来呢?
A:对比LLM任务,会发现没有输入的微调数据集。所以这个微调数据集就是通过自动课程来产生,相当于自监督打label,生成正确的技能就是label,只不过这个过程是在线的。我觉得任务输入是这么构造的,根据当前的Agent和Environment信息(input text),问GPT4下一步怎么办,GPT给出回复,然后去验证,对的就存下来,即 input text -> label(skill)
。
Q:如何从游戏中学呢?
A:通过与游戏进行交互后端能获取响应,所谓响应Minecraft世界的信息,包括Agent、Environment的信息。在游戏中Agent应该是一个Object,我们获取Object的属性就行
Q:学习的过程是什么?
A:我们获取到当前世界的全部信息后,打包交给GPT4问它根据当前的状态,下一步应该如何做。相当于GPT4作为一个大脑,决策者来制定下一步的任务策略以及动作。
显然,这个Prompt如何写,以及如何得到正确的答案才是关键
Prompt如何写?-》 如何生成正确的任务描述?
1)鼓励多样化行为和施加限制。(扩大解空间的同时,加约束条件,减少错误)
比如:我的最终目标是探索尽可能多的东西。由于我还没有掌握必要的资源或者学习到足够的技能,因此下一个任务不应该太难以至于我无法完成。
(2)智能体当前的状态,包括物品清单、装备、附近的砖石和实体、生态环境、时间、血量和饥饿值,以及地点。(当前信息)
(3)之前完成的和失败的任务,反应智能体当前的探索进度和能力边界。(历史信息)
(4)其它上下文:我们还利用 GPT-3.5 根据智能体的当前状态和探索进度进行自我提问,并使用 wiki 知识库自己回答问题,为 GPT-4 提供额外的上下文。 出于预算考虑,我们选择使用 GPT-3.5 而不是 GPT-4 来执行标准 NLP 任务 (Prefix 提供额外的知识,更容易学习到最优解)
由任务描述如何得到正确的动作? -》 如何生成正确的代码?技能,即可执行代码
(1)代码生成指南。 比如,你的函数会被复用以创建更复杂的函数。因此,你应该尽可能使它通用且可复用。 (Prefix token)
(2)控制原始 API 和从技能库中检索相关的技能,对于 in-context learning 的运作至关重要。(当前记忆库信息)
(3)上一轮生成的代码、环境反馈、执行的错误信息可以让 GPT-4 自我优化。(历史信息)
(4)智能体当前的状态,包括物品清单、装备、附近的砖石和实体、生态环境、时间、血量和饥饿值,以及地点。(当前Agent信息)
(5)在生成代码前利用思维链 prompting 进行推理。(提高推理的正确率的手段)
反馈机制(CoT):
自动课程对智能体的持续进步至关重要。如果随机选择一个课程,那么发现的物品数量会下降 93%。这是因为如果不按照(合理的)顺序,那么某些任务可能对智能体来说太过于困难了。另一方面,手工设计的课程要求大量关于 Minecraft 的专业知识,而且也无法考虑智能体的实际处境。这种方法在我们的实验中反而不如自动课程。
没有技能库的 VOYAGER 在后期往往遇到瓶颈。这反映出技能库在 VOYAGER 中的重要性。它有助于创造更多复杂的动作并,且通过鼓励在旧技能的基础上建立新技能直接推动智能体的能力边界。
自我验证是在所有反馈类型中最为重要的。移除这个模块会在发现物品数量方面导致巨大的性能衰减(-73%)。自我验证是一种重要机制,它负责决定什么时候开始新任务或者重新尝试之前失败的任务。
GPT-4 在生成代码上显著优于 GPT-3.5 并且让智能体多取得 5.7 倍的不同物品,这是因为 GPT-4 在编码能力上有巨大的跃升。
VOYAGER 目前不支持视觉感知,因为截止本文写作时只有纯文本的 GPT-4 可用。
然而,VOYAGER 有望通过多模态感知模型增强以完成更令人印象深刻的任务。我们证明了在给定人类反馈的清况下,VOYAGER 能够在 Minecraft 中搭建复杂的 3D 结构,比如下界传送门(Nether Portal)和小屋(Fig. 10)。
有两种结合人类反馈的方法:
(1)人类作为一个 critic(相当于 VOYAGER 的自我验证模块):人类为 VOYAGER 提供视觉的 critique,让它调整上一轮生成的代码。这种反馈对于纠正 VOYAGER 无法直接感知的 3D 结构中的某些细节错误至关重要。
(2)人类作为课程(相当于 VOYAGER 的自动课程模块):人类将一个复杂的建造任务拆解为更小的步骤,引导 VOYAGER 逐步完成它们。这个方法改善了 VOYAGER 处理更复杂的 3D 结构的能力。
To save token usage, instead of engaging in multi-round conversations, we concatenate a system prompt and a user prompt to obtain each assistant’s response.
We leverage GPT-3.5 to self-ask questions to provide additional context.
Voyager使用OpenAI的GPT-4作为语言模型。使用Voyager需要拥有OpenAI的API密钥。你可以从这里获取API密钥。
安装完成后,你可以通过以下方式运行Voyager:
from voyager import Voyager
# 你也可以使用mc_port替代azure_login,但是azure_login是强烈推荐的
azure_login = {
"client_id": "YOUR_CLIENT_ID",
"redirect_url": "https://127.0.0.1/auth-response",
"secret_value": "[OPTIONAL] YOUR_SECRET_VALUE",
"version": "fabric-loader-0.14.18-1.19", # Voyager经过测试的版本
}
openai_api_key = "YOUR_API_KEY"
voyager = Voyager(
azure_login=azure_login,
openai_api_key=openai_api_key,
)
# 开始终身学习
voyager.learn()
Azure Login
,它会要求你按照命令行指示生成一个配置文件。Azure Login
,你还需要自行选择世界并将世界打开到局域网。在运行voyager.learn()
后,游戏很快会弹出,你需要:
Esc
键,然后按下“打开到局域网”。如果你停止了学习过程,并希望以后从一个检查点恢复,你可以按以下方式实例化Voyager:
from voyager import Voyager
voyager = Voyager(
azure_login=azure_login,
openai_api_key=openai_api_key,
ckpt_dir="YOUR_CKPT_DIR",
resume=True,
)
如果你想要使用已学习的技能库为特定任务运行Voyager,你应该首先将技能库目录传递给Voyager:
from voyager import Voyager
# 首先使用skill_library_dir实例化Voyager。
voyager = Voyager(
azure_login=azure_login,
openai_api_key=openai_api_key,
skill_library_dir="./skill_library/trial1", # 加载一个已学习的技能库。
ckpt_dir="YOUR_CKPT_DIR", # 可以自由使用一个新的目录。不要使用与技能库相同的目录,因为新的事件仍将记录到ckpt_dir中。
resume=False, # 不要从技能库中恢复,因为这不是学习过程。
)
然后,你可以运行任务分解。注意:偶尔任务分解可能不合乎逻辑。如果你注意到打印的子目标存在问题,你可以重新运行分解。
# 运行任务分解
task = "YOUR TASK" # 例如:"Craft a diamond pickaxe"
sub_goals = voyager.decompose_task(task=task)
最后,你可以使用已学习的技能库运行子目标:
voyager.inference(sub_goals=sub_goals)
对于所有有效的技能库,请参阅已学习的技能库。
"""
Voyager的主要类。
Action agent是论文中的迭代提示机制。
Curriculum agent是论文中的自动课程设置。
Critic agent是论文中的自我验证机制。
Skill manager是论文中的技能库。
:param mc_port: Minecraft游戏中的端口号。
:param azure_login: Minecraft登录配置。
:param server_port: Mineflayer端口号。
:param openai_api_key: OpenAI API密钥。
:param env_wait_ticks: 每个步骤结束时等待的刻数,如果发现缺少一些聊天记录,可以增加此值。
:param env_request_timeout: 每个步骤等待的秒数,如果代码执行超过此时间,Python端将终止连接并需要恢复。
:param reset_placed_if_failed: 如果失败是否重置放置的方块,在构建任务中很有用。
:param action_agent_model_name: action agent模型名称。
:param action_agent_temperature: action agent温度。
:param action_agent_task_max_retries: 如果失败,重试的最大次数。
:param curriculum_agent_model_name: curriculum agent模型名称。
:param curriculum_agent_temperature: curriculum agent温度。
:param curriculum_agent_qa_model_name: curriculum agent QA模型名称。
:param curriculum_agent_qa_temperature: curriculum agent QA温度。
:param curriculum_agent_warm_up: 如果完成的任务大于字典中的值,则在课程设置人类消息中显示信息,可用的键有:
{
"context": int,
"biome": int,
"time": int,
"other_blocks": int,
"nearby_entities": int,
"health": int,
"hunger": int,
"position": int,
"equipment": int,
"chests": int,
"optional_inventory_items": int,
}
:param curriculum_agent_core_inventory_items: 在可选的inventory_items之前,在热身阶段中仅显示这些物品。
:param curriculum_agent_mode: "auto"表示自动课程设置,"manual"表示人工课程设置。
:param critic_agent_model_name: critic agent模型名称。
:param critic_agent_temperature: critic agent温度。
:param critic_agent_mode: "auto"表示自动critic,"manual"表示人工critic。
:param skill_manager_model_name: skill manager模型名称。
:param skill_manager_temperature: skill manager温度。
:param skill_manager_retrieval_top_k: 每个任务检索的技能数量。
:param openai_api_request_timeout: 等待OpenAI API的秒数。
:param ckpt_dir: 检查点目录。
:param skill_library_dir: 技能库目录。
:param resume: 是否从检查点恢复。
"""
但是,REINFORCE存在如下三个问题:
① 由于agent在一个episode中会采取很多动作,我们很难说哪个动作对最后结果是有用的,换句话说,这种算法存在高方差(variance);
② 收敛速度慢;
③ 只在这种episodic环境下能用。
为了解决上述问题,于是提出了Actor-Critic算法。
参考文章:https://zhuanlan.zhihu.com/p/110998399
Actor-Critic,其实是用了两个网络:
两个网络有一个共同点,输入状态S:
大家可以形象地想象为,Actor是舞台上的舞者,Critic是台下的评委。
Actor在台上跳舞,一开始舞姿并不好看,Critic根据Actor的舞姿打分。Actor通过Critic给出的分数,去学习:如果Critic给的分数高,那么Actor会调整这个动作的输出概率;相反,如果Critic给的分数低,那么就减少这个动作输出的概率。
算法:
TD error:
为了避免正数陷阱,我们希望Actor的更新权重有正有负。因此,我们把Q值减去他们的均值V。有:Q(s,a)-V(s)
为了避免需要预估V值和Q值,我们希望把Q和V统一;由于Q(s,a) = gamma * V(s’) + r - V(s)。所以我们得到TD-error公式: TD-error = gamma * V(s’) + r - V(s)
TD-error就是Actor更新策略时候,带权重更新中的权重值;
现在Critic不再需要预估Q,而是预估V。而根据马可洛夫链所学,我们知道TD-error就是Critic网络需要的loss,也就是说,Critic函数需要最小化TD-error。
重点:
参考文章:https://www.zhihu.com/question/595359852
GPT4的成本太过于贵。CoT加上Prompt面临如此长的token,开销巨大。
无法区分开发与生产。每次给一个任务都有重新来,无法由上文进行微调。想象一下,在玩《我的世界》(Minecraft),每次都要从头开始建造一切。显然,这会让游戏变得非常无趣。
任务不成功会陷入死循环中。解决问题和完成任务的能力,完全依赖于GPT4的推理能力,尽管GPT4解决问题的能力很好,但远非完美。
问题分解、背景理解、识别合适的task、处理重叠子问题不充分。
这个例子的目标是:整理篇AutoGPT的内容,初始行动计划是:
- 搜索AutoGPT;
- 找到项目地址看AutoGPT是做啥的?
- 在autogpt.txt这个文件中解释它;
- 结束任务
Name: AutoGPT-Demo
Role: an ai designed to teach me about auto gpt
Goals: ['search auto gpt','find the github and figure out what the project is','explain what auto gpt is in a file named autogpt.txt','terminate']
在第一轮分析后,把任务优化成了:
AUTOGPT-DEMO THOUGHTS : I think the first step should be to use the 'google' command to search for 'Auto GPT'
REASONING: This will help us gather more information about Auto GPT and we can proceed with identifying the relevant GitHub project .
PLAN:
- Use 'google' to search for 'Auto GPT'
- Browse relevant websites to find the GitHub project
- Write a document explaining what Auto GPI is
CRITICISM: I need to be sure to remain focused and efficient in my use of the 'google' command to minimize the number of step needed to identify the relevant GitHub project and answer the key questions
然后它就执行第一个任务,google搜索。
根据搜索的结果,AutoGPT重新调整了认知,增加了探索Github代码库这步:
AUTOGPT-DEMO THOUGHTS : The next step would be to browse the GitHub repository of Auto GPT. This will help us to gather more information about the project and understand it better.
REASONING: Browsing the GitHub repository is the best way to gather more detailed information about the project and understand its functionality
PLAN:
- Browse the Github repository of Auto GPT
- Explore the respository to understand the project better
- Write a document explaining what Auto GPT is
CRITICISM : I need to ensure that I focus on identifying the key functionalities of Auto GPT and understand the codebase effectively so that I can accurately describe the project in the document I write
随后就是一系列的探索AutoGPT的项目,然后写出介绍文件。
跟前面人类的行动模式是一样的,只不过想法和反馈被整合到Prompt里了。这里的Prompt分为下面几个部分(每轮迭代都会更新):
GOALS - 任务目标,可以列出多条,更有条理
CONSTRAINTS - 告诉LLM一些规则
COMMANDS - 可以调用的函数
RESOURCES - 补充规则
PERFORMANCE EVALUATION - 补充规则
RESPONSE FORMAT - 返回格式,返回格式里要求LLM给出“Thoughts”,这样在执行一系列任务时有更清晰的上下文信息。
user
、 Prompt prefix
、 memory
、 Prompt Template
.阶段一
user input:ai name/role/goals memory为空
所以第一阶段的prompt message为 “ai name/role/goals + memory[空]+ template + postfix” prompting LLM, “同时” 生成了thought 和 command的json
阶段二
假设用户选择执行生成的command,输入y postfix变为了:GENERATE NEXT COMMAND JSON
这个postfix连同执行command产生的结果,以及上一步生成的json一起更新了memory memory = [json from previous step + result from previous command + postfix]
AutoGPT的prompt 建立过程中有几个疑惑点 :
1:“Determine which next command to use, and respond using the format specified above:” 以及 GENERATE NEXT COMMAND JSON 能不能起到 ‘let‘s think step by step’的神奇作用?
2: AutoGPT到底有没有CoT?
step by step的核心步骤是把step by step生成的CoT反贴生成新的prompt来生成action。也就是,llm的CoT需要prompt两次(上一轮分步骤拆解,下一轮再得到答案) 而AutoGPT只prompt了一次(直接生成Reason和action)