import streamlit as st from hazm import Normalizer, SentenceTokenizer import os import docx from langchain.chat_models import ChatOpenAI from langchain.schema import SystemMessage, HumanMessage from rapidfuzz import fuzz import concurrent.futures import time from sentence_transformers import SentenceTransformer import numpy as np from hazm import * import re import nltk nltk.download('punkt') st.markdown(""" """, unsafe_allow_html=True) st.markdown(""" """, unsafe_allow_html=True) # ---------- احراز هویت ---------- if "authenticated" not in st.session_state: st.session_state.authenticated = False if not st.session_state.authenticated: st.markdown('', unsafe_allow_html=True) st.markdown(""" """, unsafe_allow_html=True) username = st.text_input("نام کاربری:", placeholder="شناسه نظامی خود را وارد کنید", label_visibility="visible") password = st.text_input("رمز عبور:", placeholder="رمز عبور نظامی", type="password", label_visibility="visible") if st.button("ورود"): if username == "admin" and password == "123": st.session_state.authenticated = True st.rerun() else: st.markdown("""
نام کاربری یا رمز عبور اشتباه است.
""", unsafe_allow_html=True) st.stop() # ---------- سایدبار ---------- with st.sidebar: st.image("log.png", use_container_width=True) menu_items = [ ("گزارش عملیاتی", "https://cdn-icons-png.flaticon.com/512/3596/3596165.png"), ("تاریخچه ماموریت‌ها", "https://cdn-icons-png.flaticon.com/512/709/709496.png"), ("تحلیل داده‌های نظامی", "https://cdn-icons-png.flaticon.com/512/1828/1828932.png"), ("مدیریت منابع", "https://cdn-icons-png.flaticon.com/512/681/681494.png"), ("دستیار فرماندهی", "https://cdn-icons-png.flaticon.com/512/3601/3601646.png"), ("تنظیمات امنیتی", "https://cdn-icons-png.flaticon.com/512/2099/2099058.png"), ("پشتیبانی فنی", "https://cdn-icons-png.flaticon.com/512/597/597177.png"), ] for idx, (text, icon) in enumerate(menu_items): st.markdown(f""" """, unsafe_allow_html=True) if idx in [1, 3, 5]: st.markdown("
", unsafe_allow_html=True) st.markdown(""" """, unsafe_allow_html=True) st.markdown("""

رزم‌یار ارتش

دستیار هوشمند ارتش جمهوری اسلامی ایران
""", unsafe_allow_html=True) # ---------- مدل زبانی ---------- llm = ChatOpenAI( base_url="https://api.together.xyz/v1", api_key='0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979', model="deepseek-ai/DeepSeek-R1-Distill-Llama-70B-free", max_tokens=1024 ) # ---------- پردازش فایل‌ها با کش و موازی ---------- folder_path = 'C:/Users/ici/Downloads/Telegram Desktop/45/46' normalizer = Normalizer() sentence_tokenizer = SentenceTokenizer() @st.cache_data(show_spinner="در حال پردازش اسناد... لطفاً صبور باشید.") def load_and_process_documents(path): def process_docx(filename): try: full_path = os.path.join(path, filename) doc = docx.Document(full_path) text = "\n".join([para.text for para in doc.paragraphs]) # استخراج متن normalized = normalizer.normalize(text) sentences = normalized return sentences except Exception as e: print(f"Error processing {filename}: {e}") return [] with concurrent.futures.ThreadPoolExecutor() as executor: results = executor.map(process_docx, [f for f in os.listdir(path) if f.endswith(".docx")]) return list(results) all_sentences = load_and_process_documents(folder_path) # all_sentences = load_and_process_documents(folder_path) # st.markdown(all_sentences[2]) # ---------- ورودی جستجو ---------- st.markdown(""" """, unsafe_allow_html=True) st.markdown(""" """, unsafe_allow_html=True) st.markdown(""" """, unsafe_allow_html=True) st.markdown(""" """, unsafe_allow_html=True) st.markdown(""" """, unsafe_allow_html=True) st.markdown(""" """, unsafe_allow_html=True) query = st.chat_input("چطور می‌تونم کمک کنم؟") if query: st.markdown(f'
{query}
', unsafe_allow_html=True) think = st.markdown("""

در حال فکر کردن...

""", unsafe_allow_html=True) time.sleep(4) think.empty() else: st.markdown("") # استایل‌ها برای چرخش و پیام در حال فکر کردن st.markdown(""" """, unsafe_allow_html=True) sentEmbedding = SentEmbedding() sentEmbedding.load_model("C:/Users/ici/Downloads/sent2vec/sent2vec-naab.model") top_k = 5 threshold = 0.8 original_sentences = all_sentences.copy() all_vectors = [sentEmbedding.get_sentence_vector(sentence) for sentence in original_sentences] if query: found = False threshold = 85 for idx, sentence in enumerate(all_sentences): similarity = fuzz.partial_ratio(query, sentence) if similarity >= threshold: st.markdown(sentence) prompt = f""" تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخ‌ها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفه‌ای، دقیق و روان ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. از تکرار اضافی پرهیز کن و محتوای چند پاسخ را در صورت نیاز با هم ترکیب کن و به هیچ عنوان از جملاتی جز فارسی استفاده نکن تا بهترین نتیجه حاصل شود. سوال: {query} پاسخ‌ها: {sentence} پاسخ نهایی حرفه‌ای بازنویسی‌شده: """ response = llm([ SystemMessage(content="You are a helpful assistant."), HumanMessage(content=prompt) ]) rewritten = response.content.strip() st.markdown(f'
{rewritten}
', unsafe_allow_html=True) found = True break if not found: prompt = f" لطفاً بر اساس سوال زیر یک متن مرتبط و معنادار تولید کن و از خودت ننویس و جملات معتبر باشن و از زبانی جز فارسی استفاده نکن:\n\nسوال: {query}" response = llm([ SystemMessage(content="You are a helpful assistant."), HumanMessage(content=prompt) ]) rewritten = response.content.strip() st.markdown(f'
{rewritten}
', unsafe_allow_html=True)