第六次课程官方操作文档: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
动作执行器包括各种动作PythonExecutor
,Python
解释器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自定义工具主要分为以下几步:
- 继承 BaseAction 类
- 实现简单工具的 run 方法;或者实现工具包内每个子工具的功能
- 简单工具的 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 在这方面提供了较为详尽的文档,文档地址为
自定义工具主要分为以下几步:
- 继承 BaseTool 类
- 修改 default_desc 属性(工具功能描述)
- 如有需要,重载 setup 方法(重型模块延迟加载)
- 重载 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
自定义工具分为以下几步:
- 继承
BaseTool
类 - 修改工具功能描述(
default_desc
属性) - (我改过styles_option 没有啥用)
- 重载 apply 方法(工具功能实现)
- 把工具improt进__init__,加入__all__列表
- 用apiserver调用工具