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

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

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

当开发者第一次接触大语言模型的函数调用能力时,往往会陷入复杂的API文档和参数配置中。但事实上,只需5分钟和一个简单的天气查询场景,你就能掌握这项改变游戏规则的技术。本文将带你从零开始,用实际代码演示如何构建一个能理解自然语言、自动调用天气API并生成友好回复的智能助手。

1. 环境准备与基础配置

在开始编码之前,我们需要准备好开发环境。与传统的API调用不同,函数调用功能需要特定版本的模型支持。以下是必要的准备工作:

必备工具清单

  • OpenAI账号及API密钥(从平台后台获取)
  • Python 3.7+环境
  • 官方openai库(版本≥0.27.0)
  • 一个可用的天气API(如OpenWeatherMap)

安装依赖只需一行命令:

pip install openai requests python-dotenv

建议将API密钥存储在环境变量中,避免硬编码在脚本里。创建.env文件:

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

提示:使用python-dotenv加载环境变量时,确保.gitignore中添加了.env,防止敏感信息泄露

2. 定义天气查询函数

函数调用的核心在于明确定义工具函数的结构和用途。我们需要创建一个能让模型理解的天气查询函数描述:

import json import requests from openai import OpenAI client = OpenAI() def get_current_weather(location: str, unit: str = "celsius"): """获取指定地区的当前天气情况 Args: location: 城市名,如"北京"或"New York" unit: 温度单位,"celsius"或"fahrenheit" """ # 这里替换为实际的天气API调用 params = { "q": location, "units": "metric" if unit == "celsius" else "imperial", "appid": os.getenv("WEATHER_API_KEY") } response = requests.get("https://api.openweathermap.org/data/2.5/weather", params=params) return response.json() # 供模型识别的函数描述 weather_function = { "name": "get_current_weather", "description": "获取指定地区的当前天气信息", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市及国家/地区,如'北京,中国'" }, "unit": { "type": "string", "enum": ["celsius", "fahrenheit"], "description": "温度单位" } }, "required": ["location"] } }

这个JSON结构定义了函数的所有关键信息:

  • name: 函数标识符
  • description: 帮助模型理解何时调用该函数
  • parameters: 详细的参数规范,包括类型、描述和约束

3. 实现智能对话流程

现在我们来构建完整的对话处理流程。整个过程分为三个关键阶段:

3.1 初始用户请求处理

def chat_with_ai(user_query): response = client.chat.completions.create( model="gpt-3.5-turbo-16k", messages=[{"role": "user", "content": user_query}], functions=[weather_function], function_call="auto", ) return response.choices[0].message

当用户询问"上海现在天气怎么样?"时,模型可能返回:

{ "role": "assistant", "content": null, "function_call": { "name": "get_current_weather", "arguments": "{\"location\":\"上海,中国\"}" } }

3.2 执行外部API调用

解析模型返回的function_call并执行实际天气查询:

def execute_function_call(message): if message.function_call.name == "get_current_weather": args = json.loads(message.function_call.arguments) weather_data = get_current_weather(**args) return { "name": "get_current_weather", "content": json.dumps(weather_data) } return None

3.3 生成最终用户回复

将API结果返回给模型进行自然语言转换:

def get_ai_response_with_data(user_query, function_response): messages = [ {"role": "user", "content": user_query}, { "role": "function", "name": function_response["name"], "content": function_response["content"] } ] response = client.chat.completions.create( model="gpt-3.5-turbo-16k", messages=messages ) return response.choices[0].message.content

完整调用示例:

# 用户提问 query = "旧金山现在的气温是多少?用华氏度显示" initial_response = chat_with_ai(query) # 获取函数调用参数并执行 func_args = json.loads(initial_response.function_call.arguments) func_args["unit"] = "fahrenheit" # 覆盖用户指定的单位 weather_result = get_current_weather(**func_args) # 生成最终回复 final_response = get_ai_response_with_data( query, {"name": "get_current_weather", "content": json.dumps(weather_result)} ) print(final_response)

可能的输出: "旧金山目前气温为68°F,天气晴朗,风速每小时5英里。"

4. 错误处理与优化技巧

在实际应用中,我们需要考虑各种边界情况和异常处理:

常见问题解决方案

问题类型可能原因解决方案
地点不明确用户输入"北方"这类模糊地点让模型要求用户澄清
API限制天气服务调用次数超限实现缓存机制,存储最近查询结果
参数错误模型返回的参数格式不正确添加参数验证逻辑
网络延迟第三方API响应慢设置合理超时,添加重试机制

增强版的错误处理示例:

def safe_get_weather(location, unit): try: return get_current_weather(location, unit) except requests.exceptions.RequestException as e: return {"error": f"天气服务暂时不可用: {str(e)}"} except json.JSONDecodeError: return {"error": "天气数据解析失败"}

对于用户体验优化,可以考虑:

  • 添加对话历史支持多轮交互
  • 实现本地缓存减少API调用
  • 支持更灵活的地点输入(如"我家附近"需要结合位置服务)
# 对话历史保持示例 conversation_history = [] def chat_with_history(user_input): global conversation_history conversation_history.append({"role": "user", "content": user_input}) response = client.chat.completions.create( model="gpt-3.5-turbo-16k", messages=conversation_history, functions=[weather_function] ) message = response.choices[0].message conversation_history.append(message) if hasattr(message, 'function_call'): # 处理函数调用... pass return message

注意:实际项目中建议限制对话历史长度,避免超出模型的上下文窗口

通过这个完整的天气机器人示例,我们不仅实现了基本功能,还考虑了生产环境需要的健壮性和用户体验。函数调用的真正价值在于它让大语言模型成为了一个智能的"决策中心",能够自主判断何时以及如何调用外部工具,开发者只需定义好这些工具的使用规范即可。

http://www.jsqmd.com/news/1003883/

相关文章:

  • 2026年618优麦云/卖家精灵/达人精灵 折扣码限时优惠礼遇​ - 李先生sir
  • MYSQL RR 解决“脏读+不可重复读“和“幻读“的本质区别
  • 如何免费实现7种音频格式高效转换:FlicFlac专业解决方案指南
  • 2026南通全媒体运营TOP榜单:短视频策划拍摄/账号运营/话题打造/达人联动/信息流投放/微信公众号及视频号内容运营与活动策划一站式优选 - 品牌发掘
  • 2026年 厦门连接线/端子线/电子线/排线/跳线/USB连接线/插头线厂家推荐:精准传输与耐用工艺之选 - 品牌发掘
  • 2026年 江西凉亭厂家推荐榜单:六角/八角/双层/四角凉亭,古韵匠心与户外园林精品之选 - 品牌发掘
  • Linux inode_permission inode权限检查与acl处理
  • 别再找旧脚本了!MMdetection 3.X 版本官方工具一键生成PR曲线图(附完整配置流程)
  • 2026年C语言找工作难吗?普通人还能找到好工作吗?
  • 兰州黄金回收实测 余生珍宝六店行情解析 - 余生黄金回收
  • C盘存储爆红,哪些文件类型可以安全删除?一张清单分三档
  • CVI工程中直接调用自定义DLL的实操资源包(含双项目源码与一键构建脚本)
  • Python生产级API设计:可观测、可演进、可防御的请求生命周期治理
  • TMS320F28335四层小板:6×8cm带USB供电、JTAG下载、复位键和全引脚标注
  • 六盘水珍宝黄金回收测评 2026买金避坑指南 - 余生黄金回收
  • 浙江大学LaTeX论文模板:5分钟快速生成专业毕业论文的终极指南
  • 避开回收套路荆州六大黄金门店测评 - 余生黄金回收
  • 2026年英文降AIGC率指南:别盲目同义词替换!5种降AI高效方法实测(附工具测评) - 降AI实验室
  • C盘大文件怎么搬到D盘或其他分区?从定位到迁移的完整操作
  • 别再只会录宏了!WPS JS宏实战:用filter和箭头函数5分钟搞定数据清洗
  • Spring Boot 文件上传大小限制配置全解析
  • 从英国到葡萄牙,这群欧洲青年为何把目光投向中国开源?
  • 寄行李大件什么物流最省钱?用“寄半折”比价立省一半 - 快递物流资讯
  • 2026甘孜州权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • Logisim 2.7.1 手把手:从零搭建一个支持13种运算的32位MIPS ALU(附完整电路图)
  • 2026年北京企业法律顾问怎么挑?5个核心关键点防踩雷 - 本地品牌推荐
  • STM32CubeMX配置I2C驱动AT24C64 EEPROM,手把手教你搞定用户设置数据存储(附完整工程代码)
  • 2026年q2正规青年旅行社官网品牌技术维度解析:美国旅游/318川藏线自驾游/中国青年旅行社官网/优选推荐 - 优质品牌商家
  • 2026年新中式门楼设计施工服务商评测:五大品牌对比 - 优质品牌商家
  • 保姆级教程:用ADB命令备份与删除长安UNI-V车机自带软件(附完整命令清单)