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

别再让ChatGPT瞎编了!用OpenAI Function Calling接入真实天气API,5分钟搞定实时数据查询

用OpenAI Function Calling构建真实数据驱动的AI应用以天气查询为例每次问ChatGPT今天会下雨吗它可能会给你一段充满诗意的回答——但很可能和实际情况毫无关系。这就是大模型幻觉问题的典型表现当需要实时数据时它们只能依靠训练记忆中的模式来编造答案。本文将带你用OpenAI的Function Calling功能为AI应用接入真实天气API彻底解决时效性问题。1. 为什么需要Function Calling大语言模型就像一位知识渊博但足不出户的学者它的所有知识都来自训练时读过的资料。这就导致两个核心痛点数据时效性模型无法自动获取训练截止日期之后的新信息事实准确性即使知道某个事实也可能在生成过程中出现幻觉传统解决方案是微调模型或使用嵌入检索但这些方法要么成本高昂要么灵活性不足。Function Calling提供了一种更优雅的方式# 传统方式 vs Function Calling对比 传统方式: 用户提问 → 模型凭记忆回答 Function Calling: 用户提问 → 模型决定调用API → 获取真实数据 → 生成回答典型适用场景实时信息查询天气、股价、航班数据库/知识库检索执行具体操作发送邮件、创建日历事件复杂计算模型不擅长的数学运算2. 天气查询实战从零到一的完整流程我们以接入和风天气API为例展示如何构建真实可用的天气查询功能。整个过程可分为五个关键步骤2.1 准备工作获取API密钥首先需要注册天气服务提供商。以和风天气为例访问和风天气开发者平台创建免费开发者账号在控制台获取API Key注意生产环境建议将API密钥存储在环境变量中不要直接硬编码在代码里2.2 定义函数Schema这是最关键的一步决定了模型如何理解和使用你的函数tools [{ type: function, name: get_current_weather, description: 获取指定位置的实时天气数据包括温度、天气状况和湿度, parameters: { type: object, properties: { location: { type: string, description: 城市名称如北京或上海 }, unit: { type: string, enum: [celsius, fahrenheit], description: 温度单位摄氏度或华氏度 } }, required: [location] } }]Schema设计要点description要清晰说明函数用途参数类型和格式要明确定义使用enum限制可选值范围标明必填参数(required)2.3 实现天气API调用接下来是实现实际的天气获取函数import requests def get_current_weather(location, unitcelsius): base_url https://api.qweather.com/v7/weather/now params { location: location, key: os.getenv(QWEATHER_KEY), unit: unit } try: response requests.get(base_url, paramsparams) data response.json() if data[code] 200: weather_data { temperature: data[now][temp], condition: data[now][text], humidity: data[now][humidity], unit: unit } return weather_data else: return {error: data[message]} except Exception as e: return {error: str(e)}错误处理最佳实践检查API返回的状态码捕获网络请求异常返回结构化的错误信息2.4 集成到OpenAI对话流程现在将上述组件整合到对话流程中from openai import OpenAI client OpenAI() def chat_with_weather(query): # 第一步模型决定是否调用函数 response client.chat.completions.create( modelgpt-4, messages[{role: user, content: query}], toolstools, tool_choiceauto ) # 检查是否需要调用函数 if response.choices[0].message.tool_calls: function_call response.choices[0].message.tool_calls[0] func_name function_call.function.name args json.loads(function_call.function.arguments) # 执行对应的函数 if func_name get_current_weather: weather_info get_current_weather(**args) # 将结果返回给模型生成最终回复 second_response client.chat.completions.create( modelgpt-4, messages[ {role: user, content: query}, response.choices[0].message, { role: tool, name: func_name, content: json.dumps(weather_info) } ] ) return second_response.choices[0].message.content return response.choices[0].message.content2.5 测试与优化测试不同形式的用户提问用户输入预期行为上海现在天气怎么样调用天气API返回实时数据明天会下雨吗应提示需要天气预报API巴黎铁塔多高直接回答不调用API根据测试结果优化函数描述和参数定义减少误调用。3. 进阶技巧与性能优化3.1 多函数并行调用OpenAI API支持同时定义多个函数模型会根据上下文智能选择tools [ { name: get_current_weather, # ...天气函数定义 }, { name: get_stock_price, description: 获取指定股票的实时价格, parameters: { type: object, properties: { symbol: { type: string, description: 股票代码如AAPL } }, required: [symbol] } } ]3.2 流式传输与进度反馈对于耗时较长的API调用可以使用流式传输提供实时反馈response client.chat.completions.create( modelgpt-4, messages[{role: user, content: 查询上海天气}], toolstools, streamTrue ) for chunk in response: if chunk.choices[0].delta.tool_calls: print(正在获取实时天气数据...)3.3 错误处理与重试机制健壮的生产级应用需要完善的错误处理def safe_function_call(func, *args, max_retries3, **kwargs): for attempt in range(max_retries): try: return func(*args, **kwargs) except Exception as e: if attempt max_retries - 1: return {error: str(e)} time.sleep(1 * (attempt 1))4. 生产环境最佳实践4.1 API密钥管理绝对不要将API密钥硬编码在代码中。推荐做法使用环境变量export QWEATHER_KEYyour_api_key密钥管理服务AWS Secrets ManagerHashiCorp VaultAzure Key Vault4.2 限流与缓存为防止API滥用和减少延迟from cachetools import TTLCache # 创建TTL缓存(5分钟过期) weather_cache TTLCache(maxsize1000, ttl300) def get_cached_weather(location): if location in weather_cache: return weather_cache[location] data get_current_weather(location) weather_cache[location] data return data4.3 监控与日志记录函数调用情况以便优化指标监控方式调用次数Prometheus计数器响应时间时序数据库错误率日志分析import logging logging.basicConfig( filenamefunction_calls.log, levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s ) def log_function_call(func_name, args, success): logging.info( fFunction {func_name} called with {args}. fSuccess: {success} )在实际项目中这套方案将AI回答的准确率从依赖记忆的约60%提升到了API驱动的98%以上。一个常见的陷阱是过度依赖函数调用——不是所有问题都需要实时数据关键是要让模型智能判断何时该调用外部API。

相关文章:

别再让ChatGPT瞎编了!用OpenAI Function Calling接入真实天气API,5分钟搞定实时数据查询

用OpenAI Function Calling构建真实数据驱动的AI应用:以天气查询为例 每次问ChatGPT"今天会下雨吗",它可能会给你一段充满诗意的回答——但很可能和实际情况毫无关系。这就是大模型"幻觉"问题的典型表现:当需要实时数据…...

手把手教你用Dify的‘知识库’功能,把热点数据喂给AI,打造专属的赛道咨询顾问

零代码打造AI赛道顾问:Dify知识库赋能自媒体热点挖掘新范式 当信息洪流以每秒百万级的速度冲刷各大内容平台时,真正有价值的趋势洞察往往淹没在数据噪音中。传统解决方案要求从业者掌握SQL查询、数据可视化甚至Python爬虫技能,这种技术门槛让…...

Qwen-Image定制镜像开源实操:RTX4090D环境下Qwen-VL微调与推理一体化

Qwen-Image定制镜像开源实操:RTX4090D环境下Qwen-VL微调与推理一体化 1. 镜像概述与环境准备 Qwen-Image定制镜像是专为RTX4090D显卡优化的多模态大模型开发环境,预装了完整的CUDA 12.4工具链和Qwen-VL模型依赖库。这个镜像最大的特点是开箱即用&#…...

从硅视网膜到仿生听觉:类脑传感器DVS/DAS的进化史与开源项目推荐

从硅视网膜到仿生听觉:类脑传感器DVS/DAS的进化史与开源项目推荐 当传统相机还在为帧率、动态范围和功耗苦苦挣扎时,一群科学家正从生物视觉系统中寻找答案。1991年,一位名叫Misha Mahowald的年轻学者在Carver Mead实验室里,将硅芯…...

ChromePass:三分钟高效找回Chrome浏览器所有保存密码的实用方案

ChromePass:三分钟高效找回Chrome浏览器所有保存密码的实用方案 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否曾经在登录重要网站时,明明记得在…...

5分钟体验AI图片编辑:FLUX.2-Klein-9B模型部署与功能实测

5分钟体验AI图片编辑:FLUX.2-Klein-9B模型部署与功能实测 1. 开篇:AI图片编辑新体验 你是否曾经想要修改一张照片中的服装、背景或添加文字,却苦于不会使用复杂的Photoshop?现在,借助FLUX.2-Klein-9B模型&#xff0c…...

GIS开发实战:5分钟搞定osgEarth中的WGS84与UTM坐标转换(附代码)

GIS开发实战:5分钟掌握osgEarth中的WGS84与UTM高效坐标转换 当你第一次在三维地形可视化项目中看到坐标值突然从熟悉的经纬度变成一串六位数时,是否也经历过那种手足无措的瞬间?去年在无人机航测项目中,我就因为UTM坐标转换参数设…...

如何快速上手Label Studio:机器学习数据标注的完整指南

如何快速上手Label Studio:机器学习数据标注的完整指南 【免费下载链接】label-studio 项目地址: https://gitcode.com/gh_mirrors/lab/label-studio 在构建机器学习模型的过程中,数据标注往往是耗时最长、最令人头疼的环节。😫 你是…...

Lingyuxiu MXJ LoRA SpringBoot企业级集成:微服务架构实践

Lingyuxiu MXJ LoRA SpringBoot企业级集成:微服务架构实践 Lingyuxiu MXJ LoRA创作引擎不是又一个通用图生图工具。它从底层就只做一件事:把"唯美真人人像"这件事做到稳定、可控、可复现。 1. 企业级AI集成的挑战与机遇 现在很多企业都在尝试…...

PP-DocLayoutV3参数详解:inference.pdmodel/inference.yml配置实战

PP-DocLayoutV3参数详解:inference.pdmodel/inference.yml配置实战 1. 引言:为什么你需要关注这个配置文件? 如果你用过PP-DocLayoutV3,可能会发现一个有趣的现象:有时候模型识别效果特别好,文档里的表格…...

Windows Forms现代化改造战略指南:MaterialSkin架构迁移与实施路径

Windows Forms现代化改造战略指南:MaterialSkin架构迁移与实施路径 【免费下载链接】MaterialSkin 项目地址: https://gitcode.com/gh_mirrors/mat/MaterialSkin 面向技术决策者与架构师的MaterialSkin深度技术评估与实施框架 - 在数字化转型浪潮中&#xf…...

all-MiniLM-L6-v2多场景实践:构建跨平台内容索引引擎

all-MiniLM-L6-v2多场景实践:构建跨平台内容索引引擎 1. 认识all-MiniLM-L6-v2:轻量高效的语义理解利器 all-MiniLM-L6-v2是一个专门为语义理解设计的轻量级模型,它能够将文本转换为具有语义含义的数字向量。简单来说,它就像是一…...

GTA5卡在‘正在初始化Social Club’?别急,试试这招DNS大法(附加速器白嫖攻略)

GTA5卡在“正在初始化Social Club”?终极网络优化方案 每次打开GTA5都卡在“正在初始化Social Club”界面?这种体验确实让人抓狂。作为一款全球热门的开放世界游戏,GTA5的线上模式需要稳定连接Rockstar Games服务器,而国内玩家常…...

Qwen3-32B-Chat百度开发者必读:Qwen3-32B-Chat与Qwen2.5性能对比实测

Qwen3-32B-Chat百度开发者必读:Qwen3-32B-Chat与Qwen2.5性能对比实测 1. 引言:为什么需要关注Qwen3-32B-Chat 作为百度开发者,你可能已经熟悉了Qwen系列大模型。最新发布的Qwen3-32B-Chat在多个维度实现了显著提升,特别是在RTX4…...

手把手教你用Comsol模拟超声空化气泡:从模型搭建到网格划分的完整流程

手把手教你用Comsol模拟超声空化气泡:从模型搭建到网格划分的完整流程 超声空化气泡的仿真在医学超声治疗、工业清洗等领域有着广泛应用。作为一名长期使用Comsol进行多物理场仿真的工程师,我经常遇到初学者询问如何准确模拟这一复杂现象。本文将分享一套…...

从零构建自主空中机器人:Ubuntu 20.04 + ROS Noetic 开发环境全攻略

1. 为什么选择Ubuntu 20.04 ROS Noetic? 如果你正在尝试开发自主空中机器人,那么Ubuntu 20.04和ROS Noetic的组合绝对是个不错的起点。作为一个在这个领域摸爬滚打多年的开发者,我见过太多新手因为环境配置问题而放弃,所以我决定…...

阿里云OSS文件上传避坑指南:从UUID命名到多环境配置的完整解决方案

阿里云OSS文件上传工程化实践:从UUID命名到多环境配置的完整解决方案 在当今的互联网应用开发中,文件存储服务已成为不可或缺的基础设施。阿里云对象存储服务(OSS)以其高可靠、高扩展的特性,成为众多开发者的首选。然而在实际工程实践中&…...

Qwen-Image开源大模型实战:RTX4090D上Qwen-VL支持视频关键帧图文理解

Qwen-Image开源大模型实战:RTX4090D上Qwen-VL支持视频关键帧图文理解 1. 环境准备与快速部署 1.1 硬件与镜像准备 在RTX 4090D显卡上部署Qwen-VL模型需要特定的环境配置。以下是关键硬件要求: GPU:NVIDIA RTX 4090D(24GB显存&…...

Qwen3.5-9B多场景应用案例:法律文书理解+合同关键信息提取

Qwen3.5-9B多场景应用案例:法律文书理解合同关键信息提取 1. 模型核心能力概述 Qwen3.5-9B作为新一代多模态大模型,在法律文书处理领域展现出显著优势。该模型基于unsolth框架优化,通过7860端口提供Gradio Web UI交互界面,支持C…...

OpenClaw配置可视化:QwQ-32B模型参数调优Web界面开发

OpenClaw配置可视化:QwQ-32B模型参数调优Web界面开发 1. 为什么需要模型参数可视化调优 在本地部署OpenClaw对接QwQ-32B模型的过程中,我发现一个痛点问题:每次调整模型参数都需要手动修改配置文件或通过命令行传递参数。这对于需要频繁测试…...

五、基于ITR触发的主从定时器协同控制实战

1. 理解ITR触发的主从定时器协同原理 在嵌入式开发中,精准时序控制就像交响乐团的指挥,需要精确协调各个乐器的演奏时机。STM32的ITR(Internal Trigger Connection)功能就是这样一个"指挥棒",它能让主定时器…...

Qt串口编程进阶:多线程实践与waitForReadyRead的陷阱规避

1. Qt串口编程的多线程挑战 在工业控制、物联网设备调试等场景中,串口通信的稳定性和实时性至关重要。很多开发者在使用Qt的QSerialPort进行串口编程时,会遇到一个典型问题:如何在保证UI流畅的同时,处理可能阻塞线程的串口读写操作…...

ChatTTS本地离线版本:从零搭建到性能优化的完整指南

最近在做一个需要语音合成的项目,用了一段时间的在线TTS服务,比如一些大厂提供的API。用起来是方便,但问题也慢慢暴露出来了:网络请求总有延迟,合成一句话要等个一两秒,体验很割裂;更关键的是&a…...

IAR链接器实战:三种RAM函数重定向机制的性能对比与选型指南

1. 为什么需要RAM函数重定向? 在嵌入式开发中,我们通常会把代码存放在Flash中执行。但有些特殊场景下,把关键函数放到RAM里运行能带来显著优势。想象一下,你正在开发一个工业控制设备,需要实时响应传感器信号。这时候如…...

Modbus寄存器40001和30001到底怎么用?5分钟搞懂PLC地址映射规则

Modbus寄存器40001与30001实战指南:PLC工程师必备的地址映射技巧 在工业自动化现场调试中,Modbus协议就像工程师的"普通话"——简单通用却暗藏玄机。记得我第一次面对PLC设备上闪烁的40001地址编号时,那种既熟悉又陌生的感觉至今难…...

SimpleDCMotor:基于SimpleFOC复用架构的直流电机闭环控制库

1. SimpleDCMotor 库概述SimpleDCMotor 是 SimpleFOC 生态中一个具有明确工程定位的补充性驱动库,其核心目标并非替代 SimpleFOC 的主干功能(即针对永磁同步电机 PMSM 的磁场定向控制 FOC),而是在不破坏原有架构的前提下&#xff…...

GLM-4.7-Flash应用实战:如何用它批量生成营销文案与社交媒体内容

GLM-4.7-Flash应用实战:如何用它批量生成营销文案与社交媒体内容 1. 为什么选择GLM-4.7-Flash进行内容创作 1.1 专业级内容生成能力 GLM-4.7-Flash作为30B参数级别的AI模型,在文本生成领域展现出惊人的创造力。不同于小型模型容易产生重复、空洞的内容…...

智能快递柜的隐藏成本:用STM32开发时那些没人告诉你的坑(实测数据+解决方案)

智能快递柜的隐藏成本:用STM32开发时那些没人告诉你的坑(实测数据解决方案) 当你第一次看到智能快递柜的商业计划书时,那些光鲜亮丽的数字——"99%识别准确率"、"5秒响应时间"、"降低30%人力成本"…...

Arduino嵌入式文件系统抽象库FS-Manager详解

1. 项目概述FS-Manager 是一款专为 Arduino 生态设计的嵌入式文件系统抽象层库,其核心定位是在资源受限的 MCU 平台上提供统一、健壮且易用的文件操作接口。它并非独立实现的文件系统,而是对底层 Flash 文件系统的高阶封装,当前明确支持 Litt…...

立知模型与LSTM结合:时序多模态内容排序方案

立知模型与LSTM结合:时序多模态内容排序方案 1. 引言 视频内容分析领域面临着一个常见但棘手的问题:如何对连续的视频字幕、截图序列等多模态内容进行智能排序?传统的文本排序方法难以处理视觉信息,而单纯的图像识别又无法理解时…...