如何使用GPT-4o函数调用构建一个实时应用程序?

本教程介绍了如何使用OpenAI最新的LLM GPT-4o通过函数调用将实时数据引入LLM。

我们在LLM函数调用指南(详见https://thenewstack.io/a-comprehensive-guide-to-function-calling-in-llms/)中讨论了如何将实时数据引入聊天机器人和代理。现在,我们将通过将来自FlightAware.com的API与新的GPT-4o模型集成,进一步探究这个概念,以便实时跟踪航班状态。

FlightAware的AeroAPI是一个可靠的充分利用REST的API,提供按需访问航班跟踪和状态数据。它允许开发人员通过一个基于查询的简单系统,获取实时、历史或未来的航班信息。API支持基于航班标识符、飞机注册号或机场或运营商等位置的详细请求。它旨在以JSON格式提供精确、可操作的航空数据,支持整个航空业从航空公司到机场的运营需求。

在继续之前,注册FlightAware并获得API密钥,这对于调用REST API至关重要。免费的个人套餐足以完成本教程。

第1步:定义获取航班状态的函数

一旦您获得了API密钥,用Python创建以下函数来检索任何航班的状态。

import astimport jsonimport randomfrom datetime import datetime, timedeltaimport requestsimport pytzdef get_flight_status(flight):"""Returns Flight Information"""AEROAPI_BASE_URL = "https://aeroapi.flightaware.com/aeroapi"AEROAPI_KEY="YOUR FLIGHTAWARE API KEY"def get_api_session():session = requests.Session()session.headers.update({"x-apikey": AEROAPI_KEY})return sessiondef fetch_flight_data(flight_id, session):if "flight_id=" in flight_id:flight_id = flight_id.split("flight_id=")[1]    start_date = datetime.now().date().strftime('%Y-%m-%d')end_date = (datetime.now().date() + timedelta(days=1)).strftime('%Y-%m-%d')api_resource = f"/flights/{flight_id}?start={start_date}&end={end_date}"response = session.get(f"{AEROAPI_BASE_URL}{api_resource}")response.raise_for_status()return response.json()['flights'][0]def utc_to_local(utc_date_str, local_timezone_str):utc_datetime = datetime.strptime(utc_date_str, '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=pytz.utc)local_timezone = pytz.timezone(local_timezone_str)local_datetime = utc_datetime.astimezone(local_timezone)return local_datetime.strftime('%Y-%m-%d %H:%M:%S')    session = get_api_session()flight_data = fetch_flight_data(flight, session)dep_key = 'estimated_out' if 'estimated_out' in flight_data and flight_data['estimated_out'] else \'actual_out' if 'actual_out' in flight_data and flight_data['actual_out'] else \'scheduled_out'arr_key = 'estimated_in' if 'estimated_in' in flight_data and flight_data['estimated_in'] else \'actual_in' if 'actual_in' in flight_data and flight_data['actual_in'] else \'scheduled_in'    flight_details = {'flight':flight,'source': flight_data['origin']['city'],'destination': flight_data['destination']['city'],'depart_time': utc_to_local(flight_data[dep_key], flight_data['origin']['timezone']),'arrival_time': utc_to_local(flight_data[arr_key], flight_data['destination']['timezone']),'status': flight_data['status']}return json.dumps(flight_details)flight_info = get_flight_status("EK524")print(flight_info)#'{"flight": "EK524", "source": "Dubai", "destination": "Hyderabad", "depart_time": "2024-05-23 22:00:00", "arrival_time": "2024-05-24 03:05:00", "status": "Scheduled"}'

虽然代码很简单,但还是不妨解释一下关键步骤。

get_flight_status函数接受一个航班参数(假设是航班标识符),并以JSON格式返回格式化的航班详细信息。它查询AeroAPI以根据给定的航班标识符获取航班数据,并确定关键细节的格式,比如出发地、目的地、离开时间、到达时间和状态。

不妨看看脚本的组件:

API凭据:

AEROAPI_BASE_URL是FlightAware AeroAPI的基础URL。

AEROAPI_KEY是用于身份验证的API密钥。

会话管理:

get_api_session:这个嵌套函数初始化请求。会话对象使用API密钥设置所需的报头,并返回会话对象。该会话将处理所有API请求。

数据获取:

fetch_flight_data:这个函数接受flight_id和session作为参数。它使用适当的日期过滤器构造端点URL,用于获取一天的数据,并发送GET请求以检索航班数据。该函数处理API响应,并提取相关的航班信息。

时间转换:

utc_to_local:根据所提供的时区字符串将UTC时间(来自API响应)转换为本地时间。这个函数可以帮助我们获得基于城市的到达和离开时间。

数据处理:

脚本根据估计或实际时间的可用性确定离开时间和到达时间的键,并返回到计划时间。然后,它构造一个含有格式化航班详细信息的字典。

上面的截图显示了我们从FlightAware API收到的从迪拜飞往海得拉巴的阿联酋航空EK524航班的响应信息。请注意,到达和离开时间是基于城市的当地时间。

我们的目的是将该函数与GPT-4 Omni集成,使其能够实时访问航班跟踪信息。

第2步:用GPT- 4o实现函数调用

不妨从导入OpenAI库并初始化它入手。

from openai import OpenAI
client = OpenAI()

这一行创建了OpenAI类的一个实例。这个实例(客户端)将用于与OpenAI API交互。

我们将定义一个名为tools的列表,含有一个字典,该字典指定了函数get_flight_status。该函数旨在用作OpenAI API上下文中的工具,描述参数和所需输入。

繁重工作在下面的函数中进行,其中LLM检查提示以确定是否需要调用函数/工具,然后继续生成适当的响应。

def chatbot(prompt):# Step 1: send the conversation and available functions to the modelmessages = [{"role": "user", "content": prompt}]response = client.chat.completions.create(model="gpt-4o",messages=messages,tools=tools,tool_choice="auto")response_message = response.choices[0].messagetool_calls = response_message.tool_calls# Step 2: check if the model wanted to call a functionif tool_calls:available_functions = {"get_flight_status": get_flight_status,}  messages.append(response_message)  # Step 3: send the function response to the modelfor tool_call in tool_calls:function_name = tool_call.function.namefunction_to_call = available_functions[function_name]function_args = json.loads(tool_call.function.arguments)function_response = function_to_call(flight=function_args.get("flight"))messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": function_response,})  final_response = client.chat.completions.create(model="gpt-4o",messages=messages,)  return final_response

这个函数chatbot接受用户提示,并使用OpenAI API对其进行处理。它将提示和定义的工具发送到OpenAI模型并处理响应。

通过嵌入来自用户的提示并将其发送到OpenAI API(chat.completion .create)来创建消息。API使用指定的工具(如果适用)处理这些消息。

比如说,当我们发送提示“EK524的状态是什么?”,GPT- 4o需要调用工具列表中提供的函数,并返回以下响应:

注意,响应包括函数(get_flight_status)和参数(EK226)。

下一步检查是否调用了任何工具(即工具中的函数)。它使用提供的参数执行这些函数,将它们的输出集成到对话中,并将这些更新后的信息发回到OpenAI API以进行进一步处理。

# Step 2: check if the model wanted to call a functionif tool_calls:available_functions = {"get_flight_status": get_flight_status,}  messages.append(response_message)  # Step 3: send the info for each function call and function response to the modelfor tool_call in tool_calls:function_name = tool_call.function.namefunction_to_call = available_functions[function_name]function_args = json.loads(tool_call.function.arguments)function_response = function_to_call(flight=function_args.get("flight"))messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": function_response,})

此时,messages列表包括原始提示、带有函数名和变量的初始响应以及函数的实际输出。下面的屏幕截图显示了含有所有要素的列表。

由于来自工具的响应附加到历史记录中,我们可以调用聊天完成端点,从LLM获得最终答案。

final_response = client.chat.completions.create(model="gpt-4o",messages=messages,)  return final_response

final_response对象有我们所寻找的答案:

将提示发送给函数chatbot将返回指定航班的实时状态。

下面是本教程的完整代码:

from openai import OpenAI#Initialize the environment variable OPENAI_API_KEY with your api keyclient = OpenAI()#Function is available at 
https://gist.github.com/janakiramm/2143b909626f5f01d64739e3fe90c9c8tools = [{"type": "function","function": {"name": "get_flight_status","description": "Get status of a flight","parameters": {"type": "object","properties": {"flight": {"type": "string","description": "Flight number"}},"required": ["flight"]}}}]def chatbot(prompt):# Step 1: send the conversation and available functions to the modelmessages = [{"role": "user", "content": prompt}]response = client.chat.completions.create(model="gpt-4o",messages=messages,tools=tools,tool_choice="auto")response_message = response.choices[0].messagetool_calls = response_message.tool_calls# Step 2: check if the model wanted to call a functionif tool_calls:available_functions = {"get_flight_status": get_flight_status,}  messages.append(response_message)  # Step 3: send the info for each function call and function response to the modelfor tool_call in tool_calls:function_name = tool_call.function.namefunction_to_call = available_functions[function_name]function_args = json.loads(tool_call.function.arguments)function_response = function_to_call(flight=function_args.get("flight"))messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": function_response,}) final_response = client.chat.completions.create(model="gpt-4o",messages=messages,)  return final_responseres=chatbot("What's the status of EK226?")print(res.choices[0].message.content)

我们在本教程中探讨了如何通过函数调用将实时数据引入LLM。在本系列的下一部分中,我们将把GPT-4o换成Gemini Pro,以探究相同的概念,但使用不同的模型。

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

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

相关文章

bat脚本简介

一、bat脚本 概念定义 BAT 批处理是一种在 Windows 系统中用于将一系列命令组合成一个可执行文件(.bat 文件)的脚本技术。 允许用户将多个操作命令按顺序编写在一起。形成一个自动化执行的流程。批处理文件可以包含各种系统命令和程序调用。 如文件操作…

中国现在最厉害的书法家颜廷利:东方伟大思想家哲学家教育家

中国书法界名人颜廷利教授,一位在21世纪东方哲学、科学界及当代中国教育领域内具有深远影响力的泰斗级人物,不仅以其深厚的国学修为和对易经姓名学的独到见解著称,还因其选择在济南市历城区的龙泉大街以及天桥区的凤凰山庄与泉星小区等地设立…

如何在隔离环境中设置 LocalAI 以实现 GPU 驱动的文本嵌入

作者:来自 Elastic Valeriy Khakhutskyy 你是否想在 Elasticsearch 向量数据库之上构建 RAG 应用程序?你是否需要对大量数据使用语义搜索?你是否需要在隔离环境中本地运行?本文将向你展示如何操作。 Elasticsearch 提供了多种方法…

Laravel学习-控制器

一. 创建创建控制器的命令 php artisan make:controller TestController 二. 单行为控制器 意思是,在定义路由时不用定义指定方法了,他会自己找默认的方法 php artisan make:controller showProfile --invokableRoute::get(profile, 类名的命名空间方…

多曝光融合算法(三)cv2.createAlignMTB()多曝光图像融合的像素匹配问题

文章目录 1.cv2.createAlignMTB() 主要是计算2张图像的位移,假设位移移动不大2.多曝光图像的aline算法:median thresold bitmap原理讲解3.图像拼接算法stitch4.多曝光融合工具箱 1.cv2.createAlignMTB() 主要是计算2张图像的位移,假设位移移动…

Python中猴子补丁是什么,如何使用

1、猴子补丁奇遇记 🐒 在Python的世界深处,隐藏着一种神秘而又强大的技巧——猴子补丁(Monkey Patching)。这是一项允许你在程序运行时动态修改对象(如模块、类或函数)的行为的技术。它得名于其“快速修补…

.net后端程序发布到nignx上,通过nginx访问

后端端口是:5009,ngixn端口5001 ,域名是 www.ckdq.site server { listen 5001; #server_name localhost; server_name www.ckdq.site; location / { proxy_pass http://localhost:5009; proxy_http_version 1.1; proxy_set_header Upgrade…

问题排查: Goalng Defer 带来的性能损耗

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言问题背景结论 引言 性能优化之路道阻且长,因为脱敏规定,…

vite常识性报错解决方案

1.导入路径不能以“.ts”扩展名结束。考虑改为导入“xxx.js” 原因:当你尝试从一个以 .ts 结尾的路径导入文件时,ESLint 可能会报告这个错误,因为它期望导入的是 JavaScript 文件(.js 或 .jsx)而不是 TypeScript 文件&…

coap-emqx:使用libcoap与emqx通信

# emqx开启CoAP网关 请参考【https://blog.csdn.net/chenhz2284/article/details/139562749?spm1001.2014.3001.5502】 # 写一个emqx的客户端程序&#xff0c;不断地往topic【server/1】发消息 【pom.xml】 <dependency><groupId>org.springframework.boot<…

速盾:高防 CC CDN 的优势剖析

在当今数字化的世界中&#xff0c;网络安全和性能优化至关重要。高防 CC CDN 作为一种先进的技术组合&#xff0c;展现出了诸多显著的优势。 首先&#xff0c;高防 CC 部分能够提供强大的抵御 CC 攻击的能力。CC 攻击往往会造成服务器资源的大量消耗&#xff0c;导致正常服务受…

雪花雪花雪花

/* * Project: 0x14_Hash * File Created:Monday, January 18th 2021, 10:21:24 am * Author: Bug-Free * Problem:AcWing 137. 雪花雪花雪花 */ #include <cstdio> #include <cstring> #include <iostream> #include <vector> #define ll long …

开源与新质生产力

在这个信息技术迅猛发展的时代&#xff0c;全球范围内的产业都在经历着深刻的变革。在这样的背景下&#xff0c;“新质生产力”的概念引起了广泛的讨论。无论是已经成为或正努力转型成为新质生产力的企业&#xff0c;都在寻求新的增长动力和竞争优势。作为一名长期从事开源领域…

JavaScript 编程语言【 数据类型】日期和时间

文章目录 日期和时间创建访问日期组件设置日期组件自动校准&#xff08;Autocorrection&#xff09;日期转化为数字&#xff0c;日期差值Date.now()基准测试&#xff08;Benchmarking&#xff09;对字符串调用 Date.parse总结✅任务创建日期显示星期数欧洲的星期表示方法许多天…

数据交换平台_05_ 监控和管理消息队列

数据交换平台_05_ 监控和管理消息队列 目录概述需求:设计思路实现思路分析1.监控和管理消息拓展实现参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,…

哈希算法实现

哈希算法概述 哈希算法(Hashing Algorithm)是一种将输入数据映射到固定大小的哈希值的算法,用于高效的查找和插入操作。哈希表(Hash Table)是哈希算法的典型应用,通过哈希函数将键映射到表中的索引位置,从而实现快速的数据存取。 以下是哈希表的一个简单实现,以及如何使…

Linux用户和用户组的管理

目录 前言一、系统环境二、Linux用户组的管理2.1 新增用户组2.2 删除用户组2.3 修改用户组2.4 查看用户组 三、Linux用户的管理3.1 新增用户3.2 删除用户3.3 修改用户3.4 查看用户3.5 用户口令&#xff08;密码&#xff09;的管理 总结 前言 本篇文章介绍如何在Linux系统上实现…

OrangePi Kunpeng Pro深度评测:性能与体验的完美融合

文章目录 一、引言二、硬件开箱与介绍1.硬件清单2.硬件介绍 三、软件介绍四、性能测试1. 功率测试2. cpu测试2.1 单线程cpu测试2.2 多线程cpu测试 五、实际开发体验1. 搭建API服务器2. ONNX推理测试3. 在线推理平台 五、测评总结1. 能与硬件配置2. 系统与软件3. 实际开发体验个…

jQuery:一站式指南

目录 jQuery&#xff1a;一站式指南前言1. jQuery简介1.1 jQuery的历史1.2 jQuery的安装 2. jQuery的核心概念2.1 选择器2.2 操作DOM2.2.1 内容操作2.2.2 属性操作2.2.3 CSS操作2.2.4 DOM结构操作 2.3 事件处理2.3.1 绑定事件2.3.2 事件委托2.3.3 解绑事件 3. jQuery的动画与效…

Unity物体材质属性Offset动态偏移

Unity物体材质属性Offset动态偏移 MeshRenderer mr;float offset;public float scrollSpeed 0.5F;private void Start(){mr GetComponent<MeshRenderer>();}void Update(){offset -Time.time * scrollSpeed;mr.material.mainTextureOffset new Vector2(0, -offset);}…