reemy5's picture
updates to the cide
2274ed6
# ✅ 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()