当前位置: 首页 > news >正文

基于deepseek api和openweather 天气API实现Function Calling技术讲解

以下是一个结合DeepSeek API和OpenWeather API的完整Function Calling示例,包含意图识别、API调用和结果整合:

import requests
import json
import os# 配置API密钥(从环境变量获取)
DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY")
OPENWEATHER_API_KEY = os.getenv("OPENWEATHER_API_KEY")# Function Definitions (JSON Schema格式)
functions = [{"name": "get_current_weather","description": "获取指定城市的当前天气信息","parameters": {"type": "object","properties": {"location": {"type": "string","description": "城市名称,如:'北京' 或 'London'"},"unit": {"type": "string","enum": ["celsius", "fahrenheit"],"description": "温度单位"}},"required": ["location"]}},{"name": "ask_deepseek","description": "回答通用问题,涉及知识查询、建议、解释概念等","parameters": {"type": "object","properties": {"question": {"type": "string","description": "用户提出的问题或请求"}},"required": ["question"]}}
]def call_function(function_name, arguments):"""路由函数调用到具体实现"""if function_name == "get_current_weather":return get_current_weather(location=arguments.get("location"),unit=arguments.get("unit", "celsius"))elif function_name == "ask_deepseek":return ask_deepseek(question=arguments.get("question"))else:return "未找到对应功能"# OpenWeather API实现
def get_current_weather(location, unit="celsius"):try:url = "https://api.openweathermap.org/data/2.5/weather"params = {"q": location,"appid": OPENWEATHER_API_KEY,"units": "metric" if unit == "celsius" else "imperial"}response = requests.get(url, params=params)data = response.json()if response.status_code == 200:weather_info = {"location": data["name"],"temperature": data["main"]["temp"],"unit": "°C" if unit == "celsius" else "°F","description": data["weather"][0]["description"],"humidity": f"{data['main']['humidity']}%","wind_speed": f"{data['wind']['speed']} m/s"}return json.dumps(weather_info)else:return f"获取天气信息失败:{data.get('message', '未知错误')}"except Exception as e:return f"天气API调用异常:{str(e)}"# DeepSeek API实现
def ask_deepseek(question):try:url = "https://api.deepseek.com/v1/chat/completions"headers = {"Content-Type": "application/json","Authorization": f"Bearer {DEEPSEEK_API_KEY}"}payload = {"model": "deepseek-chat","messages": [{"role": "user","content": question}],"temperature": 0.7}response = requests.post(url, headers=headers, json=payload)data = response.json()if response.status_code == 200:return data["choices"][0]["message"]["content"]else:return f"DeepSeek API错误:{data.get('error', {}).get('message', '未知错误')}"except Exception as e:return f"DeepSeek API调用异常:{str(e)}"def process_query(user_query):"""处理用户查询的主函数"""# 这里应该接入LLM进行意图识别,以下是模拟实现if "天气" in user_query or "气温" in user_query:return call_function("get_current_weather", {"location": user_query.replace("天气", "").strip(),"unit": "celsius"})else:return call_function("ask_deepseek", {"question": user_query})# 使用示例
if __name__ == "__main__":queries = ["北京现在的天气怎么样?","请解释量子计算的基本原理","上海今天的温度","如何学习机器学习?"]for query in queries:print(f"用户问:{query}")response = process_query(query)# 尝试解析JSON响应(适用于天气API)try:weather_data = json.loads(response)print("天气信息:")print(f"城市:{weather_data['location']}")print(f"温度:{weather_data['temperature']}{weather_data['unit']}")print(f"天气状况:{weather_data['description']}")print(f"湿度:{weather_data['humidity']}")print(f"风速:{weather_data['wind_speed']}\n")except:print(f"回答:{response}\n")

关键要素说明:

  1. 功能定义
  • get_current_weather:使用OpenWeather API获取实时天气数据
  • ask_deepseek:调用DeepSeek API回答通用问题
  1. 处理流程
  • 用户输入 -> 意图识别 -> 路由到对应API -> 格式化响应
  1. 增强点建议
# 可以添加的改进功能:
# 1. 更智能的意图识别(使用LLM判断)
def detect_intent(query):"""使用LLM进行意图识别"""prompt = f"""判断用户意图并返回JSON:{{"function": "get_current_weather" | "ask_deepseek","parameters": {{...}}}}示例:输入:北京天气怎么样?输出:{{"function": "get_current_weather", "parameters": {{"location": "北京"}}}}当前输入:{query}"""# 调用DeepSeek API进行意图分析response = ask_deepseek(prompt)return json.loads(response)# 2. 添加单位自动转换
def convert_temperature(temp, from_unit, to_unit):if from_unit == to_unit:return tempif from_unit == "celsius" and to_unit == "fahrenheit":return (temp * 9/5) + 32else:return (temp - 32) * 5/9# 3. 添加缓存机制
from functools import lru_cache@lru_cache(maxsize=100)
def cached_weather(location, unit):return get_current_weather(location, unit)

部署注意事项:

  1. 将API密钥存储在环境变量中
  2. 添加错误处理和重试机制
  3. 添加API调用速率限制
  4. 对用户输入进行消毒处理
  5. 添加日志记录系统

这个实现展示了:

  • REST API调用
  • JSON数据处理
  • 基本的函数路由
  • 错误处理机制
  • 可扩展的架构设计

可以根据具体需求添加更多功能,例如:

  • 多城市天气对比
  • 天气预测集成
  • 多步推理(例如结合天气数据和旅行建议)
  • 对话历史管理

相关文章:

基于deepseek api和openweather 天气API实现Function Calling技术讲解

以下是一个结合DeepSeek API和OpenWeather API的完整Function Calling示例,包含意图识别、API调用和结果整合: import requests import json import os# 配置API密钥(从环境变量获取) DEEPSEEK_API_KEY os.getenv("DEEPSEE…...

线性数据结构解密:数组的定义、操作与实际应用

系列文章目录 01-从零开始掌握Python数据结构:提升代码效率的必备技能! 02-算法复杂度全解析:时间与空间复杂度优化秘籍 03-线性数据结构解密:数组的定义、操作与实际应用 文章目录 系列文章目录前言一、数组的定义与特点1.1 数组…...

CentOS搭建PPPOE服务器

一、安装软件包 yum -y install rp-pppoe 二、配置服务器 1.修改配置文件 打开/etc/ppp/pppoe-server-options文件 nano /etc/ppp/pppoe-server-options 编辑为以下内容: # PPP options for the PPPoE server # LIC: GPL require-pap require-chap login …...

【报错】解决 RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE 报错问题

解决 RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE 报错问题 写在最前面问题描述可能的原因分析解决方案该命令的作用 结论 写在最前面 在多用户使用的服务器上,导致的环境变量的冲突和不匹配问题, 代码没有问题,但程序运行异常。…...

【C语言】C语言 文具店商品库存管理系统(源码+数据文件)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 系列文章目录 目录 系列文章目录一、设计要求1. 项…...

LangChain系列: 使用工具和工具包构建代理实战教程

让我们在LangChain中构建简单代理示例,以帮助我们理解代理的基本概念和构建块。通过保持简单,我们可以更好地掌握这些代理背后的基本思想,使我们能够在未来构建更复杂的代理。 什么是代理 LangChain官方文档有非常好的章节来介绍其代理的高级…...

布隆过滤器(简单介绍)

布隆过滤器(Bloom Filter) 是一种高效的概率型数据结构,用于快速判断一个元素是否可能存在于某个集合中。它的核心特点是空间效率极高,但存在一定的误判率(可能误报存在,但不会漏报)。 核心原理…...

C++ 利器:inline 与 nullptr

探秘 C 利器:inline 与 nullptr 引言 在 C 的浩瀚海洋中,有着许多实用且强大的特性,它们如同夜空中闪烁的繁星,照亮了开发者前行的道路。今天,我们要深入探索其中两颗耀眼的星星:inline 关键字和 nullptr …...

给一个单体项目加装Feign

1.导入pom坐标 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>4.1.2</version> </dependency> 2.主函数注解 EnableFeignClients public cl…...

可以使用Deepseek R1模型的平台集锦

最近Deepseek掀起了AI浪潮&#xff0c;就在今天百度文心一言和ChatGPT宣布要在近期实施免费开放&#xff0c;日渐减少的用户。Deepseek这么火爆&#xff0c;其官网却一直遭受攻击&#xff0c;访问速度很慢。自己本地部署&#xff0c;又负担不起硬件费用&#xff0c;相比之下&am…...

“探索1688平台:高效获取店铺商品信息的实用指南“

在电商领域&#xff0c;获取店铺所有商品信息对于商家进行数据分析、库存管理、竞品分析等方面具有重要意义。1688平台作为中国领先的B2B电商平台&#xff0c;提供了丰富的API接口供开发者使用&#xff0c;其中就包括获取店铺所有商品信息的接口。本文将详细介绍如何使用该接口…...

在fedora41中安装钉钉dingtalk_7.6.25.4122001_amd64

在Fedora-Workstation-Live-x86_64-41-1.4中安装钉钉dingtalk_7.6.25.4122001_amd64.deb 到官网下载钉钉Linux客户端com.alibabainc.dingtalk_7.6.25.4122001_amd64.deb https://page.dingtalk.com/wow/z/dingtalk/simple/ddhomedownload#/ 一、直接使用dpkg命令安装deb包报错…...

数据结构:图论入门

图论起源于欧拉对哥尼斯堡七桥问题的解决. 他构建的图模型将陆地用点来表示, 桥梁则用线表示, 如此一来, 该问题便转化为在图中能否不重复地遍历每条边的问题. 图论的应用 地图着色 在地图着色问题中, 我们用顶点代表国家, 将相邻国家之间用边相连. 这样, 问题就转化为用最少…...

有限状态系统的抽象定义及CEGAR分析解析理论篇

文章目录 一、有限状态系统的抽象定义及相关阐述1、有限状态系统定义2、 有限状态系统间的抽象关系&#xff08;Abstract&#xff09;2.1 基于函数的抽象定义2.2 基于等价关系的抽象定义 二、 基于上面的定义出发&#xff0c;提出的思考1. 为什么我们想要/需要进行抽象2. 抽象是…...

Apache Hive用PySpark统计指定表中各字段的空值、空字符串或零值比例

from pyspark.sql import SparkSession from pyspark.sql.functions import col, coalesce, trim, when, lit, sum from pyspark.sql.types import StringType, NumericType# 初始化SparkSession spark SparkSession.builder \.appName("Hive Data Quality Analysis"…...

高校元宇宙实训室解决方案:以技术驱动教育,用数字人链接未来

在AIGC技术的浪潮下&#xff0c;AI数字人正成为数字营销、文化传播等领域的核心工具。为助力高校培养适应未来需求的新型人才&#xff0c;广州虚拟动力推出高校元宇宙实训室解决方案&#xff0c;通过动作捕捉设备与虚拟数字人技术&#xff0c;构建沉浸式教学场景&#xff0c;赋…...

提升编程效率,体验智能编程助手—豆包MarsCode一键Apply功能测评

提升编程效率&#xff0c;体验智能编程助手—豆包MarsCode一键Apply功能测评 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 引言豆包…...

【前端开发】query参数和params参数的区别

在Web开发中&#xff0c;query参数&#xff08;URL查询参数&#xff09;和params参数&#xff08;路由参数&#xff09;是两种不同的URL传参方式&#xff0c;它们的核心区别如下&#xff1a; 一、 位置不同 query参数params参数位置URL中?之后&#xff0c;用&连接多个参数…...

推荐系统召回算法

推荐系统召回算法 召回算法UserCFItemCFSwing矩阵分解 召回算法 基于协同过滤的召回算法主要是应用在推荐环节的早期阶段&#xff0c;大致可以分为基于用户、基于物品的。两者各有优劣&#xff0c;优点是具有较好的可解释性&#xff0c;缺点是对于稀疏的交互矩阵&#xff0c;效…...

Python基础(上)

1. 基础语法 1.1 环境安装 Python版本: 推荐使用Python 3.6.6及以上开发工具: PyCharm 1.2 基本语法 输出: print("Hello World")​ 注释: 单行注释: # 注释内容​&#xff08;快捷键 Ctrl/​&#xff09; 多行注释: 使用三引号 注释内容​ 注意&#xff1a;不推…...

uHabits习惯追踪应用完整指南:从入门到精通的5个实用技巧

uHabits习惯追踪应用完整指南&#xff1a;从入门到精通的5个实用技巧 【免费下载链接】uhabits Loop Habit Tracker, a mobile app for creating and maintaining long-term positive habits 项目地址: https://gitcode.com/gh_mirrors/uh/uhabits uHabits习惯追踪应用是…...

VESC驱动无刷电机入门避坑:从看不懂ChibiOS源码到5分钟搞定CAN通讯

VESC驱动无刷电机入门避坑&#xff1a;从看不懂ChibiOS源码到5分钟搞定CAN通讯 第一次接触VESC驱动无刷电机时&#xff0c;面对满屏的ChibiOS源码和复杂的CAN通讯协议&#xff0c;很多嵌入式新手都会感到无从下手。特别是当你已经能用VESC Tool让电机转起来&#xff0c;但想通过…...

华为eNSP模拟企业网:用VRRP+MSTP搞定500人公司的网络冗余与隔离(附排错记录)

华为eNSP实战&#xff1a;构建500人企业级网络的高可用架构 当一家企业发展到500人规模时&#xff0c;网络架构的稳定性和可靠性就成为业务连续性的关键保障。作为网络工程师&#xff0c;我们经常面临这样的挑战&#xff1a;如何在有限的预算下&#xff0c;设计出既满足部门隔离…...

【UEFI实战】Secure Boot的密钥管理与策略配置

1. Secure Boot基础概念与核心价值 Secure Boot是UEFI规范中定义的安全启动机制&#xff0c;它的本质是通过密码学手段确保系统只加载经过授权的代码。想象一下这就像小区门禁系统——只有录入人脸信息的住户才能自由进出&#xff0c;而陌生人会被拒之门外。在实际应用中&#…...

CLion集成LVGL与SDL:打造高效嵌入式GUI模拟开发环境

1. 为什么需要CLionLVGLSDL组合&#xff1f; 如果你正在开发嵌入式设备的图形界面&#xff0c;肯定遇到过这样的困境&#xff1a;每次修改UI都要烧录到硬件上测试&#xff0c;一个简单的颜色调整可能要反复折腾十几分钟。我在开发智能手表项目时就深受其害&#xff0c;直到发现…...

跨境社媒账号做不稳 很多时候不是内容不够好而是气质不够稳定

很多团队做跨境社媒时&#xff0c;最容易把注意力集中在“内容创意”上。 选题够不够新&#xff0c;切口够不够巧&#xff0c;视频开头能不能抓住人&#xff0c;标题会不会让人点开&#xff0c;这些当然都重要。但真正做久了之后会发现&#xff0c;一个账号能不能长期跑起来&am…...

告别付费电话!手把手教你用Linphone+SIP搭建免费语音视频通话系统(附服务器配置)

零成本构建企业级音视频通信系统&#xff1a;LinphoneSIP全栈实战指南 在远程协作成为主流的今天&#xff0c;企业每年为商业通信软件支付的订阅费用往往高达数万元。我曾为一家20人团队优化通信成本时发现&#xff0c;仅视频会议一项的年支出就超过3万元——而这一切完全可以通…...

Flutter+开源鸿蒙实战|城市共享驿站智能存取系统 Day6 全局UI精细化美化+通用组件封装+反馈设置模块+隐私弹窗+鸿蒙打包签名适配+项目整体重构

Flutter开源鸿蒙实战&#xff5c;城市共享驿站智能存取系统 Day6 全局UI精细化美化通用组件封装反馈设置模块隐私弹窗鸿蒙打包签名适配项目整体重构 欢迎加入开源鸿蒙跨平台社区&#xff1a;https://openharmonycrossplatform.csdn.net <!-- Schema.org 结构化数据 --> &…...

OpenSpeedy:终极免费游戏变速工具完整使用指南

OpenSpeedy&#xff1a;终极免费游戏变速工具完整使用指南 【免费下载链接】OpenSpeedy &#x1f3ae; An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy OpenSpeedy是一款完全免费且开源的Windows游戏加速工具&#xff0c…...

HDFS源码(二)

DataNode启动源码 创建HttpServer 初始化DataNode Rpc服务 获取NameNode Rpc代理 Datanode向NameNode注册 DataNode与NameNode周期心跳及block块汇报 数据上传源码 创建文件系统及初始化DFSClient 连接NN创建目录 启动DataStreamer线程 向dataQueue队列中写入packet 设置副本写…...