在当今大语言模型(LLM)的浪潮中,不管是由 OpenAI 领衔的一系列商业闭源模型,还是百花齐放的社区开源模型,在不断刷新技术边界的同时,也激发了大家越来越多的期待—— LLM 还能带来怎样的可能性?OpenAI 提供了插件系统,社区也涌现了一系列大模型智能体(LLM-based Agent)项目,让 LLM 学会借助外部工具,扩展自己的能力边界,向 AGI 更进一步。
因此,我们也希望为这一份浪潮添砖加瓦,推出了 AgentLego 工具库。AgentLego 通过提供一个易于扩展、易于使用、易于部署的工具集合,让大家能够轻松地在各种 Agent 系统中发挥想象力,赋予大模型更强大的能力。
https://github.com/InternLM/agentlego
(文末点击阅读原文可直达,欢迎体验)
(AgentLego 功能演示视频)
AgentLego 工具库具有以下特点:
让我们从以上几个方面,详细了解一下 AgentLego 的特色吧~
丰富的工具集合
目前,AgentLego 提供了三十多种工具,涉及到文本、图像、音频三种模态,后续还会支持视频等模态。这些工具涉及图像理解、音频文字转换、图像生成等功能,让你的 LLM 能力大大增强。
我们汇总了来自 OpenMMLab、HuggingFace 等一系列算法库的各种工具,并提供了一套简单易用的统一接口。通过这一接口,你不仅可以以开箱即用的方式使用这些工具。
>>> from agentlego import load_tool
>>> tool = load_tool('ImageCaption')
>>> tool('examples/demo.png')
'a puppy and a cat sitting on a blanket'
还可以轻松地教会 LLM 使用这些工具。
>>> # 从 AgentLego 构建工具
>>> from agentlego import load_tool
>>> tool = load_tool('ImageCaption').to_langchain()
>>>
>>> # 构建一个使用 AgentLego 工具的 LangChain Agent
>>> from langchain.chat_models import ChatOpenAI
>>> from langchain.chains.conversation.memory import ConversationBufferMemory
>>> from langchain.agents import AgentType, initialize_agent
>>> agent = initialize_agent(
... agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
... llm=ChatOpenAI(temperature=0., model='gpt-4'),
... tools=[tool],
... memory=ConversationBufferMemory(memory_key='chat_history'),
... )
也许读者会有疑问,AgentLego 和社区中各种 Agent 系统的区别是什么呢?我们注意到,大部分 Agent 系统都会需要实现一系列工具,但这些工具本身和 Agent 系统的耦合程度并不高。因此我们希望实现一个独立的工具集库,在这个库中,我们致力于实现种类更多的工具、改进工具的描述,同时使这些工具能够尽可能适配更多的 Agent 系统。这也就引出了 AgentLego 的第二个特色,支持多种 Agent 系统。
支持多种 Agent 系统
目前,AgentLego 支持了主流的 Agent 系统,包括 Langchain 和 Huggingface Transformers Agent,以及 lagent,后续还将支持更多的 agent 系统。我们希望 AgentLego 中的工具可以尽可能简单、直接地应用于不同的 Agent 系统。
from agentlego import load_tool
tool = load_tool('ImageCaption')
# 在 LangChain 中
from langchain import initialize_agent
agent = initialize_agent(
agent="structured-chat-zero-shot-react-description",
tools=[tool.to_langchain()],
...
)
# 在 Transformers Agent 中
from transformers import HfAgent
agent = HfAgent(
'https://api-inference.huggingface.co/models/bigcode/starcoder',
additional_tools=[tool.to_transformers_agent()],
)
# 在 Lagent 中
from lagent import ReAct, ActionExecutor
agent = ReAct(
action_executor=ActionExecutor(actions=[tool.to_lagent()]),
...
)
我们通过统一的接口,使 AgentLego 中的所有工具,可以一步适配各种支持的智能体系统。如果你想要实现自定义工具,又想尝试各种智能体系统,就可以利用 AgentLego,一次实现,处处可用。
多模态工具调用接口
AgentLego 的另一大特色,是通过统一的多模态输入输出接口,在不同的 Agent 系统中自动进行数据格式转换。如 ImageModification 工具,输入一张图像和一段指令,输出是一张图像。
对于基于文本交互的 Agent 系统,如 LangChain,语言模型本身无法处理图像输入输出;而一些 Agent 系统,如基于 Python 环境的 Transformers Agent 可以直接处理 Pillow 图像输入输出。
为了对各种 Agent 系统提供尽可能贴近原生的支持,AgentLego 会在对接时进行自动转换。在生成提示词(prompt)时,AgentLego 会根据 Agent 系统对模态的支持情况,在描述中指定不同的入参形式,如集成在 LangChain 时,工具的提示词会要求输入图像路径;而在 Transformers Agent 中,工具的提示词会要求直接输入图像。在接收参数时,多模态接口会自动根据输入参数的模态和参数类型进行解析,如图像参数的输入是一个字符串,接口会解析为图像路径,而不是一个文本参数。
由于 AgentLego 自动完成了这一转换,在用户们添加自定义工具时,只需要根据模态指定参数即可,而不必关心参数应该输入路径还是原始数据。同样的,根据多模态接口约定对工具输出进行包装后,AgentLego 会将工具输出自动转换为 Agent 系统可接受的数据类型。
一键式远程部署
AgentLego 中提供了许多基于深度神经网络的工具。这些工具功能强大,但同时对软硬件环境有较高要求,并且每次加载模型也需要较长时间。为了在开发或使用 Agent 系统时,省去配置工具环境和反复加载工具的麻烦,AgentLego 提供了一键式、透明化工具远程部署、远程调用的机制,让 Agent 系统可以 “轻装上阵”。
你可以在(若干个)服务器上配置好工具所需要的环境,然后用一行命令启动工具服务器,并指定在该工具服务器上运行的工具列表:
python server.py ImageCaption TextToImage VQA OCR
之后,在 Agent 系统需要运行的平台,只需要配置最基本的环境,配合 RemoteTool,即可通过网络通讯的方式,调用远程机器上部署的工具。
from agentlego.tools.remote import RemoteTool
tools = RemoteTool.from_server('Tool server address')
之后,你可以像使用本地工具一样,直接使用,或是在 Agent 系统中使用这些远程工具,甚至一个工具服务器供给多个 Agent 系统使用。
以上是关于 AgentLego 的全部介绍,感兴趣的小伙伴欢迎来试用。
https://github.com/InternLM/agentlego