بناء واجهة برمجة تطبيقات LLM عالية الأداء وجاهزة للإنتاج باستخدام FastAPI: دليل خطوة بخطوة
بناء واجهة برمجة تطبيقات LLM عالية الأداء وجاهزة للإنتاج باستخدام FastAPI: دليل خطوة بخطوة
FastAPI، كإطار عمل ويب Python حديث وعالي الأداء، يحظى بشعبية كبيرة لسهولة استخدامه وسرعته ووثائق API التي يتم إنشاؤها تلقائيًا. على وجه الخصوص، في بناء واجهة برمجة تطبيقات خلفية لتطبيقات LLM (نموذج اللغة الكبير)، تُظهر FastAPI مزايا قوية. ستعلمك هذه المقالة خطوة بخطوة كيفية استخدام FastAPI لبناء واجهة برمجة تطبيقات LLM جاهزة للإنتاج، واستكشاف بعض أفضل الممارسات.
لماذا تختار FastAPI؟
عند إنشاء واجهة برمجة تطبيقات لتطبيقات LLM، توفر FastAPI المزايا الرئيسية التالية:
- أداء عالي: استنادًا إلى ASGI، يمكن لـ FastAPI التعامل مع طلبات متزامنة عالية، وهو أمر بالغ الأهمية لتطبيقات LLM التي تتطلب استجابة سريعة.
- دعم غير متزامن: تدعم FastAPI بشكل مدمج الكلمات الرئيسية
asyncوawait، مما يسهل التعامل مع العمليات غير المتزامنة، مثل استدعاء استنتاج LLM، وتجنب حظر مؤشر الترابط الرئيسي. - وثائق API تلقائية: تستخدم FastAPI OpenAPI و JSON Schema لإنشاء وثائق API تفاعلية تلقائيًا (Swagger UI)، مما يسهل على المطورين اختبار واجهة برمجة التطبيقات الخاصة بك واستخدامها.
- التحقق من صحة البيانات: تستخدم FastAPI Pydantic للتحقق من صحة البيانات، مما يضمن صحة معلمات الطلب ويقلل الأخطاء.
- حقن التبعية: يمكن لنظام حقن التبعية في FastAPI إدارة الموارد ومشاركتها بسهولة، مثل نماذج LLM.
- مجتمع نشط: تمتلك FastAPI مجتمعًا كبيرًا ونشطًا، ويمكنك الحصول على موارد ودعم غني.
عمل تحضيري
-
تثبيت Python: تأكد من تثبيت Python 3.7 أو إصدار أحدث.
-
تثبيت FastAPI و Uvicorn: استخدم pip لتثبيت FastAPI و Uvicorn (خادم ASGI):
pip install fastapi uvicorn -
اختر نموذج LLM: اختر نموذج LLM الذي تريد استخدامه. يمكن أن يكون نموذج OpenAI، أو يمكن أن يكون نموذجًا مفتوح المصدر، مثل TinyLlama. إذا اخترت OpenAI، فأنت بحاجة إلى الحصول على مفتاح OpenAI API. إذا اخترت TinyLlama، فأنت بحاجة إلى تنزيل ملف النموذج.
الخطوة 1: إنشاء تطبيق FastAPI
أنشئ ملفًا باسم main.py وأضف الكود التالي:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(title="LLM API", description="A simple API for interacting with LLMs.")
class InputText(BaseModel):
text: str
class OutputText(BaseModel):
generated_text: str
يحدد هذا الكود تطبيق FastAPI ويعرف نموذجين Pydantic: InputText لقبول نص الإدخال، و OutputText لإرجاع النص الذي تم إنشاؤه.
الخطوة 2: إضافة منطق استنتاج LLM
وفقًا لنموذج LLM الذي اخترته، أضف منطق الاستدلال المقابل. هنا، يتم استخدام OpenAI API كمثال:
import openai
import os
# الحصول على مفتاح OpenAI API
openai.api_key = os.environ.get("OPENAI_API_KEY") # يوصى باستخدام متغيرات البيئة
@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Generates text based on the input text using OpenAI.
"""
try:
response = openai.Completion.create(
engine="text-davinci-003", # اختيار النموذج
prompt=input_text.text,
max_tokens=150,
n=1,
stop=None,
temperature=0.7,
)
generated_text = response.choices[0].text.strip()
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
هذا الكود يعرّف مسار /generate، الذي يستقبل كائن InputText كمدخل، ويستدعي OpenAI API لإنشاء نص، ويعيد النص الذي تم إنشاؤه ككائن OutputText. لاحظ استبدال text-davinci-003 بالنموذج المناسب الذي تختاره.
إذا كنت تستخدم نماذج محلية مثل TinyLlama، فأنت بحاجة إلى تثبيت المكتبات المقابلة، مثل transformers، وتحميل النموذج في الذاكرة. مثال على الكود كما يلي:
from transformers import pipeline
import torch
generator = pipeline('text-generation', model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", torch_dtype=torch.bfloat16, device_map="auto")
@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Generates text based on the input text using TinyLlama.
"""
try:
generated_text = generator(input_text.text, max_length=50, do_sample=True, temperature=0.7)[0]['generated_text']
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
الخطوة 3: تشغيل تطبيق FastAPI
قم بتشغيل تطبيق FastAPI باستخدام Uvicorn:
uvicorn main:app --reload
```سيؤدي هذا إلى تشغيل خادم محلي، يمكنك الوصول إليه في المتصفح الخاص بك عن طريق `http://127.0.0.1:8000/docs` لعرض وثائق API التي تم إنشاؤها تلقائيًا. يمكن للمعامل `--reload` إعادة تشغيل الخادم تلقائيًا بعد تعديل التعليمات البرمجية، مما يسهل التطوير.
## الخطوة 4: اختبار API
استخدم وثائق API أو أدوات مثل curl لاختبار API الخاص بك. على سبيل المثال، استخدم curl لإرسال طلب POST:
```bash
curl -X POST -H "Content-Type: application/json" -d '{"text": "Tell me a joke about cats."}' http://127.0.0.1:8000/generate
يجب أن تتلقى استجابة JSON تحتوي على النص الذي تم إنشاؤه.
الخطوة 5: النشر في بيئة الإنتاج
انشر تطبيق FastAPI الخاص بك في بيئة الإنتاج، على سبيل المثال:
- Docker: استخدم Docker لحاويات تطبيقك، مما يسهل النشر والإدارة.
- المنصات السحابية: انشر على منصات سحابية، مثل AWS أو Google Cloud Platform أو Azure. يمكن استخدام Azure Cosmos DB و Azure Functions المذكورتين في النص لإنشاء API بدون خادم. يمكن أيضًا استخدام Modal لنشر تطبيقات FastAPI ذات التوسع التلقائي.
- الخوادم: انشر على الخوادم الخاصة بك.
أفضل الممارسات
- استخدم متغيرات البيئة لتخزين المعلومات الحساسة: لا تقم بتضمين معلومات حساسة مثل مفاتيح API في التعليمات البرمجية مباشرةً، ولكن استخدم متغيرات البيئة بدلاً من ذلك.
- إضافة تسجيل الأحداث: استخدم وحدة تسجيل الأحداث لتسجيل حالة تشغيل API، مما يسهل التصحيح والمراقبة.
- إضافة معالجة الأخطاء: استخدم كتل
try...exceptلمعالجة الاستثناءات المحتملة وإرجاع معلومات خطأ مناسبة. - تحديد المعدل: استخدم محدد المعدل لمنع إساءة استخدام API. يتوفر لدى FastAPI بعض مكتبات تحديد المعدل الجاهزة.
- التخزين المؤقت: بالنسبة للطلبات المتكررة، يمكنك استخدام التخزين المؤقت لتحسين الأداء.
- المراقبة: استخدم أدوات المراقبة لمراقبة أداء API وتوافره.
تقنيات متقدمة
- المعالجة غير المتزامنة: بالنسبة لاستنتاج LLM الذي يستغرق وقتًا طويلاً، استخدم الكلمات الأساسية
asyncوawaitللمعالجة غير المتزامنة لتجنب حظر الخيط الرئيسي. - الاستجابة المتدفقة: يمكن أن يؤدي استخدام الاستجابة المتدفقة (StreamingResponse) إلى إرجاع النص الذي تم إنشاؤه في الوقت الفعلي، مما يحسن تجربة المستخدم.
- الترابط المتعدد/العمليات المتعددة: بالنسبة لاستنتاج LLM المكثف لوحدة المعالجة المركزية، يمكنك استخدام الترابط المتعدد أو العمليات المتعددة لتحسين الأداء.
- تسريع GPU: إذا كان نموذج LLM الخاص بك يدعم تسريع GPU، فيمكنك استخدام CUDA أو مكتبات تسريع GPU الأخرى لتحسين سرعة الاستنتاج.





