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

news2025/3/14 3:24:00

以下是一个结合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 temp
    if from_unit == "celsius" and to_unit == "fahrenheit":
        return (temp * 9/5) + 32
    else:
        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数据处理
  • 基本的函数路由
  • 错误处理机制
  • 可扩展的架构设计

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mongodb数据管理

Mongodb数据管理 1.登录数据库,查看默认的库 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin库:admin 是 MongoDB 的管理…

从短片到长片:王琦携《Mountain》续作迈向新高度

在王琦(Qi Wang)的带领下,广受关注的短片《Mountain》迎来了成长篇续作《Rite of the Mountain》。这一全新长片不仅是她从短片迈向长篇叙事的重要一步,更是一次大胆的艺术挑战。作为制片人的她,将继续以敏锐的视觉风格和深刻的叙事洞察,拓展《Mountain》所触及的情感深度,并构…

DeepSeek应用——与PyCharm的配套使用

目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回,且在本地模型报错 记录自己学习应用DeepSeek的过程,使用的是自己电脑本地部署的私有化蒸馏模型...... (举一反三,这个不单单是可以用…

如何画产品功能图、结构图

功能图的类型 常见的功能图包括数据流图、用例图、活动图、状态图、类图、组件图、部署图等等,不同的应用场景和目标下,需要确定不同的功能图类型。 数据流图 用例图 状态图 类图 组件图 组件图是由软件系统、组件和组件之间的关系组成的图形&#xf…

标准输入输出流,面向对象,构造函数

标准输入输出流 为什么不直接用printf和scanf? 不能输入/输出C新增的内容 std C的一些标识符&#xff0c;都是定义在std这个名字空间下面cout 是什么&#xff1f; 1.是一个ostream对象 output stream:输出流使用 <<&#xff1a;输出流运算符 作用&#xff1a;将右边…

PowerBI 矩阵 列标题分组显示(两行列标题)

先看效果 数据表如下&#xff1a; 我们在powerbi里新建一个矩阵&#xff0c;然后如图加入字段&#xff1a; 我们就会得到这样的矩阵&#xff1a; 我们在“可视化”->“列”&#xff0c;上双击&#xff0c;输入空格&#xff0c;就能消除左上角的"类别"两字 同理修…

服务器部署DeepSeek,通过Ollama+open-webui部署

1. 安装ollama 1.1. linux 安装 Ollama是目前常用的AI模式部署的第三方工具&#xff0c;能一键部署deepSeek Ollama官方网址https://ollama.com/ 选择Download下载对应的服务版本 服务器选择Linux&#xff0c;下面是下载代码 curl -fsSL https://ollama.com/install.…

Ubuntu 连接 air pods

&#xff11;&#xff0e; sudo vim /etc/bluetooth/main.conf , 修改蓝牙模式为blder &#xff12;&#xff0e;sudo /etc/init.d/bluetooth restart, 重启蓝牙&#xff0c;即可连接成功

民用无人驾驶航空器操控员考试

1. 注册 民用无人驾驶航空器综合管理平台 (caac.gov.cn) 2. 选择 操控员资质 3. 安全操控理论培训 -> 在线视频培训 学习完后选择 【在线考试】 共 50道 单项 选择题&#xff0c;每选项3个&#xff0c;80分及格。 4. 查看 我的合格证 证书有效期2年

002 第一个python程序

编程语言 编程语言可以做的事情&#xff1a; 网站开发、软件 、游戏、APP、 小程序、 爬虫、 数据分析、脚本 第一个python程序 找到IDE图标pycharm 新建项目 选择项目路径 创建目录 新建python文件 输入代码 运行程序查看结果 print 介绍 print : 输出内容…

解锁机器学习核心算法 | 决策树:机器学习中高效分类的利器

引言 前面几篇文章我们学习了机器学习的核心算法线性回归和逻辑回归。这篇文章我们继续学习机器学习的经典算法——决策树&#xff08;Decision Tree&#xff09; 一、决策树算法简介 决策树算法是一种典型的分类方法&#xff0c;也是一种逼近离散函数值的方法。它的核心思想…

数据结构——顺序表与链表

目录 前言 一线性表 二顺序表 1实现 2相关面试题 2.1移除元素 2.2删除有序数组中的重复项 3.3合并两个有序数组 3问题 三链表 1链表的分类 1.1单向或者双向 1.2带头或者不带头 1.3循环或者非循环 2实现 2.1尾插与头插 2.2尾删与头删 2.3pos前插入节点与删除…

在 Python 中使用 Ollama API

文章目录 一、环境准备二、使用方法1.简单对话2.流式响应3.结构化输出4.自定义客户端4.1 同步客户端4.2 异步客户端4.3 同步 & 异步客户端不同调用次数耗时对比测试 三、常用的ollama API 接口聊天生成本地模型列表显示模型信息创建模型复制模型删除模型拉取模型推送模型生…

BGP配置华为——RR反射器配置

实验拓扑 与之前实验同理将loop0作为routerID使用&#xff0c;且R1和R2上用loop1接口用于模拟用户其他网段 实验要求 1&#xff0c;在AS100内运行OSPF协议 2.配置路由反射器&#xff0c;使得从R1进入的数据能够反射到全局网络 3.在R1和R2上分别宣告自己的loop1口网段用于观…

一.AI大模型开发-初识机器学习

机器学习基本概念 前言 本文主要介绍了深度学习基础&#xff0c;包括机器学习、深度学习的概念&#xff0c;机器学习的两种典型任务分类任务和回归任务&#xff0c;机器学习中的基础名词解释以及模型训练的基本流程等。 一.认识机器学习 1.人工智能和机器学习 人工智能&am…

力扣做题记录 (二叉树)

二叉树 打算先来了解二叉树基础&#xff0c;都是简单题&#xff0c;目的是熟悉代码格式和解题基础思路。 1、二叉树最大深度 二叉树最大深度 方法一、深度搜索 直接用原函数做递归&#xff0c;比较简单 /*** Definition for a binary tree node.* struct TreeNode {* …

前端里的this指向问题

目录 1.代码输出结果 2.代码输出结果 3.代码输出结果 4.代码输出结果 5.代码输出结果 6.代码输出结果 7.代码输出结果 8.代码输出结果 9.代码输出结果 10.代码输出结果 11.代码输出结果 12.代码输出结果 13.代码输出结果 14.代码输出结果 总结 1.代码输出结果 f…

黑马Redis详细笔记(实战篇---短信登录)

目录 一.短信登录 1.1 导入项目 1.2 Session 实现短信登录 1.3 集群的 Session 共享问题 1.4 基于 Redis 实现共享 Session 登录 一.短信登录 1.1 导入项目 数据库准备 -- 创建用户表 CREATE TABLE user (id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,phone …

基于N-gram模型的中文文本分析系统设计与实现

前言 在数字化人文研究快速发展的背景下&#xff0c;中文古典文本的量化分析面临着独特的挑战。古典文献中繁简异体字共存、语义单元边界模糊、意象隐喻密集等特征&#xff0c;使得传统的词频统计方法难以准确捕捉其深层语言规律。现有文本分析工具多面向现代汉语设计&#xff…

零基础购买阿里云服务器,XShell连接云服务器

目录 1.环境搭建方式 2. 使用云服务器 3.使用终端软件登录到Linux 4.使用XShell登录主机 5.连接失败的原因&#xff1a; 下一篇更新&#xff1a;Linux的基础指令以及如何Linux的环境搭建 1.环境搭建方式 主要有四种: 1.直接安装在物理机上&#xff0c;虽然Linux有图形化…