写点什么

软件测试 / 人工智能|LangChain 核心模块 Agents 详解

  • 2023-11-29
    北京
  • 本文字数:3410 字

    阅读完需:约 11 分钟

简介

在之前学习 AutoGPT 的过程中,AutoGPT 的 Command 模块可以针对于 LLM 的一些局限性做补充,比如爬取网页信息,精密计算,代码执行等。Agents 设计的初衷也是同样的目的,补充大语言模型的能力。


通过用户输入的自然语言转换为对工具调用的分析、工具参数的抽取,让每个角色发挥自己最擅长的部分,规避掉大模型在细节处理上不够精准的问题,解决用户与工具之间无法精确匹配的问题。


而 Agents 主要包含以下的主要能力:


  • 内置 Tools

  • 内置组件

  • 自定义工具


前两种的内置工具与组件可以覆盖大部分的常见使用场景,如果有内置工具确实无法解决的场景,则可以通过自定义工具模块实现。

设计原理

在代理(Agents)中,语言模型被用作推理引擎,以确定应该采取哪些动作以及执行顺序。如下图所示:


实践演练

调用内置 Tools


在调用内置 tools 之前,首先需要学习内置 Tools,内置 Tools 是作者封装好的一些工具,可以直接进行调用。主要步骤如下:


  • 加载工具。

  • 初始化 Agent,并将工具传入。

  • 对代理输入问题。



# LangChain相关模块的导入from langchain.chat_models import ChatOpenAIfrom langchain.agents import load_tools, initialize_agentfrom langchain.agents import AgentType# 加载个人的OpenAI Tokenkey = 'open_ai_key'# 创建OpenAI调用实例# 在本示例中,大模型需要作为一个严谨的逻辑解析工具,所以temperature设置为0llm = ChatOpenAI(temperature=0, openai_api_key=key)# 需要安装依赖库 pip install wikipedia# 加载内置工具 llm-math 和 wikipediatools = load_tools(["llm-math", "wikipedia"], llm=llm)# 创建Agent实例agent = initialize_agent( # 设置可以使用的工具 tools=tools, # 设置逻辑解析所使用的大模型实例 llm=llm, # 设置agent类型,CHAT表示agent使用了chat大模型,REACT表示在prompt生成时使用更合乎逻辑的方式,获取更严谨的结果 agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, # 设置agent可以自动处理解析失败的情况,由于使用大模型处理逻辑,返回值并不会100%严谨,所以可能会出现返回的额数据不符合解析的格式,导致解析失败 # agent可以自动处理解析失败的情况,再次发送请求以期望获取到能正常解析的返回数据 handle_parsing_errors=True, # 打开详细模式,会将agent调用细节输出到控制台 verbose=True)res = agent("1000的35%是多少?")
复制代码


执行结果示例如图:



从图中可以看出:


1.LangChain 通过分析,决定调用 Calculator tool 计算最终的结果,并且分析出了需要传入的数据格式,最终根据返回的结果得到了正确的答案 350.0。


2.虽然大模型本身对精确计算不是很擅长,但是通过 Agent 模块,大模型可以将需要精准计算的部分提交给更专业的工具进行计算,而大模型本身负责分析文本、决定使用的工具、抽取出相关的参数、分析和组合返回结果,这些部分正是大模型自己擅长的内容,通过与 Tools 分工合作,最终拿到了正确且精准的返回结果。


调用内置组件


所谓内置组件,可以将其理解为 Python 代码执行工具。前一个示例是计算工具,能够覆盖的场景有限。由于大模型本身也具备生成代码的能力,一个能够支持运行 Python 代码的工具,显然能够通过代码实现覆盖更大更复杂的场景,并且通用性也更强。使用内置的 Python 运行工具和大模型生成的代码结合的步骤如下:


1.加载工具。


2.初始化 Agent,并将工具传入,工具为 PythonREPLTool()。


3.对代理输入问题。


4.代理运行过程打开 Debug,方便查看运行流程。



# LangChain相关模块的导入from langchain.chat_models import ChatOpenAIfrom langchain.tools import PythonREPLToolfrom langchain.agents import initialize_agent
# 加载个人的OpenAI Tokenkey = 'open_ai_key'
# 创建OpenAI调用实例# 在本示例中,大模型需要作为一个严谨的逻辑解析工具,所以temperature设置为0llm = ChatOpenAI(temperature=0, openai_api_key=key)# 创建Agent实例agent = initialize_agent( # 设置可以使用的工具 tools=[PythonREPLTool()], # 设置逻辑解析所使用的大模型实例 llm=llm, # 打开详细模式,会将agent调用细节输出到控制台 verbose=True)# 待排序的人名列表name_list = ["Ashish Vaswani", "Noam Shazeer", "Niki Parmar", "Jakob Uszkoreit", "Llion Jones", "Aidan N. Gomez", "Łukasz Kaiser", "Illia Polosukhin"]# 打开Debug模式,将会输出更详细的日志信息,方便了解整体运行逻辑import langchain
langchain.debug = True# 组装成最终的命令字符串,并调用agent运行解析,获取结果command_str = f"将下列人名优先用姓氏、再使用名字进行排序,并将结果打印出来: \n{name_list}"res = agent.run(command_str)# 打印结果print(res)# 关闭Debug模式langchain.debug = False
复制代码


通过打开 Debug 开关,我们得以见到 LangChain 中 Agent 功能的详细工作流程和日志,简单梳理一下本次请求中 Agent 的工作如下图:



调用自定义工具


以上的两种方案,其实都有灵活性不足的问题,所以 LangChain 也提供了自定义 Tools 方法,方便开发者根据自己的业务生成 Tools,或者复用已有的 Tools 工具。


1.定义好自己的工具方法,并添加 @Tool 装饰器。定义工具方法的时候有以下注意事项:- 方法名作为自定义 Tool 的实例名称。- 方法参数是经过大模型分析之后,送入当前 Tool 的文本信息。- 方法中必须要存在 doc,这个 doc 会被作为 tool 的描述信息,提交给大模型用于判断什么时候怎么调用当前 tool。


2.初始化 Agent,并将定义好的工具传入。


3.对代理输入问题。


4.代理运行过程打开 Debug,方便查看运行流程。



# LangChain相关模块的导入from langchain.chat_models import ChatOpenAIfrom langchain.agents import initialize_agentfrom langchain.agents import tool
# 加载个人的OpenAI Tokenkey = 'open_ai_key'
# 创建OpenAI调用实例# 在本示例中,大模型需要作为一个严谨的逻辑解析工具,所以temperature设置为0llm = ChatOpenAI(temperature=0, openai_api_key=key)
# 使用tool装饰器,可以直接将一个方法转为BaseTool实例,用于放到Agent的tools参数中支持调用# 编写一个工具,用于将中文文本转换成拼音,以列表的形式返回文本中的每一个字@tooldef chinese_to_pinyin(query: str) -> str: # 方法名作为自定义tool的实例名称 # query参数是经过大模型分析之后,送入当前tool的文本信息 # 方法中必须要存在doc,这个doc会被作为tool的描述信息,提交给大模型用于判断什么时候怎么调用当前tool"""接收中文文本,返回对应中文的拼音列表,能够将中文转换成拼音的工具,必须要接收一个中文文本作为输入参数,并且返回的时候总是一个列表数据""" # 使用pypinyin库将中文文本转换成拼音 # 需要事先安装依赖库 pip3 install pypinyin from pypinyin import pinyin res = pinyin(query) # 将转换结果的格式修正一下[["zhong"],["wen"]] => "['zhong','wen']" return str([i[0] for i in res])

agent = initialize_agent( # 设置可以使用的工具列表 tools=[chinese_to_pinyin], # 设置逻辑解析所使用的大模型实例 llm=llm, # 打开详细模式,会将agent调用细节输出到控制台 verbose=True)# 待翻译文本chinese_str = "打开Debug模式,将会输出更详细的日志信息,方便了解整体运行逻辑"# 打开Debug模式,将会输出更详细的日志信息,方便了解整体运行逻辑import langchain
langchain.debug = True# 组装成最终的命令字符串,并调用agent运行解析,获取结果command_str = f"将以下文本转换成拼音: \n{chinese_str}"res = agent.run(command_str)# 打印结果print(res)# 关闭Debug模式langchain.debug = False
复制代码


返回结果示例截图:



根据运行中的步骤可以看到,通过大模型的分析,确实调用了预先设置好的 Tool 实例对字符串做了处理,将它转换成拼音形式,达成了最终目的。


需要注意的是,如果存在很多工具时,选用哪一款工具,将请求数据格式化成什么样的字符串发送给工具,是由大模型来决定的。这就要求我们对工具的使用描述尽可能的做到准确和简洁,并且在工具内部对异常情况多做考虑。

总结

本文主要介绍了 langchain 的 agents 模块的原理以及基本的使用,希望本文可以帮到大家!


获取更多技术资料,请点击!



用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
软件测试/人工智能|LangChain核心模块Agents详解_霍格沃兹测试开发学社_InfoQ写作社区