LangChain中代理(Agent)相关知识学习笔记
一、代理的引入
在自然语言处理领域,大语言模型虽然强大,但存在无法主动更新知识的固有问题,容易出现“事实幻觉”。为解决这一问题,代理(Agent)应运而生。代理就像一个智能的桥梁,连接着大模型和外部工具,能够根据用户输入自主判断并调用合适的工具,以获取更准确和全面的信息,从而提高大模型的实用性和可靠性。
二、代理的关键组件
(一)代理(Agent)
它是代理机制的核心,由语言模型和提示(prompt)驱动。提示中包含代理的性格、任务背景以及提示策略等信息,这些信息引导代理以特定方式进行响应和决策。不同类型的代理适用于不同的任务场景,如ReAct框架下的代理、Structured tool chat代理等。
(二)工具(Tools)
工具是代理实现各种功能的具体手段,是代理调用的函数。为了让代理能够有效地完成任务,我们需要确保代理能够访问到正确的工具,并且以清晰、准确的方式描述这些工具的功能和使用方法。例如,在查找信息时,我们可以为代理提供搜索引擎工具;在进行数学计算时,提供计算器工具等。
(三)工具包(Toolkits)
工具包是一组相关工具的集合,它们共同协作以完成特定的目标。工具包的设计使得代理在处理复杂任务时更加高效和便捷。比如,LangChain的Office365工具包中包含了连接Outlook、读取邮件列表、发送邮件等一系列工具,这些工具相互配合,能够满足与办公相关的各种任务需求。
(四)代理执行器(AgentExecutor)
代理执行器是代理的运行环境,它负责调用代理并执行代理选择的操作。在执行过程中,代理执行器需要处理各种复杂情况,如代理选择了不存在的工具、工具出错、代理输出无法解析成工具调用等。同时,它还负责对代理的决策和工具调用进行观察和日志记录,以便于调试和优化代理的性能。
三、ReAct框架
(一)原理
ReAct框架的灵感来源于人类的决策过程,强调“行动”和“推理”的协同作用。在这个框架中,大模型通过生成推理痕迹和任务特定行动来实现更大的协同效果。具体来说,模型首先对当前环境和状态进行观察,生成推理轨迹,然后根据推理结果决定采取何种行动,如与外部源交互获取信息或给出最终答案。这种框架不仅提高了大模型解决问题的能力,还改善了其可解释性和可信度。
(二)示例
以在虚拟环境中找到胡椒瓶并将其放在抽屉里为例,展示了ReAct框架的具体应用。在这个任务中,没有推理能力的模型可能无法完成任务,但使用ReAct框架后,模型能够逐步思考并采取行动,如先确定胡椒瓶可能出现的位置,然后前往相应位置寻找,找到后再将其放置在抽屉里。通过这个示例,我们可以看到ReAct框架如何引导模型有条不紊地完成复杂任务。
四、AgentExecutor的运行机制
(一)关键代码回顾
通过回顾设置模型、工具、代理并运行代理的关键代码,我们可以对AgentExecutor的使用有一个初步的了解。在实际应用中,我们需要根据具体需求选择合适的模型和工具,并将它们与代理进行集成,以实现特定的任务目标。
(二)运行机制剖析
为了深入了解AgentExecutor的运行机制,我们通过设置断点的方式深入到代码内部进行分析。在这个过程中,我们发现AgentExecutor的_take_next_step方法是整个运行机制的核心,它掌控着下一步要调用什么工具的计划。在该方法中,首先调用代理的Plan方法,根据输入问题生成初步的计划,然后根据计划选择相应的工具并执行。在工具执行完成后,获取观察结果,并将其与历史信息一起作为新的输入,再次调用代理的Plan方法进行下一轮的思考和决策,直到任务完成或达到预设的停止条件。
在这个过程中,提示信息起到了至关重要的作用。提示信息不仅告诉模型要完成的任务,还指导模型如何使用工具以及如何进行推理和决策。通过不断调整和优化提示信息,我们可以提高代理的性能和效果。
五、复杂代理类型
(一)结构化工具对话代理
随着语言模型的发展,对工具使用的限制逐渐放宽,结构化工具对话代理应运而生。这种代理能够使用结构化工具集,通过组合调用多个工具来完成复杂的任务。以PlayWright工具包为例,它提供了一系列用于自动化网页操作的工具,如点击、导航、提取文本等。结构化工具对话代理可以利用这些工具自动完成网页相关的任务,如访问特定网页、获取网页标题和内容等。
(二)Self-Ask with Search代理
Self-Ask with Search代理是一种专门用于解决多跳问题的代理类型。多跳问题是指为了得到最终答案,需要进行多步推理或多次查询的问题。这种代理通过追问和中间答案的方式,引导大模型逐步找到最终答案。例如,在查找使用玫瑰作为国花的国家的首都时,代理会先确定使用玫瑰作为国花的国家,然后再查找该国家的首都。通过这种逐步逼近的方式,代理能够有效地解决复杂的多跳问题。
(三)Plan and execute代理
Plan and execute代理的独特之处在于它将计划和执行分别由不同的大语言模型完成。首先,一个大语言模型负责制定计划,将整个任务划分为多个子任务;然后,另一个大语言模型负责执行这些子任务。这种分工协作的方式使得代理在处理复杂任务时更加灵活和高效。以计算在纽约100美元能买几束玫瑰为例,计划模型先确定需要获取玫瑰在纽约的平均价格,然后执行模型根据平均价格计算出可购买的玫瑰束数。
六、总结
代理是LangChain中非常重要的概念,它通过与外部工具的结合,赋予了大模型更强的自主性和实用性。ReAct框架为代理的运行提供了理论基础,使得代理能够更加智能地进行推理和决策。AgentExecutor作为代理的执行引擎,负责协调各个组件的工作,确保代理能够顺利完成任务。不同类型的代理适用于不同的任务场景,我们可以根据具体需求选择合适的代理类型来解决问题。在未来的发展中,代理技术有望在更多领域得到应用,为人工智能的发展带来新的机遇和挑战。