1.代理的作用 每当你遇到这种需要模型做自主判断、自行调用工具、自行决定下一步行动的时候,Agent(也就是代理)就出场了。 代理就像一个多功能的接口,它能够接触并使用一套工具。根据用户的输入,代理会决定调用哪些工具。它不仅可以同时使用多种工具,而且可以将一个工具的输出数据作为另一个工具的输入数据。 在LangChain中使用代理,我们只需要理解下面三个元素。 大模型:提供逻辑的引擎,负责生成预测和处理输入。 与之交互的外部工具:可能包括数据清洗工具、搜索引擎、应用程序等。 控制交互的代理:调用适当的外部工具,并管理整个交互过程的流程。 这个过程有很多地方需要大模型自主判断下一步行为(也就是操作)要做什么,如果不加引导,那大模型本身是不具备这个能力的。比如下面这一系列的操作: 什么时候开始在本地知识库中搜索(这个比较简单,毕竟是第一个步骤,可以预设)? 怎么确定本地知识库的检索已经完成,可以开始下一步? 调用哪一种外部搜索工具(比如Google引擎)? 如何确定外部搜索工具返回了想要找的内容? 如何确定信息真实性的检索已经全部完成,可以开始下一步? 那么,LangChain中的代理是怎样自主计划、自行判断,并执行行动的呢?
2.ReAct框架 这里我要请你思考一下:如果你接到一个新任务,你将如何做出决策并完成下一步的行动? 比如说,你在运营花店的过程中,经常会经历天气变化而导致的鲜花售价变化,那么,每天早上你会如何为你的鲜花定价? 也许你会告诉我,我会去Google上面查一查今天的鲜花成本价啊(行动),也就是我预计的进货的价格,然后我会根据这个价格的高低(观察),来确定我要加价多少(思考),最后计算出一个售价(行动)!
3.通过代理实现ReAct框架 下面,就让我们用LangChain中最为常用的 ZERO_SHOT_REACT_DESCRIPTION ——这种常用代理类型,来剖析一下LLM是如何在ReAct框架的指导之下进行推理的。 此处,我们要给代理一个任务,这个任务是找到玫瑰的当前市场价格,然后计算出加价15%后的新价格。 在开始之前,有一个准备工作,就是你需要在 serpapi.com 注册一个账号,并且拿到你的 SERPAPI_API_KEY,这个就是我们要为大模型提供的 Google 搜索工具。
4.Agent 的关键组件
在LangChain的代理中,有这样几个关键组件。
代理(Agent):这个类决定下一步执行什么操作。它由一个语言模型和一个提示(prompt)驱动。提示可能包含代理的性格(也就是给它分配角色,让它以特定方式进行响应)、任务的背景(用于给它提供更多任务类型的上下文)以及用于激发更好推理能力的提示策略(例如ReAct)。LangChain中包含很多种不同类型的代理。
工具(Tools):工具是代理调用的函数。这里有两个重要的考虑因素:一是让代理能访问到正确的工具,二是以最有帮助的方式描述这些工具。如果你没有给代理提供正确的工具,它将无法完成任务。如果你没有正确地描述工具,代理将不知道如何使用它们。LangChain提供了一系列的工具,同时你也可以定义自己的工具。
工具包(Toolkits):工具包是一组用于完成特定目标的彼此相关的工具,每个工具包中包含多个工具。比如LangChain的Office365工具包中就包含连接Outlook、读取邮件列表、发送邮件等一系列工具。当然LangChain中还有很多其他工具包供你使用。
代理执行器(AgentExecutor):代理执行器是代理的运行环境,它调用代理并执行代理选择的操作。执行器也负责处理多种复杂情况,包括处理代理选择了不存在的工具的情况、处理工具出错的情况、处理代理产生的无法解析成工具调用的输出的情况,以及在代理决策和工具调用进行观察和日志记录。
总的来说,代理就是一种用语言模型做出决策、调用工具来执行具体操作的系统。通过设定代理的性格、背景以及工具的描述,你可以定制代理的行为,使其能够根据输入的文本做出理解和推理,从而实现自动化的任务处理。而代理执行器(AgentExecutor)就是上述机制得以实现的引擎。