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/注册,在个人中心查看自己的key
        self.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 data

        else:
            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"]
    # 若存在外部函数库则需要灵活选取外部函数并进行回答j
    else:
        # 创建function对象c
        functions = functions_list

        # first response
        response = 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 message
            messages.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框架的学习。

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

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

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

相关文章

基于51单片机的AD/DA转换的串口通信proteus仿真(附源码)

文章目录 一、前言二、PCF85911.介绍2.原理图3.引脚介绍 三、仿真图1.未仿真时2.仿真时 四、仿真程序main.cIIC.c 五、总结 一、前言 AT89C52是一款经典的8051系列单片机&#xff0c;它通常不包含内置的模数转换器&#xff08;ADC&#xff09;或数字模拟转换器&#xff08;DAC…

「Python绘图」绘制奥运五环

python 绘制奥运五环 一、预期结果 二、核心代码 import turtle print("开始绘制奥运五环")# 创建Turtle对象 pen turtle.Turtle() pen.shape("turtle") pen.pensize(8)print("绘制蓝色圆") pen.up() pen.goto(50-170,0) pen.down() pen.color…

进程信号 signal

文章目录 信号基础信号的产生OS中的时间 信号的保存sigset_tsigprocmasksigpending 信号的捕捉用户态和内核态sigactionvolatile SIGCHLD 信号基础 生活中的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也知道快递来临…

HNU-算法设计与分析-作业5

第五次作业【回溯算法】 文章目录 第五次作业【回溯算法】<1> 算法分析题5-3 回溯法重写0-1背包<2> 算法分析题5-5 旅行商问题&#xff08;剪枝&#xff09;<3> 算法实现题5-2 最小长度电路板排列问题<4> 算法实现题5-7 n色方柱问题<5> 算法实现…

[论文阅读]FINE-TUNE THE PRETRAINED ATST MODEL FOR SOUND EVENT DETECTION

摘要 本研究提出了一种微调预训练模型ATST&#xff08;音频师生转换模型&#xff09;的方法&#xff0c;用于声音事件检测&#xff08;SED&#xff09;。通过引入ATST-Frame模型&#xff0c;该方法在DCASE挑战任务4数据集上取得了新的SOTA结果&#xff0c;有效解决了预训练模型…

Leetcode - 130双周赛

目录 一&#xff0c;3142. 判断矩阵是否满足条件 二&#xff0c;3143. 正方形中的最多点数 三&#xff0c;3144. 分割字符频率相等的最少子字符串 四&#xff0c;3145. 大数组元素的乘积 一&#xff0c;3142. 判断矩阵是否满足条件 本题题意&#xff0c;满足每一列的数全部…

LLama3大模型本地部署 仅需6步完成对话模型本地安装部署。附送可视化ui安装、自定义模型目录,修改模型保存地址,第三方微调模型、中文模型下载地址

本篇分为三部分 一&#xff1a;6步完成llama3大模型本地部署 二&#xff1a;8步完成llama3可视化对话界面安装 三&#xff1a;重设模型文件路径 四&#xff1a;微调模型、中文模型下载资源分享 一、LLama3 大模型本地部署安装 首先去mata官网下载ollama客户端 Ollama 选择合适…

Linux操作系统最著名的两大系列Red Hat和Debian

Linux操作系统可以根据其背后的项目或社区分为不同的系列&#xff0c;其中最著名的两大系列是Red Hat系列和Debian系列。 1.著名的两大系列是Red Hat和Debian Red Hat系列&#xff1a; Red Hat Enterprise Linux (RHEL)&#xff1a;这是Red Hat公司推出的企业级操作系统&#…

计算机网络-路由策略与路由控制一

到目前为止我们学习了路由与交换基础&#xff0c;路由协议有静态、RIP、OSPF、IS-IS等&#xff0c;但是根据实际组网需求&#xff0c;往往需要实施一些路由策略对路由信息进行过滤、属性设置等操作&#xff0c;通过对路由的控制&#xff0c;可以影响数据流量转发。 因此我们开始…

Vitis HLS 学习笔记--资源绑定-使用URAM(1)

目录 1. 简介 2. 代码分析 2.1 存储器代码 2.2 Implementation报告 2.3 存储器类型指定 2.4 存储器初始化 3. 总结 1. 简介 在博文《Vitis HLS 学习笔记--资源绑定-使用URAM-CSDN博客》中&#xff0c;介绍了如何在Vitis HLS环境下设计一个简易的存储器模型。 通过以下…

Skywalking配置traceId

1.引言 1.1 SkyWalking概述 SkyWalking是一个开源的分布式系统观测平台&#xff0c;旨在解决微服务和云原生架构中常见的性能监控和故障排除问题。自2015年由Apache基金会孵化以来&#xff0c;SkyWalking已经成为全球范围内广泛使用的APM&#xff08;应用性能管理&#xff09…

Selenium 自动化 —— 高级交互(click、sendKeys、submit、clear、select)

更多关于Selenium的知识请访问CSND论坛“兰亭序咖啡”的专栏&#xff1a;专栏《Selenium 从入门到精通》 ​​ 1. 前言 这是我的《Selenium从入门到精通》专栏的第11篇文章&#xff0c;前面花了很多时间在元素的定位上。不管是爬虫和自动化&#xff0c;找到元素后&#xff0c…

jvisualvm安装Visual GC插件

给jdk自带的jvisualvm安装Visual GC插件&#xff0c;遇到We’re sorry the java.net site has closed&#xff08;我们很抱歉java.net网站已经关闭&#xff09; 1、找到新的更新地址 visualvm新访问地址&#xff1a;https://visualvm.github.io/index.html 进入“Plugins”&am…

【介绍下Python多线程,什么是Python多线程】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

一个可自动生成行排号的excel VBA小工具

如下图&#xff0c;点击“生成行排号”按钮即可生成想要的行排号 基本用法如下&#xff1a; 1、设置顺序排列的行排号&#xff08;每排的行号一致&#xff0c;行的方向排序方向也一致&#xff09; 2、设置顺序排列的行排号&#xff08;行号从小到大排列&#xff0c;而不受排的…

UEC++学习(十五)创建、查找、加入会话

创建会话 基于上篇配置steam在线子系统之后&#xff0c;在Character.h中声明一个会话创建完成时的委托以及回调函数。 #include "Interfaces/OnlineSessionInterface.h"public://指向在线会话界面的指针,将会话接口存储在里面TSharedPtr<class IOnlineSession, ES…

电脑缺失api-ms-win-crt-runtime-l1-1-0.dll文件的几种修复方法

当您在使用电脑过程中遇到程序启动失败&#xff0c;提示缺少“api-ms-win-crt-runtime-l1-1-0.dll”文件时&#xff0c;不必过于焦虑&#xff0c;此问题通常与Windows系统的Visual C Redistributable组件未正确安装或损坏有关。小编将介绍5种修复电脑缺失api-ms-win-crt-runtim…

STM32-09-IWDG

文章目录 STM32 IWDG1. IWDG2. IWDG框图3. IWDG寄存器4. IWDG寄存器操作步骤5. IWDG溢出时间计算6. IWDG配置步骤7. 代码实现 STM32 IWDG 1. IWDG IWDG Independent watchdog&#xff0c;即独立看门狗&#xff0c;本质上是一个定时器&#xff0c;这个定时器有一个输出端&#…

elementui 那些遇到的问题呀

1、在父组件调用子组件方法的&#xff0c;现在想关闭el-dialog 弹框&#xff0c;清除编辑器里面的值&#xff0c;结果哦方法走了但是没清空&#xff0c;原代码是这样的 父组件&#xff1a;<el-dialog closed"formulaclosed" v-model"detailsFormVisible&quo…

颜色的表示和还原(一)

这篇文章主要提炼于ICCV 2019 Tutorial: Understanding Color and the In-Camera Image Processing Pipeline for Computer Vision。里面深入浅出地讲解了很多ISP中的基础知识&#xff0c;这里主要对颜色相关的部分做一点总结。 假设不成立了 相机经常被简单地看作是衡量光线…