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

news2024/11/24 22:29:55

本教程介绍了如何使用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 ast
	import json
	import random
	from datetime import datetime, timedelta
	import requests
	import pytz
	
	def 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 session
	
	    def 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 model
    messages = [{"role": "user", "content": prompt}]
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=messages,
        tools=tools,
        tool_choice="auto"
    )
    response_message = response.choices[0].message
    tool_calls = response_message.tool_calls
 
    # Step 2: check if the model wanted to call a function
    if tool_calls:
        available_functions = {
            "get_flight_status": get_flight_status,
        }  
        messages.append(response_message)  
        
        # Step 3: send the function response to the model
        for tool_call in tool_calls:
            function_name = tool_call.function.name
            function_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 function
    if 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 model
        for tool_call in tool_calls:
            function_name = tool_call.function.name
            function_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 key
	client = OpenAI()
	
	
#Function is available at 
https://gist.github.com/janakiramm/2143b909626f5f01d64739e3fe90c9c8
	
	tools = [
	    {
	        "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 model
	    messages = [{"role": "user", "content": prompt}]
	    response = client.chat.completions.create(
	        model="gpt-4o",
	        messages=messages,
	        tools=tools,
	        tool_choice="auto"
	    )
	    response_message = response.choices[0].message
	    tool_calls = response_message.tool_calls
	
	
    # Step 2: check if the model wanted to call a function
	    if 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 model
	        for tool_call in tool_calls:
	            function_name = tool_call.function.name
	            function_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
	
	
res=chatbot("What's the status of EK226?")
	print(res.choices[0].message.content)

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

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

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

相关文章

持续警惕火灾风险:学校可燃气体报警器的定期校准检验

可燃气体报警器在学校中的安装、检验和校准对于保护师生生命安全至关重要。 接下来,佰德将探讨可燃气体报警器在学校中的必要性,以及相关实际案例和数据,为您呈现一个安全的学习环境。 一、学校安全不能掉以轻心 学校是培养未来的摇篮&…

Android限制参数传递之StringDef注解的使用

文章目录 1. 引言2. 注解 StringDef2.1 举例2.2 StringDef源码解释 3. 其他类似注解 IntDef、LongDef4. 总结 1. 引言 在参数传递时,如果你想限制传入的参数只能是特定的几个值,该怎么做呢? 除了把参数类型定义为枚举值,还可以使…

Boom 3D软件最新版下载及详细安装教程

值得肯定的是Boom 3D最新版新增的Boom音量控制器和Controlled Boost功能为使用者提供了一个完美的控制,通过一个整齐的设计切换栏的系统音频输出,帮助他们轻松调整音量,从而让他们实现理想的音频输出,有需要的欢迎来开心电玩下载使…

C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法

C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法 —— 2024-06-08 杭州 code review! 文章目录 C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法一.从一个函数中获取多个返回值的方法1. 使用结构体或类2. 使用`std::t…

Polar Web【中等】你知道sys还能这样玩吗

Polar Web【中等】你知道sys还能这样玩吗 Contents Polar Web【中等】你知道sys还能这样玩吗思路&探索源码 EXPPHP测试生成十六进制化的命令上传测试 Python 脚本 运行&总结 思路&探索 本题属实是有些…即使提示了sys也难以迅速想到 /sys.php 这个路径,…

IP纯净度是什么,对用户有多么重要?

在网络应用和数据采集等领域,代理IP被广泛使用,而代理IP的纯净度则直接影响其性能和可用性。代理IP的纯净度主要涉及到代理IP在网络传输过程中的稳定性、匿名性和安全性。今天就带大家一起了解代理IP纯净度对用户的重要性。 第一,保护用户的隐…

密文域可逆信息隐藏安全性研究-从图像到视频

前言 随着云存储、云计算等新兴技术的兴起,海量的隐私信息被广泛地上传、存储到服务器上。为保证用户的隐私性,必须对用户的数据进行加密,然后再将其上传到服务器上。因此,密文域的可逆信息隐藏(reversible data hiding in encry…

RPM包方式离线部署gitlab

下载安装包 要求:可以联网,系统及版本与目标服务器一致。配置gitlab yum仓库 curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash 新建包存放目录 mkdir /root/gitlab 下载gitlab及相关安装包 …

RPA影刀 | 变量的使用

1.什么是变量 2.变量的作用 作用1:方便后续流程调用 这里在后续流程“点击元素”中,就可以选中这个变量 作用2:区分相同属性的变量 如果要打开两个网页,总不能都叫web_page吧。 所以这里一个叫百度web_page,一个叫…

【论文阅读】Point2RBox (CVPR’2024)

paper:https://arxiv.org/abs/2311.14758 code:https://github.com/yuyi1005/point2rbox-mmrotate

2024版本---LabVIEW 软件安装及使用教程

目录 第1章 LabVIEW 软件安装及使用教程 1. 简介 2. 安装教程 2.1 下载 LabVIEW 2024 版本 2.2 安装 LabVIEW 3. 激活 LabVIEW 4. LabVIEW 基本使用教程 4.1 用户界面介绍 4.2 创建一个简单的 VI(虚拟仪器) 4.3 数据采集示例 5. 进阶功能介绍…

关于软件调用独显配置指引【笔记】

关于笔记本电脑不支持独显直连的,bios下也是没有切换独显直连的选项的,处理方法 简单的来说按照图片指引可配置让软件调用独显: 1、进入系统→屏幕→显示卡界面; 2、【添加应用】浏览需要调用独显的软件安装目录,并打开…

yg校园易购电商系统(Go+Vue)

校园易购二手平台系统 GitHub项目地址:https://github.com/xzhHas/yg 文章目录 校园易购二手平台系统一、技术栈简介二、快速开始1、安装本系统使用到的插件,这里推荐使用docker安装,此操作皆在ubuntu系统下操作,如果是其他系统只…

Rust基础学习-Rust宏

Rust中的宏是生成另一段代码的一段代码。可以根据输入生成代码,简化重复模式,使得代码更加简洁。比如我们一直在用的println!,vec!,panic!都是宏。 创建宏 可以使用macro_rules!创建一个宏: macro_rules! macro_name {(...) > {...} }这…

从中国迈向全球:一家造车新势力的扬帆出海

作为中国造车新势力的一员,哪吒汽车的出海之旅可以带给我们怎样的启示? 造车新势力的全球化布局 经常关注汽车市场的读者朋友,想必对哪吒汽车都不会感到陌生。作为合众新能源汽车有限公司旗下的汽车品牌,哪吒汽车自诞生以来一直致…

制作AI问答机器人:从0到1的完整指南

在数字化转型的浪潮中,企业正追求更高效、智能的客户服务解决方案。AI问答机器人以其快速响应、全天候服务和持续学习的能力,成为了提升客户满意度和加速业务发展的关键工具。本文将深入探讨如何制作一个企业级的AI问答机器人,并强调其功能体…

Docker大学生看了都会系列(八、Dokcerfile部署go项目)

系列文章目录 第一章 Docker介绍 第二章 2.1 Mac通过Homebrew安装Docker 第二章 2.2 CentOS安装Docker 第三章 Docker常用命令 第四章 常用命令实战 第五章 Docker镜像详解 第六章 Docker容器数据卷 第七章 Dockerfile详解 第八章 Dokcerfile部署go项目 文章目录 一、前言二、环…

How to: Add and Customize the Ribbon Skin List and Skin Gallery

皮肤列表和皮肤库允许用户选择皮肤。本文介绍如何在功能区中显示“皮肤列表”或“皮肤库”并对其进行自定义。 DevExpress演示中心中的大多数应用程序都允许您选择皮肤。例如,运行XtraGrid演示并导航到皮肤功能区页面以更改当前皮肤。 在功能区UI中显示皮肤列表或…

Python YOLOv5 7.0 基于深度学习的口罩检测识别系统

目录 1,演示视频和资源下载 1.1 演示视频 1.2 资源下载 2,数据集 3,代码 3.1 带 PyQt5 UI 的检测程序,基于YOLOv5 7.0 3.1.1 根据训练结果进行检测 3.1.2 自动保存每张图片/每帧的检测结果 3.1.3 筛选查看每张图片/每帧检…

【Git教程】(二十一)与其他版本控制系统并行使用 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 与其他版本控制系统并行使用 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 初始部署版本库3.2 得到中央版本控制管理中的更新修改3.3 将修改提交传输到中央本版控制系统 在许多企业和组织中,会统一管理版本控制工具和相关的流程。其中的个人和小团队…