Nour83/contract_analysis
0
1import streamlit as st2import os3import docx4import shutil5from langchain_community.document_loaders import PyPDFLoader6from langchain_huggingface import HuggingFaceEmbeddings7from langchain_chroma import Chroma8from langchain_groq import ChatGroq9from langchain_text_splitters import RecursiveCharacterTextSplitter10from langchain_core.documents import Document11from dotenv import load_dotenv12 13# 1. إعدادات الصفحة14st.set_page_config(page_title="AI Legal Auditor", layout="wide")15load_dotenv()16 17# تحسين شكل الواجهة18st.markdown("""19 <style>20 .stApp { background-color: #f8f9fa; }21 h1, h2, h3 { color: #1e3d59; font-family: 'Arial'; }22 .stButton>button { width: 100%; border-radius: 8px; background-color: #1e3d59; color: white; height: 3em; font-weight: bold; }23 .stButton>button:hover { background-color: #ffc107; color: #1e3d59; border: 1px solid #1e3d59; }24 .stAlert { border-radius: 10px; }25 </style>26 """, unsafe_allow_html=True)27 28# دالة قراءة الوورد29def read_docx(file_path):30 doc = docx.Document(file_path)31 text = "\n".join([para.text for para in doc.paragraphs if para.text.strip()])32 return [Document(page_content=text, metadata={"source": "uploaded_docx"})]33 34@st.cache_resource35def load_models():36 embeddings = HuggingFaceEmbeddings(model_name="./my_model")37 llm = ChatGroq(38 temperature=0, 39 api_key=os.getenv("GROQ_API_KEY"), 40 model_name="llama-3.3-70b-versatile"41 )42 return embeddings, llm43 44embeddings, llm = load_models()45 46st.title("⚖️ منصة تدقيق العقود الذكية")47st.write("حلل عقودك بدقة قانونية، اكتشف الثغرات، واضمن حقوقك بميزان القانون المصري.")48 49uploaded_file = st.file_uploader("ارفع العقد (PDF أو DOCX)", type=["pdf", "docx"])50 51if uploaded_file:52 file_ext = uploaded_file.name.split('.')[-1].lower()53 temp_path = f"temp_ui.{file_ext}"54 55 with open(temp_path, "wb") as f:56 f.write(uploaded_file.getbuffer())57 58 try:59 # معالجة الملف60 with st.spinner("جاري قراءة وتحليل المستند..."):61 if file_ext == "pdf":62 loader = PyPDFLoader(temp_path)63 docs = loader.load()64 else:65 docs = read_docx(temp_path)66 67 full_content = " ".join([d.page_content for d in docs])68 69 # --- فحص صحة العقد (Validation) ---70 legal_keywords = ["عقد", "بند", "طرف", "التزام", "اتفاق", "قانون", "صلاحية", "اختصاص", "contract", "agreement"]71 is_legal = any(word in full_content.lower() for word in legal_keywords)72 73 if not is_legal or len(full_content.strip()) < 150:74 st.error("⚠️ المستند المرفق لا يبدو عقداً قانونياً معتمداً. يرجى رفع ملف يحتوي على بنود قانونية واضحة.")75 st.stop()76 77 # تقسيم النص وإنشاء المستودع الرقمي78 text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)79 splits = text_splitter.split_documents(docs)80 vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)81 82 # زيادة k لـ 6 لضمان تحليل شامل للمخاطر83 retriever = vectorstore.as_retriever(search_kwargs={"k": 6})84 85 # دالة المهام الذكية86 def run_legal_task(task_instruction, use_table=False):87 relevant_docs = retriever.invoke(task_instruction)88 context = "\n\n".join([doc.page_content for doc in relevant_docs])89 90 table_info = "برجاء عرض النتائج في شكل جدول Markdown منظم." if use_table else ""91 92 # الـ Prompt التحليلي المطور93 full_prompt = f"""أنت مستشار قانوني مصري خبير وشديد الذكاء. 94 مهمتك: تحليل النص المرفق والإجابة على سؤال المستخدم بدقة وقوة قانونية.95 96 قواعد العمل:97 1. استخدم السياق المرفق لتحليل المخاطر، الثغرات، والالتزامات.98 2. في حالة الأسئلة التحليلية (مثل المخاطر)، قم باستنتاج التبعات القانونية بناءً على نصوص العقد والقانون المصري.99 3. إذا وجدت بنداً غامضاً أو معلومة ناقصة (مثل غياب تاريخ الانتهاء أو شروط الفسخ)، وضح ذلك فوراً كخطر محتمل.100 4. الإجابة بالعربية الفصحى فقط، وبأسلوب قانوني رصين.101 5. ممنوع استخدام أي لغة غير العربية في الإجابة.102 103 السياق المستخرج:104 {context}105 106 المهمة المطلوبة: {task_instruction}107 {table_info}108 109 الإجابة التحليلية:"""110 111 with st.spinner("جاري الفحص القانوني..."):112 response = llm.invoke(full_prompt)113 return response.content114 115 # عرض الواجهة116 st.success("✅ تم التعرف على المستند بنجاح. يمكنك الآن البدء بالتدقيق.")117 118 col1, col2, col3 = st.columns(3)119 with col1:120 if st.button("📝 ملخص العقد"):121 res = run_legal_task("لخص أهم بنود العقد (الأطراف، القيمة، المدة، وطبيعة العمل).", True)122 st.markdown(res)123 with col2:124 if st.button("🚨 كشف المخاطر"):125 res = run_legal_task("استخرج أي ثغرات قانونية أو مخاطر محتملة في هذا العقد بناءً على بنود الفسخ والتعويضات.")126 st.warning(res)127 with col3:128 if st.button("💰 الالتزامات"):129 res = run_legal_task("ما هي الالتزامات المالية، طرق الدفع، والجزاءات المذكورة؟", True)130 st.info(res)131 132 st.divider()133 st.subheader("💬 اسأل المستشار القانوني")134 user_query = st.text_input("اسأل عن أي بند محدد (مثلاً: ما هو موقف الطرف الثاني في حالة القوة القاهرة؟)")135 if user_query:136 answer = run_legal_task(user_query)137 st.chat_message("assistant").write(answer)138 139 except Exception as e:140 st.error(f"حدث خطأ أثناء المعالجة: {e}")141 finally:142 if os.path.exists(temp_path):143 os.remove(temp_path)144else:145 st.info("💡 **نصيحة:** ارفع عقداً واضحاً بصيغة PDF أو Word للحصول على أدق تحليل قانوني.")