Lagent 是一个开源的 LLM 智能体框架,允许使用者快速将一个大语言模型转换成智能体,并提供一些典型工具来激发大语言模型的潜能。Lagent 目前已经支持了包括 AutoGPT、ReAct 等在内的多个经典智能体范式,也支持了如下工具:
Arxiv 搜索
Bing 地图
Google 学术搜索
Google 搜索
交互式 IPython 解释器
IPython 解释器
PPT
Python 解释器
Lagent 框架图如下:
Lagent 包含三个主要模块:agents,llms 和 actions。
pip 安装
pip install lagent
源码安装
如需修改部分功能,可以从源码构建 Lagent
git clone https://github.com/InternLM/lagent.git
cd lagent
pip install -e .
注意,如果你想使用 HuggingFace 模型,请先运行 pip install -e .[all]
# 从 Lagent 导入必要的模块和类
from lagent.agents import ReAct
from lagent.actions import ActionExecutor, GoogleSearch, PythonInterpreter
from lagent.llms import HFTransformer
from lagent.llms.meta_template import INTERNLM2_META as META
# 初始化 HFTransformer 模型
llm = HFTransformer(path='internlm/internlm2-chat-7b', meta_template=META)
# 初始化 Goolge 搜索工具,你可能需要提供 API 密钥
search_tool = GoogleSearch(api_key='Your SERPER_API_KEY')
# 初始化 Python 代码解释其
python_interpreter = PythonInterpreter()
# 配置 ReAct 智能体,创建聊天机器人
chatbot = ReAct(
llm=llm, # 大语言模型实例
action_executor=ActionExecutor(
actions=[search_tool, python_interpreter]), # 指定智能体可以调用的工具
)
# 询问LaTeX格式的数学问题
response = chatbot.chat('若$z=-1+\sqrt{3}i$,则$\frac{z}{{z\overline{z}-1}}=\left(\ \ \right)$')
# 打印回复
print(response.response)
>>> $-\\frac{1}{3}+\\frac{{\\sqrt{3}}}{3}i$
启动 ReAct 网页 App
# 你需要先安装 streamlit
# pip install streamlit
streamlit run examples/react_web_demo.py
可以通过UI界面进行对话
提供了一套LLM驱动的智能体用来与真实世界交互并执行复杂任务的函数。
两种类型的工具:
对于简单工具,描述可按如下格式声明:
TOOL_DESCRIPTION = {
'name': 'bold', # 工具名称
'description': 'a function used to make text bold', # 介绍工具的功能
'parameters': [ # 这个工具所需要的参数列表
{
'name': 'text', 'type': 'STRING', 'description': 'input content'
}
],
'required': ['text'], # 指定必需的参数名
}
在某些情况下,可能还包含 return_data,parameter_description 字段,分别描述返回内容及参数传递格式。
注意
parameter_description 通常被动作的解析器自动插入到工具描述中,这部分将在接口设计中进行介绍。
对于工具包,描述非常相似,但嵌套了子方法
TOOL_DESCRIPTION = {
'name': 'PhraseEmphasis', # 工具包的名字
'description': 'a toolkit which provides different styles of text emphasis', # 介绍工具包的功能
'api_list': [
{
'name': 'bold',
'description': 'make text bold',
'parameters': [
{
'name': 'text', 'type': 'STRING', 'description': 'input content'
}
],
'required': ['text']
},
{
'name': 'italic',
'description': 'make text italic',
'parameters': [
{
'name': 'text', 'type': 'STRING', 'description': 'input content'
}
],
'required': ['text']
}
]
}
将函数转换为工具
对于已定义好的函数,无需人工添加额外的描述。在 Lagent 中,我们提供了一个修饰器 tool_api,它可以通过自动解析函数的类型提示和文档字符串来生成描述字典,并将其绑定到属性 api_description。
from lagent import tool_api
@tool_api
def bold(text: str) -> str:
"""make text bold
Args:
text (str): input text
Returns:
str: bold text
"""
return '**' + text + '**'
bold.api_description
{'name': 'bold',
'description': 'make text bold',
'parameters': [{'name': 'text',
'type': 'STRING',
'description': 'input text'}],
'required': ['text']}
一旦启用 returns_named_value,您应当声明返回值的名称,这将被处理成一个新的字段 return_data:
@tool_api(returns_named_value=True)
def bold(text: str) -> str:
"""make text bold
Args:
text (str): input text
Returns:
bold_text (str): bold text
"""
return '**' + text + '**'
bold.api_description
{'name': 'bold',
'description': 'make text bold',
'parameters': [{'name': 'text',
'type': 'STRING',
'description': 'input text'}],
'required': ['text'],
'return_data': [{'name': 'bold_text',
'description': 'bold text',
'type': 'STRING'}]}
有时工具可能返回一个 dict 或 tuple,如果你想在 return_data 中详细说明每个成员的含义而不是把它们当作一个整体,设置 explode_return=True 并在文档字符串的 Returns 部分中罗列它们。
@tool_api(explode_return=True)
def list_args(a: str, b: int, c: float = 0.0) -> dict:
"""Return arguments in dict format
Args:
a (str): a
b (int): b
c (float): c
Returns:
dict: input arguments
- a (str): a
- b (int): b
- c: c
"""
return {'a': a, 'b': b, 'c': c}
{'name': 'list_args',
'description': 'Return arguments in dict format',
'parameters': [{'name': 'a', 'type': 'STRING', 'description': 'a'},
{'name': 'b', 'type': 'NUMBER', 'description': 'b'},
{'name': 'c', 'type': 'FLOAT', 'description': 'c'}],
'required': ['a', 'b'],
'return_data': [{'name': 'a', 'description': 'a', 'type': 'STRING'},
{'name': 'b', 'description': 'b', 'type': 'NUMBER'},
{'name': 'c', 'description': 'c'}]}
警告
目前仅支持 Google 格式的 Python 文档字符串。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。