你要的AI Agent工具都在这里

news/2024/10/5 12:29:05/文章来源:https://www.cnblogs.com/mangod/p/18274620

只有让LLM(大模型)学会使用工具,才能做出一系列实用的AI Agent,才能发挥出LLM真正的实力。本篇,我们让AI Agent使用更多的工具,比如:外部搜索、分析CSV、文生图、执行代码等。

1. 使用工具的必要性

LLM(大模型)如果没有使用工具的能力,那就相当于一个有着聪明大脑 但四肢僵硬的 渐冻人,什么事儿也做不了。人类之所以区别于动物,正是因为学会了使用工具。因此,赋予LLM使用工具的能力至关重要。

我们需要 LLM去帮助执行各种任务。而Tool(工具)就是LLM 在执行任务过程中,能够调用的外部能力。比如:需要检索外部资料时,可以调用检索工具;需要执行一段代码时,可以调用自定义函数去执行。

2. LangChain的Tool规范

所有的工具肯定要遵守一套规范,才能让LLM随意调用。为此,LangChain 抽象出一个Tool 层,只要是遵守这套规范的函数就是 Tool 对象,就可以被 LLM调用。

2.1. Tool规范

Tool的规范也简单,只要有三个属性就行:namedescriptionfunction

  • name:工具的名称。
  • description:对工具的功能描述,后续这个描述文本会添加到Prompt(提示词)中,LLM 将根据description来决定是否调用该工具。
  • function:此工具实际运行的函数。

只要遵守这个规范就行,使用形式可以有多种,下文的实践代码会介绍到。

2.2. Agent使用工具的流程

让AI Agent使用工具,需要定义AgentAgentExecutorAgentExecutor维护了Tool.nameToolMap 结构。

LLM根据Prompt(包含了Tool的描述) 和 用户的问题,判断是否需要调用工具,确定某个工具后,在根据Tool的名称 和 调用参数,到映射Map 中获找Tool实例,找到之后调用Tool实例的function

3. 如何使用各种Tool

自定义Tool只需要遵守以上规范就可以,下面以几个常用的工具做示例。

下文有些工具用到了toolkitstoolkitsLangChain提供的工具包,旨在简化使用工具的成本toolkits里提供了丰富的工具,还在不断叠加,大部分的工具都可以在里面找到。

3.1. 外部搜索

使用外部搜索工具。本文使用的是serpapiserpapi集成了Google、百度等多家搜索引擎,通过api的形式调用,非常方便。

官网地址:https://serpapi.com/。可以自行注册,有一些免费额度。外部搜索工具定义如下:

# 1. 使用@tool装饰器,定义搜索工具
@tool
def search(query: str) -> str:"""只有在需要了解实时信息 或 不知道的事情的时候 才会使用这个工具,需要传入要搜索的内容。"""serp = SerpAPIWrapper()result = serp.run(query)return result

3.2. 文生图

文生图工具是使用LangChain社区提供的DallEAPIWrapper类,本文使用OpenAI的图片生成模型Dall-E-3,具体代码如下:

# 2. 使用Tool工具类,定义图片生成工具
dalle_image_generator = Tool(name="基于OpenAI Dall-E-3的图片生成器",func=DallEAPIWrapper(model="dall-e-3").run,description="OpenAI DALL-E API 的包装器。当你需要根据 描述的文本 生成图像时 使用此工具,需要传入 对于图像的描述。",
)

这里的DallEAPIWrapper(model="dall-e-3").run方法就是个函数,实际是去调用了OpenAI的接口。

3.3. 代码执行器

代码执行器工具,可以执行代码 或者 根据自然语言生成代码。主要使用LangChain提供的PythonREPLTool 和 LangChain提供的toolkits

比如create_python_agent就简化了创建Python解释器工具的过程。代码如下:

# 3. 使用toolkit,定义执行Python代码工具
python_agent_executor = create_python_agent(llm=model,tool=PythonREPLTool(),verbose=True,agent_executor_kwargs={"handle_parsing_errors": True},
)

3.4. 分析CSV

CSV工具,用来分析csv文件。依旧是使用toolkits工具包里的create_csv_agent函数快出创建工具。代码如下:

# 4. 使用toolkit,定义分析CSV文件工具
csv_agent_executor = create_csv_agent(llm=model,path="course_price.csv",verbose=True,agent_executor_kwargs={"handle_parsing_errors": True},allow_dangerous_code=True,
)

3.5. 完整代码

上面介绍了AI Agent的常用工具,定义好工具之后,在把工具放入到工具集中,最后在定义Agent 和 AgentExecutor就算完成了。短短几十行代码,就可以让LLM使用这么多工具了。

完整代码如下:

import os
from langchain import hub
from langchain_openai import ChatOpenAI
from langchain.agents import create_structured_chat_agent, AgentExecutor, Tool
from langchain.tools import BaseTool, StructuredTool, tool
from langchain_experimental.agents.agent_toolkits import (create_python_agent,create_csv_agent,
)
from langchain_community.utilities import SerpAPIWrapper
from langchain_experimental.tools import PythonREPLTool
from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper# 需要先安装serpapi, pip install serpapi, 还需要到 https://serpapi.com/ 去注册账号# SERPAPI_API_KEY 和 OPENAI 相关密钥,注册到环境变量
os.environ["SERPAPI_API_KEY"] = ("9dd2b2ee429ed996c75c1daf7412df16336axxxxxxxxxxxxxxx"
)
os.environ["OPENAI_API_KEY"] = "sk-a3rrW46OOxLBv9hdfQPBKFZtY7xxxxxxxxxxxxxxxx"
os.environ["OPENAI_API_BASE"] = "https://api.302.ai/v1"model = ChatOpenAI(model_name="gpt-3.5-turbo")# 基于reAct机制的Prompt模板
prompt = hub.pull("hwchase17/structured-chat-agent")# 各种方式定义工具# 1. 使用@tool装饰器,定义搜索工具
@tool
def search(query: str) -> str:"""只有在需要了解实时信息 或 不知道的事情的时候 才会使用这个工具,需要传入要搜索的内容。"""serp = SerpAPIWrapper()result = serp.run(query)return result# 2. 使用Tool工具类,定义图片生成工具
dalle_image_generator = Tool(name="基于OpenAI Dall-E-3的图片生成器",func=DallEAPIWrapper(model="dall-e-3").run,description="OpenAI DALL-E API 的包装器。当你需要根据 描述的文本 生成图像时 使用此工具,需要传入 对于图像的描述。",
)# 3. 使用toolkit,定义执行Python代码工具
python_agent_executor = create_python_agent(llm=model,tool=PythonREPLTool(),verbose=True,agent_executor_kwargs={"handle_parsing_errors": True},
)# 4. 使用toolkit,定义分析CSV文件工具
csv_agent_executor = create_csv_agent(llm=model,path="course_price.csv",verbose=True,agent_executor_kwargs={"handle_parsing_errors": True},allow_dangerous_code=True,
)# 定义工具集合
tool_list = [search,dalle_image_generator,Tool(name="Python代码工具",description="""当你需要借助Python解释器时,使用这个工具。比如当你需要执行python代码时,或者,当你想根据自然语言的描述生成对应的代码时,让它生成Python代码,并返回代码执行的结果。""",func=python_agent_executor.invoke,),Tool(name="CSV分析工具",description="""当你需要回答有关course_price.csv文件的问题时,使用这个工具。它接受完整的问题作为输入,在使用Pandas库计算后,返回答案。""",func=csv_agent_executor.invoke,),
]# 将工具丢给Agent
agent = create_structured_chat_agent(llm=model,tools=tool_list,prompt=prompt
)# 定义AgentExecutor
agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tool_list, verbose=True, # 打印详细的 选择工具的过程 和 reAct的分析过程handle_parsing_errors=True
)# 不会使用工具
agent_executor.invoke({"input": "你是谁?"})# 使用查询工具
# agent_executor.invoke({"input": "南京今天的温度是多少摄氏度?现在外面下雨吗?"})# 使用Python代码工具
# agent_executor.invoke(
#     {
#         "input": """
#         帮我执行```号里的python代码,#         ```python#             def add(a,b):
#                 return a+b#             print("hello world : ", add(100,200))
#         ```
#         """
#     }
# )# 使用图片生成工具
# agent_executor.invoke(
#     {
#         "input": "帮我生成一副图片,图片描述如下:一个非常忙碌的中国高中生在准备中国的高考,夜已经很深了,旁边他的妈妈一边看书一边在陪伴他,窗外是模糊的霓虹灯。"
#     }
# )# 使用CSV分析工具
# agent_executor.invoke({"input": "course_price数据集里,一共有哪几个城市?用中文回答"})

一起看下使用工具后,reAct的整个过程。

以上代码经过完整调试,更换下openai和serpapi的密钥即可直接运行,如果遇到问题可以关注公众号给我留言。

4. 总结

本文主要聊了AI Agent的工具规范,以及常用工具。AI Agent只有借助工具才能发挥威力。

=====>>>>>> 关于我 <<<<<<=====

本篇完结!欢迎点赞 关注 收藏!!!

原文链接:https://mp.weixin.qq.com/s/iSJExaJSCe7fXzous17pXg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/733442.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏

前言 今天大姚给大家分享一款由C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏:SeeSharpSnake。 项目特点 该仓库中的项目文件和脚本可以用多种不同的配置构建相同的游戏,每个配置生成的输出大小也不同。 项目源码运行F5 运行 SeeSharpSnake项目,查看优秀效果: 构建不同大小…

dotnet X11 调用 XRootWindow 是否耗时

本文将通过阅读 lib x11 代码告诉大家,调用 XRootWindow 函数是不耗时的,没有成本的在我阅读 Avalonia 和 CPF 和 UNO 框架的代码的时候,我发现了很多时候都是在需要用到 RootWindow 时,调用 XRootWindow 或 XDefaultRootWindow 获取 RootWindow 的值。此时我想着是否将 Ro…

C++

C++中的isalnum可以判断一个字符是否为字母或者十进制数; 需包含头文件cctype 函数原型:int isalnum(int_C); 通过实验可知,int_C可以为字符、数字; 并且返回值为int类型,判断为true则返回1,判断为false则返回0; 接下来介绍sizeof(string) string s; sizeof(s) …

记vscode无法启动解决办法

背景之前都好好的,突然就不行了,点击快捷方式或直接程序右击管理员运行均没有任何反应。处理方式(确认使用此解决办法可以看下方红字部分,是否也有类似提示):创建null服务。(启发站点:shellvon的回复):https://github.com/microsoft/vscode/issues/185298 步骤 1、要…

OOP第7-8次作业总结

前言: 时光飞快, 转眼就到了学期末尾。从第七次作业开始,作业便开始加难度了。第七次作业加了互斥开关和窗帘,但是这次的电子元件不能像之前简单的写如同写商品类这样简单的写出,需要思考如何设计这个电器类。并且,在加上上面两个类的基础上,电路开放了串联电路中有串联…

[C++ Primer] 泛型算法

记录了C++标准库提供的泛型算法相关重难点。泛型算法 初识泛型大多数算法定义在头文件algorithm中。标准库还在头文件numeric中定义了一组数值范型算法。那些只接受一个单一迭代器来表示第二个序列的算法,都假定第二个序列至少与第一个序列一样长。 // v2中的元素数目应该至少…

prometheus指标终端绘图工具

最近搞了一个prometheus 指标终端展示工具,有兴趣的可以试试:本文来自博客园,作者:charlieroro,转载请注明原文链接:https://www.cnblogs.com/charlieroro/p/18274557

CC4+CC5分析利用

CC4+CC5分析利用 CC4分析与利用 学了前面的cc2,其实cc4就是将cc2使用的InvokerTransformer替换成InstantiateTransformer来加载字节码(CC3里面有说)。 把最后调用的transform方法改为:Transformer[] transformers = new Transformer[]{new ConstantTransformer(TrAXFilter.…

DApp设计与开发 课程笔记(三):erc20 | erc721

笔记对应课程内容为成都信息工程大学区块链产业学院老师梁培利的DApp 设计与开发 07-09 课 笔记中提到的名词不做过多解释 不懂就搜!ERC-20区块链专业的学生需要熟知erc20的接口,不看代码的前提下能够独立完成,至少你要知道有哪些属性和函数接口。balanceof, address, balan…

大白话讲解会计科目

大白话讲解会计科目

15款主流项目进度软件对比

15好用的款主流项目进度管理软件:PingCode、Worktile、Trello、Tower、Asana、Smartsheet、Teambition、ClickUp、Wrike、Monday.com、Notion、禅道、飞书、云效、蓝凌。严格的进度管理有助于更好地控制项目进展,提升团队效率,最终实现项目成功。一个好的项目进度管理工具可…

《护士长的工作!》——开发日志

正文 2024/6/28 23:00 终于整完啦!开导开导!定个时间发布,睡觉咯... 2024/6/28 接下来是调音时间!大概就是加个bgm,然后把声优大大们的声音跟人物动画手动对齐,必要时还得去网上搜一搜音效给加上...然后音量大小调整到-6到-12dB区间balabala... 有时候会遇到音频和自己做…