通知:即日起,禁止携带Note 7登机,且不得作为航空货物托运或承运
06-17
作者:lucasgftang 大语言模型 vs 人类 大语言模型非常强大,就像人的大脑一样,它具有思考的能力。如果人类只有大脑,没有四肢,没有工具,就无法与世界互动。
如果我们可以为大型模型配备肢体和工具会怎么样?大型模型是否会打破次元壁,从数字世界走向现实世界,与现实世界实现梦幻联动?大型语言模型(后来称为LLM)可以接受输入,分析&推理,并输出文本\代码\媒体。但它无法像人类一样拥有计划和思考的能力、利用各种工具与物理世界交互、拥有人类的记忆能力。
LLM:接受输入、思考、输出 人类:LLM(接受输入、思考、输出)+记忆+工具+规划 如果我们给LLM配备:与物理世界交互的工具、记忆能力、规划和思考能力。 LLM能否像人一样,能够独立思考并规划完成任务的过程,检索记忆,利用各种工具提高效率,最终完成任务?什么是代理?代理人的英文名称是Agent。
AI行业对Agent提出了多种定义。就我个人而言,我理解代理是一般问题解决者。
从软件工程的角度来看,智能代理是一种基于大语言模型的计算机程序,具有计划思考、记忆和使用工具功能的能力,能够独立完成给定的任务。图 1. LLM 驱动的智能体系统如图 1 所示。
在基于 LLM 的智能体中,LLM 充当智能体的“大脑”,同样具有三个关键部分: 规划:智能体将大任务分解为子任务并计划执行任务的过程; Agent会对任务执行过程进行思考和反思,以决定是否继续执行任务,或者判断任务完成并终止运行。记忆:短期记忆是指任务执行期间的上下文。
它会在子任务执行过程中生成并暂存,任务完成后会被清除。长期记忆是长期保留的信息,一般指外部知识库,通常使用向量数据库来存储和检索。
工具使用:为Agent配备工具API,如计算器、搜索工具、代码执行器、数据库查询工具等。通过这些工具API,Agent可以与物理世界交互并解决实际问题。
智能代理能做什么?相信看到这里,我们已经对智能代理有了基本的了解。如果你仍然觉得智能代理的概念有点抽象,没关系。
现在让我们做一些有趣的事情。让我们看看智能代理能玩出什么花样。
Agent的Researcher Agent Researcher Agent可以从搜索引擎中搜索信息并根据用户的研究问题进行总结,然后生成研究报告。这里使用 MetaGPT 框架中的研究人员示例来展示代理的实际角色和组成。
运行一下,尝试进入研究主题:特斯拉 FSD 和华为 ADS 两种自动驾驶系统研究 代码语言:javascript copy~ python3 -m metagpt.roles.researcher 《特斯拉 FSD vs 华为 ADS》智能代理执行研究图 2从搜索引擎搜索并获取URL地址列表(左边是冯·诺依曼;右边是奥本海默;后面是世界上第一台采用冯·诺依曼架构的“现代”计算机)图3。浏览网页并总结网页内容 图4.生成研究报告并输出研究报告metaGPT。
生成并保存研究报告文件:Tesla FSD vs 华为 ADS.md 图5 拆解Researcher Researcher Agent组成 返回上一篇文章 是的,如果你只有LLM的大脑,是无法完成整个研究过程的。在研究员代理中,LLM大脑配备了计划、工具和记忆的能力,使他能够独立完成研究任务。
其基本构成如下所示,分为角色、工具、内存三个部分。在角色中,会注册各种工具来定义思维和计划的方式,以及短期记忆能力。
图 6 Agent img Agent 的关键组成如上图所示,在基于 LLM 的 Agent 中,LLM 充当了 Agent 的“大脑”,同样具有三个关键部分:规划(规划)、记忆(Memory)、工具使用(Tool use)规划(Planning)规划,可以通过观察和思考来理解。如果用人类来比喻,当我们接到一个任务时,我们的思维模型可能是这样的:我们首先思考如何完成任务。
然后我们将了解我们手头的工具以及如何有效地使用它们来实现我们的目标。我们会将任务拆分为子任务(就像我们使用 TAPD 进行任务拆分一样)。
在执行任务的时候,我们会反思和改进执行过程,吸取教训改进以后的步骤,并思考在执行过程中什么时候可以终止任务。这就是人的计划能力。
我们希望智能体也有这样的思维模式。因此,LLM提示工程可以用来给代理人这样的思维模式。
在Agent中,最重要的是让LLM具备以下两个能力: 子任务分解。 LLM允许智能体将大型任务分解为更小、更可控的子任务,从而能够有效地完成复杂的任务。
。 Chain of Thought(CoT) Chain of Thought已经是一种比较标准的提示技术,可以显着提高LLM完成复杂任务的效率。
当我们要求LLM“一步步思考”时,我们会发现LLM会将问题分解为多个步骤,一步一步地思考和解决,这样可以让输出的结果更加准确。这是一种线性的思维方式。
思维链的提示可以如下(这只是一个极简的提示,提示会根据需要进行调整): 代码语言:javascript copy template="回答问题:Q:{question}?我们一步步思考步骤:“思想树 (ToT) 进一步扩展了 CoT。思维链的每一步都会推断出多个分支,并将拓扑展开为一棵思维树。
使用启发式方法评估每个推理分支对解决问题的贡献。选择一种搜索算法,使用广度优先搜索 (BFS) 或深度优先搜索 (DFS) 等算法来探索思维树并向前看和回溯。
图7 反思与改进 在任务执行过程中,Agent使用LLM来反思已完成的子任务,从错误中学习,并改进未来的步骤,以提高任务完成的质量。同时反思任务是否完成并终止任务。
ReAct(当我第一次接触这个词时,我想到的是“React 是 Facebook 开源的一个 JavaScript 库,用于创建用户界面……”别说了,我们好像走错片场了。这个 React不是ReAct?﹏?)ReAct(Yao et al.),《ReAct: Synergizing Reasoning and Acting in Language Models》本文提出了一种增强大型语言模型的方法,通过结合推理(Reasoning)和行动(Acting)效果来增强推理和决策。
推理:LLM根据“现有知识”或“行动后获得的知识”得出结论的过程。代理:LLM根据实际情况使用工具获取知识,或完成子任务以获得阶段性信息。
为什么推理与行动相结合能有效增强LLM完成任务的能力?这个问题其实很容易回答。我们以上面的“研究员代理”为例。
我提出了一个问题:“特斯拉 FSD 与华为 ADS”。以下是几种不同规划模式的推论: Reasoning Only(仅推理):LLM仅根据现有知识进行推理并生成答案来回答该问题。
显然,如果LLM本身没有这些知识,它可能会产生幻觉并给出随机答案。 Acting Only:大模型不使用推理,仅使用工具(例如搜索引擎)来搜索这个问题。
结果会是大量的数据,你无法直接返回这个问题。推理与行动:法学硕士将首先建立在现有知识的基础上,并审查您拥有的工具。
当发现现有的知识不足以回答问题时,就会调用工具,比如搜索工具、报告生成等,然后获取新的信息,并根据已有的知识重复推理和行动。新信息,直到任务完成。
推理和行动的步骤如下: 代码语言:javascript 复制推理1:目前的知识不足以回答这个问题。要回答这个问题,你需要知道“特斯拉FSD”和“华为ADS”是什么。
操作1:使用搜索工具搜索“特斯拉FSD”和“华为ADS”的信息。观察一:总结行动一的内容。
推论二:根据行动一和观察一的信息,我们得知这是一个关于两家自动驾驶提供商的计划。相反,根据现有信息,现在需要生成报告。
行动2:使用报告生成工具生成研究报告。观察 2:任务完成。
图8采用巧妙的promt提示设计,使LLM能够反复执行推理和动作,最终完成任务。 。
ReAct的提示模板的总体思路是: 代码语言:javascript Copy Thought(思考):...Action(行动):...Observation(观察):...Thought(思考):...Action(动作):...观察:...(重复多次) 记忆(Memory) 什么是记忆?当我们思考这个问题时,人脑已经在使用记忆了。记忆力是大脑存储、保留和回忆信息的能力。
记忆可分为不同类型: 短期记忆(或工作记忆):这是一种短期记忆,能够临时存储和处理有限数量的信息。例如,在拨打之前记住一个电话号码。
长期记忆:这是一种持久的记忆,可以存储大量信息,从几分钟到一生。长期记忆又可分为外显记忆和内隐记忆。
外显记忆是可以有意识地回忆和表达的信息。外显记忆可分为情景记忆(个人经历的具体事件)和语义记忆(一般知识和概念)。
内隐记忆通常是无意识的,涉及技能和习惯,例如骑自行车或打字。仿照人类记忆机制,智能体实现了两种记忆机制: 短期记忆:当前任务执行过程中产生的信息,例如某个工具或子任务的结果,将被写入短期记忆记忆。
记忆在当前任务期间生成并暂时存储,并在任务完成后清除。长期记忆:长期记忆是长期保留的信息。
一般指外部知识库,通常使用向量数据库来存储和检索。工具使用(Tool use)LLM是数字世界中的一门课程。
如果你想与现实世界互动,获取未知的知识,或者计算复杂的公式,就离不开工具。所以我们需要给Agent配备各种工具,并赋予它使用工具的能力。
有哪些工具?它可以是一把锤子、一把螺丝刀、一个函数或一个软件开发工具包 (sdk)。工具是人类智慧的体现,拓展我们的能力,提高工作效率。
在代理中,工具就是函数,工具的使用就是调用函数。要在 LLM 中实现函数调用,请使用 LLM 的以下功能: 函数调用 函数调用是一种将大型语言模型连接到外部工具的机制。
通过API调用LLM时,调用者可以对函数进行描述,包括函数描述、请求参数描述、响应参数描述,这样LLM可以根据用户的输入,适当选择调用哪个函数,同时理解用户的自然语言,转换为调用函数的Request参数(以JSON格式返回)。调用者使用LLM返回的函数名称和参数来调用函数并获取响应。
最后,如果需要,将函数的响应传递给LLM,并让LLM将其组织成自然语言回复给用户。函数调用的具体工作流程如下图所示: 图9 不同LLM的API接口协议会有所不同。
下面以OpenAI的API协议为例,讲解如何实现Function Calling功能描述。我们可以根据代理的需求来实现该功能。
比如上面提到的“Researcher”代理,就实现了这些功能: WebBrowseAndSummarize:浏览网页并总结网页内容;进行研究:生成研究报告等。如果是智能家居代理,可能需要这些功能:开关灯、打开空调、获取环境信息等。
功能的实现不再赘述详细信息请参见此处。功能可以通过自身编码来实现,也可以通过调用外部API来实现。
假设你的功能已经实现了,我们需要向LLM描述这个功能。函数描述必备要素:函数名称、函数描述、函数请求参数描述、函数响应参数描述(可选) “查询近期天气”函数描述: 代码语言:javascript copy tools = [{ "type": "function", "function": { "name": "get_n_day_weather_forecast", "description": "获取最近n天的天气预报", "parameters": { "type": "object", "properties": { "location" : { "type": "string", "description": "城市或城镇如:深圳市南山区", }, "format": { "type": "string", "enum": [" celsius", "fahrenheit"], "description": "要使用的温度单位,摄氏度或华氏度", },"num_days": { "type": "integer", "description": "预测天数", } }, "required": ["location", "format", "num_days"] }, } }] 调用LLM获取函数的请求参数,Function Calling是通过请求LLM的聊天API来实现的。
支持Function Calling模型的聊天API参数中,会有一个functions参数(或者tools,不同LLM的参数会不同)。通过传入这个Parameters,大模型就会知道哪些参数可用,并根据用户的输入推断出应该调用哪些函数,并将自然语言转换为函数的请求参数返回给请求者。
以下是 OpenAI 的 SDK 示例: 代码语言: javascript copy from openai import OpenAIdef chat_completion_request(messages, tools=None, tool_choice=None, model="gpt-3.5-turbo"): try: response = client.chat.completions .create ( model=model, messages=messages, tools=tools, tool_choice=tool_choice, ) 返回响应,例外情况为 e: print("无法生成 ChatCompletion 响应") print(f"Exception: {e}") return eif __name__ == "__main__": messages = [] messages.append({"role": "system", "content": "不要假设函数中输入的值是什么。如果用户的请求不清楚,请询问清楚"}) messages.append({"role": "user", "content": "未来5天深圳市南山区的天气怎么样"} ) chat_response = chat_completion_request( messages, tools =tools ) tool_calls = chat_response.choices[0].message.tool_calls print("====reply===") print(tool_calls)LLM 将返回 get_n_day_weather_forecast 函数的调用参数: 代码语言: javascript Copy===reply ===[ChatCompletionMessageToolCall(id='call_7qGdyUEWp34ihubinIUCTXyH', function=Function(arguments='{"location":"深圳市南山区","format":"celsius", "num_days":5}', name=' get_n_day_weather_forecast'), type='function')]//格式化:chat_response.choices[0].message.tool_calls:[ { "id": "call_7qGdyUEWp34ihubinIUCTXyH", "function ": { "arguments": { " location": "深圳市南山区", "format": "摄氏度", "num_days": 5 }, "name": "get_n_day_weather_forecast" }, "type": "function" }] 调用该函数后,调用者获取LLM返回的函数调用信息(函数名和调用参数),调用该函数如果需要,可以将函数执行的响应附加到聊天 API 会话中并传递给 LLM,以便 LLM 可以组织自然语言回复给用户。
代码语言: javascript copy # 在 tool_calls 中执行 tool_call 的函数: function = tool_call.function.name Arguments_list = json.loads(tool_call.function.arguments) function_to_call = globals().get(function) result = function_to_call(**arguments_list) print("===" + function + "===") print(result) # 将函数调用结果添加到对话历史中 messages.append( { "tool_call_id": tool_call.id, # 用于标识函数调用ID "role": "user", "name": function, "content": "函数执行结果为:" + str(result) } )# 函数执行结果传递给LLM并组织成自然语言回复to the user chat_response = chat_completion_request (messages, tools=tools)print("====reply===")print(chat_response.choices[0].message.content)执行结果: 代码语言:javascriptCopy===get_n_day_weather_forecast ===[{'日期': '04-01', '地点': '深圳市南山区', '温度': '20°C', '描述': '晴'}, {'日期': '04-02', '地点': '深圳市南山区', '温度': '21°C', '描述': '阴天'} , {'date': '04-03', 'location': '深圳市南山区', '温度': '22°C', 'description': '晴天'}, {'date': '04 -04 ', 'location': '深圳市南山区', '温度': '23°C', 'description': '阴天'}, {'date': '04-05', 'location': '深圳市南山区', '温度': '24℃', '描述': '晴'}]====回复===深圳市南山区未来5天天气情况如下: - 4月1日:晴,气温20°C - 4月2日:阴天,气温21°C - 4月3日:晴,气温22°C - 4月4日:阴天,气温23°C - 4月5日:晴,气温24°C 请注意,天气预报仅供参考,实际情况可能会有所变化。代理的开发框架是现在(2020年5月)。
如果你想开发一个AI代理,比大模型爆发初期方便得多。随着AI应用需求的不断增长,代理框架层出不穷。
Agent开发框架对常用的模块进行了抽象和封装,如内存能力、规划能力、RAG能力、大模型调用等。使用Agent框架可以帮助您快速构建智能Agent。
据awesome-ai-agents介绍,无论是开源还是闭源,代理应用框架在各个领域都比较有代表性,比如定制代理、编码、研究、数据分析、多代理等产品可供选择。图 10 中使用了 MetaGPT。
MetaGPT 是一个多代理框架。多Agent框架可以帮助您开发由多个具有不同职责的Agent组成的多Agent。
例如,如果我们要开发一个多Agent的软件团队,软件团队可以根据用户需求交付代码,并在内部通过测试代码和审查代码来提高代码质量。多智能体将包括三个具有不同职责的智能体:开发者(coder)、测试者(tester)和评审者(reviewer)。
他们各司其职,相互协作完成任务。下图左侧是多个Agent的协作流程,右侧是单个Agent的工作流程。
图11展望:随着大型模型的蓬勃发展,LLM将支持更长的上下文、更大的参数尺度,其推理能力将变得越来越强大。因此,基于大模型的AI智能体的能力正在不断突破。
通过Agent技术,我们可以创建各种各样的AI应用,比如Copilot、DB-GPT等,一些AI应用已经成为工作和生活中不可或缺的。我相信人工智能应用将快速、全面地重构我们习惯的软件形态和交互方式,提高人类生产力。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-21
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用