Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from langchain_community.embeddings import HuggingFaceEmbeddings | |
| from langchain_community.vectorstores import FAISS | |
| from langchain.prompts import PromptTemplate | |
| from langchain.chains import RetrievalQA | |
| from langchain.chat_models import ChatOpenAI | |
| from langchain.schema import Document | |
| import os | |
| import pickle | |
| from pathlib import Path | |
| # تحميل API Key | |
| def load_api_key(): | |
| if "OPENROUTER_API_KEY" in os.environ: | |
| return os.getenv("OPENROUTER_API_KEY") | |
| raise ValueError("API key not found in environment variables") | |
| # تحويل النص إلى لغة فصيحة | |
| def load_translator_model(): | |
| return ChatOpenAI( | |
| base_url="https://openrouter.ai/api/v1", | |
| api_key=load_api_key(), | |
| model="mistralai/mistral-7b-instruct", | |
| temperature=0.1 | |
| ) | |
| def translate_to_fusha(text): | |
| translator = load_translator_model() | |
| prompt = f""" | |
| قم بتحويل الجملة التالية من اللهجة العامية إلى اللغة العربية الفصحى مع الحفاظ على المعنى: | |
| النص الأصلي: {text} | |
| النص المترجم: | |
| """ | |
| try: | |
| response = translator.predict(prompt) | |
| return response.strip() | |
| except Exception as e: | |
| st.error(f"خطأ في التحويل إلى الفصحى: {str(e)}") | |
| return text # العودة للنص الأصلي في حالة الخطأ | |
| # مسارات تخزين البيانات | |
| EMBEDDINGS_PATH = "embeddings_cache.pkl" | |
| VECTORDB_PATH = "faiss_vectorstore" | |
| # تحميل أو إنشاء الـ embeddings و vectorstore | |
| def load_or_create_embeddings(): | |
| # تحميل البيانات | |
| faq_data =[ | |
| { | |
| "question": "ما هي الخدمات التي تقدمها شركة اتصالات المستقبل؟", | |
| "answer": "نقدم خدمات الاتصالات الهاتفية، الإنترنت، والجيل الخامس (5G)، بالإضافة إلى خدمات الترفيه عبر الإنترنت مثل البث المباشر والتلفزيون الذكي." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمة الإنترنت فائق السرعة؟", | |
| "answer": "نعم، نقدم خدمات الإنترنت فائق السرعة عبر شبكات الجيل الرابع والجيل الخامس." | |
| }, | |
| { | |
| "question": "ما هي الباقات المتاحة للإنترنت المنزلي؟", | |
| "answer": "لدينا عدة باقات تبدأ من 50 ميجابت في الثانية حتى 1 جيجابت في الثانية، مع خيارات لا محدودية للباقات." | |
| }, | |
| { | |
| "question": "هل توفر اتصالات المستقبل خدمات الهاتف المحمول؟", | |
| "answer": "نعم، نقدم خدمات الهاتف المحمول مع خيارات مختلفة للباقات الصوتية والبيانات." | |
| }, | |
| { | |
| "question": "هل يوجد تطبيق للهواتف الذكية لإدارة حساباتي؟", | |
| "answer": "نعم، لدينا تطبيق مخصص يتيح لك إدارة حسابك، دفع الفواتير، ومتابعة استهلاك البيانات." | |
| }, | |
| { | |
| "question": "ما هي خطط اتصالات المستقبل لتوسيع خدماتها في المناطق الريفية؟", | |
| "answer": "نحن نعمل حالياً على توسيع شبكة الجيل الخامس لتشمل المناطق الريفية، بهدف توفير اتصال أسرع وأكثر استقرارًا." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات خاصة للشركات؟", | |
| "answer": "نعم، نقدم خدمات مخصصة للأعمال والشركات مثل حلول الاتصالات الموحدة، الإنترنت المخصص، وحلول الأمن السيبراني." | |
| }, | |
| { | |
| "question": "هل هناك خصومات أو عروض خاصة للطلاب؟", | |
| "answer": "نعم، نقدم خصومات خاصة للطلاب على باقات الإنترنت والمكالمات." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات الدفع عبر الهاتف؟", | |
| "answer": "نعم، يمكن للعملاء الدفع باستخدام الهاتف عبر خدمة 'محفظتي' المتاحة عبر التطبيق." | |
| }, | |
| { | |
| "question": "ما هو نظام الفواتير في اتصالات المستقبل؟", | |
| "answer": "لدينا نظام فواتير شهري مرن، حيث يمكن للعملاء اختيار الدفع المسبق أو الفواتير الشهرية." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات الإنترنت للمنزل والأعمال؟", | |
| "answer": "نعم، نقدم خدمات الإنترنت بسرعات عالية للأفراد والشركات مع دعم فني متميز." | |
| }, | |
| { | |
| "question": "ما هي الميزات الخاصة لباقات الجيل الخامس التي تقدمها الشركة؟", | |
| "answer": "توفر باقات الجيل الخامس سرعة إنترنت غير محدودة تقريباً، مع تحسينات كبيرة في الاتصال بالإنترنت للأجهزة المتعددة." | |
| }, | |
| { | |
| "question": "هل يمكن للعملاء تحويل رصيدهم بين الأرقام؟", | |
| "answer": "نعم، توفر اتصالات المستقبل خدمة تحويل الرصيد بين الأرقام عبر التطبيق أو الرسائل النصية." | |
| }, | |
| { | |
| "question": "هل توجد خدمات إضافية مثل المكالمات الدولية؟", | |
| "answer": "نعم، لدينا باقات للمكالمات الدولية بأسعار تنافسية لعدة وجهات حول العالم." | |
| }, | |
| { | |
| "question": "كيف يمكنني الاشتراك في أحد باقات الإنترنت؟", | |
| "answer": "يمكنك الاشتراك عبر التطبيق أو من خلال زيارة أحد فروعنا أو عبر موقعنا الإلكتروني." | |
| }, | |
| { | |
| "question": "هل يوجد دعم للعملاء على مدار الساعة؟", | |
| "answer": "نعم، نحن نقدم دعمًا على مدار الساعة عبر الهاتف، الدردشة المباشرة، والبريد الإلكتروني." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمة 'الواي فاي' في الأماكن العامة؟", | |
| "answer": "نعم، لدينا خدمة واي فاي مجانية في العديد من الأماكن العامة مثل المولات والمطارات." | |
| }, | |
| { | |
| "question": "كيف يمكنني إلغاء خدمة اشتراك تلقائي؟", | |
| "answer": "يمكنك إلغاء الاشتراك من خلال التطبيق أو بالاتصال بخدمة العملاء." | |
| }, | |
| { | |
| "question": "ما هي خطة 'اتصالات المستقبل' لتقديم خدمات الإنترنت عبر الأقمار الصناعية؟", | |
| "answer": "نحن نعمل على تطوير خدمة الإنترنت عبر الأقمار الصناعية لتوفير الاتصال في المناطق التي يصعب الوصول إليها." | |
| }, | |
| { | |
| "question": "هل توجد خيارات مختلفة لتخصيص باقات البيانات؟", | |
| "answer": "نعم، يمكنك تخصيص باقات البيانات حسب احتياجاتك، سواء للاستخدام الشخصي أو للأعمال." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات الترفيه مثل الألعاب عبر الإنترنت؟", | |
| "answer": "نعم، نقدم مجموعة واسعة من الألعاب عبر الإنترنت بالتعاون مع شركات ترفيه عالمية." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات التلفزيون الرقمي؟", | |
| "answer": "نعم، نقدم خدمة 'اتصالات المستقبل' للبث المباشر والمحتوى الرقمي مع قنوات محلية وعالمية." | |
| }, | |
| { | |
| "question": "هل توفرون خيارات مرنة للدفع؟", | |
| "answer": "نعم، نحن نوفر عدة خيارات للدفع، بما في ذلك الدفع عبر الإنترنت، الدفع عبر الهاتف المحمول، وطرق الدفع التقليدية." | |
| }, | |
| { | |
| "question": "كيف يمكنني التحقق من رصيدي وبيانات استهلاكي؟", | |
| "answer": "يمكنك التحقق من رصيدك واستهلاكك عبر تطبيق الهاتف المحمول أو عبر موقعنا الإلكتروني." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات خاصة لذوي الاحتياجات الخاصة؟", | |
| "answer": "نعم، نقدم حلولًا خاصة لذوي الاحتياجات الخاصة مثل المترجمين الفوريين وتطبيقات قراءة الشاشة." | |
| }, | |
| { | |
| "question": "ما هي الحلول التي تقدمها اتصالات المستقبل للأمن السيبراني؟", | |
| "answer": "نحن نقدم حلولاً متكاملة لحماية البيانات والخصوصية للشركات والأفراد، بما في ذلك خدمات المراقبة والتشفير." | |
| }, | |
| { | |
| "question": "هل تقدمون برامج شراكة للمؤسسات؟", | |
| "answer": "نعم، لدينا برامج شراكة للأعمال التجارية تشمل عروضًا مخصصة وخدمات متميزة." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات الإنترنت المحمول لمناطق غير مغطاة؟", | |
| "answer": "نعم، نعمل على تطوير حلول لتوصيل الإنترنت المحمول في المناطق النائية عبر تقنيات جديدة." | |
| }, | |
| { | |
| "question": "هل تقدمون باقات مشتركة للعائلة؟", | |
| "answer": "نعم، لدينا باقات عائلية توفر مميزات مشتركة للإنترنت والمكالمات بأسعار منافسة." | |
| }, | |
| { | |
| "question": "هل تقدمون عروضًا للعملاء الجدد؟", | |
| "answer": "نعم، نقدم عروضًا خاصة للعملاء الجدد تشمل خصومات على أول فاتورة أو ترقية مجانية للباقات." | |
| }, | |
| { | |
| "question": "ما هي أبرز مميزات شبكة الجيل الخامس في اتصالات المستقبل؟", | |
| "answer": "توفر الشبكة سرعة عالية جداً، زمن استجابة منخفض، ودعماً أكبر للأجهزة المتصلة." | |
| }, | |
| { | |
| "question": "هل يمكنني ترقية خطتي إلى باقة أكبر في أي وقت؟", | |
| "answer": "نعم، يمكنك ترقية خطتك في أي وقت عبر التطبيق أو من خلال خدمة العملاء." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات 'الواي فاي' في الفنادق والمطاعم؟", | |
| "answer": "نعم، نقدم خدمات واي فاي مدفوعة أو مجانية في العديد من الفنادق والمطاعم." | |
| }, | |
| { | |
| "question": "هل يمكنني إلغاء اشتراكي في الخدمات قبل نهاية الفترة؟", | |
| "answer": "نعم، يمكنك إلغاء الاشتراك في الخدمات وفقًا لشروط وأحكام محددة عبر خدمة العملاء." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات الدعم الفني للمشاكل التقنية؟", | |
| "answer": "نعم، لدينا فريق دعم فني متخصص يقدم المساعدة في حل المشاكل التقنية المتعلقة بالشبكة أو الأجهزة." | |
| }, | |
| { | |
| "question": "هل توفرون حلولاً خاصة للمؤسسات الحكومية؟", | |
| "answer": "نعم، نقدم حلولاً متخصصة للمؤسسات الحكومية تشمل الأمن السيبراني والبنية التحتية للاتصالات." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات إضافية مثل التخزين السحابي؟", | |
| "answer": "نعم، نقدم خدمات تخزين سحابي للعملاء لتخزين البيانات والملفات بشكل آمن." | |
| }, | |
| { | |
| "question": "كيف يمكنني استعادة الرقم أو الحساب بعد فقده؟", | |
| "answer": "يمكنك استعادة الرقم أو الحساب عن طريق التحقق من هويتك عبر خدمة العملاء أو التطبيق." | |
| }, | |
| { | |
| "question": "هل تقدمون خصومات للأعمال التجارية؟", | |
| "answer": "نعم، نقدم خصومات وخدمات مخصصة للأعمال التجارية، بما في ذلك حلول الاتصال السحابية." | |
| }, | |
| { | |
| "question": "هل يمكنني إضافة أفراد عائلتي إلى خطتي؟", | |
| "answer": "نعم، يمكنك إضافة أفراد عائلتك إلى خطتك واختيار باقات مشتركة." | |
| }, | |
| { | |
| "question": "هل تقدمون خططًا خاصة لرجال الأعمال؟", | |
| "answer": "نعم، نقدم خططًا مخصصة لرجال الأعمال تشمل بيانات غير محدودة وخدمات متميزة." | |
| }, | |
| { | |
| "question": "ما هي مزايا الاشتراك في خدمة الإنترنت عبر الألياف الضوئية؟", | |
| "answer": "خدمة الإنترنت عبر الألياف الضوئية توفر سرعة عالية جداً وثباتاً في الاتصال." | |
| }, | |
| { | |
| "question": "هل يوجد خصومات للمتقاعدين؟", | |
| "answer": "نعم، نقدم خصومات خاصة للمتقاعدين على بعض الخدمات." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات مشتركين دوليين؟", | |
| "answer": "نعم، نقدم خدمات مخصصة للمشتركين الدوليين مثل المكالمات الدولية بأسعار مخفضة." | |
| }, | |
| { | |
| "question": "هل يمكنني تغيير باقتي أثناء السفر خارج البلاد؟", | |
| "answer": "نعم، يمكنك تغيير باقتك بسهولة عبر التطبيق لتناسب احتياجاتك أثناء السفر." | |
| }, | |
| { | |
| "question": "هل يوجد خطط مخصصة للأشخاص الذين يستخدمون الإنترنت بشكل كبير؟", | |
| "answer": "نعم، نقدم خطط مخصصة للعملاء الذين يستخدمون الإنترنت بشكل كبير تشمل بيانات غير محدودة." | |
| }, | |
| { | |
| "question": "هل تقدمون خدمات لأصحاب المشاريع الصغيرة؟", | |
| "answer": "نعم، نقدم حلولاً مخصصة لأصحاب المشاريع الصغيرة تشمل الإنترنت عالي السرعة وخدمات الاتصالات." | |
| }, | |
| { | |
| "question": "هل تقدمون حلول ترفيهية لمستخدمي الإنترنت المنزلي؟", | |
| "answer": "نعم، نقدم حلولاً ترفيهية مثل اشتراكات في منصات بث الفيديو والألعاب عبر الإنترنت." | |
| }, | |
| { | |
| "question": "كيف يمكنني تحديث بياناتي الشخصية؟", | |
| "answer": "يمكنك تحديث بياناتك الشخصية بسهولة عبر التطبيق أو عبر زيارة أحد فروعنا." | |
| }, | |
| { | |
| "question": "هل تقدمون ضمانًا لجودة الشبكة؟", | |
| "answer": "نعم، نقدم ضمانًا لجودة الشبكة مع التعويضات في حال حدوث انقطاعات طويلة." | |
| }, | |
| { | |
| "question": "متى تم إنشاء شركة اتصالات المستقبل؟", | |
| "answer": "تم إنشاء شركة 'اتصالات المستقبل' في عام 2025 في مصر على يد مجموعة من الخبراء." | |
| }, | |
| { | |
| "question": "ما هي أسعار باقات الإنترنت المنزلي الأساسية؟", | |
| "answer": "تبدأ أسعار باقات الإنترنت المنزلي من 250 جنيهًا شهريًا للباقة 50 ميجابت/ثانية، وتصل إلى 750 جنيهًا للباقة 1 جيجابت/ثانية." | |
| }, | |
| { | |
| "question": "كم تبلغ تكلفة باقات الجيل الخامس للهواتف المحمولة؟", | |
| "answer": "تبدأ باقات الجيل الخامس من 150 جنيهًا (10 جيجابايت) وتصل إلى 500 جنيهًا (باقة غير محدودة بسرعات فائقة)." | |
| }, | |
| { | |
| "question": "ما هي أسعار باقات الإنترنت للأعمال؟", | |
| "answer": "تبدأ باقات الإنترنت للأعمال من 500 جنيه شهريًا (100 ميجابت/ثانية) وتصل إلى 2000 جنيه (1 جيجابت/ثانية مع خوادم مخصصة)." | |
| }, | |
| { | |
| "question": "هل تختلف أسعار الباقات حسب المنطقة؟", | |
| "answer": "نعم، قد تختلف الأسعار قليلاً حسب المنطقة بسبب اختلاف البنية التحتية، مع وجود خصومات تصل إلى 20% في بعض المناطق النائية." | |
| }, | |
| { | |
| "question": "ما هي أسعار الباقات العائلية؟", | |
| "answer": "الباقات العائلية تبدأ من 600 جنيه (4 خطوط بإنترنت مشترك 200 جيجابايت) مع خصم 15% على الخطوط الإضافية." | |
| }, | |
| { | |
| "question": "كم سعر ترقية الباقة إلى سرعة أعلى؟", | |
| "answer": "ترقية الباقة تكلف 50 جنيهًا للترقية بين المستويات، مع وجود عرض ترقية مجانية كل 6 أشهر للعملاء الدائمين." | |
| }, | |
| { | |
| "question": "ما هي أسعار باقات البيانات الإضافية؟", | |
| "answer": "حزم البيانات الإضافية تبدأ من 20 جنيهًا (2 جيجابايت) وتصل إلى 100 جنيه (20 جيجابايت) صالحة لمدة 30 يومًا." | |
| }, | |
| { | |
| "question": "هل هناك عروض خاصة على أسعار الباقات الجديدة؟", | |
| "answer": "نعم، حالياً يوجد خصم 25% على أول 3 أشهر للباقات الجديدة، بالإضافة إلى شهر مجاني عند الاشتراك السنوي." | |
| }, | |
| { | |
| "question": "ما هي سرعات باقات الإنترنت المنزلي المتاحة؟", | |
| "answer": "السرعات المتاحة: 50، 100، 200، 500 ميجابت/ثانية، و1 جيجابت/ثانية مع خيارات محدودة وغير محدودة." | |
| }, | |
| { | |
| "question": "ما هي أحجام البيانات في باقات الهاتف المحمول؟", | |
| "answer": "أحجام البيانات: 5، 10، 20، 50 جيجابايت للباقات الشهرية، مع وجود باقات يومية وأسبوعية أيضًا." | |
| }, | |
| { | |
| "question": "ما الفرق بين باقات السرعة الثابتة والمتغيرة؟", | |
| "answer": "الباقات الثابتة تحافظ على السرعة المعلنة طوال الوقت بسعر أعلى قليلاً، بينما المتغيرة قد تقل السرعة في أوقات الذروة بخصم 30% على السعر." | |
| }, | |
| { | |
| "question": "ما هي باقة الإنترنت الأكثر مبيعاً؟", | |
| "answer": "الباقة 200 ميجابت/ثانية بسعر 400 جنيه شهرياً هي الأكثر طلباً لأنها توازن بين السعر والسرعة المناسبة لمعظم الأسر." | |
| }, | |
| { | |
| "question": "هل توجد باقات إنترنت ليلية بأسعار مخفضة؟", | |
| "answer": "نعم، لدينا باقة ليلية غير محدودة من الساعة 12 مساءً حتى 6 صباحًا بسعر 100 جنيه فقط شهريًا." | |
| }, | |
| { | |
| "question": "ما هي مدة صلاحية باقات البيانات؟", | |
| "answer": "معظم الباقات شهرية، لكن لدينا باقات أسبوعية (صلاحية 7 أيام) ويومية (24 ساعة) بأسعار تبدأ من 10 جنيهات." | |
| }, | |
| { | |
| "question": "كم تبلغ سرعة باقة 500 ميجابت/ثانية الفعلية؟", | |
| "answer": "سرعة الباقة 500 ميجابت/ثانية تصل فعلياً إلى 480-490 ميجابت/ثانية في الظروف المثالية، مع ضمان عدم انخفاضها عن 400 ميجابت/ثانية." | |
| }, | |
| { | |
| "question": "ما هي الباقات الموصى بها للألعاب عبر الإنترنت؟", | |
| "answer": "نوصي بباقة 1 جيجابت/ثانية للألعاب (زمن استجابة أقل من 10ms) أو باقة 500 ميجابت/ثانية مع خوادم ألعاب مخصصة." | |
| }, | |
| { | |
| "question": "هل توجد باقات إنترنت للطلاب بأسعار خاصة؟", | |
| "answer": "نعم، باقات الطلاب تبدأ من 150 جنيه (100 ميجابت/ثانية) مع اشتراط تقديم إثبات دراسة صالح." | |
| }, | |
| { | |
| "question": "ما هي تكلفة إعدادات الإنترنت الأولية؟", | |
| "answer": "رسوم الإعداد 200 جنيه لمرة واحدة، لكننا نقدمها مجاناً حالياً مع أي باقة سنوية." | |
| }, | |
| { | |
| "question": "كم عدد الأجهزة التي يمكن توصيلها بباقة 1 جيجابت؟", | |
| "answer": "باقة 1 جيجابت/ثانية تدعم حتى 50 جهازاً متصلاً في نفس الوقت دون تأثر الأداء." | |
| }, | |
| { | |
| "question": "ما هي باقات الإنترنت المؤقتة للزوار؟", | |
| "answer": "لدينا باقات زوار لمدة 7 أيام (100 جيجابايت) بسعر 150 جنيه، أو 30 يومًا (300 جيجابايت) بـ 300 جنيه." | |
| }, | |
| { | |
| "question": "هل تختلف أسعار الباقات بين الفروع والموقع الإلكتروني؟", | |
| "answer": "الأسعار واحدة، لكن قد تجد عروضاً حصرية على الموقع الإلكتروني أو في بعض الفروع حسب المنطقة." | |
| }, | |
| { | |
| "question": "ما هي باقات الإنترنت للشركات الصغيرة؟", | |
| "answer": "باقات الشركات الصغيرة تبدأ من 300 جيجابايت شهرياً بـ 600 جنيه مع عنوان IP ثابت وخدمة دعم متميزة." | |
| }, | |
| { | |
| "question": "هل توجد باقات إنترنت بدون حدود استهلاك؟", | |
| "answer": "نعم، الباقات غير المحدودة تبدأ من 600 جنيه شهرياً (200 ميجابت/ثانية) مع استهلاك عادل يصل إلى 1 تيرابايت." | |
| } | |
| ] | |
| # تحقق من وجود تخزين مسبق | |
| if Path(EMBEDDINGS_PATH).exists() and Path(VECTORDB_PATH).exists(): | |
| try: | |
| with open(EMBEDDINGS_PATH, "rb") as f: | |
| embeddings = pickle.load(f) | |
| vectorstore = FAISS.load_local(VECTORDB_PATH, embeddings) | |
| return vectorstore.as_retriever() | |
| except Exception as e: | |
| st.warning(f"خطأ في تحميل البيانات المحفوظة: {str(e)}. سيتم إنشاء بيانات جديدة.") | |
| # إنشاء بيانات جديدة إذا لم توجد | |
| documents = [Document(page_content=f"سؤال: {faq['question']} جواب: {faq['answer']}") for faq in faq_data] | |
| embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-mpnet-base-v2") | |
| # حفظ الـ embeddings للاستخدام المستقبلي | |
| with open(EMBEDDINGS_PATH, "wb") as f: | |
| pickle.dump(embeddings, f) | |
| # إنشاء وحفظ vectorstore | |
| vectorstore = FAISS.from_documents(documents, embeddings) | |
| vectorstore.save_local(VECTORDB_PATH) | |
| return vectorstore.as_retriever() | |
| # 3. LLM model | |
| def load_model(): | |
| return ChatOpenAI( | |
| base_url="https://openrouter.ai/api/v1", | |
| api_key=load_api_key(), | |
| model="mistralai/mistral-7b-instruct", | |
| temperature=0.3 | |
| ) | |
| # 4. Prompt Engineering | |
| template = """ | |
| أنت مساعد ذكي متخصص في خدمات شركة "اتصالات المستقبل". | |
| يجب عليك الالتزام الصارم بالقواعد التالية: | |
| 1. استخدم فقط المعلومات المقدمة في قسم 'السياق' أدناه للإجابة. | |
| 2. إذا لم تجد الإجابة في السياق، قل: "عذراً، لا يمكنني الإجابة على هذا السؤال حالياً. يرجى الاتصال بخدمة العملاء على الرقم 00000 للمساعدة." | |
| 3. حافظ على نفس لغة السؤال (عربية/إنجليزية) في ردك. | |
| السياق: | |
| {context} | |
| السؤال: | |
| {question} | |
| الإجابة: | |
| """ | |
| prompt = PromptTemplate( | |
| input_variables=["context", "question"], | |
| template=template, | |
| ) | |
| # 5. Rag | |
| def create_qa_chain(_llm, _retriever): | |
| return RetrievalQA.from_chain_type( | |
| llm=_llm, | |
| retriever=_retriever, | |
| chain_type="stuff", | |
| chain_type_kwargs={"prompt": prompt}, | |
| return_source_documents=False, | |
| ) | |
| # UI | |
| def main(): | |
| # أسلوب CSS مخصص للدردشة | |
| st.markdown(""" | |
| <style> | |
| .chat-container { | |
| direction: rtl; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 10px; | |
| margin-bottom: 20px; | |
| } | |
| .user-message { | |
| background-color: #000000; /* أسود */ | |
| color: white; /* نص أبيض */ | |
| padding: 12px 16px; | |
| border-radius: 18px 18px 0 18px; | |
| align-self: flex-end; | |
| max-width: 80%; | |
| box-shadow: 0 1px 2px rgba(0,0,0,0.1); | |
| } | |
| .bot-message { | |
| background-color: #E0E0E0; /* رمادي فاتح */ | |
| color: #000000; /* نص أسود */ | |
| padding: 12px 16px; | |
| border-radius: 18px 18px 18px 0; | |
| align-self: flex-start; | |
| max-width: 80%; | |
| box-shadow: 0 1px 2px rgba(0,0,0,0.1); | |
| } | |
| .stTextInput input, .stTextArea textarea { | |
| border: 2px solid #4CAF50 !important; | |
| border-radius: 10px !important; | |
| padding: 10px !important; | |
| } | |
| .stButton button { | |
| background-color: #4CAF50 !important; | |
| color: white !important; | |
| border-radius: 10px !important; | |
| padding: 10px 24px !important; | |
| width: 100% !important; | |
| font-weight: bold !important; | |
| } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| # رأس الصفحة | |
| st.markdown('<h1 style="color: #2E86C1; text-align:center">📞 مساعد اتصالات المستقبل</h1>', unsafe_allow_html=True) | |
| st.markdown("---") | |
| # تهيئة حالة الجلسة لتخزين المحادثة | |
| if 'chat_history' not in st.session_state: | |
| st.session_state.chat_history = [] | |
| # عرض تاريخ المحادثة | |
| with st.container(): | |
| st.markdown('<div class="chat-container">', unsafe_allow_html=True) | |
| for message in st.session_state.chat_history: | |
| if message['type'] == 'user': | |
| st.markdown(f'<div class="user-message">👤 {message["content"]}</div>', unsafe_allow_html=True) | |
| else: | |
| st.markdown(f'<div class="bot-message">🤖 {message["content"]}</div>', unsafe_allow_html=True) | |
| st.markdown('</div>', unsafe_allow_html=True) | |
| try: | |
| # تحميل المكونات | |
| llm = load_model() | |
| retriever = load_or_create_embeddings() | |
| qa_chain = create_qa_chain(llm, retriever) | |
| # قسم إدخال السؤال | |
| user_query = st.text_area( | |
| "اكتب رسالتك هنا:", | |
| height=100, | |
| placeholder="اطرح سؤالك عن خدماتنا...", | |
| key="user_input" | |
| ) | |
| col1, col2 = st.columns([1, 3]) | |
| with col1: | |
| if st.button("إرسال", key="send_btn"): | |
| if user_query.strip(): | |
| # إضافة سؤال المستخدم إلى التاريخ | |
| st.session_state.chat_history.append({ | |
| 'type': 'user', | |
| 'content': user_query | |
| }) | |
| with st.spinner('جاري تحضير الإجابة...'): | |
| # تحويل السؤال إلى فصحى | |
| fusha_query = translate_to_fusha(user_query) | |
| # الحصول على الإجابة | |
| response = qa_chain.run(fusha_query) | |
| # إضافة إجابة البوت إلى التاريخ | |
| st.session_state.chat_history.append({ | |
| 'type': 'bot', | |
| 'content': response | |
| }) | |
| # إعادة تحميل الصفحة لعرض المحادثة الجديدة | |
| st.rerun() | |
| else: | |
| st.warning("الرجاء إدخال سؤال قبل الإرسال") | |
| with col2: | |
| if st.button("مسح المحادثة", key="clear_btn"): | |
| st.session_state.chat_history = [] | |
| st.rerun() | |
| except Exception as e: | |
| st.error(f"حدث خطأ: {str(e)}") | |
| st.session_state.chat_history.append({ | |
| 'type': 'bot', | |
| 'content': "عذراً، حدث خطأ في النظام. يرجى المحاولة مرة أخرى." | |
| }) | |
| st.rerun() | |
| if __name__ == "__main__": | |
| main() |