《书生·浦语大模型实战营》第六节课《Lagent & AgentLego 智能体应用搭建》实践笔记
- 《书生·浦语大模型实战营》第六节课《Lagent & AgentLego 智能体应用搭建》实践笔记
本次学习
2024年3月开始参加《书生·浦语大模型实战营》
https://openxlab.org.cn/models/InternLM/subject
相关链接
- https://github.com/InternLM/InternLM
- https://huggingface.co/internlm
- https://modelscope.cn/organization/Shanghai_AI_Laboratory
- https://openxlab.org.cn/models/InternLM
第一节课《书生·浦语大模型全链路开源体系》课程及 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
等待 LMDeploy
的 api_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_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 44811
打开 Lagent
Web Demo
在本地的浏览器页面中打开 http://localhost:7860 以使用 Lagent
Web Demo 。首先输入模型 IP
为 127.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_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 44811
配置 agent
点击上方 Agent
进入 Agent
配置页面。
点击 Agent
下方框,选择 New Agent。
选择 Agent Class 为 lagent.InternLM2Agent
。
输入模型 URL
为 http://127.0.0.1:23333 。
输入 Agent name , internlm2
。
点击 save to 以保存配置。
保存后可以看到 Agent
下拉列表中出现了 internlm2
,点击 load
以加载配置。
可以看到已加载消息。
Successfully loaded internlm2.
配置工具
点击上方 Tools
页面进入工具配置页面。
点击 Tools
下方框,选择 New Tool 以加载新工具。
选择 Tool Class 为 ObjectDetection
。
点击 save
以保存配置。
加载完成后出现消息
Loaded ObjectDetection.
使用聊天功能
单击上方的 chat
在 Select 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://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_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 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_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 44811
使用
单击 Agent
标签页,在 Agent
中选择 internlm2
,单击 Load
按钮,看到出现加载成功提示。
Successfully loaded internlm2.
单击 Tool
标签页,在 Tools
中选择 New Tool
,在 Tool class 中选择 MagicMakerImageGeneration
。
单击 Save
按钮。
单击 Chat
标签页,在 Select tools 中选择 MagicMakerImageGeneration
,取消选择其他工具。输入提示词,单击 Generate
按钮。
结果如下所示