news 2026/6/13 19:05:53

别再手动调API了!用GPT-3.5-turbo-0613的函数调用,5分钟搞定天气查询机器人

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再手动调API了!用GPT-3.5-turbo-0613的函数调用,5分钟搞定天气查询机器人

5分钟打造智能天气助手:GPT-3.5函数调用实战指南

上周帮朋友调试一个天气查询功能时,我惊讶地发现他还在用传统API对接方式——手动解析地址参数、处理错误响应、拼接返回结果。这让我想起三年前自己写的第一行天气查询代码,当时花了两天时间才搞定基础功能。而现在,借助GPT-3.5-turbo的函数调用特性,同样的事情只需要5分钟就能完成。

这个功能本质上让AI模型成为了你的"API翻译官"。你只需要用自然语言描述函数功能,模型就能自动将用户提问转化为结构化API请求。想象一下,当用户问"上海明天会下雨吗",系统会自动转换成类似get_weather(location="上海", date="2023-07-20")的调用,这比传统开发流程节省了90%的代码量。

1. 环境准备与基础配置

在开始前,确保你已准备好以下三样东西:

  1. OpenAI API密钥:从平台后台获取,建议设置合理的用量限制
  2. 天气API服务:推荐OpenWeatherMap的免费套餐(每天1000次调用)
  3. 开发环境:本文示例使用Python 3.8+,但核心逻辑适配任何语言

安装必要依赖:

pip install openai requests python-dotenv

创建.env文件存储敏感信息:

OPENAI_API_KEY=你的API密钥 WEATHER_API_KEY=你的天气API密钥

安全提示:永远不要将API密钥直接写入代码。使用环境变量或专业密钥管理服务

2. 定义天气查询函数

函数调用的核心在于明确定义你的外部工具能力。以下是一个完整的天气函数定义示例:

import json import requests from typing import Literal def get_current_weather( location: str, unit: Literal["celsius", "fahrenheit"] = "celsius" ) -> str: """获取指定城市的当前天气情况 Args: location: 城市名称,如"北京"或"New York" unit: 温度单位,默认为摄氏度 Returns: JSON格式的天气数据字符串 """ base_url = "https://api.openweathermap.org/data/2.5/weather" params = { "q": location, "appid": os.getenv("WEATHER_API_KEY"), "units": "metric" if unit == "celsius" else "imperial" } try: response = requests.get(base_url, params=params, timeout=5) data = { "temperature": response.json()["main"]["temp"], "unit": unit, "description": response.json()["weather"][0]["description"] } return json.dumps(data) except Exception as e: return json.dumps({"error": str(e)})

关键点说明:

  • 类型提示:使用Python的类型注解明确参数类型
  • 文档字符串:详细描述函数用途,这将成为AI理解功能的基础
  • 错误处理:确保异常情况下仍返回合法JSON

3. 构建AI交互管道

现在我们需要让GPT理解这个函数能力。以下是配置函数描述的完整代码:

from openai import OpenAI client = OpenAI() def ask_weather(query: str) -> str: # 定义函数描述(会被发送给AI理解) functions = [ { "name": "get_current_weather", "description": "获取指定城市的当前天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,如'北京'或'New York'", }, "unit": { "type": "string", "enum": ["celsius", "fahrenheit"], }, }, "required": ["location"], }, } ] # 第一步:发送用户查询给AI response = client.chat.completions.create( model="gpt-3.5-turbo-0613", messages=[{"role": "user", "content": query}], functions=functions, function_call="auto", ) # 第二步:处理AI返回的函数调用请求 if response.choices[0].message.function_call: function_name = response.choices[0].message.function_call.name if function_name == "get_current_weather": arguments = json.loads(response.choices[0].message.function_call.arguments) weather_data = get_current_weather(**arguments) # 第三步:将API结果返回给AI生成最终回复 second_response = client.chat.completions.create( model="gpt-3.5-turbo-0613", messages=[ {"role": "user", "content": query}, response.choices[0].message, { "role": "function", "name": function_name, "content": weather_data, }, ], ) return second_response.choices[0].message.content return response.choices[0].message.content

4. 实战测试与优化技巧

让我们测试几个典型场景:

案例1:基础查询

print(ask_weather("北京现在多少度?")) # 输出:北京当前气温为28摄氏度,天气晴朗。

案例2:单位转换

print(ask_weather("What's the temperature in New York in Fahrenheit?")) # 输出:The current temperature in New York is 75°F with clear skies.

案例3:模糊查询

print(ask_weather("明天上海天气怎么样?")) # 输出:我目前只能查询实时天气信息。上海现在的天气是...

通过测试我们发现几个常见问题及解决方案:

问题类型表现解决方案
时间范围用户询问未来天气在函数描述中明确说明仅支持实时查询
地点模糊"我家附近"等表述让AI先询问具体位置
API限制免费套餐调用超限添加速率限制和缓存机制

高级优化建议:

  1. 批量处理:当检测到多个函数调用需求时,可以并行执行API请求
  2. 本地缓存:对相同参数的查询结果缓存5-10分钟,减少API调用
  3. 备用数据源:当主天气API不可用时自动切换备用服务
# 缓存装饰器示例 from functools import lru_cache import time @lru_cache(maxsize=100) def cached_weather(location: str, unit: str): """带缓存的天气查询,有效期10分钟""" return get_current_weather(location, unit) # 在get_current_weather实现中添加时间戳验证

5. 扩展应用场景

这个模式可以轻松扩展到其他领域:

股票查询机器人

functions = [ { "name": "get_stock_price", "description": "获取指定股票的实时价格", "parameters": { "type": "object", "properties": { "symbol": {"type": "string"}, "currency": {"type": "string", "enum": ["USD", "CNY"]} } } } ]

酒店预订系统

functions = [ { "name": "search_hotels", "description": "搜索符合条件的酒店", "parameters": { "type": "object", "properties": { "location": {"type": "string"}, "check_in": {"type": "string", "format": "date"}, "check_out": {"type": "string", "format": "date"}, "max_price": {"type": "number"} } } } ]

实际项目中,我更喜欢将函数描述存储在JSON文件中,方便团队协作和维护:

// functions.json { "weather": { "name": "get_current_weather", "description": "...", "parameters": {...} }, "stock": { "name": "get_stock_price", "description": "...", "parameters": {...} } }

加载方式:

import json with open("functions.json") as f: function_registry = json.load(f) def get_function_config(name): return function_registry.get(name)

这种架构下,新增功能只需更新JSON文件,无需修改核心代码。上周刚用这种方式为客户的电商平台添加了物流查询功能,开发时间从预估的3人日压缩到2小时。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 18:50:53

2025-2026耐酸碱防腐涂料厂家深度评测:高温烟道防渗透工况选型指南(含实测参数+标杆案例)

针对化工、能源、环保行业高温烟道、化工储罐、污水处理池等严苛腐蚀工况,本文依托两大全球权威行业报告,搭建四维评测矩阵,横向测评国内5家头部耐酸碱防腐涂料厂家,完整公开产品耐温、耐酸碱浸泡、附着力等实测数据,同…

作者头像 李华
网站建设 2026/6/13 18:50:52

OpenBoard:基于AOSP的100%开源输入法架构深度解析

OpenBoard:基于AOSP的100%开源输入法架构深度解析 【免费下载链接】openboard 项目地址: https://gitcode.com/gh_mirrors/op/openboard 在移动设备输入法领域,隐私保护和开源自由已成为开发者与用户共同关注的核心议题。OpenBoard作为一款完全基…

作者头像 李华
网站建设 2026/6/13 18:46:58

Metrowerks宏汇编器深度指南:从HC12汇编到混合编程实战

1. 项目概述与核心价值 如果你曾经在嵌入式领域,尤其是基于Freescale(现NXP)HC12、HCS12或ColdFire系列微控制器的项目中摸爬滚打过,那么“Metrowerks”这个名字对你来说一定不陌生。它不仅仅是一个工具品牌,更是一个时…

作者头像 李华
网站建设 2026/6/13 18:41:21

【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理

大家好,我是程序员二叉。简介 线程池是后端开发高频核心考点,本文完整覆盖七大参数、执行流程、四类线程池、四种拒绝策略、阿里规范、核心线程计算、回收关闭、execute/submit差异、异常捕获全知识点。欢迎点赞关注收藏。一、线程池七大核心参数含义 co…

作者头像 李华