当前位置: 首页 > 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.gsyq.cn/news/1515663.html

相关文章:

  • MYSQL RR 解决“脏读+不可重复读“和“幻读“的本质区别
  • 如何免费实现7种音频格式高效转换:FlicFlac专业解决方案指南
  • 2026年 江西凉亭厂家推荐榜单:六角/八角/双层/四角凉亭,古韵匠心与户外园林精品之选 - 品牌发掘
  • C盘存储爆红,哪些文件类型可以安全删除?一张清单分三档
  • 兰州黄金回收实测 余生珍宝六店行情解析 - 余生黄金回收
  • 2026年英文降AIGC率指南:别盲目同义词替换!5种降AI高效方法实测(附工具测评) - 降AI实验室
  • 别再只会录宏了!WPS JS宏实战:用filter和箭头函数5分钟搞定数据清洗
  • C盘大文件怎么搬到D盘或其他分区?从定位到迁移的完整操作
  • 2026甘孜州权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • 2026年q2正规青年旅行社官网品牌技术维度解析:美国旅游/318川藏线自驾游/中国青年旅行社官网/优选推荐 - 优质品牌商家
  • 保姆级教程:用ADB命令备份与删除长安UNI-V车机自带软件(附完整命令清单)
  • Windows电脑频繁弹广告怎么彻底清除?从定位来源到卸载残留的完整方法
  • 长沙鑫合诚新能源物流车联系电话多少?快速获取 - 工业品牌热点
  • 别再手动填数据了!Vivado 2023.2 中一键生成 .coe 文件并配置 ROM IP 核的保姆级教程
  • 2026实力之选:广东单头加热管厂家如何应对全场景定制挑战? - 品牌发掘
  • 临汾余生黄金回收实测 2026六家门店价格对比 - 余生黄金回收
  • 靠谱的HIP热等静压推荐供应商,顶立科技,售后响应快 - 工业品牌热点
  • Python原生OLAP BI平台:atoti实战指南
  • 荆州闲置黄金变现六家正规机构盘点 - 余生黄金回收
  • AR 巡检落地案例与优质厂商推荐
  • 球对称流形上的Sobolev嵌入定理与应用
  • 多维聚合中的数据变形术:从GROUP BY到决策表的四步重构
  • 性价比高的托育机构,湘蒙在宝宝语言启蒙培养方面表现突出 - 工业品牌热点
  • 建筑保温材料厂主要分布在哪些产区?全国版图盘点
  • Xilinx FPGA上LVDS与CameraLink高速图像接口的完整工程实现(含VHDL/Verilog源码及Vivado工程)
  • 2026阜阳市权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • 构建高性能AI内容创作引擎:ComfyUI模块化架构深度解析
  • 荆州黄金回收实测六家靠谱门店 - 余生黄金回收
  • 2026年全自动压滤机租赁市场深度分析:谁更值得合作? - 优质品牌商家
  • 2026年职业发展证书清单,AI证书适合提前布局吗