تحويل تطبيق الذكاء الاصطناعي إلى واجهة برمجة تطبيقات (API) باستخدام FastAPI
لماذا نحتاج إلى تحويل تطبيق الذكاء الاصطناعي إلى API؟
عندما تبدأ ببناء سكربت ذكاء اصطناعي محلي، فإن أول نسخة غالباً تكون ملف Python بسيط يستقبل نصاً، يرسله إلى نموذج لغوي، ثم يعيد الإجابة. لكن هذه البنية لا تكفي عند الانتقال إلى بيئة إنتاج حقيقية. السبب أن التطبيقات الحديثة تحتاج إلى نقطة وصول مركزية يمكن أن تتصل بها واجهة ويب، أو تطبيق جوال، أو لوحة تحكم داخلية، أو حتى خدمة خارجية. هنا تظهر أهمية تحويل منطق الذكاء الاصطناعي إلى API مبنية باستخدام FastAPI.
إطار FastAPI مناسب جداً لهذا الدور لأنه سريع، غير متزامن، يدعم التحقق التلقائي من البيانات عبر Pydantic، ويوفر توثيقاً تلقائياً بصيغة OpenAPI. وهذا يجعله مثالياً لنشر تطبيقات تعتمد على نماذج اللغة الكبيرة LLMs، أو خطوط عمل LangChain، أو أنظمة RAG في صورة خدمة قابلة لإعادة الاستخدام.
المعمارية الهندسية لتحويل تطبيق الذكاء الاصطناعي إلى خدمة
قبل كتابة الكود، يجب التفكير في البنية المعمارية. الخطأ الشائع هو وضع كل شيء داخل نقطة نهاية واحدة /chat. هندسياً، الأفضل فصل الطبقات حتى يسهل الاختبار، التوسع، واستبدال المزود أو النموذج لاحقاً.
الطبقات الأساسية
- طبقة الاستقبال
API Layer: تستقبل الطلبات، تتحقق من المدخلات، وتعيد الاستجابة بصيغةJSON. - طبقة الخدمة
Service Layer: تحتوي منطق الذكاء الاصطناعي نفسه، مثل تكوين البرومبت، استدعاء النموذج، أو دمج نتائج الاسترجاع. - طبقة البيانات
Data Layer: تتعامل مع قواعد البيانات، الذاكرة، أو قواعد البيانات المتجهة مثلVector DBs. - طبقة التكامل
Integration Layer: مسؤولة عن الاتصال بمزود النموذج مثلOpenAIأو غيره.
تدفق البيانات عادة يكون كالتالي: يرسل العميل سؤالاً إلى POST /generate، ثم تتحقق Pydantic من بنية الطلب، بعدها تستدعي نقطة النهاية طبقة الخدمة، والتي قد تبني برومبت اعتماداً على هندسة الأوامر داخل الكود، أو قد تنفذ استرجاعاً من قاعدة متجهة إذا كان النظام من نوع RAG. أخيراً تُعاد الإجابة في كائن JSON منظم يمكن لأي واجهة استخدامه.
تجهيز المشروع وبناء أول نقطة نهاية
إذا لم تكن جهزت البيئة بعد، فابدأ من درس إعداد بيئة العمل الذكية. بعد ذلك أنشئ مشروعاً بسيطاً يحتوي على ملف main.py لتشغيل الخادم.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI(title="AI API with FastAPI")
class PromptRequest(BaseModel):
prompt: str
@app.get("/")
async def root():
return {"message": "API is running"}
@app.post("/generate")
async def generate_text(data: PromptRequest):
return {
"input": data.prompt,
"output": f"Processed prompt: {data.prompt}"
}
هذا المثال لا يستدعي نموذجاً حقيقياً بعد، لكنه يوضح أساسيتين مهمتين: تعريف التطبيق، وبناء نموذج بيانات للطلب. عند تشغيله بواسطة uvicorn، ستحصل تلقائياً على صفحة توثيق تفاعلية، وهي ميزة مهمة جداً أثناء اختبار واجهات الذكاء الاصطناعي.
تشغيل الخادم
uvicorn main:app --reload
ربط FastAPI بالنموذج اللغوي
في التطبيق الحقيقي، نريد استبدال النص الوهمي باستدعاء فعلي لمزود النموذج. إذا كنت قد أنجزت سابقاً خطوة جلب مفاتيح API وكتابة أول سكربت اتصال، فيمكنك الآن تغليف هذا الاتصال داخل خدمة مستقلة.
import os
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from openai import OpenAI
app = FastAPI(title="LLM Inference API")
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
class PromptRequest(BaseModel):
prompt: str
temperature: float = 0.2
@app.post("/generate")
async def generate_text(data: PromptRequest):
try:
response = client.chat.completions.create(
model="gpt-4o-mini",
temperature=data.temperature,
messages=[
{"role": "system", "content": "You are a precise AI assistant."},
{"role": "user", "content": data.prompt}
]
)
return {
"output": response.choices[0].message.content,
"model": "gpt-4o-mini"
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
لاحظ هنا أننا سمحنا بتمرير قيمة temperature من العميل. وهذا مفيد إذا كنت تريد إعطاء الواجهة الأمامية مرونة في التحكم في مستوى الإبداع، كما شرحنا في درس التحكم في معاملات Temperature و Top-K.
تصميم برومبت احترافي داخل الخدمة
من الأخطاء الشائعة تمرير سؤال المستخدم مباشرة إلى النموذج دون سياق. الأفضل دائماً بناء قالب واضح يحدد الدور، النبرة، القيود، وشكل الإجابة. هذه الفكرة جوهرية في أي نظام إنتاجي.
أنت مساعد ذكاء اصطناعي متخصص في الشرح التقني. أجب بدقة، وتجنب الافتراضات غير المؤكدة، وإذا كانت المعلومة غير كافية فاذكر ذلك بوضوح. سؤال المستخدم: {{prompt}}
يمكن بناء هذا البرومبت ديناميكياً باستخدام قوالب F-Strings كما في مقال هندسة الأوامر داخل الكود. وعندما تحتاج إلى إجبار النموذج على إرجاع بنية محددة، فمن الأفضل اعتماد أسلوب استخراج JSON فقط لتسهيل التكامل مع الواجهات البرمجية.
دمج LangChain أو RAG داخل الـ API
إذا كان تطبيقك أكثر من مجرد سؤال وجواب مباشر، فغالباً ستحتاج إلى خط معالجة أعمق. على سبيل المثال، يمكن أن يستقبل FastAPI السؤال، ثم يمرره إلى سلسلة LangChain أو إلى نظام RAG كامل يعتمد على Embeddings وقاعدة متجهة.
- استقبال سؤال المستخدم.
- تحويل السؤال إلى تمثيل بحثي إذا لزم الأمر.
- تنفيذ عملية
Retrieverلاسترجاع المقاطع الأنسب. - دمج السياق مع السؤال في برومبت نهائي.
- إرسال النتيجة إلى النموذج لإنتاج إجابة دقيقة أقل عرضة للهلوسة.
هذا الأسلوب هو نفسه الذي بُني عليه شرح دمج المعلومات المسترجعة مع النموذج لتوليد إجابة دقيقة. وعند تحويله إلى خدمة API، يصبح قابلاً للاستهلاك من أي واجهة أو منتج.
بنية استجابة احترافية وقابلة للتوسع
الاستجابة الجيدة لا تحتوي فقط على النص النهائي. في الأنظمة الهندسية، من الأفضل إعادة بيانات إضافية تساعد على المراقبة والتكامل.
{
"success": true,
"output": "Final generated answer",
"model": "gpt-4o-mini",
"latency_ms": 842,
"tokens_estimated": 621,
"sources": [
"document_12.pdf",
"knowledge_base_article_4"
]
}
هذه الحقول تجعل الـ API أكثر نضجاً، خاصة إذا كنت تريد لاحقاً إضافة تتبع للاستهلاك، أو ربطاً مع درس حساب التكلفة وإدارة الرموز، أو إظهار المصادر للمستخدم النهائي في أنظمة RAG.
اعتبارات الإنتاج: الأمان، الأداء، والبث المباشر
عند نقل الخدمة إلى بيئة حقيقية، لا يكفي أن تعمل فقط، بل يجب أن تكون آمنة وقابلة للتوسع. أضف مفتاح وصول داخلي أو آلية Bearer Token لحماية النقاط، واستخدم rate limiting لمنع الإساءة، وفعّل التسجيل logging لمراقبة الأخطاء.
أما إذا كنت تريد تجربة استخدام شبيهة بـ ChatGPT، فيمكنك بناء نقطة بث مباشر تعتمد على Streaming، مستفيداً من المفاهيم التي شرحناها في البث المباشر للردود. هذا مهم جداً لخفض الإحساس بزمن الانتظار وتحسين تجربة المستخدم.
الخلاصة العملية
تحويل تطبيق الذكاء الاصطناعي إلى API باستخدام FastAPI ليس مجرد تغليف سكربت داخل خادم، بل هو خطوة هندسية تنقل مشروعك من تجربة محلية إلى خدمة قابلة للتكامل، القياس، وإعادة الاستخدام. كلما فصلت بين الطبقات، نظمت البرومبتات، هيكلت الاستجابات، وراعيت الأمان والأداء، أصبحت واجهتك البرمجية أقرب إلى مستوى المنتجات الحقيقية.
والأهم أن هذه البنية لا تخدم سيناريو واحداً فقط؛ بل يمكنها تشغيل مساعدات محادثية، أنظمة RAG، أدوات تحليل مستندات، أو حتى عملاء أذكياء Agents. وبذلك يصبح FastAPI هو الجسر العملي بين هندسة النماذج الذكية وبين التطبيقات التي يستهلكها المستخدم فعلياً.
7 comments