大语言模型智能体怎么入门?来看看OpenAI研究员Lilian Weng的干货分享 原创 精华
2024年,大语言模型智能体LLM Agent吸引了越来越多人的关注,各种技术层出不穷。相比于传统机器学习方法,LLM Agent借助于大语言模型的涌现能力,能够实现少样本、零样本学习,并且能够实现与现实物理世界的交互。如何入门这一令人兴奋的领域呢?小编找到了OpenAI研究员Lilian Weng分享的博客,并全文翻译过来,原文地址:https://lilianweng.github.io/posts/2023-06-23-agent
构建以大型语言模型(LLM)为核心控制器的智能体是一个极富创意的概念。几个概念验证演示,如AutoGPT、GPT-Engineer和BabyAGI,都提供了鼓舞人心的示例。LLM的潜力远不止于生成优美的文案、故事、文章和程序;它可以被看作是一种强大的通用问题解决者。
智能体系统概览
在由LLM驱动的自主智能体系统中,LLM充当智能体的“大脑”,并由以下几个关键组件辅助:
规划
- 子目标与分解:智能体将大任务分解为更小、更易于管理的子目标,从而高效处理复杂任务。
- 反思与完善:智能体能够对过去的行为进行自我批评和自我反思,从错误中学习并在未来的步骤中进行改进,从而提升最终结果的质量。
记忆
- 短期记忆:我将所有上下文学习(参见提示工程)视为利用模型的短期记忆来学习。
- 长期记忆:这为智能体提供了长期保留和回忆(无限)信息的能力,通常是通过利用外部向量存储和快速检索来实现。
工具使用
智能体学会调用外部API以获取模型权重中缺失的额外信息(通常在预训练后难以更改),包括当前信息、代码执行能力、访问专有信息源等。
图1 大语言模型智能体基本结构
组件一:规划
一个复杂的任务通常涉及许多步骤。智能体需要知道这些步骤是什么,并且提前规划。
任务分解
思维链(CoT;Wei等人,2022年)已经成为一种标准的提示技术,用于提升模型在复杂任务上的性能。模型被指示“一步一步思考”,以利用更多的测试时计算来将困难任务分解为更小、更简单的步骤。CoT将大任务转化为多个可管理的任务,并揭示了对模型思考过程的解释。
思维树(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: ...
... (Repeated many times)
图2 ReAct推理例子
在知识密集型任务和决策任务的实验中,ReAct的表现都优于仅执行行动的基线模型,后者移除了“思考:…步骤”。
Reflexion(Shinn & Labash,2023年)是一个框架,它为智能体装备了动态记忆和自我反思能力,以提升推理技能。Reflexion具有标准的强化学习(RL)设置,其中奖励模型提供一个简单的二元奖励,行动空间遵循ReAct中的设置,任务特定的行动空间通过语言进行扩展,以实现复杂的推理步骤。在每次行动之后,智能体计算一个启发式值,并且根据自我反思的结果,可以选择性地决定重置环境以开始新的尝试。
图3 Reflexion基本结构
启发式函数用于确定轨迹何时效率低下或包含幻觉,并应停止。效率低下的规划指的是在没有成功的情况下耗时过长的轨迹。幻觉定义为遇到一系列连续相同的行动,这些行动导致环境中出现相同的观察结果。
自我反思是通过向LLM展示两个示例来创建的,每个示例都是一个(失败的轨迹,理想的反思,用于指导未来计划中的变化)对。然后,将这些反思添加到智能体的工作记忆中,最多三个,以作为查询LLM的上下文。
图4 AlfWorld和HotpotQA上的实验结果
链式后见之明(CoH;Liu等人,2023年)通过明确地向模型展示一系列带有反馈注解的过去输出,鼓励模型改进自己的输出。人类反馈数据是一系列集合,其中 是提示,每个 是模型的完成输出, 是人类对 的评分, 是相应的人类提供的后见之明反馈。假设反馈元组按奖励排序, 过程是监督式微调,数据形式为 ,其中 。模型被微调以仅预测 ,条件是序列前缀,使得模型可以根据反馈序列进行自我反思,以产生更好的输出。在测试时,模型可以选择性地接收人类注释者的多轮指令。
为了防止过拟合,CoH添加了一个正则化项,以最大化预训练数据集的对数似然。为了避免走捷径和复制(因为反馈序列中有许多常见词汇),他们在训练过程中随机掩盖了0% - 5%的过去令牌。
他们的实验中的训练数据集是WebGPT比较、人类反馈的摘要和人类偏好数据集的组合。
图5 CoH实验结果
CoH(链式后见之明)的理念是在上下文中呈现一系列逐渐改进的输出历史,并训练模型承接这一趋势以产生更好的输出。算法蒸馏(AD;Laskin等人,2023年)将相同的理念应用于强化学习任务中的跨情节轨迹,其中算法被封装在一个长期历史条件策略中。考虑到智能体多次与环境互动,并且在每个情节中智能体都会有所进步,AD将这种学习历史连接起来并输入到模型中。因此,我们应当期望下一个预测的行动比之前的尝试带来更好的性能。目标是学习强化学习的过程,而不是训练特定任务的政策本身。
图6 算法蒸馏基本框架
该论文假设,任何生成一组学习历史的算法都可以通过执行行为克隆来蒸馏成一个神经网络。这些历史数据是由一组源策略生成的,每个源策略都是针对特定任务进行训练的。在训练阶段,每次RL运行时,都会随机抽取一个任务,并使用多情节历史的子序列进行训练,从而使得学到的策略与任务无关。
在现实中,模型的上下文窗口长度是有限的,因此情节应该足够短,以便构建多情节历史。为了学习接近最优的上下文内RL算法,需要2-4情节的多情节上下文。上下文内RL的出现需要足够长的上下文。
与三个基线进行比较,包括ED(专家蒸馏,使用专家轨迹而不是学习历史的行为克隆)、源策略(用于通过UCB生成蒸馏轨迹的策略)、RL^2(Duan等人,2017年;用作上限,因为它需要在线RL),AD展示了上下文内RL,其性能接近RL^2,尽管只使用了离线RL,并且比其他基线学习得更快。当条件是源策略的部分训练历史时,AD也比ED基线改进得更快。
图7 AD、ED等对比结果
组件二:记忆
记忆类型
记忆可以定义为用于获取、存储、保留和随后检索信息的过程。人类大脑中有几种类型的记忆。
- 感官记忆:这是记忆的最早阶段,它提供了在原始刺激结束后保留感官信息(视觉、听觉等)印象的能力。感官记忆通常只能持续几秒钟。子类别包括图像记忆(视觉)、回声记忆(听觉)和触觉记忆(触觉)。
- 短期记忆(STM)或工作记忆:它存储我们当前意识到并且需要用来执行复杂认知任务(如学习和推理)的信息。短期记忆被认为大约能容纳7个项目(Miller 1956)并且持续20-30秒。
- 长期记忆(LTM):长期记忆可以存储信息的时间非常长,从几天到几十年不等,并且具有实质上无限存储容量的特点。长期记忆有两个子类型:
- 显式/陈述性记忆:这是关于事实和事件的记忆,指的是那些可以自觉回忆的记忆,包括情景记忆(事件和经历)和语义记忆(事实和概念)。
- 隐式/程序性记忆:这种类型的记忆是无意识的,涉及自动执行的能力和常规,如骑自行车或键盘打字。
图8 人类记忆分类
我们可以大致考虑以下映射:
- 感官记忆类似于学习原始输入的嵌入表示,包括文本、图像或其他模态;
- 短期记忆类似于上下文内的学习。它是短暂且有限的,因为它受到变换器有限上下文窗口长度的限制。
- 长期记忆类似于智能体在查询时可以关注的外部向量存储,通过快速检索即可访问。
图9 MIPS性能对比
最大内积搜索(MIPS)
外部记忆可以缓解有限注意力范围的限制。一种标准做法是将信息的嵌入表示保存到支持快速最大内积搜索(MIPS)的向量存储数据库中。为了优化检索速度,常见的做法是使用近似最近邻(ANN)算法来返回大约最接近的 top k 个邻居,以牺牲一点准确性的损失来换取巨大的速度提升。
用于快速MIPS的常见ANN算法选择包括:
- LSH(局部敏感哈希):它引入了一个哈希函数,使得相似的输入项以高概率映射到相同的桶中,其中桶的数量远小于输入的数量。
- ANNOY(Approximate Nearest Neighbors Oh Yeah):核心数据结构是随机投影树,这是一组二叉树,每个非叶子节点代表一个将输入空间一分为二的超平面,每个叶子存储一个数据点。树是独立且随机构建的,因此在某种程度上,它模仿了哈希函数。ANNOY搜索在所有树中进行,通过迭代搜索最接近查询的一半,然后聚合结果。这个想法与KD树有关,但更具可扩展性。
- HNSW(层次可导航小世界):它受到小世界网络思想的启发,其中大多数节点可以在少数几步内被任何其他节点访问;例如,社交网络的“六度分离”特征。HNSW构建了这些小世界图的分层层,其中底层包含实际的数据点。中间层创建快捷方式以加速搜索。执行搜索时,HNSW从顶层的随机节点开始,向目标导航。当它无法再接近时,它移动到下一层,直到到达底层。在上层中的每次移动都可能在大数据空间中覆盖一段较大的距离,而在下层的每次移动都提高了搜索质量。
- FAISS(Facebook AI相似性搜索):它基于高维空间中节点间距离遵循高斯分布的假设,因此数据点应该存在聚类。FAISS通过将向量空间划分为簇,然后在簇内细化量化来应用向量量化。搜索首先使用粗量化查找簇候选者,然后在每个簇中使用更精细的量化进一步查找。
- ScaNN(可扩展最近邻):ScaNN的主要创新是各向异性向量量化。它将数据点 ( q ) 量化为 ( q' ),使得内积 ( q' \cdot q ) 尽可能接近原始距离 ( q ),而不是选择最近的量化中心点。
组件三:工具使用
工具使用是人类的一个显著且独特的特征。我们创造、修改并利用外部物体来完成超出我们身体和认知极限的事情。为LLMs配备外部工具可以显著扩展模型的能力。
图10 海獭在使用工具
MRKL(Karpas等人,2022年),即“模块化推理、知识和语言”,是一种用于自主智能体的神经符号架构。MRKL系统被提议包含一系列“专家”模块,而通用型LLM则作为一个路由器,将询问引导至最适合的专家模块。这些模块可以是神经型的(例如深度学习模型)或符号型的(例如数学计算器、货币转换器、天气API)。
他们进行了一项实验,微调LLM以调用计算器,使用算术作为测试案例。他们的实验显示,解决口头数学问题比明确陈述的数学问题更难,因为LLM(7B Jurassic1-large模型)无法可靠地提取基本算术的正确参数。这些结果突出了外部符号工具何时可以可靠地工作,了解何时以及如何使用工具是至关重要的,这取决于LLM的能力。
TALM(工具增强的语言模型;Parisi等人,2022年)和Toolformer(Schick等人,2023年)都是微调语言模型以学习使用外部工具API。数据集是基于新添加的API调用注释是否可以提高模型输出的质量来扩展的。有关更多详细信息,请参见“提示工程”部分的“外部API”部分。
ChatGPT插件和OpenAI API函数调用是LLMs增强工具使用能力的实际应用示例。工具API的集合可以由其他开发者提供(如插件)或自行定义(如函数调用)。
HuggingGPT(Shen等人,2023年)是一个框架,它使用ChatGPT作为任务规划器,根据模型描述选择HuggingFace平台上的可用模型,并根据执行结果总结响应。
图11 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将任务分配给专家模型,其中请求被表述为多项选择题。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等人,2023年)是评估工具增强LLM性能的基准。它包含53个常用的API工具,一个完整的工具增强LLM工作流程,以及264个涉及568个API调用的注释对话。API的选择相当多样,包括搜索引擎、计算器、日历查询、智能家居控制、日程管理、健康数据管理、账户认证工作流等。由于API数量众多,LLM首先可以访问API搜索引擎以找到要调用的正确API,然后使用相应的文档进行调用。
图12 API-Bank算法流程
在API-Bank工作流程中,LLM需要做出几个决策,在每个步骤我们都可以评估这个决策的准确性。决策包括:
- 是否需要API调用。
- 确定要调用的正确API:如果不理想,LLM需要迭代修改API输入(例如,为搜索引擎API决定搜索关键词)。
- 根据API结果生成响应:如果结果不满意,模型可以选择再次细化并调用。
这个基准评估了智能体在三个层次的工具使用能力:
- 第1级评估调用API的能力。给定API的描述,模型需要确定是否调用给定的API,正确调用,并适当响应API返回的结果。
- 第2级检查检索API的能力。模型需要搜索可能解决用户需求的API,并通过阅读文档学习如何使用它们。
- 第3级评估超出检索和调用的API规划能力。给定不明确的用户请求(例如,安排小组会议、为旅行预订航班/酒店/餐厅),模型可能需要进行多次API调用来解决它。
案例研究
科学发现代理
ChemCrow(Bran等人,2023年)是一个特定领域的示例,LLM被增强为13个专家设计的工具,以完成有机合成、药物发现和材料设计等任务。在LangChain中实现的工作流程反映了之前描述的ReAct和MRKLs,并将CoT推理与任务相关的工具结合起来:
- LLM被提供了一个工具名称列表、它们的用途描述以及预期的输入/输出详情。
- 然后,它被指示在必要时使用提供的工具回答用户给定的提示。提示建议模型遵循ReAct格式 - 思考、行动、行动输入、观察。
一个有趣的观察是,尽管LLM评估得出GPT-4和ChemCrow的表现几乎相当,但以解决方案的完成和化学正确性为导向的人类评估显示,ChemCrow在很大程度上超过了GPT-4。这表明使用LLM评估其在需要深厚专业知识领域的表现可能存在潜在问题。缺乏专业知识可能导致LLM不知道其缺陷,因此无法很好地判断任务结果的正确性。Boiko等人(2023年)还研究了LLM增强的代理在科学发现中的应用,以处理自主设计、规划和执行复杂科学实验。这个代理可以使用工具浏览互联网、阅读文档、执行代码、调用机器人实验API并利用其他LLM。
例如,当被要求“开发一种新型抗癌药物”时,模型提出了以下推理步骤:
- 询问当前抗癌药物发现的趋势;
- 选择一个目标;
- 请求针对这些化合物的支架;
- 一旦确定了化合物,模型尝试进行合成。
他们也讨论了风险,特别是与非法药物和生物武器有关的风险。他们开发了一个测试集,包含了一份已知化学武器代理的列表,并要求代理合成它们。11个请求中有4个(36%)被接受以获取合成解决方案,而代理尝试咨询文档以执行程序。7个请求被拒绝,其中5个是在网络搜索后被拒绝的,而另外2个是基于提示直接被拒绝的。
生成代理模拟
生成代理(Park等人,2023年)是一个超级有趣的实验,其中25个虚拟角色,每个角色都由一个LLM驱动的代理控制,在一个沙盒环境中生活和互动,灵感来自《模拟人生》。生成代理为交互式应用创建了可信的人类行为模拟。生成代理的设计结合了LLM、记忆、规划和反思机制,使代理能够根据过去的经验行为,并与其他代理互动。
- 记忆流:是一个长期记忆模块(外部数据库),记录了代理的自然语言体验的全面列表。每个元素都是一个观察结果,直接由代理提供。代理之间的通信可以触发新的自然语言语句。
- 检索模型:根据相关性、最近性和重要性,向代理提供上下文以指导其行为。
- 最近性:近期事件得分更高
- 重要性:区分日常记忆和核心记忆。直接问LLM。
- 相关性:基于当前情况/查询的相关性。
- 反思机制:随着时间的推移,将记忆合成成更高层次的推论,并指导代理的未来行为。这是对过去事件的高级总结(请注意,这与上面的自我反思有所不同)。
提示LLM使用最近的100个观察结果,并生成一组观察/陈述中3个最突出的高级问题。然后要求LLM回答这些问题。
- 规划和反应:将反思和环境信息转化为行动
- 规划本质上是为了在时间和瞬间优化可信度。
- 提示模板:{代理X的介绍}。以下是X今天的计划大纲:1)
- 代理之间的关系以及一个代理对另一个代理的观察都在规划和反应中被考虑。
- 环境信息以树状结构呈现。
这个有趣的模拟结果导致了涌现的社会行为,例如信息传播、关系记忆(例如,两个代理继续对话主题)和社会事件的协调(例如,举办派对并邀请其他人)。
图 13 生成式智能体框架
概念验证示例
AutoGPT已经引起了人们对使用LLM作为主要控制器来建立自主代理的可能性的大量关注。由于自然语言接口,AutoGPT存在相当多的可靠性问题,但无论如何都是一个酷的概念验证演示。AutoGPT中有很多代码是关于格式解析的。
以下是AutoGPT使用的系统消息,其中{{...}}是用户输入:
You are {{ai-name}}, {{user-provided AI bot description}}.
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.
GOALS:
1. {{user-provided goal 1}}
2. {{user-provided goal 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.
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>"
2. Browse Website: "browse_website", args: "url": "<url>", "question": "<what_you_want_to_find_on_website>"
3. Start GPT Agent: "start_agent", args: "name": "<name>", "task": "<short_task_desc>", "prompt": "<prompt>"
4. Message GPT Agent: "message_agent", args: "key": "<key>", "message": "<message>"
5. List GPT Agents: "list_agents", args:
6. Delete GPT Agent: "delete_agent", args: "key": "<key>"
7. Clone Repository: "clone_repository", args: "repository_url": "<url>", "clone_path": "<directory>"
8. Write to file: "write_to_file", args: "file": "<file>", "text": "<text>"
9. Read file: "read_file", args: "file": "<file>"
10. Append to file: "append_to_file", args: "file": "<file>", "text": "<text>"
11. Delete file: "delete_file", args: "file": "<file>"
12. Search Files: "search_files", args: "directory": "<directory>"
13. Analyze Code: "analyze_code", args: "code": "<full_code_string>"
14. Get Improved Code: "improve_code", args: "suggestions": "<list_of_suggestions>", "code": "<full_code_string>"
15. Write Tests: "write_tests", args: "code": "<full_code_string>", "focus": "<list_of_focus_areas>"
16. Execute Python File: "execute_python_file", args: "file": "<file>"
17. Generate Image: "generate_image", args: "prompt": "<prompt>"
18. Send Tweet: "send_tweet", args: "text": "<text>"
19. Do Nothing: "do_nothing", args:
20. Task Complete (Shutdown): "task_complete", args: "reason": "<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.
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
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
GPT-Engineer是另一个项目,旨在根据自然语言指定的任务创建一个完整的代码库。GPT-Engineer被指示思考一系列更小的组件来构建,并根据需要向用户请求输入以澄清问题。
以下是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"
},
{
"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?"
},
{
"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.\"."
},
{
"role": "assistant",
"content": "Remaining unclear areas: 2 remaining questions.\nCan you provide more information about how the MVC components are split into separate files?"
},
{
"role": "user",
"content": "{{Make your own assumptions and state them explicitly before starting}}"
}
]
然后在这些澄清之后,代理进入了代码编写模式,使用了一个不同的系统消息。系统消息:
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 format, where 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 language, and CODE is the 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. For NodeJS, you always create an appropriate package.json file. 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:
pytest
dataclasses
对话样本:
[
{
"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's data, such as level information, character states, and enemy positions.\n2. View: The view will handle the game's visuals, including rendering the game objects, backgrounds, and updating the display.\n3. Controller: The controller will manage user input, such as keyboard controls, and update the model accordingly.\n\nWith these assumptions in mind, is there any specific aspect of the keyboard control implementation you would like me to clarify?"
},
{
"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 start with 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"
}
]
挑战
- 有限的上下文长度:受限的上下文容量限制了历史信息的包含、详细指令、API调用上下文和响应。系统设计必须与这种有限的通信带宽一起工作,而自我反思等机制从过去的错误中学习将受益于长或无限上下文窗口。尽管向量存储和检索可以提供对更广泛知识库的访问,但它们的表示能力不如全注意强大。
- 长期规划和任务分解的挑战:规划长期历史和有效探索解决方案空间仍然具有挑战性。LLM在遇到意外错误时难以调整计划,这使得它们与人类相比,在从试错中学习方面更脆弱。
- 自然语言接口的可靠性:当前的智能体系统依赖于自然语言作为LLM与外部组件(如记忆和工具)之间的接口。然而,模型输出的可靠性值得怀疑,因为LLM可能会出现格式错误,并偶尔表现出叛逆行为(例如,拒绝遵循指令)。因此,智能体演示代码的大部分集中在解析模型输出上。
本文转载自公众号AIGC最前线
原文链接:https://mp.weixin.qq.com/s/N4z6wyJTEpk890iIALjfiQ