كيفية بناء تطبيق في الوقت الحقيقي من خلال استدعاء الدوال في GPT-4o
لنفترض أنك تود تطوير تطبيق يتيح للمستخدمين تتبع حالة الرحلات الجوية في الوقت الحقيقي. سيتيح التطبيق للمستخدمين إدخال رقم الرحلة والحصول على معلومات حول الحالة الحالية للرحلة، بما في ذلك وقت المغادرة والوصول المتوقعين، وأي تأخيرات، وحالة الطقس في المطارات المعنية.
لتطوير تطبيق كهذا ستحتاج للمتطلبات التالية:
API لتتبع الرحلات الجوية (مثل FlightAware's AeroAPI)
استخدام GPT-4o مع استدعاء الدوال لتحليل الطلبات وتوفير الردود التفاعلية
تصميم واجهة تطبيق بسيطة ومرتبة مع وجود عناصر رئيسية تشمل:
حقل إدخال لرقم الرحلة
زر "بحث" لجلب المعلومات
منطقة عرض معلومات الرحلة
رسالة الحالة لتقديم تحديثات حول العملية الجارية.
قد تتساءل كيف يمكن للنماذج اللغوية الكبيرة (LLMs) جلب البيانات في الوقت الحقيقي إلى برامج الدردشة والوكلاء. سنوضح الطريقة في مقال اليوم من خلال توضيح طريقة دمج واجهة برمجة التطبيقات من موقع FlightAware.com مع نموذج GPT-4o الجديد بهدف تتبع حالة الرحلات الجوية في الوقت الحقيقي.
ما هي واجهة برمجة التطبيقات FlightAware’s AeroAPI
واجهة برمجة تطبيقات AeroAPI من FlightAware هي واجهة برمجة تطبيقات قوية ومتطورة تتيح الوصول عند الطلب إلى بيانات تتبع الرحلات وحالتها بشكل واسع. تُمكن هذه الواجهة المطورين من جلب معلومات الرحلات الجوية في الوقت الحقيقي أو التاريخية أو المستقبلية عبر نظام استعلام بسيط. تدعم الواجهة طلبات مفصلة تعتمد على معرفات الرحلات، تسجيل الطائرات، أو المواقع مثل المطارات أو المشغلين. تُصمم الواجهة لتقديم بيانات طيران دقيقة وقابلة للتنفيذ بتنسيق JSON، مما يدعم الاحتياجات التشغيلية عبر صناعة الطيران من شركات الطيران إلى المطارات.
الخطوة 1: تعريف الدالة لجلب حالة الرحلة
بمجرد الحصول على مفتاح API، قم بإنشاء الدالة التالية في Python لاسترداد حالة أي رحلة.
import json
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' في 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)
شرح الخطوات الرئيسية في الكود
تعريف الجلسة: تقوم الدالة
get_api_session
بتهيئة كائن جلسة (Session) وإعداد العنوان المطلوب بمفتاح API.جلب بيانات الرحلة: تقوم الدالة
fetch_flight_data
بأخذ معرف الرحلة والجلسة كمعاملات. تنشئ عنوان URL لنقطة النهاية مع المرشحات الزمنية المناسبة لاسترداد البيانات لمدة يوم واحد وترسل طلب GET لاسترجاع بيانات الرحلة.تحويل الوقت: تقوم الدالة
utc_to_local
بتحويل الوقت UTC (من استجابة API) إلى الوقت المحلي استنادًا إلى سلسلة المنطقة الزمنية المقدمة.معالجة البيانات: يحدد النص مفاتيح لأوقات المغادرة والوصول بناءً على توافر الأوقات المقدرة أو الفعلية، مع الرجوع إلى الأوقات المجدولة عند الضرورة. ثم ينشئ قاموس يحتوي على تفاصيل الرحلة بتنسيق JSON.
الخطوة 2: تنفيذ استدعاء الدوال مع GPT-4o
ابدأ باستيراد مكتبة OpenAI وتثبيتها.
from openai import OpenAI
client = OpenAI()
بعد ذلك، سنحدد قائمة تحتوي على الدالة get_flight_status
لاستخدامها كأداة ضمن سياق واجهة برمجة تطبيقات OpenAI.
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"]
}
}
}
]
الدالة الأساسية التي تقوم بالعمل الأساسي هنا هي chatbot
، فهي تفحص الاستعلام لتحديد ما إذا كان من الضروري استدعاء دالة ومن ثم تولد استجابة مناسبة.
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
شرح الكود
إرسال المحادثة والأدوات المتاحة إلى النموذج: يتم إنشاء قائمة الرسائل بإضافة الاستعلام من المستخدم وإرساله إلى واجهة برمجة تطبيقات OpenAI.
فحص استدعاء الدوال: إذا كانت هناك دوال مستدعاة، يتم تنفيذ هذه الدوال باستخدام المعاملات المقدمة وإدماج مخرجاتها في المحادثة.
إرسال الاستجابة النهائية: مع الاستجابة من الدالة المضافة إلى التاريخ، يتم استدعاء نقطة نهاية الإكمال للدردشة للحصول على الإجابة النهائية من نموذج اللغة الكبير.
مثال على الاستخدام
عند إرسال الاستعلام التالي "What’s the status of EK524"، يحدد GPT-4o أنه يحتاج إلى استدعاء الدالة المقدمة في قائمة الأدوات ويعود بالاستجابة المناسبة.
وإليك الكود كاملًا
from openai import OpenAI
# Initialize the environment variable OPENAI_API_KEY with your API key
client = OpenAI()
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
the response back 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
# Usage Example
prompt = "What’s the status of EK524?"
response = chatbot(prompt)
print(response.choices[0].message["content"])
الخلاصة
شرحنا في مقال اليوم طريقة بناء تطبيق في الوقت الحقيقي باستخدام استدعاء الدوال في GPT-4o وطريقة تنفيذ عمليات ديناميكية ومتطورة تتفاعل مع البيانات في الوقت الحقيقي، مما يزيد من فائدة وقيمة التطبيق النهائي.
هل لديك أفكار أخرى لتطبيقات مشابهة؟ شاركنا أفكارك في التعليقات أسفل المقال