""" Aqeedah AI Chatbot - Gradio Interface ====================================== A Retrieval-Augmented Generation (RAG) chatbot for Islamic theology (Aqeedah) questions, powered by Gemini and deployed on Hugging Face Spaces. Author: Abdullah Alamodi Dataset: https://huggingface.co/datasets/abdullah-alamodi/aqeedah-rag-dataset Space: https://huggingface.co/spaces/abdullah-alamodi/aqeedah-ai """ import os import gradio as gr from google import genai from dotenv import load_dotenv from retrieval import HybridRetriever # Load environment variables load_dotenv() # --- Configuration --- GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") # Options: "gemini-2.0-flash-exp", "gemini-1.5-flash", "gemini-1.5-pro" GEMINI_MODEL = "gemini-2.5-flash" # System prompt template SYSTEM_PROMPT_TEMPLATE = """ # التعليمات 1. أجب **فقط** على الأسئلة المتعلقة بـ **العقيدة الإسلامية**. 2. لا تستخدم أي معرفة مسبقة خارج السياق. 3. إذا لم تجد الإجابة في السياق → قل بوضوح: **"لم أجد الإجابة في النص المقدم"**. 4. إذا كان السؤال خارج موضوع العقيدة الإسلامية → قل بوضوح: **"هذا السؤال خارج نطاق العقيدة الإسلامية، ولا أستطيع الإجابة عليه"**. 5. في حالة وجود اجابة وكان السؤال متعلقاً بالعقيدة الإسلامية، ابدأ كل إجابة بالصيغة: **"الحمد لله، والصلاة والسلام على رسول الله، وعلى آله وصحبه ومن والاه، أما بعد:"** 6. اذكر المصادر التي استندت إليها في إجابتك من السياق المقدم مثل اسم الكتاب او اسم الشيخ ان امكن. --- ## السياق: {context} --- ## السؤال: {query} --- ## الإجابة: الحمد لله، والصلاة والسلام على رسول الله، وعلى آله وصحبه ومن والاه، أما بعد: ... أكمل اجابتك هنا بناءً على السياق أعلاه. """ # --- Initialize Global Components --- print("🚀 Initializing Aqeedah AI Chatbot...") # Initialize Gemini client if not GEMINI_API_KEY: print("⚠️ WARNING: GEMINI_API_KEY not found in environment variables!") print(" Please set GEMINI_API_KEY in .env file or HF Spaces secrets") gemini_client = None else: gemini_client = genai.Client(api_key=GEMINI_API_KEY) print(f"✓ Gemini client initialized (model: {GEMINI_MODEL})") # Initialize retriever retriever = HybridRetriever( embedding_model="aubmindlab/bert-base-arabertv02", dataset_name="abdullah-alamodi/aqeedah-rag-dataset" ) print("✅ Chatbot initialized successfully!\n") # --- Core Function --- def answer_question(question, top_k=4): """ Answer a question using RAG with Gemini. Args: question (str): User's question in Arabic top_k (int): Number of documents to retrieve Returns: tuple: (answer, sources_list, context_preview) """ if not question or question.strip() == "": return "⚠️ الرجاء إدخال سؤال", "", "" # Check if Gemini is available if gemini_client is None: return "⚠️ خطأ: لم يتم تكوين Gemini API. الرجاء التحقق من متغيرات البيئة.", "", "" try: # Step 1: Retrieve relevant documents print(f"\n🔍 Searching for: {question}") results = retriever.search(question, top_k=top_k) if not results: return "⚠️ لم أجد نتائج ذات صلة بسؤالك في قاعدة البيانات", "", "" # Step 2: Build context from retrieved documents context_parts = [] sources_list = [] for i, result in enumerate(results, 1): doc_name = result['meta']['doc_name'] author_name = result['meta']['author_name'] paragraph_num = result['meta']['paragraph_number'] content = result['content'] # Add to context context_parts.append( f"المصدر {i}:\n" f"الكتاب: {doc_name}\n" f"المؤلف: {author_name}\n" f"الفقرة رقم: {paragraph_num}\n" f"النص: {content}\n" ) # Add to sources list sources_list.append({ "rank": i, "document": doc_name, "author": author_name, "paragraph": paragraph_num, "preview": content[:200] + "..." if len(content) > 200 else content }) context = "\n---\n\n".join(context_parts) # Step 3: Generate answer with Gemini print(f"🤖 Generating answer with Gemini...") prompt = SYSTEM_PROMPT_TEMPLATE.format(context=context, query=question) response = gemini_client.models.generate_content( model=GEMINI_MODEL, contents=prompt ) answer = response.text # Step 4: Format output print(f"✓ Answer generated successfully") # Create a nicely formatted sources display sources_md = "### 📚 المصادر المستخدمة:\n\n" for src in sources_list: sources_md += f"**{src['rank']}.** {src['document']}\n" sources_md += f" - المؤلف: {src['author']}\n" sources_md += f" - الفقرة: {src['paragraph']}\n\n" return answer, sources_md, context except Exception as e: error_msg = f"⚠️ حدث خطأ أثناء معالجة السؤال:\n\n{str(e)}" print(f"❌ Error: {e}") # Check if it's a rate limit error if "429" in str(e) or "RESOURCE_EXHAUSTED" in str(e): error_msg = """## ⚠️ تم تجاوز الحد المسموح من الطلبات (API Rate Limit Exceeded) **عذراً! لقد تم استنفاد حصة Gemini API المجانية.** ### 🔄 الحلول المتاحة: **الحل الأول: انتظر دقيقة واحدة ثم أعد المحاولة** - انتظر 60 ثانية - أعد إدخال السؤال مرة أخرى **الحل الثاني: قم بتنزيل الكود وتشغيله محلياً** 1. قم بتحميل الكود من GitHub: ```bash git clone https://github.com/Abdullah-Alamodi/aqeedah-ai.git cd aqeedah-ai ``` 2. قم بإنشاء ملف `.env` وأضف مفتاح Gemini API الخاص بك: ``` GEMINI_API_KEY=your_api_key_here ``` احصل على المفتاح من: [Google AI Studio](https://aistudio.google.com/app/apikey) 3. قم بتثبيت المتطلبات: ```bash pip install -r requirements.txt ``` 4. شغّل التطبيق: ```bash python app.py ``` --- **📊 GitHub Repository:** [Abdullah-Alamodi/aqeedah-ai](https://github.com/Abdullah-Alamodi/aqeedah-ai) **💡 ملاحظة:** التشغيل المحلي يعطيك حصة API مستقلة وأداء أفضل! """ return error_msg, "", "" # --- Gradio Interface --- def create_interface(): """Create and configure the Gradio interface.""" with gr.Blocks( title="مساعد العقيدة الإسلامية | Aqeedah AI Assistant", theme=gr.themes.Soft(), css=""" .rtl { direction: rtl; text-align: right; } .container { max-width: 900px; margin: auto; } """ ) as interface: # Header gr.Markdown("""
نظام ذكاء اصطناعي للإجابة على أسئلة العقيدة الإسلامية بناءً على مصادر علمية موثوقة
🔬 هذا نظام تجريبي للبحث العلمي فقط
🔬 This is an Experimental Research Chatbot
⚠️ لا تعتمد على إجابات هذا النظام في الأمور الشرعية
يجب الرجوع إلى العلماء المعتمدين (المشايخ) للفتاوى والأحكام الشرعية
⚠️ Do not rely on this system for religious rulings
Always refer to authorized Islamic scholars (Sheikh) for religious guidance
📊 Dataset: abdullah-alamodi/aqeedah-rag-dataset
🤖 Model: Gemini 2.5 Flash + AraBERT v2
⚠️ Disclaimer: This is an AI research tool. Please consult qualified Islamic scholars for authoritative religious guidance.
📜 License: MIT | Sources: Authenticated Sunni Islamic theology texts