AhmedEwis commited on
Commit
79b2bc5
·
verified ·
1 Parent(s): 4a34420

Upload 4 files

Browse files
Files changed (4) hide show
  1. README_HF.md +82 -0
  2. app.py +453 -0
  3. processed_documents.json +0 -0
  4. requirements.txt +13 -35
README_HF.md ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: CMA RAG Chatbot
3
+ emoji: 🤖
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: gradio
7
+ sdk_version: 4.44.0
8
+ app_file: app.py
9
+ pinned: false
10
+ license: mit
11
+ ---
12
+
13
+ # 🤖 مستشار هيئة أسواق المال الكويتية - نظام RAG التفاعلي
14
+
15
+ ## نظام ذكي تفاعلي للاستشارات القانونية والتنظيمية
16
+
17
+ مساعد ذكي متخصص في قوانين ولوائح هيئة أسواق المال الكويتية، مدرب على جميع الوثائق الرسمية باستخدام تقنيات الذكاء الاصطناعي المتقدمة مع ذاكرة محادثة تفاعلية.
18
+
19
+ ## ✨ المميزات الرئيسية
20
+
21
+ ### 🧠 **ذكاء اصطناعي متقدم**
22
+ - **نموذج GPT-4o Mini** للاستجابات الذكية
23
+ - **تقنية RAG** (Retrieval-Augmented Generation)
24
+ - **Vector Embeddings** باستخدام Sentence Transformers
25
+ - **FAISS** لبحث سريع ودقيق
26
+
27
+ ### 💬 **محادثة تفاعلية**
28
+ - **ذاكرة محادثة** تتذكر السياق السابق
29
+ - **أسئلة متتابعة** مع فهم السياق
30
+ - **محادثة عامة** بالإضافة للاستشارات القانونية
31
+ - **واجهة عربية** بتصميم RTL احترافي
32
+
33
+ ### 📚 **قاعدة معرفية شاملة**
34
+ - **2,091 مستند** معالج من الوثائق الرسمية
35
+ - **19 مصدر** من كتب ولوائح هيئة أسواق المال
36
+ - **334,809 كلمة** من المحتوى القانوني
37
+
38
+ ## 🎯 مجالات الخبرة
39
+
40
+ يمكن للمستشار الذكي مساعدتك في:
41
+ - قوانين ولوائح الأوراق المالية
42
+ - أنظمة الاستثمار الجماعي
43
+ - قواعد الإدراج والتداول
44
+ - متطلبات الحوكمة والامتثال
45
+ - أحكام مكافحة غسل الأموال
46
+ - التقنيات المالية والابتكار
47
+
48
+ ## 🚀 كيفية الاستخدام
49
+
50
+ ### 💬 **للمحادثة العامة:**
51
+ - "السلام عليكم"
52
+ - "كيف حالك؟"
53
+
54
+ ### ⚖️ **للاستشارات القانونية:**
55
+ - "ما هي أنظمة الاستثمار الجماعي؟"
56
+ - "عرف قواعد الإدراج"
57
+ - "ما هي متطلبات الحوكمة؟"
58
+
59
+ ### 🔄 **للأسئلة المتتابعة:**
60
+ - "أريد مزيد من التفاصيل"
61
+ - "وضح أكثر"
62
+
63
+ ## 🔧 التقنيات المستخدمة
64
+
65
+ - **OpenAI GPT-4o Mini** - نموذج اللغة الأساسي
66
+ - **Sentence Transformers** - تحويل النصوص لـ embeddings
67
+ - **LangChain** - إطار عمل RAG المتقدم
68
+ - **FAISS** - بحث سريع في المتجهات
69
+ - **Gradio** - واجهة تفاعلية حديثة
70
+
71
+ ## 📊 إحصائيات النظام
72
+
73
+ | المؤشر | القيمة |
74
+ |---------|--------|
75
+ | 📄 المستندات المعالجة | 2,091 |
76
+ | 📚 المصادر الرسمية | 19 |
77
+ | 🧠 نموذج الذكاء الاصطناعي | GPT-4o Mini |
78
+ | 💬 نوع المحادثة | تفاعلية مع ذاكرة |
79
+
80
+ ---
81
+
82
+ **تم تطوير هذا النظام باستخدام أحدث تقنيات الذكاء الاصطناعي لخدمة المجتمع المالي الكويتي** 🇰🇼
app.py ADDED
@@ -0,0 +1,453 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Enhanced CMA RAG Chatbot for Hugging Face Spaces
5
+ Conversational AI with memory for Kuwait Capital Markets Authority documents
6
+ """
7
+
8
+ import os
9
+ import json
10
+ import logging
11
+ import gradio as gr
12
+ from typing import List, Tuple, Dict, Any
13
+ import faiss
14
+ import pickle
15
+ from sentence_transformers import SentenceTransformer
16
+ from langchain.vectorstores import FAISS
17
+ from langchain.embeddings import HuggingFaceEmbeddings
18
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
19
+ from langchain.schema import Document
20
+ from langchain.retrievers import ContextualCompressionRetriever
21
+ from langchain.retrievers.document_compressors import LLMChainExtractor
22
+ from langchain.chat_models import ChatOpenAI
23
+ from langchain.prompts import ChatPromptTemplate
24
+ from langchain.schema.runnable import RunnablePassthrough
25
+ from langchain.schema.output_parser import StrOutputParser
26
+ import uuid
27
+
28
+ # Configure logging
29
+ logging.basicConfig(level=logging.INFO)
30
+ logger = logging.getLogger(__name__)
31
+
32
+ class EnhancedCMARAGBot:
33
+ def __init__(self):
34
+ """Initialize the Enhanced CMA RAG Bot with conversational capabilities"""
35
+ logger.info("🚀 Starting Enhanced CMA Conversational RAG Chatbot...")
36
+ logger.info("📚 Loading vector store and initializing conversational AI...")
37
+
38
+ # Initialize embedding model
39
+ self.embedding_model = HuggingFaceEmbeddings(
40
+ model_name="sentence-transformers/all-MiniLM-L6-v2",
41
+ model_kwargs={'device': 'cpu'},
42
+ encode_kwargs={'normalize_embeddings': True}
43
+ )
44
+ logger.info("Embedding model initialized")
45
+
46
+ # Load vector store
47
+ self.vector_store = self._load_vector_store()
48
+ logger.info("Vector store loaded successfully")
49
+
50
+ # Initialize OpenAI LLM
51
+ self.llm = ChatOpenAI(
52
+ model="gpt-4o-mini",
53
+ temperature=0.1,
54
+ max_tokens=1000,
55
+ openai_api_key=os.getenv("OPENAI_API_KEY")
56
+ )
57
+ logger.info("OpenAI LLM initialized with gpt-4o-mini")
58
+
59
+ # Setup retrieval chain
60
+ self._setup_retrieval_chain()
61
+ logger.info("Retrieval chain setup completed")
62
+
63
+ # Initialize chat sessions for memory
64
+ self.chat_sessions: Dict[str, List[Dict[str, str]]] = {}
65
+
66
+ logger.info("Enhanced CMA RAG Bot initialized successfully")
67
+
68
+ def _load_vector_store(self):
69
+ """Load the pre-built FAISS vector store"""
70
+ try:
71
+ vector_store = FAISS.load_local(
72
+ "faiss_index",
73
+ self.embedding_model,
74
+ allow_dangerous_deserialization=True
75
+ )
76
+ return vector_store
77
+ except Exception as e:
78
+ logger.error(f"Error loading vector store: {e}")
79
+ # Fallback: create from processed documents
80
+ return self._create_vector_store_from_documents()
81
+
82
+ def _create_vector_store_from_documents(self):
83
+ """Create vector store from processed documents as fallback"""
84
+ try:
85
+ with open('processed_documents.json', 'r', encoding='utf-8') as f:
86
+ processed_docs = json.load(f)
87
+
88
+ documents = []
89
+ for doc_data in processed_docs:
90
+ doc = Document(
91
+ page_content=doc_data['content'],
92
+ metadata=doc_data['metadata']
93
+ )
94
+ documents.append(doc)
95
+
96
+ # Create vector store
97
+ vector_store = FAISS.from_documents(documents, self.embedding_model)
98
+
99
+ # Save for future use
100
+ vector_store.save_local("faiss_index")
101
+ logger.info("Vector store created and saved from processed documents")
102
+
103
+ return vector_store
104
+
105
+ except Exception as e:
106
+ logger.error(f"Error creating vector store from documents: {e}")
107
+ raise
108
+
109
+ def _setup_retrieval_chain(self):
110
+ """Setup the retrieval chain with enhanced prompts"""
111
+ # Create retriever
112
+ self.retriever = self.vector_store.as_retriever(
113
+ search_type="similarity",
114
+ search_kwargs={"k": 5}
115
+ )
116
+
117
+ # Enhanced system prompt for conversational AI
118
+ system_prompt = """أنت "مستشار CMA"، مساعد ذكي متخصص ومتفهم في قوانين ولوائح هيئة أسواق المال الكويتية.
119
+
120
+ شخصيتك:
121
+ - محترف ومتفهم ومساعد
122
+ - تتحدث بطريقة ودودة وطبيعية
123
+ - تتذكر السياق والمحادثات السابقة بدقة
124
+ - تجيب على الأسئلة العامة والمحادثة العادية بطريقة مهذبة
125
+ - تفهم الأسئلة التتابعية والمتابعة بناءً على السياق السابق
126
+
127
+ قواعد الإجابة:
128
+ - أجب باللغة العربية دائماً
129
+ - للأسئلة القانونية: استخدم المعلومات من السياق المتوفر فقط
130
+ - للمحادثة العامة (مثل "كيف حالك؟"): أجب بطريقة ودودة ومهذبة
131
+ - عند طلب "مزيد من التفاصيل" أو "توضيح أكثر": ارجع للموضوع السابق في المحادثة وقدم تفاصيل إضافية
132
+ - إذا لم تجد معلومات قانونية في السياق، قل "لا توجد معلومات كافية في الوثائق المتاحة"
133
+ - اذكر مصدر المعلومة (اسم الكتاب ورقم المادة) عند الإمكان
134
+ - كن مفصلاً ودقيقاً في الإجابات القانونية
135
+ - اربط الأسئلة التتابعية بالسياق السابق في المحادثة
136
+
137
+ السياق المتاح من وثائق هيئة أسواق المال:
138
+ {context}"""
139
+
140
+ qa_prompt = ChatPromptTemplate.from_messages([
141
+ ("system", system_prompt),
142
+ ("human", "تاريخ المحادثة:\n{chat_history}\n\nالسؤال الحالي: {question}")
143
+ ])
144
+
145
+ # Create the chain
146
+ self.rag_chain = (
147
+ {
148
+ "context": self.retriever | self._format_docs,
149
+ "question": RunnablePassthrough(),
150
+ "chat_history": RunnablePassthrough()
151
+ }
152
+ | qa_prompt
153
+ | self.llm
154
+ | StrOutputParser()
155
+ )
156
+
157
+ def _format_docs(self, docs):
158
+ """Format retrieved documents for context"""
159
+ formatted = []
160
+ for doc in docs:
161
+ source = doc.metadata.get('source', 'غير محدد')
162
+ content = doc.page_content
163
+ formatted.append(f"المصدر: {source}\nالمحتوى: {content}\n")
164
+ return "\n---\n".join(formatted)
165
+
166
+ def get_chat_history(self, user_id: str) -> List[Dict[str, str]]:
167
+ """Get chat history for a user"""
168
+ return self.chat_sessions.get(user_id, [])
169
+
170
+ def add_to_chat_history(self, user_id: str, user_message: str, bot_response: str):
171
+ """Add message to chat history"""
172
+ if user_id not in self.chat_sessions:
173
+ self.chat_sessions[user_id] = []
174
+
175
+ chat_history = self.chat_sessions[user_id]
176
+ chat_history.append({"role": "user", "content": user_message})
177
+ chat_history.append({"role": "assistant", "content": bot_response})
178
+
179
+ # Keep only last 10 messages to manage memory
180
+ if len(chat_history) > 10:
181
+ self.chat_sessions[user_id] = chat_history[-10:]
182
+
183
+ def is_legal_question(self, user_input: str) -> bool:
184
+ """Determine if the question is legal/regulatory in nature"""
185
+ legal_keywords = [
186
+ 'قانون', 'لائحة', 'نظام', 'قاعدة', 'متطلب', 'شرط', 'إجراء',
187
+ 'هيئة', 'أسواق', 'مال', 'استثمار', 'إدراج', 'تداول', 'حوكمة',
188
+ 'امتثال', 'غسل', 'أموال', 'تقنيات', 'مالية', 'ترخيص', 'رقابة',
189
+ 'عقوبة', 'مخالفة', 'تفتيش', 'بورصة', 'وساطة', 'صندوق',
190
+ 'ما هي', 'عرف', 'اشرح', 'وضح', 'متى', 'كيف', 'أين',
191
+ 'تفاصيل', 'مزيد', 'أكثر', 'توضيح', 'شرح', 'تفسير',
192
+ 'نعم', 'أريد', 'أرغب', 'أود', 'هل يمكن', 'كيفية',
193
+ 'تسهيلات', 'تركز', 'تمويلي', 'أطراف', 'مترابطة', 'احتساب',
194
+ 'حد', 'أعلى', 'نقدية', 'غير نقدية', 'مستخدم', 'ممنوح'
195
+ ]
196
+
197
+ # Also check if it's a follow-up question
198
+ followup_phrases = [
199
+ 'مزيد من التفاصيل', 'تفاصيل أكثر', 'وضح أكثر', 'اشرح أكثر',
200
+ 'نعم أريد', 'نعم أرغب', 'أريد تفاصيل', 'أود معرفة',
201
+ 'هل يمكن توضيح', 'كيف يتم', 'ما هو الإجراء'
202
+ ]
203
+
204
+ user_input_lower = user_input.lower().strip()
205
+
206
+ # Check for follow-up phrases
207
+ if any(phrase in user_input_lower for phrase in followup_phrases):
208
+ return True
209
+
210
+ return any(keyword in user_input for keyword in legal_keywords)
211
+
212
+ def get_conversational_response(self, user_input: str) -> str:
213
+ """Generate conversational responses for non-legal questions"""
214
+ greetings = ['سلام', 'أهلا', 'مرحبا', 'صباح', 'مساء']
215
+ how_are_you = ['كيف حالك', 'كيف الحال', 'شلونك', 'كيفك']
216
+ thanks = ['شكرا', 'شكراً', 'مشكور', 'تسلم']
217
+ goodbye = ['وداع', 'سلامة', 'باي', 'مع السلامة']
218
+
219
+ user_lower = user_input.lower()
220
+
221
+ if any(greeting in user_lower for greeting in greetings):
222
+ return """وعليكم السلام ورحمة الله وبركاته. أهلاً وسهلاً بك في مست��ار هيئة أسواق المال الكويتية.
223
+
224
+ أنا مستشار ذكي متخصص في قوانين ولوائح هيئة أسواق المال الكويتية، مدرب على جميع الوثائق الرسمية باستخدام تقنيات الذكاء الاصطناعي المتقدمة.
225
+
226
+ يمكنني مساعدتك في:
227
+ • قوانين ولوائح الأوراق المالية
228
+ • أنظمة الاستثمار الجماعي
229
+ • قواعد الإدراج والتداول
230
+ • متطلبات الحوكمة والامتثال
231
+ • أحكام مكافحة غسل الأموال
232
+ • التقنيات المالية والابتكار
233
+
234
+ كيف يمكنني مساعدتك اليوم؟ 😊"""
235
+
236
+ elif any(how in user_lower for how in how_are_you):
237
+ return """أنا بخير شكراً لسؤالك! 😊 كيف يمكنني مساعدتك اليوم في موضوع يتعلق بهيئة أسواق المال الكويتية؟
238
+
239
+ أنا جاهز للإجابة على أي استفسار قانوني أو تنظيمي، سأكون سعيداً جداً بمساعدتك.
240
+
241
+ يمكنك سؤالي عن أي موضوع متعلق بأسواق المال الكويتية! 📚"""
242
+
243
+ elif any(thank in user_lower for thank in thanks):
244
+ return "العفو! أنا سعيد لمساعدتك. إذا كان لديك أي استفسار آخر حول قوانين ولوائح هيئة أسواق المال، لا تتردد في السؤال! 😊"
245
+
246
+ elif any(bye in user_lower for bye in goodbye):
247
+ return "مع السلامة! كان من دواعي سروري مساعدتك. أتمنى لك يوماً سعيداً، وأراك قريباً! 👋"
248
+
249
+ else:
250
+ return """أقدر تفاعلك معي!
251
+
252
+ أنا متخصص في الإجابة على الأسئلة المتعلقة بقوانين ولوائح هيئة أسواق المال الكويتية. إذا كان لديك أي استفسار قانوني أو تنظيمي، سأكون سعيداً جداً بمساعدتك.
253
+
254
+ يمكنك سؤالي عن أي موضوع متعلق بأسواق المال الكويتية! 📚"""
255
+
256
+ def format_chat_history_for_prompt(self, chat_history: List[Dict[str, str]]) -> str:
257
+ """Format chat history for the prompt"""
258
+ if not chat_history:
259
+ return "لا يوجد تاريخ محادثة سابق."
260
+
261
+ formatted_history = []
262
+ for message in chat_history[-6:]: # Last 6 messages for context
263
+ role = "المستخدم" if message["role"] == "user" else "المستشار"
264
+ formatted_history.append(f"{role}: {message['content']}")
265
+
266
+ return "\n".join(formatted_history)
267
+
268
+ def get_response(self, user_input: str, user_id: str = None) -> str:
269
+ """Get response from the RAG system with conversational capabilities"""
270
+ try:
271
+ if user_id is None:
272
+ user_id = str(uuid.uuid4())
273
+
274
+ # Get chat history
275
+ chat_history = self.get_chat_history(user_id)
276
+ formatted_history = self.format_chat_history_for_prompt(chat_history)
277
+
278
+ # Check if it's a legal question or general conversation
279
+ if self.is_legal_question(user_input):
280
+ # Use RAG for legal questions
281
+ response = self.rag_chain.invoke({
282
+ "question": user_input,
283
+ "chat_history": formatted_history
284
+ })
285
+ else:
286
+ # Use conversational responses for general chat
287
+ response = self.get_conversational_response(user_input)
288
+
289
+ # Add to chat history
290
+ self.add_to_chat_history(user_id, user_input, response)
291
+
292
+ return response
293
+
294
+ except Exception as e:
295
+ logger.error(f"Error getting response: {e}")
296
+ return "عذراً، حدث خطأ أثناء معالجة استفسارك. يرجى المحاولة مرة أخرى."
297
+
298
+ # Initialize the bot
299
+ try:
300
+ bot = EnhancedCMARAGBot()
301
+ logger.info("Bot initialized successfully")
302
+ except Exception as e:
303
+ logger.error(f"Failed to initialize bot: {e}")
304
+ bot = None
305
+
306
+ def chat_interface(message, history, user_id_state):
307
+ """Gradio chat interface"""
308
+ if bot is None:
309
+ return "عذراً، النظام غير متاح حالياً. يرجى المحاولة لاحقاً.", history, user_id_state
310
+
311
+ # Generate user ID if not exists
312
+ if user_id_state is None:
313
+ user_id_state = str(uuid.uuid4())
314
+
315
+ # Get response
316
+ response = bot.get_response(message, user_id_state)
317
+
318
+ # Update history
319
+ history.append((message, response))
320
+
321
+ return "", history, user_id_state
322
+
323
+ def get_stats():
324
+ """Get system statistics"""
325
+ try:
326
+ with open('processed_documents.json', 'r', encoding='utf-8') as f:
327
+ docs = json.load(f)
328
+ return len(docs), 19, "GPT-4o Mini", "تفاعلية مع ذاكرة"
329
+ except:
330
+ return "2,091", "19", "GPT-4o Mini", "تفاعلية مع ذاكرة"
331
+
332
+ # Create Gradio interface
333
+ def create_interface():
334
+ """Create the Gradio interface"""
335
+
336
+ # Get stats
337
+ doc_count, source_count, model_name, chat_type = get_stats()
338
+
339
+ with gr.Blocks(
340
+ title="مستشار هيئة أسواق المال الكويتية - نظام RAG التفاعلي",
341
+ theme=gr.themes.Soft(),
342
+ css="""
343
+ .rtl { direction: rtl; text-align: right; }
344
+ .main-header { background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); color: white; padding: 20px; border-radius: 10px; margin-bottom: 20px; }
345
+ .stats-container { display: flex; gap: 10px; margin-bottom: 20px; }
346
+ .stat-card { flex: 1; padding: 15px; border-radius: 8px; text-align: center; }
347
+ .stat-card.docs { background-color: #e3f2fd; }
348
+ .stat-card.sources { background-color: #e8f5e8; }
349
+ .stat-card.model { background-color: #fff3e0; }
350
+ .stat-card.chat { background-color: #f3e5f5; }
351
+ .examples-container { margin-top: 15px; }
352
+ .example-section { margin-bottom: 15px; }
353
+ .example-buttons { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
354
+ .example-btn { padding: 8px 12px; border: 1px solid #ddd; border-radius: 15px; background: #f8f9fa; cursor: pointer; font-size: 12px; }
355
+ .example-btn:hover { background: #e9ecef; }
356
+ """
357
+ ) as interface:
358
+
359
+ # Header
360
+ gr.HTML(f"""
361
+ <div class="main-header rtl">
362
+ <h1>🤖 مستشار هيئة أسواق المال الكويتية</h1>
363
+ <p>نظام RAG تفاعلي مع ذاكرة محادثة وذكاء اصطناعي محسّن</p>
364
+ <p>مساعد ذكي متفهم يتذكر المحادثة ويجيب على الأسئلة القانونية والمحادثة العامة</p>
365
+ </div>
366
+ """)
367
+
368
+ # Statistics
369
+ gr.HTML(f"""
370
+ <div class="stats-container">
371
+ <div class="stat-card docs">
372
+ <h3>📄 المستندات</h3>
373
+ <h2>{doc_count}</h2>
374
+ </div>
375
+ <div class="stat-card sources">
376
+ <h3>📚 المصادر</h3>
377
+ <h2>{source_count}</h2>
378
+ </div>
379
+ <div class="stat-card model">
380
+ <h3>🧠 النموذج</h3>
381
+ <h2>{model_name}</h2>
382
+ </div>
383
+ <div class="stat-card chat">
384
+ <h3>💬 المحادثة</h3>
385
+ <h2>{chat_type}</h2>
386
+ </div>
387
+ </div>
388
+ """)
389
+
390
+ # User ID state (hidden)
391
+ user_id_state = gr.State(None)
392
+
393
+ # Chat interface
394
+ with gr.Row():
395
+ with gr.Column():
396
+ chatbot = gr.Chatbot(
397
+ label="💬 المحادثة مع مستشار CMA",
398
+ height=400,
399
+ rtl=True,
400
+ show_label=True,
401
+ container=True,
402
+ bubble_full_width=False
403
+ )
404
+
405
+ with gr.Row():
406
+ msg = gr.Textbox(
407
+ label="✍️ اكتب رسالتك هنا",
408
+ placeholder="يمكنك سؤالي عن القوانين أو حتى المحادثة العامة...",
409
+ rtl=True,
410
+ scale=4
411
+ )
412
+ send_btn = gr.Button("📤 إرسال", scale=1)
413
+
414
+ # Examples
415
+ gr.HTML("""
416
+ <div class="examples-container rtl">
417
+ <div class="example-section">
418
+ <h4>🗣️ محادثة عامة</h4>
419
+ <div class="example-buttons">
420
+ <span class="example-btn">كيف حالك؟</span>
421
+ <span class="example-btn">شكراً لك</span>
422
+ <span class="example-btn">مع السلامة</span>
423
+ </div>
424
+ </div>
425
+ <div class="example-section">
426
+ <h4>⚖️ أسئلة قانونية</h4>
427
+ <div class="example-buttons">
428
+ <span class="example-btn">ما هي أنظمة الاستثمار الجماعي؟</span>
429
+ <span class="example-btn">عرف قواعد الإدراج</span>
430
+ <span class="example-btn">ما هي متطلبات الحوكمة؟</span>
431
+ </div>
432
+ </div>
433
+ </div>
434
+ """)
435
+
436
+ # Event handlers
437
+ def respond(message, history, user_id_state):
438
+ return chat_interface(message, history, user_id_state)
439
+
440
+ msg.submit(respond, [msg, chatbot, user_id_state], [msg, chatbot, user_id_state])
441
+ send_btn.click(respond, [msg, chatbot, user_id_state], [msg, chatbot, user_id_state])
442
+
443
+ return interface
444
+
445
+ # Launch the interface
446
+ if __name__ == "__main__":
447
+ interface = create_interface()
448
+ interface.launch(
449
+ server_name="0.0.0.0",
450
+ server_port=7860,
451
+ share=False,
452
+ show_error=True
453
+ )
processed_documents.json ADDED
The diff for this file is too large to render. See raw diff
 
requirements.txt CHANGED
@@ -1,35 +1,13 @@
1
- # Enhanced Arabic Document Chatbot Dependencies
2
-
3
- # Core web framework
4
- gradio>=4.0.0
5
-
6
- # AI and language models
7
- google-generativeai>=0.3.0
8
- openai>=1.3.0
9
-
10
- # Vector search and embeddings
11
- faiss-cpu>=1.7.4
12
- sentence-transformers>=2.2.0
13
-
14
- # PDF processing
15
- PyMuPDF>=1.23.0
16
- pdfplumber>=0.10.0
17
- pytesseract>=0.3.10
18
- easyocr>=1.7.0
19
-
20
- # Data processing
21
- numpy>=1.24.0
22
- PyYAML>=6.0
23
-
24
- # Arabic NLP tools
25
- camel-tools>=1.5.2
26
- pyarabic>=0.6.15
27
- arabic-reshaper>=3.0.0
28
- python-bidi>=0.4.2
29
-
30
- # Utilities
31
- tenacity>=8.2.0
32
-
33
- # Optional: GPU support (uncomment if needed)
34
- # faiss-gpu>=1.7.4
35
- # torch>=2.0.0
 
1
+ gradio==4.44.0
2
+ langchain==0.1.20
3
+ langchain-community==0.0.38
4
+ langchain-openai==0.1.8
5
+ openai==1.35.15
6
+ faiss-cpu==1.8.0
7
+ sentence-transformers==2.7.0
8
+ transformers==4.41.2
9
+ torch==2.3.1
10
+ numpy==1.24.4
11
+ pandas==2.0.3
12
+ python-dotenv==1.0.1
13
+ tiktoken==0.7.0