如何使用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,以探究相同的概念,但使用不同的模型。
相关文章:
如何使用GPT-4o函数调用构建一个实时应用程序?
本教程介绍了如何使用OpenAI最新的LLM GPT-4o通过函数调用将实时数据引入LLM。 我们在LLM函数调用指南(详见https://thenewstack.io/a-comprehensive-guide-to-function-calling-in-llms/)中讨论了如何将实时数据引入聊天机器人和代理。现在,我们将通过将来自Fligh…...
[Vue-常见错误]浏览器显示Uncaught runtime errors
文章目录 错误描述正确写法具体如下 错误描述 当前端代码发生错误时,浏览器中出现以下错误提示。 正确写法 显然这不是我们所期望的,在vue.config.js中配置如下设置关闭Uncaught runtime errors显示 devServer: {client: {overlay: false}具体如下 …...
html常见的表单元素有哪些,html表单元素有哪些?
HTML中常用的表单元素包括:文本区域(TEXTAREA),列表框(SELECT),文本输入框(INPUT typetext),密码输入框(INPUT typepassword),单选输入框(INPUT typeradio),复选输入框(INPUT typecheckbox),重置…...
spring boot sso
代码:https://gitee.com/forgot940629/ssov2 授权服务 登录成功后,session中会存储UsernamePasswordAuthenticationToken,之后每次请求code时都会用UsernamePasswordAuthenticationToken生成OAuth2Authentication,并将OAuth2Aut…...
Keras深度学习框架实战(5):KerasNLP使用GPT2进行文本生成
1、KerasNLP与GPT2概述 KerasNLP的GPT2进行文本生成是一个基于深度学习的自然语言处理任务,它利用GPT-2模型来生成自然流畅的文本。以下是关于KerasNLP的GPT2进行文本生成的概述: GPT-2模型介绍: GPT-2(Generative Pre-trained …...
速盾:网站重生之我开了高防cdn
在互联网的广袤海洋中,网站就如同一个个独立的岛屿,面临着各种风雨和挑战。而作为一名专业程序员,我深知网站安全和性能的重要性。当我的网站遭遇频繁的攻击和访问压力时,我毅然决定开启高防 CDN,开启了一场网站的重生…...
【spark】spark列转行操作(json格式)
前言:一般我们列转行都是使用concat_ws函数或者concat函数,但是concat一般都是用于字符串的拼接,后续处理数据时并不方便。 需求:将两列数据按照设备id进行分组,每个设备有多个时间点位和对应值,将其一一对…...
记录一次Linux启动kafka后并配置了本地服务连接远程kafka的地址后依旧连接localhost的问题
问题的原因 我是使用docker来安装并启动kafka 的,所以在启动过程中并没有太多需要配置的地方,基本都是从网上照搬照抄,没动什么脑子,所以看着启动起来了觉得就没事了,但是运行项目的时候发现,我明明已经配…...
MacOS中Latex提示没有相关字体怎么办
在使用mactex编译中文的时候,遇到有些中文字体识别不到的情况,例如遇到识别不到Songti.ttc。其实这个时候字体是在系统里面的,但是只不过是latex没有找到正确的字体路径。 本文只针对于系统已经安装了字体库并且能够用find命令搜到࿰…...
物资材料管理系统建设方案(Word)—实际项目方案
二、 项目概述 2.1 项目背景 2.2 现状分析 2.2.1 业务现状 2.2.2 系统现状 三、 总体需求 3.1 系统范围 3.2 系统功能 3.3 用户分析 3.4 假设与依赖关系 四、 功能需求 4.4.11.7 非功能性需求 五、 非功能性需求 5.1 用户界面需求 5.2 软硬件环境需求 5.3 产品质量需求 5.4 接口…...
!力扣102. 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] /*** Definition for…...
Vue3 + TS + Antd + Pinia 从零搭建后台系统(一) 脚手架搭建 + 入口配置
简易后台系统搭建开启,分几篇文章更新,本篇主要先搭架子,配置入口文件等目录 效果图一、搭建脚手架:二、处理package.json基础需要的依赖及运行脚本三、创建环境运行文件四、填充vue.config.ts配置文件五、配置vite-env.d.ts使项目…...
中国同胞进来看看,很多外国人想通过CSDN坑咱们中国人
地址:【诈骗离你我很近】中国同胞进来看看国外诈骗新套路。-CSDN博客...
Web前端电话咨询:深度解析与实用指南
Web前端电话咨询:深度解析与实用指南 在数字化时代,Web前端技术日新月异,对于许多企业和个人而言,通过电话咨询了解前端技术的最新动态和解决方案已成为一种高效且便捷的方式。本文将从四个方面、五个方面、六个方面和七个方面&a…...
使用python绘制季节图
使用python绘制季节图 季节图效果代码 季节图 季节图(Seasonal Plot)是一种数据可视化图表,用于展示时间序列数据的季节性变化。它通过将每个时间段(如每个月、每个季度)的数据绘制在同一张图表上,使得不同…...
VS2019专业版 C#和MFC安装
1. VS2019专业版下载地址 https://learn.microsoft.com/en-us/visualstudio/releases/2019/history 2.安装 C# 部分 MFC部分...
spring入门aop和ioc
文章目录 spring分层架构表现层服务层(业务层)持久层 spring核心ioc(控制反转)1)**接下来是代码示例:**2)**ioc容器的使用过程**3)ioc中的bean管理4)实例化bean的三种方式 aop(面向切面开发) 定…...
使用Python创建Word文档
使用Python创建Word文档 安装python-docx库创建Word文档代码效果 在这篇文章中,我们将介绍如何使用 Python创建一个Word文档。首先,我们需要安装python-docx库,然后通过一段简单的代码示例展示如何创建和编辑Word文档。 安装python-docx库 …...
【设计模式】装饰器模式(结构型)⭐⭐
文章目录 1.概念1.1 什么是装饰器模式1.2 优点与缺点 2.实现方式3. Java 哪些地方用到了装饰器模式4. Spring 哪些地方用到了装饰器模式 1.概念 1.1 什么是装饰器模式 它允许用户在不修改现有对象的代码的情况下向对象添加新的功能;这种模式是通过创建一个包含该对…...
计算机网络--应用层
计算机网络–计算机网络概念 计算机网络–物理层 计算机网络–数据链路层 计算机网络–网络层 计算机网络–传输层 计算机网络–应用层 1. 概述 因为不同的网络应用之间需要有一个确定的通信规则。 1.1 两种常用的网络应用模型 1.1.1 客户/服务器模型(Client/Se…...
计算机网络 —— 网络层(IP数据报)
计算机网络 —— 网络层(IP数据报) 网络层要满足的功能IP数据报IP数据报格式IP数据报首部格式数据部分 IP数据报分片 我们今天进入网络层的学习。 网络层要满足的功能 网络层作为OSI模型中的第三层,是计算机网络体系结构的关键组成部分&…...
Clo3D导出服装动画,使用Unity3D展示
1.前言 Clo3D是一款应用于时装行业的3D服装设计软件,其强大的布料模拟算法可在3D空间中实现设计、制版、试衣和走秀,大幅提升数字作品逼真度和制作效率。为了让服装动画效果展示在Unity3D上模拟效果,需要Clo3D模拟出逼着的衣服动画。总体流程为Clo3D - Mixamo -Blen…...
LSTM 词语模型上的动态量化
原文链接 (beta) Dynamic Quantization on an LSTM Word Language Model — PyTorch Tutorials 2.3.0cu121 documentation 引言 量化涉及将模型的权重和激活值从浮点数转换为整数,这样可以缩小模型大小,加快推理速度,但对准确性的影响很小…...
STM32 proteus + STM32Cubemx仿真教程(第一课LED教程)
文章目录 前言一、STM32点亮LED灯的原理1.1GPIO是什么1.2点亮LED灯的原理 二、STM32Cubemx创建工程三、proteus仿真电路图四、程序代码编写1.LED灯操作函数介绍HAL_GPIO_WritePin函数原型参数说明示例代码 HAL_GPIO_TogglePin函数原型参数说明示例代码 2.代码编写3.烧写程序 总…...
享元模式
前言 享元模式:运用共享技术有效地支持大量细粒度的对象。 在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了。事实上,享元模式可以避免大…...
R语言数据分析16-针对芬兰污染指数的分析与考察
1. 研究背景及意义 近年来,随着我国科技和经济高速发展,人们生活质量也随之显著提高。但是, 环境污染问题也日趋严重,给人们的生活质量和社会生产的各个方面都造成了许多不 利的影响。空气污染作为环境污染主要方面,更…...
Search用法Python:深入探索搜索功能的应用与技巧
Search用法Python:深入探索搜索功能的应用与技巧 在Python编程中,搜索功能是一项至关重要的技能,它能够帮助我们快速定位并处理数据。然而,对于初学者来说,如何高效地使用搜索功能可能会带来一些困惑。本文将从四个方…...
STM32的FreeRtos的学习
首先就是去官网下载一个源文件:FreeRtos官网 下载下来的是一个zip文件,解压缩了。 然后再工程文件夹中创建个文件夹: 在这个文件夹中创建3个文件夹: 然后开始把下载下来的文件夹中的文件挑选出来放到我们的工程文件夹中࿱…...
从零入手人工智能(2)——搭建开发环境
1.前言 作为一名单片机工程师,想要转型到人工智能开发领域的道路确实充满了挑战与未知。记得当我刚开始这段旅程时,心中充满了迷茫和困惑。面对全新的领域,我既不清楚如何入手,也不知道能用人工智能干什么。正是这些迷茫和困惑&a…...
Web前端指南
前言 前端开发员主要负责网站的设计、外观和感觉。他们设计引人入胜的在线用户体验,激发用户兴趣,鼓励用户重复访问。他们与设计师密切合作,使网站美观、实用、快捷。 如果您喜欢创造性思维、打造更好的体验并对视觉设计感兴趣,这将是您的理想职业道路。 探讨前端、后端以…...
做湘菜的网站/seo关键词优化技术
删除iphone中/System/Library/PrivateFrameworks/IAP.framework/Support/目录下的iapd文件 进入/SYSTEM/Library/LaunchDaemons/ 目录然后删除 com.apple.iapd.plist 文件转载于:https://www.cnblogs.com/ctacy/p/6114191.html...
建设一个网站app需要多少钱/一个新产品的营销方案
0效果 1来由 首先我有个程序需要用到进度条,我首先试了一下MATLAB自带的进度条: barwaitbar(0,读取数据中...); % waitbar显示进度条 for i1:1000A(i)rand();str[计算中...,num2str(100*i/1000),%]; % 显示的文本waitbar(i/1000,bar,str) …...
返利网站建设/上海整站seo
我加载一个xml内容,并将其保存到磁盘.然后我读了它,并尝试解析.当我成功解析xml时,我应该忽略7行中的IOException吗?catch (IOException ignore) {}或者可能会出现一些问题?private HashMap loadContent(String url){try {BufferedInputStream bStream …...
广州疫情 高位平台/安卓优化大师2021
当用浏览器浏览网页的时候,当我们点击一个连接的时候,浏览器就会转到新的页面去。整个过程如下: 1)用户在当前页面点击->2)浏览器获取新的URL->3)浏览器转到新的URL。现在,假设我们有一个pdf的阅读程…...
专门做卫生间效果图的网站/游戏推广渠道
最近开始研究Python的并行开发技术,包括多线程,多进程,协程等。逐步整理了网上的一些资料,今天整理一下greenlet相关的资料。并发处理的技术背景并行化处理目前很受重视, 因为在很多时候,并行计算能大大的提…...
做类似58同城的网站/电商运营转行后悔了
release()方法源码如下: public final boolean release(int arg) {//tryRelease()方法由子类实现,由子类来决定是否能成功释放锁if (tryRelease(arg)) {//取得队列头节点Node h head;//如果头节点不为null而且头节点的状态不为0,0代表的是新…...