# الجلسة 4: بناء تطبيقات دردشة جاهزة للإنتاج باستخدام Chainlit ## نظرة عامة تركز هذه الجلسة على بناء تطبيقات دردشة جاهزة للإنتاج باستخدام Chainlit وMicrosoft Foundry Local. ستتعلم كيفية إنشاء واجهات ويب حديثة للمحادثات الذكية، تنفيذ استجابات متدفقة، ونشر تطبيقات دردشة قوية مع معالجة الأخطاء وتصميم تجربة المستخدم بشكل صحيح. **ما ستقوم ببنائه:** - **تطبيق دردشة Chainlit**: واجهة ويب حديثة مع استجابات متدفقة - **عرض WebGPU**: استنتاج داخل المتصفح لتطبيقات تحافظ على الخصوصية - **تكامل Open WebUI**: واجهة دردشة احترافية مع Foundry Local - **أنماط الإنتاج**: معالجة الأخطاء، المراقبة، واستراتيجيات النشر ## أهداف التعلم - بناء تطبيقات دردشة جاهزة للإنتاج باستخدام Chainlit - تنفيذ استجابات متدفقة لتحسين تجربة المستخدم - إتقان أنماط تكامل Foundry Local SDK - تطبيق معالجة الأخطاء والتدهور التدريجي بشكل صحيح - نشر وتكوين تطبيقات الدردشة لبيئات مختلفة - فهم أنماط واجهات الويب الحديثة للذكاء الاصطناعي الحواري ## المتطلبات الأساسية - **Foundry Local**: مثبت ويعمل ([دليل التثبيت](https://learn.microsoft.com/azure/ai-foundry/foundry-local/)) - **Python**: الإصدار 3.10 أو أحدث مع دعم البيئة الافتراضية - **النموذج**: تحميل نموذج واحد على الأقل (`foundry model run phi-4-mini`) - **المتصفح**: متصفح ويب حديث يدعم WebGPU (Chrome/Edge) - **Docker**: لتكامل Open WebUI (اختياري) ## الجزء 1: فهم تطبيقات الدردشة الحديثة ### نظرة عامة على الهيكلية ``` User Browser ←→ Chainlit UI ←→ Python Backend ←→ Foundry Local ←→ AI Model ↓ ↓ ↓ ↓ ↓ Web UI Event Handlers OpenAI Client HTTP API Local GPU ``` ### التقنيات الرئيسية **أنماط Foundry Local SDK:** - `FoundryLocalManager(alias)`: إدارة الخدمة تلقائيًا - `manager.endpoint` و `manager.api_key`: تفاصيل الاتصال - `manager.get_model_info(alias).id`: تحديد النموذج **إطار عمل Chainlit:** - `@cl.on_chat_start`: بدء جلسات الدردشة - `@cl.on_message`: معالجة الرسائل الواردة من المستخدم - `cl.Message().stream_token()`: بث في الوقت الحقيقي - إنشاء واجهة المستخدم تلقائيًا وإدارة WebSocket ## الجزء 2: مصفوفة القرار بين المحلي والسحابي ### خصائص الأداء | الجانب | المحلي (Foundry) | السحابي (Azure OpenAI) | |--------|------------------|-----------------------| | **الكمون** | 🚀 50-200ms (بدون شبكة) | ⏱️ 200-2000ms (يعتمد على الشبكة) | | **الخصوصية** | 🔒 البيانات لا تغادر الجهاز أبدًا | ⚠️ البيانات تُرسل إلى السحابة | | **التكلفة** | 💰 مجاني بعد شراء الأجهزة | 💸 الدفع لكل رمز | | **عدم الاتصال بالإنترنت** | ✅ يعمل بدون إنترنت | ❌ يتطلب الإنترنت | | **حجم النموذج** | ⚠️ محدود بالأجهزة | ✅ الوصول إلى أكبر النماذج | | **التوسع** | ⚠️ يعتمد على الأجهزة | ✅ توسع غير محدود | ### أنماط الاستراتيجية الهجينة **الأولوية للمحلي مع التراجع:** ```python async def hybrid_completion(prompt: str, complexity_threshold: int = 100): if len(prompt.split()) < complexity_threshold: return await local_completion(prompt) # Fast, private else: return await cloud_completion(prompt) # Complex reasoning ``` **التوجيه بناءً على المهام:** ```python async def smart_routing(prompt: str, task_type: str): routing_rules = { "code_generation": "local", # Privacy-sensitive "creative_writing": "cloud", # Benefits from larger models "data_analysis": "local", # Fast iteration needed "research": "cloud" # Requires broad knowledge } if routing_rules.get(task_type) == "local": return await foundry_completion(prompt) else: return await azure_completion(prompt) ``` ## الجزء 3: العينة 04 - تطبيق دردشة Chainlit ### البدء السريع ```cmd # Navigate to Module08 directory cd Module08 # Start your preferred model foundry model run phi-4-mini # Run the Chainlit application (avoiding port conflicts) chainlit run samples\04\app.py -w --port 8080 ``` يفتح التطبيق تلقائيًا على `http://localhost:8080` مع واجهة دردشة حديثة. ### التنفيذ الأساسي تُظهر العينة 04 أنماط جاهزة للإنتاج: **اكتشاف الخدمة تلقائيًا:** ```python import chainlit as cl from openai import OpenAI from foundry_local import FoundryLocalManager # Global variables for client and model client = None model_name = None async def initialize_client(): global client, model_name alias = os.environ.get("MODEL", "phi-4-mini") try: # Use FoundryLocalManager for proper service management manager = FoundryLocalManager(alias) model_info = manager.get_model_info(alias) client = OpenAI( base_url=manager.endpoint, api_key=manager.api_key or "not-required" ) model_name = model_info.id if model_info else alias return True except Exception as e: # Fallback to manual configuration base_url = os.environ.get("BASE_URL", "http://localhost:51211") client = OpenAI(base_url=f"{base_url}/v1", api_key="not-required") model_name = alias return True ``` **معالج دردشة متدفقة:** ```python @cl.on_message async def main(message: cl.Message): # Create streaming response msg = cl.Message(content="") await msg.send() stream = client.chat.completions.create( model=model_name, messages=[ {"role": "system", "content": "You are a helpful AI assistant."}, {"role": "user", "content": message.content} ], stream=True ) # Stream tokens in real-time for chunk in stream: if chunk.choices[0].delta.content: await msg.stream_token(chunk.choices[0].delta.content) await msg.update() ``` ### خيارات التكوين **متغيرات البيئة:** | المتغير | الوصف | الافتراضي | المثال | |---------|-------|----------|---------| | `MODEL` | الاسم المستعار للنموذج المستخدم | `phi-4-mini` | `qwen2.5-7b` | | `BASE_URL` | نقطة نهاية Foundry Local | يتم اكتشافها تلقائيًا | `http://localhost:51211` | | `API_KEY` | مفتاح API (اختياري للمحلي) | `""` | `your-api-key` | **الاستخدام المتقدم:** ```cmd # Use different model set MODEL=qwen2.5-7b chainlit run samples\04\app.py -w --port 8080 # Use different ports (avoid 51211 which is used by Foundry Local) chainlit run samples\04\app.py -w --port 3000 chainlit run samples\04\app.py -w --port 5000 ``` ## الجزء 4: إنشاء واستخدام دفاتر Jupyter ### نظرة عامة على دعم الدفاتر تتضمن العينة 04 دفتر Jupyter شامل (`chainlit_app.ipynb`) يوفر: - **📚 محتوى تعليمي**: مواد تعليمية خطوة بخطوة - **🔬 استكشاف تفاعلي**: تشغيل وتجربة خلايا الكود - **📊 عروض مرئية**: رسوم بيانية، مخططات، وعرض النتائج - **🛠️ أدوات تطوير**: اختبار وتصحيح الأخطاء ### إنشاء دفاتر خاصة بك #### الخطوة 1: إعداد بيئة Jupyter ```cmd # Ensure you're in the Module08 directory cd Module08 # Activate your virtual environment .venv\Scripts\activate # Install Jupyter and dependencies pip install jupyter notebook jupyterlab ipykernel pip install -r requirements.txt # Register the kernel for VS Code python -m ipykernel install --user --name=foundry-local --display-name="Foundry Local" ``` #### الخطوة 2: إنشاء دفتر جديد **باستخدام VS Code:** 1. افتح VS Code في دليل Module08 2. أنشئ ملفًا جديدًا بامتداد `.ipynb` 3. اختر "Foundry Local" كالنواة عند الطلب 4. ابدأ بإضافة خلايا بمحتواك **باستخدام Jupyter Lab:** ```cmd # Start Jupyter Lab jupyter lab # Navigate to samples/04/ and create new notebook # Choose Python 3 kernel ``` ### أفضل الممارسات لتنظيم الدفاتر #### تنظيم الخلايا ```python # Cell 1: Imports and Setup import os import sys import chainlit as cl from openai import OpenAI from foundry_local import FoundryLocalManager print("✅ Libraries imported successfully") ``` ```python # Cell 2: Configuration and Client Setup class FoundryClientManager: def __init__(self, model_name="phi-4-mini"): self.model_name = model_name self.client = None def initialize_client(self): # Client initialization logic pass # Initialize and test client_manager = FoundryClientManager() result = client_manager.initialize_client() print(f"Client initialized: {result}") ``` ### أمثلة تفاعلية وتمارين #### التمرين 1: اختبار تكوين العميل ```python # Test different configuration methods configurations = [ {"method": "foundry_sdk", "model": "phi-4-mini"}, {"method": "manual", "base_url": "http://localhost:51211", "model": "qwen2.5-7b"}, ] for config in configurations: print(f"\n🧪 Testing {config['method']} configuration...") # Implementation here result = test_configuration(config) print(f"Result: {'✅ Success' if result['status'] == 'ok' else '❌ Failed'}") ``` #### التمرين 2: محاكاة استجابة متدفقة ```python import asyncio async def simulate_streaming_response(text, delay=0.1): """Simulate how streaming works in Chainlit.""" print("🌊 Simulating streaming response...") for char in text: print(char, end='', flush=True) await asyncio.sleep(delay) print("\n✅ Streaming complete!") # Test the simulation sample_text = "This is how streaming responses work in Chainlit applications!" await simulate_streaming_response(sample_text) ``` ## الجزء 5: عرض استنتاج WebGPU داخل المتصفح ### نظرة عامة يتيح WebGPU تشغيل نماذج الذكاء الاصطناعي مباشرة داخل المتصفح لتحقيق أقصى قدر من الخصوصية وتجربة بدون تثبيت. تُظهر هذه العينة تنفيذ ONNX Runtime Web مع WebGPU. ### الخطوة 1: التحقق من دعم WebGPU **متطلبات المتصفح:** - Chrome/Edge 113+ مع تمكين WebGPU - تحقق: `chrome://gpu` → تأكيد حالة "WebGPU" - تحقق برمجيًا: `if (!('gpu' in navigator)) { /* no WebGPU */ }` ### الخطوة 2: إنشاء عرض WebGPU إنشاء دليل: `samples/04/webgpu-demo/` **index.html:** ```html