Spaces:
Sleeping
Sleeping
| # ✅ Updated RAG Chatbot Code Using Groq | |
| # 📦 Install first: | |
| import os | |
| import re | |
| import html | |
| import gradio as gr | |
| from langchain_community.document_loaders import PyMuPDFLoader | |
| from langchain.text_splitter import RecursiveCharacterTextSplitter | |
| from langchain.vectorstores import FAISS | |
| from langchain_community.embeddings import HuggingFaceEmbeddings | |
| from langchain.memory import ConversationBufferMemory | |
| from langchain_groq import ChatGroq | |
| from langchain_core.prompts import ChatPromptTemplate | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| # 📁 Load PDFs | |
| pdf_folder_path = "documents" | |
| documents = [] | |
| for filename in os.listdir(pdf_folder_path): | |
| if filename.endswith(".pdf"): | |
| file_path = os.path.join(pdf_folder_path, filename) | |
| loader = PyMuPDFLoader(file_path) | |
| documents.extend(loader.load()) | |
| print(f"✅ Loaded {len(documents)} documents from '{pdf_folder_path}'.") | |
| # 🧠 Split and Embed | |
| text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) | |
| split_documents = text_splitter.split_documents(documents) | |
| embedding_model = HuggingFaceEmbeddings( | |
| model_name="intfloat/multilingual-e5-large", | |
| encode_kwargs={"normalize_embeddings": True} | |
| ) | |
| vectorstore = FAISS.from_documents(split_documents, embedding_model) | |
| retriever = vectorstore.as_retriever(search_kwargs={"k": 5}) | |
| memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) | |
| # 🤖 Use Groq Chat Model | |
| api_key = os.getenv("GROQ_API_KEY") | |
| if not api_key: | |
| raise ValueError("Please set the GROQ_API_KEY environment variable.") | |
| llm = ChatGroq( | |
| api_key=api_key, | |
| model_name="llama-3.3-70b-versatile" | |
| ) | |
| # Prompt | |
| system_prompt = """ | |
| أنت مساعد ذكي متخصص في الموارد البشرية ورأس المال البشري، وتتكلم باللهجة السعودية. هدفك إنك تجاوب على الأسئلة بطريقة سهلة وواضحة، وكأنك تشرح لصديق أو زميل عمل. خلك طبيعي في الكلام واستخدم تعابير دارجة زي "يعني"، "كذا"، "مره"، "بالضبط"، "من الآخر". | |
| لا تخترع معلومات من عندك، خلك ملتزم فقط بالمحتوى اللي جاي من المستندات. | |
| إذا السؤال ما له علاقة بالمحتوى، قل بصراحة إنك ما تقدر تجاوب عليه. | |
| """ | |
| chat_history = [] | |
| def generate_response(user_query, context="", history_text=""): | |
| full_prompt = f""" | |
| {system_prompt} | |
| {history_text} | |
| محتوى المستندات: | |
| {context} | |
| السؤال: {user_query} | |
| """ | |
| return llm.invoke(full_prompt).content.strip() | |
| def rag_chat_with_memory(user_query): | |
| history_text = "" | |
| for question, answer in chat_history: | |
| history_text += f"سؤال: {question}\nالجواب: {answer}\n\n" | |
| docs = retriever.get_relevant_documents(user_query) | |
| context = "\n\n".join([doc.page_content for doc in docs]) | |
| answer = generate_response(user_query, context=context, history_text=history_text) | |
| chat_history.append((user_query, answer)) | |
| return answer | |
| def respond(message): | |
| try: | |
| message = html.escape(message) | |
| response = rag_chat_with_memory(message)[:4000] | |
| full_html = "" | |
| for user_msg, bot_msg in chat_history: | |
| full_html += f""" | |
| <div style='direction: rtl; text-align: right; font-family: Arial; font-size: 16px; margin-bottom: 20px;'> | |
| <div style='background-color:#e1f5fe; padding:10px; border-radius:10px;'><strong>👤 المستخدم:</strong><br>{user_msg}</div> | |
| <div style='background-color:#f0f0f0; padding:10px; border-radius:10px; margin-top:5px;'><strong>🤖 المساعد:</strong><br>{bot_msg}</div> | |
| </div> | |
| """ | |
| return "", full_html | |
| except Exception as e: | |
| import traceback | |
| print("🔥 ERROR:", traceback.format_exc()) | |
| return "", "<div style='color:red;'>حدث خطأ في المحادثة. حاول مجددًا.</div>" | |
| def reset_chat(): | |
| chat_history.clear() | |
| return "", "" | |
| # 🚀 Gradio UI | |
| with gr.Blocks() as demo: | |
| gr.Markdown("### 🤖 مساعد الموارد البشرية", elem_id="title") | |
| textbox = gr.Textbox(label="🗣️ سؤالك", rtl=True) | |
| output_html = gr.HTML() | |
| reset_btn = gr.Button("🔄 إعادة المحادثة") | |
| textbox.submit(respond, [textbox], [textbox, output_html]) | |
| reset_btn.click(reset_chat, outputs=[textbox, output_html]) | |
| demo.launch() | |