LagentAgentLego智能体工具使用

news2024/11/18 12:30:34

1. lagent

参考文档

https://github.com/InternLM/Tutorial/blob/camp2/agent/lagent.md

  1. 使用 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

在这里插入图片描述

2.启动并使用 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

在这里插入图片描述
3. 使用自带的arxive search插件进行论文搜索:
在这里插入图片描述
4. 自定义工具(天气查询)进行调用
准备和风天气的API
在这里插入图片描述
首先通过 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):
    """天气查询插件,用于查询天气信息。"""
    
    def __init__(self,
                 key: Optional[str] = None,  # 可选参数:API 密钥
                 description: Optional[dict] = None,
                 parser: Type[BaseParser] = JsonParser,
                 enable: bool = True) -> None:
        super().__init__(description, parser, enable)
        # 从环境变量或传入的参数中获取天气 API 密钥
        key = os.environ.get('WEATHER_API_KEY', key)
        if key is None:
            raise ValueError(
                '请设置天气 API 密钥,可以通过环境变量 WEATHER_API_KEY 设置,或者在实例化时传入 key 参数'
            )
        self.key = key
        # 设置用于查询城市信息和天气信息的 URL
        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:
        """执行天气查询的方法。

        Args:
            query (str): 要查询的城市名称。
        """
        tool_return = ActionReturn(type=self.name)
        # 调用 _search 方法查询天气信息
        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:
        """解析从 QWeather API 返回的天气信息。

        Args:
            results (dict): QWeather API 返回的天气信息,JSON 格式。

        Returns:
            str: 解析后的天气信息。
        """
        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):
        """查询城市代码和天气信息。

        Args:
            query (str): 要查询的城市名称。

        Returns:
            tuple: 包含状态码和响应结果的元组。
        """
        # 查询城市代码
        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']
        # 查询天气信息
        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. AgentLego:组装智能体“乐高”

参考文档

https://github.com/InternLM/Tutorial/blob/camp2/agent/agentlego.md#1-%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8-agentlego

直接使用 AgentLego

安装相关依赖后,上传一张街景图片,使用目标检测工具。
通过 touch /root/agent/direct_use.py(大小写敏感)的方式在 /root/agent 目录下新建 direct_use.py 以直接使用目标检测工具,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)

运行结果如下:
在这里插入图片描述
可以发现其识别出了car/person/truck/bicycle/bus等物体
在这里插入图片描述
更换一张图片进行测试:
请添加图片描述
会发现他没有识别出物体
“No object found”
在这里插入图片描述
再次更换一张街景图片进行识别
在这里插入图片描述
这是香港街头的一张图片,虽然比较复杂,但可以看出还是可以识别出大部分物体的。但图片左侧有一些人没有识别出来。

作为智能体工具使用

这样的使用方式可以在Web页面中,新增agent和工具吗,然后指定agent调用工具

在这里插入图片描述

在这里插入图片描述

3. 使用自定义工具

首先通过 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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1664912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebSocket前后端建立以及使用

1、什么是WebSocket WebSocket 是一种在 Web 应用程序中实现双向通信的协议。它提供了一种持久化的连接,允许服务器主动向客户端推送数据,同时也允许客户端向服务器发送数据,实现了实时的双向通信。 这部分直接说你可能听不懂;我…

线路和绕组中的波过程(三)

本篇为本科课程《高电压工程基础》的笔记。 本篇为这一单元的第三篇笔记。上一篇传送门。 冲击电晕对线路上波过程的影响 实际中的导线存在电阻,而且还有对地电导,会消耗一部分能量。但是因为雷击所涉及的传输距离很短,所以几乎可以忽略这…

acer笔记本怎样进行系统还原?教你两招!

acer笔记本怎样进行系统还原?教你两招! 作为笔记本用户,你在日常使用中可能会遇到各种各样的电脑问题。一般来说,对于一些小问题,我们可以通过一些简单的操作来解决,比如重新启动电脑或者长按电源键强制关机…

【吴恩达机器学习-week2】多个变量的线性回归问题

文章目录 1.1 目标2 问题陈述2.1 包含我们示例的矩阵 X2.2 参数向量 w \mathbf{w} w 和 b b b 3 使用多个变量进行模型预测3.1 逐元素单独预测3.2 单一预测,向量 4 使用多个变量计算成本5 使用多个变量的梯度下降5.1 使用多个变量计算梯度 多个变量的梯度下降小结…

卷积特征图与感受野

特征图尺寸和感受野是卷积神经网络中非常重要的两个概念,今天来看一下,如何计算特征尺寸和感受野。 特征图尺寸 卷积特征图,是图片经过卷积核处理之后的尺寸。计算输出特征的尺寸,需要给出卷积核的相关参数包括: 输…

虚表,虚函数习题

6. 关于虚表说法正确的是(d ) A:一个类只能有一张虚表 多重继承 B:基类中有虚函数,如果子类中没有重写基类的虚函数,此时子类与基类共用同一张虚表 即使子类重写了基类的虚函数,此时子类与…

模拟集成电路(3)----单级放大器(共源极)

模拟集成电路(3)----单级放大器(共源极) 放大是模拟电路的基本功能 大多数自然模拟信号太小而无法处理需要足够的信噪比 理想的放大器 线性:无限的幅度和频率范围 输入阻抗无限大 输出阻抗无限小 共源放大器 共源放大器就是将源极接A…

视频监控系统中,中心录像服务器的录像文件实际大小和理论值相差很大的问题解决

目录 一、现象描述 二、视频监控的录像文件计算 (一)计算方法 1、仅视频部分 2、视频和音频部分 3、使用平均码率 (二)计算工具 1、关注威迪斯特公众号 2、打开“计算容量”的小工具 三、原因分析 (一&…

企业网络需求及适合的解决方案

近年来,企业网络通信需求可谓五花八门,变幻莫测。它不仅为企业的生产、办公、研发、销售提供全面赋能,同时也让企业业务规模变大成为了可能。 在当前的技术格局下,中大型企业常见的技术方案有很多,而同时也有各自不可替…

超级好看的html网站维护源码

源码介绍 好看的html网站维护源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面, 源码截图 源码下载 好看的html网站维护源码

【力扣】LCR 166.珠宝的最高价值

原题链接:. - 力扣(LeetCode) 目录 1.题目描述 2.思路分析 3.代码实现 1.题目描述 现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为: 只能从架子的左上角开始拿珠宝…

《Python编程从入门到实践》day25

# 昨日知识点回顾 如何创建多行外星人 碰撞结束游戏 创建game_stats.py跟踪统计信息 # 今日知识点学习 第14章 记分 14.1 添加Play按钮 14.1.1 创建Button类 import pygame.font# button.py class Button:def __init__(self, ai_game, msg):"""初始化按钮…

按键配合LDO实现开关功能

今天给大家分享一个学到的按键开关电路,适合没有足够空间给自锁开关的场景,既可以用于USB供电控制也可以用于电池供电控制。话不多说上电路图先。 核心任务就是通过按键控制LDO芯片的使能管脚的电平状态,这枚NCP芯片高电平使能,VB…

基于Nios软件实现流水灯+串口输出

基于NIOS-II软核实现流水灯串口输出 引言: ​ 在现代电子设计领域,FPGA(现场可编程门阵列)因其灵活性和并行处理能力而成为实现复杂数字系统的首选平台。Nios II,作为Altera(现为Intel旗下)提供…

2016-2021年全国范围的2.5m分辨率的建筑屋顶数据

一、论文介绍 摘要:大规模且多年的建筑屋顶面积(BRA)地图对于解决政策决策和可持续发展至关重要。此外,作为人类活动的细粒度指标,BRA可以为城市规划和能源模型提供帮助,为人类福祉带来好处。然而&#xf…

WordPress原创插件:超链接点击访问统计

WordPress原创插件:超链接点击访问统计 https://download.csdn.net/download/huayula/89296775

ICode国际青少年编程竞赛- Python-4级训练场-while语句综合

ICode国际青少年编程竞赛- Python-4级训练场-while语句综合 1、 for i in range(4):while not Flyer[i].disappear():wait()Spaceship.step(6)Spaceship.turnLeft()2、 Dev.turnLeft() for i in range(4):Spaceship.step(2)while Flyer[i].disappear():wait()Dev.step(4)Dev.…

Go实现树莓派读取at24c02 eeprom读写数据

步骤 启用i2c 参考 Go实现树莓派读取bh1750光照强度 代码 package mainimport ("fmt""periph.io/x/conn/v3/i2c" )type AT24C02Device struct {dev *i2c.Dev }func NewAT24C02Device(addr uint16, bus i2c.BusCloser) (*AT24C02Device, error) {var (d…

【HDFS】关于HDFS-17497:在commit block时更新quota

链接:https://github.com/apache/hadoop/pull/6765 Ticket标题:The number of bytes of the last committed block should be calculated into the file length。 HDFS里,一个在写入的文件可能包含多个commited状态的块。 但是计算文件大小的时候,最后一个commited block并…

Yii2 自动生成php代码

文档地址:入门(Getting Started): 用 Gii 生成代码(Generating Code with Gii) - Yii 2.0 权威指南 - 文档 - Yii Framework 中文网 找到配置文件,以我的项目为例: 因为的是开启了路由美化所以访…