前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lagent 开源的 LLM 智能体框架 (持续更新)

Lagent 开源的 LLM 智能体框架 (持续更新)

原创
作者头像
用户10497140
修改2024-10-03 19:32:23
1270
修改2024-10-03 19:32:23

Lagent 是什么

Lagent 是一个开源的 LLM 智能体框架,允许使用者快速将一个大语言模型转换成智能体,并提供一些典型工具来激发大语言模型的潜能。Lagent 目前已经支持了包括 AutoGPT、ReAct 等在内的多个经典智能体范式,也支持了如下工具:

Arxiv 搜索

Bing 地图

Google 学术搜索

Google 搜索

交互式 IPython 解释器

IPython 解释器

PPT

Python 解释器

Lagent 框架图如下

Lagent 包含三个主要模块:agents,llms 和 actions。

  • agents 实现了多种智能体,如 ReAct,AutoGPT。
  • llms 支持多种大语言模型,包括在 HuggingFace 上托管的开源模型(Llama-2, InternLM)及 GPT3.5/4 等闭源模型。
  • actions 包含一系列工具,并提供工具执行器来统一管理。 如何使用

安装方式

pip 安装

pip install lagent

源码安装

如需修改部分功能,可以从源码构建 Lagent

git clone https://github.com/InternLM/lagent.git

cd lagent

pip install -e .

InterLM 驱动的 ReAct 智能体

注意,如果你想使用 HuggingFace 模型,请先运行 pip install -e .[all]

代码语言:python
代码运行次数:0
复制
# 从 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)
代码语言:python
代码运行次数:0
复制
>>> $-\\frac{1}{3}+\\frac{{\\sqrt{3}}}{3}i$

启动 ReAct 网页 App

代码语言:python
代码运行次数:0
复制
# 你需要先安装 streamlit
# pip install streamlit
streamlit run examples/react_web_demo.py

可以通过UI界面进行对话

工具

提供了一套LLM驱动的智能体用来与真实世界交互并执行复杂任务的函数。

两种类型的工具:

  • 简单工具: 只提供一个API接口供调用。
  • 工具包: 实现多个API接口,承担不同的子任务。 工具描述 在Lagent中,工具描述是一个刻画工具调用方式的字典,能够被LLM观察并用于决策。

对于简单工具,描述可按如下格式声明:

代码语言:python
代码运行次数:0
复制
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 通常被动作的解析器自动插入到工具描述中,这部分将在接口设计中进行介绍。

对于工具包,描述非常相似,但嵌套了子方法

代码语言:python
代码运行次数:0
复制
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。

代码语言:python
代码运行次数:0
复制
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
代码语言:python
代码运行次数:0
复制
{'name': 'bold',
 'description': 'make text bold',
 'parameters': [{'name': 'text',
   'type': 'STRING',
   'description': 'input text'}],
 'required': ['text']}

一旦启用 returns_named_value,您应当声明返回值的名称,这将被处理成一个新的字段 return_data:

代码语言:python
代码运行次数:0
复制
@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
代码语言:python
代码运行次数:0
复制
{'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 部分中罗列它们。

代码语言:python
代码运行次数:0
复制
@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}
代码语言:python
代码运行次数:0
复制
{'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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Lagent 是什么
    • 安装方式
      • InterLM 驱动的 ReAct 智能体
        • 工具
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档