《书生·浦语大模型实战营》第六节课《Lagent & AgentLego 智能体应用搭建》实践笔记

《书生·浦语大模型实战营》第六节课《Lagent & AgentLego 智能体应用搭建》实践笔记

本次学习

2024年3月开始参加《书生·浦语大模型实战营》

https://openxlab.org.cn/models/InternLM/subject

相关链接

第一节课《书生·浦语大模型全链路开源体系》课程及 InternLM2 技术报告笔记在

https://blog.csdn.net/hu_zhenghui/article/details/137194274

第二节课《轻松玩转书生·浦语大模型趣味 Demo》课程笔记在

https://huzhenghui.blog.csdn.net/article/details/137403590

第二节课《轻松玩转书生·浦语大模型趣味 Demo》实践笔记在

https://huzhenghui.blog.csdn.net/article/details/137404579

第三节课《茴香豆:搭建你的 RAG 智能助理》课程笔记在

https://huzhenghui.blog.csdn.net/article/details/137691859

第三节课《茴香豆:搭建你的 RAG 智能助理》实践笔记在

https://huzhenghui.blog.csdn.net/article/details/137692249

第四节课《XTuner 微调 LLM:1.8B、多模态、Agent》课程笔记在

https://huzhenghui.blog.csdn.net/article/details/137951465

第四节课《XTuner 微调 LLM:1.8B、多模态、Agent》实践笔记在

https://huzhenghui.blog.csdn.net/article/details/136909890

第五节课《LMDeploy 量化部署 LLM 实践》课程笔记在

https://huzhenghui.blog.csdn.net/article/details/135050733

第五节课《LMDeploy 量化部署 LLM 实践》实践笔记在

https://huzhenghui.blog.csdn.net/article/details/136908934

这是《书生·浦语大模型实战营》第六节课《Lagent & AgentLego 智能体应用搭建》实践笔记

基础作业 1 完成 Lagent Web Demo 使用

创建开发机

开发机界面

https://studio.intern-ai.org.cn/console/instance

单击创建开发机按钮。

https://studio.intern-ai.org.cn/console/instance/new

单击选择镜像链接,在镜像列表中选择 Cuda 12.2-conda

在这里插入图片描述

开发机名称中输入Lagent,在资源配置中选择 30% A100*1

在这里插入图片描述

单击立即创建按钮。

配置 conda 环境

创建一个用于存放 Agent 相关文件的目录。

mkdir -p /root/agent

配置 conda 环境,输入如下指令:

studio-conda -t agent -o pytorch-2.1.2

在这里插入图片描述

从源码安装 Lagent

获取 Lagent 源代码

cd /root/agent
conda activate agent
git clone https://gitee.com/internlm/lagent.git
cd lagent && git checkout 581d9fb

在这里插入图片描述

安装 Lagent 依赖包

安装 Lagent 依赖包

cd /root/agent
cd lagent && pip install -e . && cd ..

在这里插入图片描述

安装其他依赖包

conda activate agent
pip install lmdeploy==0.3.0

在这里插入图片描述

准备 Tutorial

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

在这里插入图片描述

使用 LMDeploy 部署

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

等待 LMDeployapi_server 完全启动

在这里插入图片描述

启动 Lagent Web Demo

新建一个 terminal 以启动 Lagent Web Demo 。在新建的 terminal 中执行如下指令:

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

等待 Lagent Web Demo 完全启动

在这里插入图片描述

本地端口映射

查询开发机端口

在这里插入图片描述

记录开发机端口为 44811

拼接本地端口映射命令,将 LMDeploy api_server23333 端口以及 Lagent Web Demo7860 端口映射到本地。

ssh -CNg -L 7860:127.0.0.1:7860 -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p 44811

打开 Lagent Web Demo

在本地的浏览器页面中打开 http://localhost:7860 以使用 Lagent Web Demo 。首先输入模型 IP127.0.0.1:23333 ,在输入完成后按下回车键以确认。并选择插件为 ArxivSearch ,以让模型获得在 arxiv 上搜索论文的能力。

在这里插入图片描述

使用 Lagent Web Demo

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

在这里插入图片描述

可以看到模型正确输出了 InternLM2 技术报告的相关信息,并且把摘要翻译成中文。

基础作业 2 完成 AgentLego 直接使用部分

获取 AgentLego 源代码

cd /root/agent
conda activate agent
git clone https://gitee.com/internlm/agentlego.git
cd agentlego && git checkout 7769e0d

在这里插入图片描述

安装 AgentLego 依赖包

cd /root/agent
cd agentlego && pip install -e . && cd ..

在这里插入图片描述

安装 mim

AgentLego 所实现的目标检测工具是基于 mmdet ( MMDetection ) 算法库中的 RTMDet-Large 模型,首先安装 mim

conda activate agent
pip install openmim==0.3.9

在这里插入图片描述

安装 mmdet

通过 mim 工具来安装 mmdet

conda activate agent
mim install mmdet==3.3.0

在这里插入图片描述

上传文件

在这里插入图片描述

文件保存路径为 /root/agent/IMG_6283.jpg

编写程序

创建程序文件

touch /root/agent/direct_use.py

VSCode 中输入内容。

"""
《书生·浦语大模型实战营》第六节课《Lagent & AgentLego 智能体应用搭建》实践笔记
基础作业 2 完成 `AgentLego` 直接使用部分
"""
import re

import cv2
from agentlego.apis import load_tool

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

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

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

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

for pred in preds:
    print(pred)
    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/IMG_6283_detection_direct.jpg', image)

在这里插入图片描述

运行程序

执行程序进行推理。

python /root/agent/direct_use.py

在这里插入图片描述

可以看到如下输出

tv (624, 1572, 2757, 2899), score 81
person (1514, 1905, 2214, 3238), score 80
chair (2444, 2997, 2736, 3669), score 76
chair (0, 2703, 648, 3633), score 75
cup (291, 3890, 552, 4032), score 72
dining table (0, 3206, 2791, 4030), score 68
chair (2798, 3084, 3022, 3728), score 63
person (990, 1965, 1607, 2824), score 61
chair (0, 3259, 198, 3919), score 56
chair (231, 2966, 623, 3642), score 53
chair (2786, 3409, 3024, 4031), score 52
tv (624, 1572, 2757, 2899), score 81
person (1514, 1905, 2214, 3238), score 80
chair (2444, 2997, 2736, 3669), score 76
chair (0, 2703, 648, 3633), score 75
cup (291, 3890, 552, 4032), score 72
dining table (0, 3206, 2791, 4030), score 68
chair (2798, 3084, 3022, 3728), score 63
person (990, 1965, 1607, 2824), score 61
chair (0, 3259, 198, 3919), score 56
chair (231, 2966, 623, 3642), score 53
chair (2786, 3409, 3024, 4031), score 52

输出图片如下

在这里插入图片描述

进阶作业 1 完成 AgentLego WebUI 使用

修改相关文件

安装代码修改工具

pip install ast-grep-cli

搜索目标代码

ast-grep --pattern 'LMDeployClient(model_name=$A,$$$ARGS)' --lang python /root/agent/agentlego/webui/modules/agents/lagent_agent.py

在这里插入图片描述

修改代码

ast-grep --interactive --pattern 'LMDeployClient(model_name=$V,$$$ARGS)' --rewrite 'LMDeployClient(model_name="internlm2-chat-7b",$$$ARGS)' --lang python /root/agent/agentlego/webui/modules/agents/lagent_agent.py

在这里插入图片描述

查看代码修改

git -C /root/agent/agentlego diff -- webui/modules/agents/lagent_agent.py

在这里插入图片描述

使用 LMDeploy 部署

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

在这里插入图片描述

启动 AgentLego WebUI

新建一个 terminal 以启动 AgentLego WebUI。在新建的 terminal 中执行如下指令

conda activate agent
cd /root/agent/agentlego/webui
python one_click.py

在这里插入图片描述

本地端口映射

查询开发机端口

在这里插入图片描述

记录开发机端口为 44811

拼接本地端口映射命令,将 LMDeploy api_server23333 端口以及 Lagent Web Demo7860 端口映射到本地。

ssh -CNg -L 7860:127.0.0.1:7860 -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p 44811

配置 agent

打开 http://localhost:7860

在这里插入图片描述

点击上方 Agent 进入 Agent 配置页面。
点击 Agent 下方框,选择 New Agent
选择 Agent Classlagent.InternLM2Agent
输入模型 URLhttp://127.0.0.1:23333
输入 Agent nameinternlm2

在这里插入图片描述

点击 save to 以保存配置。

在这里插入图片描述

保存后可以看到 Agent 下拉列表中出现了 internlm2 ,点击 load 以加载配置。

在这里插入图片描述

可以看到已加载消息。

Successfully loaded internlm2.

配置工具

点击上方 Tools 页面进入工具配置页面。
点击 Tools 下方框,选择 New Tool 以加载新工具。
选择 Tool ClassObjectDetection

在这里插入图片描述

点击 save 以保存配置。

加载完成后出现消息

Loaded ObjectDetection.

使用聊天功能

单击上方的 chatSelect tools 选择 All ,其中选中 ObjectDetection ,取消选择其他项。

在这里插入图片描述

上传一张照片,输入问题,等待回复。

在这里插入图片描述

进阶作业 2-1 使用 Lagent 实现自定义工具并完成调用

创建工具文件

新建工具文件

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

输入内容

"""
《书生·浦语大模型实战营》第六节课《Lagent & AgentLego 智能体应用搭建》实践笔记
进阶作业 2-1 使用 `Lagent` 实现自定义工具并完成调用
"""

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()

在这里插入图片描述

获取 API KEY

打开 https://dev.qweather.com

在这里插入图片描述

单击免费注册

在这里插入图片描述

注册完成后进入登录页面 https://id.qweather.com/#/login

在这里插入图片描述

打开开发文档 https://dev.qweather.com/docs/api/

在这里插入图片描述

点击右上角控制台

在这里插入图片描述

单击左侧的项目管理

在这里插入图片描述

单击创建项目,在项目名称中输入 Lagent ,在选择订阅中单击免费订阅,在适用平台中单击Web API,在KEY的名称中输入 Lagent

在这里插入图片描述

单击创建按钮,复审创建信息。

在这里插入图片描述

单击返回项目管理

在这里插入图片描述

单击查看,记录Private KEY

启动 LMDeploy 服务

在一个 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

在这里插入图片描述

启动 demo 服务

在一个新的 terminal 中运行,设置环境变量

export WEATHER_API_KEY=

启动服务

conda activate agent
cd /root/agent/Tutorial/agent
streamlit run internlm2_weather_web_demo.py --server.address 127.0.0.1 --server.port 7860

在这里插入图片描述

映射端口

查询开发机端口

在这里插入图片描述

记录开发机端口为 44811

拼接本地端口映射命令,将 LMDeploy api_server23333 端口以及 Lagent Web Demo7860 端口映射到本地。

ssh -CNg -L 7860:127.0.0.1:7860 -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p 44811

使用

打开 http://127.0.0.1:7860 ,在模型IP中输入 127.0.0.1:23333 ,在插件选择中选择 WeatherQuery,输入问题

北京天气

等待系统查询

在这里插入图片描述
在这里插入图片描述

进阶作业 2-2 使用 AgentLego 实现自定义工具并完成调用

创建工具文件

创建文件

touch /root/agent/agentlego/agentlego/tools/magicmaker_image_generation.py

输入内容

"""
《书生·浦语大模型实战营》第六节课《Lagent & AgentLego 智能体应用搭建》实践笔记
进阶作业 2-2 使用 `AgentLego` 实现自定义工具并完成调用
"""
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.imdecode(np.frombuffer(image_response.content, np.uint8), cv2.IMREAD_COLOR)
        return ImageIO(image)

在这里插入图片描述

注册新工具

搜索目标代码

ast-grep --pattern 'from .vqa import VQA' --lang python /root/agent/agentlego/agentlego/tools/__init__.py

在这里插入图片描述

修改代码

ast-grep --interactive --pattern 'from .vqa import VQA' --rewrite "from .vqa import VQA
from .magicmaker_image_generation import MagicMakerImageGeneration" --lang python /root/agent/agentlego/agentlego/tools/__init__.py

搜索目标代码

ast-grep --pattern '__all__ = [$$$V]' --lang python /root/agent/agentlego/agentlego/tools/__init__.py

修改代码

ast-grep --interactive --pattern '__all__ = [$$$V]' --rewrite "__all__ = [\$\$\$V 'MagicMakerImageGeneration']" --lang python /root/agent/agentlego/agentlego/tools/__init__.py

查看代码修改范围

git -C /root/agent/agentlego diff -- agentlego/tools/__init__.py

在这里插入图片描述

启动 LMDeploy 服务

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

在这里插入图片描述

启动 WebUI

conda activate agent
cd /root/agent/agentlego/webui
python one_click.py

在这里插入图片描述

本地端口映射

查询开发机端口

在这里插入图片描述

记录开发机端口为 44811

拼接本地端口映射命令,将 LMDeploy api_server23333 端口以及 Lagent Web Demo7860 端口映射到本地。

ssh -CNg -L 7860:127.0.0.1:7860 -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p 44811

使用

打开 http://127.0.0.1:7860

单击 Agent 标签页,在 Agent 中选择 internlm2 ,单击 Load 按钮,看到出现加载成功提示。

Successfully loaded internlm2.

在这里插入图片描述

单击 Tool 标签页,在 Tools 中选择 New Tool ,在 Tool class 中选择 MagicMakerImageGeneration

在这里插入图片描述

单击 Save 按钮。

单击 Chat 标签页,在 Select tools 中选择 MagicMakerImageGeneration ,取消选择其他工具。输入提示词,单击 Generate 按钮。

在这里插入图片描述

结果如下所示

在这里插入图片描述

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值