python机器人Agent编程——实现一个本地大模型和爬虫结合的手机号归属地天气查询Agent

目录

  • 一、前言
  • 二、准备工作
  • 三、Agent结构
  • 四、python模块实现
    • 4.1 实现手机号归属地查询工具
    • 4.2实现天气查询工具
    • 4.3定义创建Agent主体
    • 4.4创建聊天界面
  • 五、小结
  • PS.扩展阅读
    • ps1.六自由度机器人相关文章资源
    • ps2.四轴机器相关文章资源
    • ps3.移动小车相关文章资源
    • ps3.wifi小车控制相关文章资源

一、前言

在本文中,我们将逐步实现一个手机号归属地天气查询agent。这个agent将能够接收用户的手机号输入,自动查询该手机号的归属地,并进一步根据获取的城市信息查询该地区的实时天气信息。我们将使用Python语言,并结合qwen_agent库,及fastapi服务来实现这个功能。
在这里插入图片描述

二、准备工作

首先,确保你已经安装了Python环境和以下库:

  • qwen_agent:用于创建agent的框架。
  • requests:用于发送HTTP请求。
  • phone:用于查询手机号归属地
  • json:用于处理JSON数据。
  • re:用于正则表达式匹配。
  • 本地大模型服务:ollama本地大模型管理软件及qwen大模型。
  • fastapi:用户构建web前端聊天界面
    如果还没有安装这些库,可以通过以下命令安装:
pip install qwen_agent requests #其它所需的模块

这里如果没有装所需的库,运行时会提示,根据提示安装缺的库即可。
没有ollama也先去安装ollama并运行qwen大模型,过程非常简单,网上很多,不再赘述。
在这里插入图片描述

三、Agent结构

qwen智能体基本结构是这样的:先定义工具类tools,然后定义智能体的任务描述,然后创建一个智能体,再然后就是web发布智能体服务,进行双向通讯。
在这里插入图片描述

四、python模块实现

在这里插入图片描述

4.1 实现手机号归属地查询工具

我们首先定义一个工具MobileAddress,用于查询手机号的归属地。这个工具将使用phone库的API调用来获取归属地信息。



@register_tool('get_mobile_address')
class MobileAddress(BaseTool):
    description = '手机号归属地查询服务,输入手机号,返回该手机号的归属地。'
    parameters = [{
        'name': 'mobile',
        'type': 'string',
        'description': '输入的手机号',
        'required': True
    }]

    def call(self, params: str, **kwargs) -> str:  
        print("调用了function:", len(params))
        print("字符串内容:",params)
        
        try:
            params_json = json.loads(params[:-1])
            prompt = params_json["mobile"]
            print("转化后的号码:", prompt)
        except json.JSONDecodeError as e:
            print("JSON解析错误:", e)
            return "参数格式错误"        
        res=p.find(prompt)
        print("原始查询结果:",res)
        return res

4.2实现天气查询工具

接下来,我们定义另一个工具WeatherByAddress,用于根据城市名称查询天气信息。这个工具将使用另一个外部API来获取天气数据。

@register_tool('get_weather')
class WeatherByAddress(BaseTool):
    description = '根据提供的城市名称,查找代码,并通过互联网请求查询天气信息。'
    parameters = [{'name': 'city', 'type': 'string', 'description': '城市名称', 'required': True}]

    def call(self, params: str, **kwargs) -> str:
        try:
            params_json = json.loads(params)
            city_name = params_json["city"]
            # 假设我们有一个城市代码的映射字典
            city_code = {'Beijing': '101010100'}  # 示例代码
            url = f'https://www.weather.com.cn/weather1d/{city_code[city_name]}.shtml'
            response = requests.get(url)
            if response.status_code == 200:
                html_content = response.text
                match = re.search(r'var hour3data=(\{.*?\});', html_content)
                if match:
                    hour3data = match.group(1)
                    return hour3data
                else:
                    return "未找到天气小时数据"
            else:
                return "请求失败,状态码: {}".format(response.status_code)
        except json.JSONDecodeError as e:
            return "参数格式错误"

4.3定义创建Agent主体

最后,我们创建一个Assistant实例,这个agent将使用我们定义的工具来处理用户的输入,并返回归属地和天气信息。

from qwen_agent.agents import Assistant

# 配置LLM
llm_cfg = {
    'model': 'qwen',#这里可以根据自己的大模型类型修改配置参数
    'model_server': 'http://localhost:11434/v1',#这里可以根据自己的大模型类型修改配置参数
    'generate_cfg': {'top_p': 0.8}
}

# 创建agent
system_instruction = '你扮演一个助手,会调用工具,首先获取用户输入的手机号码,并调用手机号归属地查询服务工具获得城市地址,然后再调用天气查询工具获得所在城市的天气信息,最后进行整理,输出手机归属地和天气信息'
tools = ['get_mobile_address', 'get_weather']
bot = Assistant(llm=llm_cfg, system_message=system_instruction, description='function calling', function_list=tools)

4.4创建聊天界面

我们将使用FastAPI来创建一个简单的Web界面,用户可以通过这个界面输入手机号,并获取归属地和天气信息。

from fastapi import FastAPI, Request, Form
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")

@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
    return templates.TemplateResponse("chat.html", {"request": request})

@app.post("/chat")
async def chat(message: str = Form(...)):
    messages = [{'role': 'user', 'content': message}]
    responses = bot.run(messages=messages)
    return {"responses": [content['content'] for content in responses]}

# 运行FastAPI应用
if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host='0.0.0.0', port=9000, workers=1)

创建一个简单的html页面,如下:

<!DOCTYPE html>
<html>
<head>
    <title>Chat Interface</title>
    <script>
        function send_message() {
            var message = document.getElementById("message").value;
            if (message.trim() === "") {
                alert("Message cannot be empty!");
                return;
            }
            fetch("/chat", {
                method: "POST",
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded",
                },
                body: "message=" + encodeURIComponent(message),
            })
            .then(response => {
                if (!response.ok) {
                    throw new Error("Network response was not ok");
                }
                return response.json();
            })
            .then(data => {
                var responses = data.responses;
                var chat_window = document.getElementById("chat-window");
                responses.forEach(response => {
                    var response_div = document.createElement("div");
                    response_div.innerText = response; // Fixed to access response directly
                    chat_window.appendChild(response_div);
                });
                document.getElementById("message").value = "";
                chat_window.scrollTop = chat_window.scrollHeight;
            })
            .catch(error => console.error("Error:", error));
        }
    </script>
</head>
<body>
    <div id="chat-window" style="width: 80%; height: 400px; border: 1px solid #000; overflow-y: scroll;"></div>
    <input type="text" id="message" placeholder="Type a message..." style="height: 100px;width: 80%;">
    <button onclick="send_message()" style="background-color: blue; color: white; font-size: larger; padding: 10px 20px;">Send</button>
</body>
</html>

五、小结

至此,我们实现了一个anget,他可以接收我们输入的电话号码,并且调用本地大模型进行处理,先是调用一个手机号码归属地查询tool,再去调用一个天气查询爬虫tool,最后大模型综合tool的反馈信息进行整合后输出给用户。以上是简单的实现,为了更加的准确好用需要进一步优化,包括qwen-anget本身好像有点问题,有时候只能调用一个手机号码归属地函数发挥不是很稳定因此需要优化prompt,第二,可以加入更多检查工具,比如,输入的号码检查,让大模型自己先检查一下对不对,比如对回答进行一些过滤,过滤掉不必要的信息等。

本篇所有源码及安装虚拟python环境已经打包上传解压运行,下载链接

[------------本篇完-------------]

PS.扩展阅读

————————————————————————————————————————

对于python机器人编程感兴趣的小伙伴,可以进入如下链接阅读相关咨询

ps1.六自由度机器人相关文章资源

(1) 对六自由度机械臂的运动控制及python实现(附源码)
在这里插入图片描述

(2) N轴机械臂的MDH正向建模,及python算法
在这里插入图片描述

ps2.四轴机器相关文章资源

(1) 文章:python机器人编程——用python实现一个写字机器人
在这里插入图片描述

在这里插入图片描述

(2)python机器人实战——0到1创建一个自动是色块机器人项目-CSDN直播

(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(4)实现了语音输入+大模型指令解析+机器视觉+机械臂流程打通
在这里插入图片描述
在这里插入图片描述

ps3.移动小车相关文章资源

(1)python做了一个极简的栅格地图行走机器人,到底能干啥?[第五弹]——解锁蒙特卡洛定位功能-CSDN博客
(2) 对应python资源:源码地址
在这里插入图片描述
在这里插入图片描述

(3)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(上篇)_agv编程-CSDN博客
(4)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)_agv路线规划原则python-CSDN博客
对应python及仿真环境资源:源码链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ps3.wifi小车控制相关文章资源

web端配套资源源代码已经上传(竖屏版),下载地址
仿真配套资源已经上传:下载地址
web端配套资源源代码已经上传(横屏版),下载地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app打包后报错云服务空间未关联

使用uni-app打包到h5 项目里面用到了uni-app的云端一体城市选择组件&#xff0c;这个组件数据用到了uniCloud云服务空间&#xff0c;在本地运行没问题&#xff0c;打包之后测试环境报错&#xff1a; 一顿查&#xff0c;查到了官网是这样说的&#xff1a; cli publish --platfo…

SpringBoot框架:共享汽车行业的技术升级

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了共享汽车管理系统的开发全过程。通过分析共享汽车管理系统管理的不足&#xff0c;创建了一个计算机管理共享汽车管理系统的方案。文章介绍了共享汽车管理系统的系…

DBAPI连接阿里云 maxcompute 报错

使用正确的驱动包 访问以下链接寻找驱动包 https://github.com/aliyun/aliyun-odps-jdbc/releases/tag/v3.4.3 注意要使用odps-jdbc-3.4.3-jar-with-dependencies.jar &#xff0c;这个是完整的jar包 不要使用odps-jdbc-3.4.3.jar&#xff0c;这个不是完整的&#xff0c;它还…

【数据集】【YOLO】【目标检测】树木倒塌识别数据集 9957 张,YOLO道路树木断裂识别算法实战训练教程!

一、数据集介绍 【数据集】树木倒塌识别数据集 9957 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。 数据集中包含1种分类&#xff1a;{0: fallen_tree}&#xff0c;代表倒塌或者断裂的树木。 数据集来自国内外图片网站和视频截图&#xff1b; 可用于无人机树木…

贪心算法day2(最长递增子序列)

目录 1.最长递增子序列 方法一&#xff1a;动态规划 方法二&#xff1a;贪心二分查找 1.最长递增子序列 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;动态规划 思路&#xff1a;我们定义dp[i]为最长递增子序列&#xff0c;那么dp[j]就是…

基于微信小程序的电子购物系统的设计与实现(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

雨晨 23H2 Windows 11 企业版 IE VCDX 适度 22631.4445 (VIP有限开放版本)

雨晨 23H2 Windows 11 企业版 IE VCDX 适度 22631.4445 &#xff08;VIP有限开放版本&#xff09; 文 件: 雨晨 23H2 Windows 11 企业版 适度 22631.4445 install.wim 提 取 码: ZZLR 大 小: 2824999564 字节 修改时间: 2024年11月9日, 星期六, 05:33:05 MD5 : 9C88…

OWASP TOP10 OSS 风险:开源软件安全指南

OWASP OSS 列表提供了旨在绕过 CVE 目录等滞后指标的建议&#xff0c;并为安全从业者提供了安全使用 OSS 组件的指南。 在最近的一些暴露的漏洞和风险之后&#xff0c;对开源软件 &#xff08;OSS&#xff09;的安全和使用方式进行批判性审视的呼声越来越高&#xff0c;特别是 …

无人机培训机型有哪些?CAAC考证选3类还是4类

无人机培训是一个涵盖多个方面的综合性过程&#xff0c;旨在培养具备无人机操作技能和相关知识的人才。 无人机培训机型 无人机培训通常涵盖多种机型&#xff0c;以满足不同领域和应用场景的需求。常见的无人机培训机型包括&#xff1a; 1. 多旋翼无人机&#xff1a;也称为多…

浏览器漫谈HTML--2.1印象深刻的标签-语义化标签

语义化标签 HTML语义化标签是HTML5引入的一个重要特性 常见的语义化标签&#xff1a; <header>, <nav>, <main>, <article>, <section>, <aside>, <footer> 布局如下 底层实现逻辑&&好处 语义化标签其实底层实现逻辑和…

el-table-column prop值根据数组获取

方法一&#xff1a; 可以给el-table-column添加一个属性&#xff1a;formatter&#xff0c;代码如下&#xff1a; 这里是因为多个列都需要同样的计算&#xff0c;所以使用column.property获取属性&#xff0c;不然可以直接row.属性 方法二&#xff1a; 直接在template scope …

2021-04-22 51单片机玩转点阵

理论就不赘述了,网络上多得很,直接从仿真软件感性上操作认识点阵,首先打开ISIS仿真软件,放置一个点阵和电源与地线就可以开始了;由点阵任何一脚连线到地线,另一边对应的引脚就连接到电源,如图:点击运行看是否点亮?看到蓝色与红色的点表示电源正常但是没有任何亮点,这时对调一下…

数据结构---详解单链表

一、单链表的概念及性质 1、链表的概念 链表是一种物理存储结构上非连续、非顺序的储存结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 我们看上图&#xff0c;一个链表就很像一节节车厢一样&#xff0c;和顺序表不同的是&#xff0c;链表里的每节“…

基于Spring Boot的网上商品订单转手系统设计与实现,LW+源码+讲解

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装网上商品订单转手系统软件来发挥其高效地信息处理的作用&a…

金蝶云星空与聚水潭系统的数据无缝对接案例

金蝶云星空与聚水潭的其他出库单数据集成案例分享 在企业日常运营中&#xff0c;数据的高效流动和准确处理至关重要。本文将重点介绍如何通过轻易云数据集成平台&#xff0c;实现金蝶云星空系统中的其他出库单数据无缝对接到聚水潭系统。本次集成方案名为“金蝶-其他出库单——…

企业级大数据安全架构

安全架构 一、集群访问控制1.1 Kerberos认证机制1.2 Apache Knox 统一访问网关 二、资源授权管理2.1 Apache Ranger 数据授权与管理 三、服务安全保障3.1 LDAP 轻量目录访问协议 四、大数据安全架构 当谈到企业级大数据平台时&#xff0c;安全性是一个至关重要的方面。随着数据…

cv::intersectConvexConvex返回其中一个输入点集,两个点集不相交

问题&#xff1a;cv::intersectConvexConvex返回其中一个输入点集&#xff0c;但两个点集并不相交 版本&#xff1a;opencv 3.1.0 git上也有人反馈了intersectConvexConvex sometimes returning one of the input polygons in case of empty intersection #10044 是凸包嵌套判…

贪心算法day3(最长递增序列问题)

目录 1.最长递增三元子序列 2.最长连续递增序列 1.最长递增三元子序列 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;我们只需要设置两个数进行比较就好。设a为nums[0]&#xff0c;b 为一个无穷大的数&#xff0c;只要有比a小的数字就赋值…

SpringBoot助力的共享汽车业务优化系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

基于STM32的LCD1602显示Proteus仿真设计(仿真+程序+设计报告+讲解视频)

这里写目录标题 1.主要功能0. 资料清单&下载链接资料下载链接&#xff1a;2.仿真设计3. 程序设计4. 设计报告5. 框图 基于STM32的LCD1602显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a…