基于ModelScope-Agent搭建智能体|1.本地demo:快递查询助手

基于ModelScope-Agent搭建智能体|1.本地demo:快递查询助手

背景及介绍

最近在尝试使用Agent改进施策仿真项目,在搜集资料的过程中了解到了ModelScope-Agent框架。为了搞清Agent的结构和构建流程,我试图用该框架跑一些demo。本文记录第一个案例快递查询小助手。该案例旨在于本地环境验证自定义工具的实现方法。

Modelscope-Agent是阿里达摩院开发的一个可定制的、可扩展的Agent代码框架。单Agent具有角色扮演、LLM调用、工具使用、规划、记忆等能力。 主要具有以下特点:

  • 简单的Agent实现流程:仅需指定角色描述、LLM名称、工具名列表,即可实现一个Agent应用,框架内部自动实现工具使用、规划、记忆等工作流的编排。
  • 丰富的模型和工具:框架内置丰富的LLM接口,例如Dashscope和Modelscope模型接口,> OpenAI模型接口等。内置丰富的工具,例如代码运行天气查询文生图网页解析等,方便定制专属Agent。
  • 统一的接口和高扩展性:框架具有清晰的工具、LLM注册机制,方便用户扩展能力更加丰富的Agent应用。
  • 低耦合性:开发者可以方便的直接使用内置的工具、LLM、记忆等组件,而不需要绑定更上层的Agent

快递查询小助手旨在帮助用户查询快递状态。该Agent接入了一个PostQuery的自定义工具。该工具接受快递公司代码type和快递单号postid两个参数,并通过访问接口http://www.kuaidi100.com/query查询快递状态。以下是访问该接口的一个例子,即查询圆通公司快递单号为11111111111的快递(经过我的尝试该接口多次相同请求返回的值可能不同,似乎返回的并非真实数据,不过这并不影响使用该接口构建Agent进行演示):

访问示例

http://www.kuaidi100.com/query?type=yuantong&postid=11111111111

返回值

{"message":"ok","nu":"11111111111","ischeck":"1","condition":"F00","com":"yuantong","status":"200","state":"304","data":[{"time":"2024-07-26 19:06:35","ftime":"2024-07-26 19:06:35","context":"【驿站】包裹已签收!如有问题请联系:妈妈驿站18521118681,您的快递已经妥投,投诉电话:02759768722。起早贪黑不停忙,如有不妥您见谅,好评激励我向上,求个五星暖心房。","location":"T驿站"},{"time":"2024-07-26 12:17:00","ftime":"2024-07-26 12:17:00","context":"快件已到达[妈妈驿站]天龙路金地中心城西区东二门旁妈妈驿站,请您及时取件,如有疑问请联系站点:18521118681,如您未收到此快递,请拨打投诉电话:02759768722!","location":"妈妈驿站"},{"time":"2024-07-26 07:01:39","ftime":"2024-07-26 07:01:39","context":"【武汉市】湖北武汉洪山区民大公司 的快递员(金地中心城/18627851585)正在为您派送(可放心接听95089申通专属派送号码),投诉电话:02759768722","location":"T武汉市"},{"time":"2024-07-26 06:56:25","ftime":"2024-07-26 06:56:25","context":"【武汉市】快件已到达 湖北武汉洪山区民大公司 咨询电话:02759768722","location":"T武汉市"},{"time":"2024-07-25 20:28:47","ftime":"2024-07-25 20:28:47","context":"【鄂州市】快件已发往 湖北武汉洪山区民大公司","location":"T鄂州市"},{"time":"2024-07-25 20:25:13","ftime":"2024-07-25 20:25:13","context":"【鄂州市】快件已到达 湖北武昌转运中心 ","location":"T鄂州市"},{"time":"2024-07-24 21:23:09","ftime":"2024-07-24 21:23:09","context":"【济南市】快件已发往 湖北武昌转运中心","location":"T济南市"},{"time":"2024-07-24 21:18:26","ftime":"2024-07-24 21:18:26","context":"【济南市】快件已到达 山东济南转运中心 ","location":"T济南市"},{"time":"2024-07-24 20:56:49","ftime":"2024-07-24 20:56:49","context":"【淄博市】快件已发往 山东济南转运中心","location":"T淄博市"},{"time":"2024-07-24 08:08:20","ftime":"2024-07-24 08:08:20","context":"【淄博市】山东淄博周村区正阳路公司(05338795099)的客服2号线(18906437015) 已揽收","location":"T淄博市"}]}

Agent本地构建步骤

首先将项目仓库拉取至本地,并安装相关依赖(记得先创建并切换虚拟环境)。

git clone https://github.com/modelscope/modelscope-agent.git
cd modelscope-agent && pip install -r requirements.txt

examples文件夹下有一些示例,其中tools文件夹下包含Agent调用工具的例子。由于我想先弄清楚Agent调用用户自定义工具的方法,因此先仿照该文件夹内的相关示例写了一个快递查询小助手的Agent。该Agent只调用一个自定义的PostQuery工具进行快递查询。

examples/tools文件夹内新建post_query_tool.ipynb文件

1. 本地配置

这一步作用是将/modelscope-agent目录加入path变量,以使后续导包不至于报错。

import os
os.chdir('/Users/ningjing/Code/Agent/modelscope-agent/examples/tools')

import sys
sys.path.append('../../')

2. 测试接口

使用requests库以GET方式向接口请求数据,测试一下接口是否能跑通。

import requests
import json
api_url = 'http://www.kuaidi100.com/query'
params = {"type":"yuantong", "postid":'11111111111'}
data = json.dumps(params)
response = requests.get(api_url, params=params)

print(json.loads(response.content.decode('utf-8')))

返回结果如下:

{'message': 'ok', 'nu': '11111111111', 'ischeck': '0', 'condition': '00', 'com': 'yuantong', 'status': '200', 'state': '0', 'data': [{'time': '2024-09-04 13:57:02', 'ftime': '2024-09-04 13:57:02', 'context': '您的快件离开【浙江省金华市义乌市江湾镇】', 'location': '金华市,义乌市'}, {'time': '2024-09-02 14:53:58', 'ftime': '2024-09-02 14:53:58', 'context': '您的快件在【浙江省金华市义乌市江湾镇保税仓分部】已揽收,揽收人: 王艺(15924243933)', 'location': '金华市,义乌市'}]}

3. API管理

LLM是Agent大脑,是Agent的核心。本案例使用qwen-max模型,以调用api的形式进行Agent构建。为了访问api,需要首先在环境变量中配置DASHSCOPE_API_KEY

import os

print('请输入DASHSCOPE_API_KEY')
os.environ['DASHSCOPE_API_KEY'] = input()

4. 本地部署的工具注册

为了让Agent可以使用PostQuery工具,需要首先实现一个继承自BaseTool类的工具类,在该类中定义调用工具时需要传入的参数及相关逻辑。该类需要使用@register_tool装饰器进行工具注册。只有注册后的工具类才能被Agent感知并调用。

from typing import Dict, Optional
from modelscope_agent.tools.base import BaseTool
from modelscope_agent.tools import register_tool
import requests
import json

@register_tool('post_query')
class PostQuery(BaseTool):
    description = '查询快递'
    name = 'post_query'
    parameters: list = [{
        'name': 'type',
        'description': '快递公司代号',
        'required': True,
        'type': 'string'
    },
    {
        'name': 'postid',
        'description': '快递单号',
        'required': True,
        'type': 'string'
    }]
    
    def call(self, params: str, **kwargs):
        api_url = 'http://www.kuaidi100.com/query'
        params = self._verify_args(params)
        data = json.dumps(params)
        response = requests.get(api_url, params=params)
        res = str(json.loads(response.content.decode('utf-8')))
        return res

5. 构建Agent

配置Agent使用的LLM和工具并示例化一个Agent。RolePlay是框架中预定义的一个Agent模板,内置了用于角色扮演任务的prompt,可用于构建角色扮演的Agent。

from modelscope_agent.agents import RolePlay

role_template = '你是快递小助手,你需要根据用户输入的快递公司代号和快递单号来查询快递状态'
llm_config = {
    'model': 'qwen-max', 
    'model_server': 'dashscope',
    }
function_list = ['post_query']

bot = RolePlay(function_list=function_list,llm=llm_config, instruction=role_template)

6. 执行Agent

测试一下构建好的Agent是否能正确调用PostQuery工具进行快递查询并返回结果。

response = bot.run("帮我查询韵达快递,快递公司代号yuantong,快递单号11111111111", remote=False, print_info=True)
text = ''
for chunk in response:
    text += chunk
print(text)

结果如下,可以看到Agent在接受用户输入后,决定调用post_query工具,并成功从用户输入中提取了工具所需的参数。在进行工具调用后,Agent获得了快递的相关信息,并在整理后输出给了用户。

Action: post_query
Action Input: {"type": "yuantong", "postid": "11111111111"}

Observation: <result>{'message': 'ok', 'nu': '11111111111', 'ischeck': '0', 'condition': 'B00', 'com': 'yuantong', 'status': '200', 'state': '1', 'data': [{'time': '2024-09-09 08:59:59', 'ftime': '2024-09-09 08:59:59', 'context': '【广州市】广东广州花都区花东公司(02022326117)的揽件1(020-22326117) 已揽收', 'location': ''}]}</result>
Answer:您的韵达快递(单号:11111111111)最新状态如下:

- 时间:2024年09月09日 08:59:59
- 描述:【广州市】广东广州花都区花东公司(02022326117)的揽件1(020-22326117) 已揽收

目前快递已被揽收,但暂无进一步的地理位置信息。您可以通过快递公司提供的联系方式进行更详细的查询。

总结

通过在本地实现该快递查询助手Agent,在宏观层面对基于ModelScope-Agent框架搭建Agent有了初步认识,也初步验证了自定义工具供Agent调用的方法。然而,本案例没有针对具体任务对Agent的prompt进行调整,也没有使用外部知识库等模块,且仅在本地进行了测试。未来可以在这些方面进行更多的尝试。

参考资料

[1] modelscope/modelscope-agent: ModelScope-Agent: An agent framework connecting models in ModelScope with the world (github.com)

[2] Agent实操(二):低代码调用API创建更加酷炫的Agent · 魔搭社区 (modelscope.cn)

[3] Agent实操(三):将API注册为tool,成为smart API,方便社区开发者调用 · 魔搭社区 (modelscope.cn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值