【InternLM 实战营第二期笔记+作业06】Lagent & AgentLego 智能体应用搭建

第六次课程官方操作文档:Tutorial/agent at camp2 · InternLM/Tutorial · GitHub

第六次课程官方录播课程:Lagent & AgentLego 智能体应用搭建_哔哩哔哩_bilibili

一、为什么要有智能体——大语言模型的局限性

幻觉、时效性、可靠性

什么是智能体

智能体组成

经典的智能体范式 AutoGPT ReWoo ReAct

AutoGPT

ReWoo

ReAct

Lagent

一个轻量级开源智能体框架,支持多种智能体范式(如autogpt、rewoo、react)、支持多种工具(如谷歌搜索、python解释器等)

  • 大语言模型模块接受人类反馈、人类指令、外部观察等
  • 在做出规划和行动后交给 Action Executor 动作执行器
  • Action Executor 动作执行器包括各种动作
    • PythonExecutorPython 解释器
    • Search , 搜索

AgentLego

  • 一个多模态工具包,旨在像乐高积木,可以快速简便地扩展自定义工具,从而组装出自己的智能体。集合hugging face、open mm lab、stable diffusion的目标检测、图像分割、文字识别等多种工具,接入多个智能体框架(如Lagent、LangChain、Transformer Agents)
  • 提供大量视觉、多模态领域前沿算法

lagent和agentlego之间的关系

  • 用户输入到大语言模型时,大语言模型会根据自身判断是否需要调用工具,不需要就直接输出,需要调用工具则进入Lagent框架中

二、实践

1.环境配置

开发机conda12.2 A30

建目录、配环境

安装lagent和agentlego

cd /root/agent
conda activate agent
git clone https://gitee.com/internlm/lagent.git
cd lagent && git checkout 581d9fb && pip install -e . && cd ..
git clone https://gitee.com/internlm/agentlego.git
cd agentlego && git checkout 7769e0d && pip install -e . && cd ..

安装lmdeploy

conda activate agent
pip install lmdeploy==0.3.0

准备需要用到的tutorial脚本

cd /root/agent
git clone -b camp2 https://gitee.com/internlm/Tutorial.git

2.体验lagent智能体

这部分的教学文档:

Tutorial/agent/lagent.md at camp2 · InternLM/Tutorial · GitHub

2.1用lmdeploy启动api server(lmdeploy server的详细讲解在第五节课)

conda activate agent
lmdeploy serve api_server /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-7b \
                            --server-name 127.0.0.1 \
                            --model-name internlm2-chat-7b \
                            --cache-max-entry-count 0.1

2.2启动并使用lagent web demo(基础作业)

新建一个 terminal 以启动 Lagent Web Demo

conda activate agent
cd /root/agent/lagent/examples
streamlit run internlm2_agent_web_demo.py --server.address 127.0.0.1 --server.port 7860

本地进行端口映射,将 LMDeploy api_server 的23333端口以及 Lagent Web Demo 的7860端口映射到本地。可以执行:

ssh -CNg -L 7860:127.0.0.1:7860 -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p 你的 ssh 端口号

打开URL 设置模型信息如下

输入“请帮我搜索 InternLM2 Technical Report” 以让模型搜索书生·浦语2的技术报告

aha,不能搜索到呢

2.3用lagent定义工具(进阶作业)

lagent关于工具部分的介绍文档在

动作 — Lagent

使用lagent自定义工具主要分为以下几步:

  1. 继承 BaseAction 类
  2. 实现简单工具的 run 方法;或者实现工具包内每个子工具的功能
  3. 简单工具的 run 方法可选被 tool_api 装饰;工具包内每个子工具的功能都需要被 tool_api 装饰

实现一个调用和风天气 API 的工具以完成实时天气查询的功能。

2.3.1创建工具文件

 touch /root/agent/lagent/lagent/actions/weather.py

写入内容

import json
import os
import requests
from typing import Optional, Type

from lagent.actions.base_action import BaseAction, tool_api
from lagent.actions.parser import BaseParser, JsonParser
from lagent.schema import ActionReturn, ActionStatusCode

class WeatherQuery(BaseAction):
    """Weather plugin for querying weather information."""
    
    def __init__(self,
                 key: Optional[str] = None,
                 description: Optional[dict] = None,
                 parser: Type[BaseParser] = JsonParser,
                 enable: bool = True) -> None:
        super().__init__(description, parser, enable)
        key = os.environ.get('WEATHER_API_KEY', key)
        if key is None:
            raise ValueError(
                'Please set Weather API key either in the environment '
                'as WEATHER_API_KEY or pass it as `key`')
        self.key = key
        self.location_query_url = 'https://geoapi.qweather.com/v2/city/lookup'
        self.weather_query_url = 'https://devapi.qweather.com/v7/weather/now'

    @tool_api
    def run(self, query: str) -> ActionReturn:
        """一个天气查询API。可以根据城市名查询天气信息。
        
        Args:
            query (:class:`str`): The city name to query.
        """
        tool_return = ActionReturn(type=self.name)
        status_code, response = self._search(query)
        if status_code == -1:
            tool_return.errmsg = response
            tool_return.state = ActionStatusCode.HTTP_ERROR
        elif status_code == 200:
            parsed_res = self._parse_results(response)
            tool_return.result = [dict(type='text', content=str(parsed_res))]
            tool_return.state = ActionStatusCode.SUCCESS
        else:
            tool_return.errmsg = str(status_code)
            tool_return.state = ActionStatusCode.API_ERROR
        return tool_return
    
    def _parse_results(self, results: dict) -> str:
        """Parse the weather results from QWeather API.
        
        Args:
            results (dict): The weather content from QWeather API
                in json format.
        
        Returns:
            str: The parsed weather results.
        """
        now = results['now']
        data = [
            f'数据观测时间: {now["obsTime"]}',
            f'温度: {now["temp"]}°C',
            f'体感温度: {now["feelsLike"]}°C',
            f'天气: {now["text"]}',
            f'风向: {now["windDir"]},角度为 {now["wind360"]}°',
            f'风力等级: {now["windScale"]},风速为 {now["windSpeed"]} km/h',
            f'相对湿度: {now["humidity"]}',
            f'当前小时累计降水量: {now["precip"]} mm',
            f'大气压强: {now["pressure"]} 百帕',
            f'能见度: {now["vis"]} km',
        ]
        return '\n'.join(data)

    def _search(self, query: str):
        # get city_code
        try:
            city_code_response = requests.get(
                self.location_query_url,
                params={'key': self.key, 'location': query}
            )
        except Exception as e:
            return -1, str(e)
        if city_code_response.status_code != 200:
            return city_code_response.status_code, city_code_response.json()
        city_code_response = city_code_response.json()
        if len(city_code_response['location']) == 0:
            return -1, '未查询到城市'
        city_code = city_code_response['location'][0]['id']
        # get weather
        try:
            weather_response = requests.get(
                self.weather_query_url,
                params={'key': self.key, 'location': city_code}
            )
        except Exception as e:
            return -1, str(e)
        return weather_response.status_code, weather_response.json()

2.3.2获取API KEY

首先打开 开发文档 | 和风天气开发服务 后,点击右上角控制台,设置如下,复制private key

在vs code模式下新建terminal,输入

conda activate agent
lmdeploy serve api_server /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-7b \
                            --server-name 127.0.0.1 \
                            --model-name internlm2-chat-7b \
                            --cache-max-entry-count 0.1

再新建一个terminal

export WEATHER_API_KEY=在2.2节获取的API KEY
# 比如 export WEATHER_API_KEY=1234567890abcdef
conda activate agent
cd /root/agent/Tutorial/agent
streamlit run internlm2_weather_web_demo.py --server.address 127.0.0.1 --server.port 7860

再本地端口映射,再打开链接,模型和插件如下

2.4AgentLego组装智能体乐高

2.4.1直接使用Agentlego(基础作业)

这部分的官方教程文档是Tutorial/agent/agentlego.md at camp2 · InternLM/Tutorial · GitHub

进入对应文件夹下载演示图片

cd /root/agent
wget http://download.openmmlab.com/agentlego/road.jpg

 由于 AgentLego 在安装时并不会安装某个特定工具的依赖,因此我们接下来准备安装目标检测工具运行时所需依赖。

AgentLego 所实现的目标检测工具是基于 mmdet (MMDetection) 算法库中的 RTMDet-Large 模型,因此我们首先安装 mim,然后通过 mim 工具来安装 mmdet。

conda activate agent
pip install openmim==0.3.9
mim install mmdet==3.3.0

pip install:

pip 是Python的包管理器,用于安装和管理Python包。

mim install:

mim 是OpenMMLab维护的一个包管理工具,专门用于安装OpenMMLab项目(如MMDetection, MMSegmentation等)的模型和配置文件。使用 mim install 可以方便地下载并安装预训练模型、配置文件、数据集等,而不仅仅是Python包。

新建

 touch /root/agent/direct_use.py

填入代码

import re

import cv2
from agentlego.apis import load_tool

# load tool
tool = load_tool('ObjectDetection', device='cuda')

# apply tool
visualization = tool('/root/agent/road.jpg')
print(visualization)

# visualize
image = cv2.imread('/root/agent/road.jpg')

preds = visualization.split('\n')
pattern = r'(\w+) \((\d+), (\d+), (\d+), (\d+)\), score (\d+)'

for pred in preds:
    name, x1, y1, x2, y2, score = re.match(pattern, pred).groups()
    x1, y1, x2, y2, score = int(x1), int(y1), int(x2), int(y2), int(score)
    cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 1)
    cv2.putText(image, f'{name} {score}', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 1)

cv2.imwrite('/root/agent/road_detection_direct.jpg', image)

运行该文件,此时目标检测工具开始推理

python /root/agent/direct_use.py

得到结果

丢给AI读下

  • 每个对象都由一个四元组 (x_min, y_min, x_max, y_max) 描述,其中 (x_min, y_min) 是边界框左上角的坐标(通常是相对于图片左上角的像素位置),而 (x_max, y_max) 是边界框右下角的坐标。
  • 类别是检测到的对象的类型(如truck, car, person, bicycle, bus等)。
  • 分数(或置信度)是模型对于该对象存在于边界框内的确定性的度量,范围通常在0到100之间(或0到1,然后乘以100来表示为百分比)。分数越高,模型对该对象的检测越有信心。

所以第一条意思是检测到了一个卡车(truck)在位置 (345, 428, 528, 599),模型对其的置信度是83%

2.4.2作为智能体工具使用(进阶作业)

由于 AgentLego 算法库默认使用 InternLM2-Chat-20B 模型,因此我们首先需要修改 /root/agent/agentlego/webui/modules/agents/lagent_agent.py 文件的第 105行位置,将 internlm2-chat-20b 修改为 internlm2-chat-7b,即

1)状况1:lagent_agent.py修改后无法保存
def llm_internlm2_lmdeploy(cfg):
    url = cfg['url'].strip()
    llm = LMDeployClient(
-         model_name='internlm2-chat-20b',
+         model_name='internlm2-chat-7b',
        url=url,
        meta_template=INTERNLM2_META,
        top_p=0.8,
        top_k=100,
        temperature=cfg.get('temperature', 0.7),
        repetition_penalty=1.0,
        stop_words=['<|im_end|>'])
    return llm

第一次改这的时候保存不了,再保存文件也丢了

解决方法:卸载了agent环境、再把agent文件夹手动删掉,重新配一遍agent环境

使用lmdeploy部署

由于 AgentLego 的 WebUI 需要用到 LMDeploy 所启动的 api_server,因此我们首先按照下图指示在 vscode terminal 中执行如下代码使用 LMDeploy 启动一个 api_server。

conda activate agent
lmdeploy serve api_server /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-7b \
                            --server-name 127.0.0.1 \
                            --model-name internlm2-chat-7b \
                            --cache-max-entry-count 0.1

新建terminal启动agentlego webui

conda activate agent
cd /root/agent/agentlego/webui
python one_click.py
2)状况2:运行one_click报错,没有langchain_community

这一步运行one_click文件报错,原因是‘试图导入一个名为 langchain_community.chat_message_histories 的模块,但是这个模块没有被找到’

解决方法:切到 terminal界面,激活agent环境,安装 langchain-community

conda activate agent
pip install -U langchain-community

安装完成后,检查一下包是否已经成功安装

pip show langchain-community

这样再切回 vscode界面,运行one_click就可以了

按教程继续走


智能体之前大概是做智慧城市的

2.4.3用 AgentLego 自定义工具(进阶作业)

基于 AgentLego 构建自己的自定义工具。AgentLego 在这方面提供了较为详尽的文档,文档地址为

自定义工具 — AgentLego 0.2.0 文档

自定义工具主要分为以下几步:

  1. 继承 BaseTool 类
  2. 修改 default_desc 属性(工具功能描述)
  3. 如有需要,重载 setup 方法(重型模块延迟加载)
  4. 重载 apply 方法(工具功能实现)

其中第一二四步是必须的步骤。下面我们将实现一个调用 MagicMaker 的 API 以实现图像生成的工具。

MagicMaker 是汇聚了优秀 AI 算法成果的免费 AI 视觉素材生成与创作平台。主要提供图像生成、图像编辑和视频生成三大核心功能,全面满足用户在各种应用场景下的视觉素材创作需求。体验更多功能可以访问Magic Maker

1.新建工具文件,填入内容

touch /root/agent/agentlego/agentlego/tools/magicmaker_image_generation.py
import json
import requests

import numpy as np

from agentlego.types import Annotated, ImageIO, Info
from agentlego.utils import require
from .base import BaseTool


class MagicMakerImageGeneration(BaseTool):

    default_desc = ('This tool can call the api of magicmaker to '
                    'generate an image according to the given keywords.')

    styles_option = [
        'dongman',  # 动漫
        'guofeng',  # 国风
        'xieshi',   # 写实
        'youhua',   # 油画
        'manghe',   # 盲盒
    ]
    aspect_ratio_options = [
        '16:9', '4:3', '3:2', '1:1',
        '2:3', '3:4', '9:16'
    ]

    @require('opencv-python')
    def __init__(self,
                 style='guofeng',
                 aspect_ratio='4:3'):
        super().__init__()
        if style in self.styles_option:
            self.style = style
        else:
            raise ValueError(f'The style must be one of {self.styles_option}')
        
        if aspect_ratio in self.aspect_ratio_options:
            self.aspect_ratio = aspect_ratio
        else:
            raise ValueError(f'The aspect ratio must be one of {aspect_ratio}')

    def apply(self,
              keywords: Annotated[str,
                                  Info('A series of Chinese keywords separated by comma.')]
        ) -> ImageIO:
        import cv2
        response = requests.post(
            url='https://magicmaker.openxlab.org.cn/gw/edit-anything/api/v1/bff/sd/generate',
            data=json.dumps({
                "official": True,
                "prompt": keywords,
                "style": self.style,
                "poseT": False,
                "aspectRatio": self.aspect_ratio
            }),
            headers={'content-type': 'application/json'}
        )
        image_url = response.json()['data']['imgUrl']
        image_response = requests.get(image_url)
        image = cv2.cvtColor(cv2.imdecode(np.frombuffer(image_response.content, np.uint8), cv2.IMREAD_COLOR),cv2.COLOR_BGR2RGB)
        return ImageIO(image)

2.注册新工具

接下来修改 /root/agent/agentlego/agentlego/tools/__init__.py 文件,将我们的工具注册在工具列表中。如下所示,我们将 MagicMakerImageGeneration 通过 from .magicmaker_image_generation import MagicMakerImageGeneration 导入到了文件中,并且将其加入了 __all__ 列表中。

3.再启动terminal

三、总结

1.lagent是一个智能体框架,agentlego是框架中的工具包,是一个开源的工具API库,提供了灵活的工具接口,允许扩展具有多种类型参数和输出的自定义工具。

2.用agentlego自定义工具分为以下几步:

  1. 继承 BaseTool
  2. 修改工具功能描述(default_desc 属性)
  3. (我改过styles_option 没有啥用)
  4. 重载 apply 方法(工具功能实现)
  5. 把工具improt进__init__,加入__all__列表
  6. 用apiserver调用工具
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值