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) st.markdown(""" """, unsafe_allow_html=True) username = st.text_input("نام کاربری:", placeholder="شناسه خود را وارد کنید", label_visibility="visible") password = st.text_input("رمز عبور:", placeholder="رمز عبور ", type="password", label_visibility="visible") st.markdown(""" """, unsafe_allow_html=True) 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://m17idd-reporting.hf.space"), ("تاریخچه ماموریت‌ها", "https://cdn-icons-png.flaticon.com/512/709/709496.png", None), ("تحلیل داده‌های نظامی", "https://cdn-icons-png.flaticon.com/512/1828/1828932.png", "https://m17idd-test.hf.space"), ("مدیریت منابع", "https://cdn-icons-png.flaticon.com/512/681/681494.png", None), ("دستیار فرماندهی", "https://cdn-icons-png.flaticon.com/512/3601/3601646.png", None), ("تنظیمات امنیتی", "https://cdn-icons-png.flaticon.com/512/2099/2099058.png", None), ("پشتیبانی فنی", "https://cdn-icons-png.flaticon.com/512/597/597177.png", None), ] st.markdown(""" """, unsafe_allow_html=True) for idx, (text, icon, link) in enumerate(menu_items): content = f""" """ if link: content = f'{content}' st.markdown(content, unsafe_allow_html=True) if idx in [1, 3, 5]: 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", ) # from transformers import pipeline # hf_api_key = os.getenv("tavana55") # model_name = "Qwen/Qwen3-0.6B" # llm = pipeline("text-generation", model=model_name) # ---------- ورودی جستجو ---------- 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) import os import re import docx import streamlit as st import concurrent.futures from hazm import Normalizer from rapidfuzz import fuzz from langchain.schema import SystemMessage, HumanMessage from langchain.chat_models import ChatOpenAI # تنظیمات folder_path = '46' normalizer = Normalizer() # حافظه گفتگو if "chat_history" not in st.session_state: st.session_state.chat_history = [] # بارگذاری اسناد @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) return filename, normalized except Exception as e: return filename, "" filenames = [f for f in os.listdir(path) if f.endswith(".docx")] doc_texts = {} with concurrent.futures.ThreadPoolExecutor() as executor: for filename, content in executor.map(process_docx, filenames): doc_texts[filename] = content return doc_texts doc_texts = load_and_process_documents(folder_path) # کلمات توقف stop_words = [ "است", "و", "با", "که", "در", "از", "برای", "به", "بر", "تا", "این", "آن", "یک", "کدام", "کجا", "هم", "همه", "یا", "همچنین", "می", "باید", "شود", "شد", "گفت", "گویا", "داشت", "داشتن", "کنند", "کنیم", "کرد", "کردن", "نیز", "اگر", "ای", "اینکه", "نه", "باشید", "باشم", "باشی", "در حالی که", "مگر", "چرا" ] # توابع کمکی def remove_stop_words(text, stop_words): words = text.split() return " ".join([word for word in words if word not in stop_words]) def extract_keywords_from_text(text, query_words): matched_lines = [] lines = text.split("\n") for line in lines: if any(query_word in line for query_word in query_words): matched_lines.append(line) return matched_lines def clean_text(text): return re.sub(r'[^آ-ی۰-۹0-9،.؟!؛+\-* ]+', '', text) def find_closest_lines(query, doc_texts, stop_words, top_n=10): cleaned_query = remove_stop_words(query, stop_words) query_words = cleaned_query.split() all_matched_lines = [] for filename, text in doc_texts.items(): matched_lines = extract_keywords_from_text(text, query_words) for line in matched_lines: similarity = fuzz.partial_ratio(query, line) all_matched_lines.append((line, similarity)) all_matched_lines.sort(key=lambda x: x[1], reverse=True) return [line for line, _ in all_matched_lines[:top_n]] def remove_stop_words_from_lines(lines, stop_words): cleaned_lines = [] for line in lines: words = line.split() cleaned_words = [word for word in words if word not in stop_words] cleaned_lines.append(" ".join(cleaned_words)) return cleaned_lines # ورودی کاربر با chat_input query = st.chat_input("چطور می‌تونم کمک کنم؟") if query: thinking = st.empty() thinking.markdown("""
⏳ در حال فکر کردن...
""", unsafe_allow_html=True) # جستجو در متن اسناد closest_lines = find_closest_lines(query, doc_texts, stop_words, top_n=3) cleaned_closest_lines = remove_stop_words_from_lines(closest_lines, stop_words) if cleaned_closest_lines: prompt = f""" لطفاً با توجه به سؤال زیر و محتوای خطوط مرتبط، یک پاسخ نهایی حرفه‌ای، دقیق و روان تولید کن. فقط از متن خطوط مرتبط استفاده کن. اگر اطلاعات کافی در متن وجود ندارد، صادقانه اعلام کن. سوال: {query} خطوط مرتبط: {cleaned_closest_lines} پاسخ نهایی: """ response = llm([ SystemMessage(content="You are a helpful assistant."), HumanMessage(content=prompt) ]) final_answer = clean_text(response.content.strip()) else: final_answer = "❗ هیچ خط مرتبطی با سؤال پیدا نشد." # پاک کردن وضعیت در حال فکر کردن thinking.empty() # ذخیره و نمایش پاسخ st.session_state.chat_history.append(("🧑", query)) st.session_state.chat_history.append(("🤖", final_answer)) st.markdown(""" """, unsafe_allow_html=True) # نمایش تاریخچه گفتگو st.markdown("---") for sender, message in st.session_state.chat_history: st.markdown(f'
{sender}: {message}
', unsafe_allow_html=True)