Qwen学习笔记4:Qwen 7B模型调用天气API实现天气的即时查询

前言

在学习Qwen模型的函数调用功能后,进一步尝试利用本地的Qwen模型访问OpenWeather API来获取实时的天气情况。

参考代码来源于视频教程:

简单粗暴,轻松配置Qwen模型查询实时数据功能_哔哩哔哩_bilibili

说明

该代码运行前,确保Qwen模型在本地以Openai-api的方式启动了服务,Qwen模型的部署和启动可以参考我之前的笔记。

主要代码

首先定义一个类实现获取实时天气的功能:

import requests
class WeatherQuery:def __init__(self):"""初始化Weather类:param api_key:必要参数字符串类型"""self.api_key = "XXXX" # 请自行到https://home.openweathermap.org/注册,在个人中心查看自己的keyself.base_url = "https://api.openweathermap.org/data/2.5/weather"def get_weather(self, loc):params = {"q": loc,"appid": self.api_key,"units": "metric","lang": "zh_cn"}response = requests.get(self.base_url, params=params)print(response)if response.status_code == 200:data = response.json()return dataelse:return {"error": "无法获取到天气信息,请检查城市名称是否正确"}

OpenWeather API的获取需要到Members (openweathermap.org)进行注册,然后到个人中心去获取自己的访问API。

该类和方法示例使用:

# 示例使用
# APIkey
weather_query = WeatherQuery()
result = weather_query.get_weather('Beijing')
print(result)
<Response [200]>
{'coord': {'lon': 116.3972, 'lat': 39.9075}, 'weather': [{'id': 800, 'main': 'Clear', 'description': '晴', 'icon': '01d'}], 'base': 'stations', 'main': {'temp': 27.94, 'feels_like': 26.56, 'temp_min': 27.94, 'temp_max': 27.94, 'pressure': 1017, 'humidity': 7, 'sea_level': 1017, 'grnd_level': 1012}, 'visibility': 10000, 'wind': {'speed': 3.75, 'deg': 267, 'gust': 6.55}, 'clouds': {'all': 0}, 'dt': 1715760908, 'sys': {'type': 1, 'id': 9609, 'country': 'CN', 'sunrise': 1715720372, 'sunset': 1715772131}, 'timezone': 28800, 'id': 1816670, 'name': 'Beijing', 'cod': 200}

可以看到,该代码能正确请求到接口返回的数据。如果上述代码出现报错,例如没有requests包,使用pip install requests安装即可。

修改调用本地千问模型的函数代码(该代码的拆解详见之前的笔记内容):

def run_conversation(messages, functions_list=None):"""能够自动执行外部函数的chat对话模型:param messages: 必要参数,字典类型,输入到Chat模型的messages参数对象:param functions_list: 可选参数,默认为None,可以设置为包含全部外部函数的列表对象:param model: Chat模型,可选参数,,默认模式是gpt-4:return: Chat模型输出结果"""# 如果没有外部函数库,则执行普通的对话任务# 修改一:修改为Qwen的对话逻辑if functions_list == None:response = openai.ChatCompletion.create(model="Qwen",messages=messages,)response_message = response["choices"][0]["message"]final_response = response_message["conten"]# 若存在外部函数库则需要灵活选取外部函数并进行回答jelse:# 创建function对象cfunctions = functions_list# first responseresponse = openai.ChatCompletion.create(model="Qwen",messages=messages,functions=functions)response_message = response["choices"][0]["message"]# 修改2从函数API编写方式,改为类的编写方式h# 判断返回结果是否存在function_call,即判断是否需要调用外部函数来回答问题if response_message.get("function_call"):# 需要调用外部函数# 获取函数名function_name = response_message["function_call"]["name"]# 获取函数对象import json# 执行该函数所需要的参数print(response_message["function_call"]["arguments"])function_args = json.loads(response_message["function_call"]["arguments"].replace("'", '"'))tool_instance = eval(function_name)()# 实例化类中的方法tool_func = getattr(tool_instance, next(iter(function_args)))first_result = tool_func(function_args[next(iter(function_args))])# 修改3:按照Qwen的对话History,添加system messagemessages.append({"role": "assistant","content": response.choices[0].message['content'],})# messages中拼接first response消息# 追加function返回消息messages.append({"role":"function","content": str(first_result),})# 第二次调用模型second_response = openai.ChatCompletion.create(model='Qwen',messages=messages,)# 获取最终结果final_response = second_response["choices"][0]["message"]["content"]else:final_response = second_response["content"]return final_response

这里与之前不同的地方只有一处:

定义一个工具的jsonSchema,用于模型调用的参数:

weather_tools = [{'name_for_human': '即时天气查询工具','name_for_model': 'WeatherQuery','description_for_model': '即时天气查询工具使用OpenWeather API查询指定城市的即时天气状况。该工具需要城市的名称需要转换为其对应的英文名称,例如北京需要转换为Beijing。','parameters': [{'name': 'get_weather','description': '必要参数,字符串类型,用于表示查询天气的具体城市名称,中国的城市需要用英文名称替代,例如“北京”需要替换为“Beijing”','required': True,'schema': {'type': 'string'},}],},# 其他工具的定义可以在这里继续添加
] 

调用模型,返回结果

messages = [{'role': 'user', 'content': '现在北京的天气怎么样?'}]
run_conversation(messages = messages,functions_list=weather_tools)
{"get_weather": "Beijing"}
<Response [200]>
" API返回的数据格式为json,看起来包含一个叫做'weather'的列表,它里面存储了当前的天气情况。此外,还包含了其他一些数据,如压力、湿度等。\n\nResponse: 北京现在的天气是晴朗的,温度大约在27度左右,空气比较干燥。"

我们再调用之前定义的类和方法,查看一下是不是模型杜撰的。

weather_query = WeatherQuery()
result = weather_query.get_weather('Beijing')
print(result)
<Response [200]>
{'coord': {'lon': 116.3972, 'lat': 39.9075}, 'weather': [{'id': 800, 'main': 'Clear', 'description': '晴', 'icon': '01d'}], 'base': 'stations', 'main': {'temp': 27.94, 'feels_like': 26.56, 'temp_min': 27.94, 'temp_max': 27.94, 'pressure': 1017, 'humidity': 7, 'sea_level': 1017, 'grnd_level': 1012}, 'visibility': 10000, 'wind': {'speed': 3.75, 'deg': 267, 'gust': 6.55}, 'clouds': {'all': 0}, 'dt': 1715761584, 'sys': {'type': 1, 'id': 9609, 'country': 'CN', 'sunrise': 1715720372, 'sunset': 1715772131}, 'timezone': 28800, 'id': 1816670, 'name': 'Beijing', 'cod': 200}

可以看到,模型返回的结果确实是OpenWeather API返回的结果。模型正确的请求并返回了结果。

结语

到这篇笔记为止,我们已经通过学习ReAct原理,以及手动拆解代码,一步步分析Qwen模式是如何进入思考模式,实现函数调用的功能的。

后边封装的代码也能够快速的调用工具来实现之前模型不具备的能力,这为大模型的应用增加了不少的可能性。这些思考和方法,以及实现的代码可以作为后续模型的应用开发、上层开发提供思路和借鉴。

后续也可以进一步深入学习。

我自己这边,对于千问模型,后续再将其升级到Qwen1.5,再大概测试一下其性能,直观感受一下吧,以及了解下功能上是否有更新,可能就不会耗费更多的时间,接下来的重点将会转到对chatGLM和langchain框架的学习。

如果大家看到这篇笔记,有疑问的可以提出来,我们可以一起探讨。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kibana使用

一、什么是Kibana   Kibana 是一个开源的分析和可视化平台&#xff0c;Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析&#xff0c;并在各种图表、表格和地图中可视化数据。 Kibana使用&#xff1a…

JVM运行时内存:虚拟机栈

文章目录 1. 概述2. 栈针3. 栈针内部结构3.1 局部变量表3.2 操作数栈3.3 动态链接3.4 方法返回地址3.5 一些附加信息 运行时内存整体结构如下图所示: 1. 概述 如何理解栈管运行&#xff0c;堆管存储&#xff1f; 角度一&#xff1a;GC;OOM角度二&#xff1a;栈、堆执行效率角…

pdfMake,xlsx-js-style,elementTable表格导出大量数据的pdf和xslx表格

使用渲染dom传递给xlsx或将dom转canvas在传给jspdf数据量大都会造成页面负载过大 所以导pdf和xlsx都使用数据传递给pdfMake,xlsx-js-style&#xff0c;pdf涉及分页与合并单元格 一.pdf npm并引入pdfMake和其字体包&#xff08;记录时使用版本0.2.10 import pdfMake from &qu…

六西格玛绿带培训:解锁质量工程师的职场新篇章

在质量管理这条道路上&#xff0c;我们或许都曾有过这样的疑问&#xff1a;为何付出了同样的努力&#xff0c;却未能获得预期的回报&#xff1f;当我们看到身边的同行们逐渐步入高薪的行列&#xff0c;而自己却似乎陷入了职业的泥沼&#xff0c;这种对比无疑令人倍感焦虑。然而…

【SRC实战】退款导致零元购支付漏洞

挖个洞先 https://mp.weixin.qq.com/s/3k3OCC5mwI5t9ILNt6Q8bw “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 1、购买年卡会员 2、订单处查看已支付 3、申请退款 4、会员仍然有效 5、使用另一个账号重复支付退款操作&#…

「AIGC算法」近邻算法原理详解

本文主要介绍近邻算法原理及实践demo。 一、原理 K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;是一种基于距离的分类算法&#xff0c;其核心思想是距离越近的样本点&#xff0c;其类别越有可能相似。以下是KNN算法的原理详解&#xff1a; 1. 算…

在Python中防止某些字段被Pickle序列化

在Python中&#xff0c;如果你想防止某些字段被pickle序列化&#xff0c;可以使用__reduce__()方法来自定义pickle行为。__reduce__()方法允许你返回一个元组&#xff0c;其中包含要在对象被pickle时调用的函数以及传递给该函数的参数。下面就是我遇到的问题以及最终解决方案。…

PCIE/PCI设备配置空间

PCI/PCIE Capability PCI/PCIE设备的配置空间记录了PCIE设备的capability支持信息&#xff0c;每个capability定义了一个ID标识&#xff0c;可以通过函数pci_find_capability和pci_find_ext_capability来探测和获取这些配置信息的位置。这些ID定义在文件include/uapi/linux/pc…

第八篇 Asciidoc 输出 All In One HTML 解决图片无法显示问题

问题:我的图片显示不出来了 小明使用 Asciidoc 来记笔记,他将笔记输出为 HTML 文件。小丽向小明借笔记。小明将 Asciidoc 笔记输出为 HTML文件,并拷贝给了小丽。 但是,小丽发现,图片都显示不出来了。 小丽:小明,你给我的笔记,图片都显示不出来啊。 小明:是我给你的…

【错题集-编程题】主持人调度(一)(排序)

牛客对应题目链接&#xff1a;主持人调度&#xff08;一&#xff09;_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 区间问题技巧&#xff1a;左端点排序或者按照右端点排序。 左端点排序后&#xff0c;仅需考虑后续区间是否能与前⼀个区间重叠即可。 二、代码 1、没看题解之…

2024 Google I/O大会:全方位解读最新AI技术和产品

引言&#xff1a; 2024年的Google I/O大会如期举行&#xff0c;作为技术圈的年度盛事之一&#xff0c;谷歌展示了其在人工智能领域的最新进展。本次大会尤其引人注目&#xff0c;因为它紧随着OpenAI昨天发布GPT-4o的脚步。让我们详细解析Google此次公布的各项新技术和产品&…

springcloud+nocos从零开始

首先是去nacos官网下载最新的包&#xff1a;Nacos 快速开始 | Nacos win下启动命令&#xff1a;startup.cmd -m standalone 这样就可以访问你的nacos 了。 添加一个配置&#xff0c;记住你的 DataId,和Group名字。 创建一个pom项目&#xff0c;引入springCloud <?xml ve…