import time import streamlit as st from langchain.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings.base import Embeddings from langchain.vectorstores import FAISS from langchain.indexes import VectorstoreIndexCreator from langchain.chains import RetrievalQA from langchain.chat_models import ChatOpenAI from typing import List from together import Together import pandas as pd import streamlit as st import numpy as np from sentence_transformers import SentenceTransformer import faiss # ----------------- تنظیمات صفحه ----------------- st.set_page_config(page_title="رزم یار ارتش", page_icon="🪖", layout="wide") # ----------------- استایل سفارشی ----------------- st.markdown(""" """, unsafe_allow_html=True) # ----------------- بدنه اصلی ----------------- with st.sidebar: st.image("log.png", width=90) st.markdown("""


""", unsafe_allow_html=True) st.markdown(""" """, unsafe_allow_html=True) # محتوای اصلی st.markdown("""

رزم یار ارتش

دستیار هوشمند ارتشی برای پشتیبانی و راهبری
""", unsafe_allow_html=True) st.markdown('
👋 سلام! چطور میتونم کمکتون کنم؟
', unsafe_allow_html=True) # چت اینپوت کاربر #user_input = st.text_input("پیام خود را وارد کنید...") #if user_input: # st.markdown(f'
📩 شما: {user_input}
', unsafe_allow_html=True) # ⚙️ مدل Embedding ساده و سریع @st.cache_resource def get_embedding_model(): return SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') @st.cache_resource def process_csv(csv_file): df = pd.read_csv(csv_file) texts = df.iloc[:, 0].astype(str).tolist() texts = [text for text in texts if text.strip()] text_splitter = RecursiveCharacterTextSplitter( chunk_size=300, chunk_overlap=50, length_function=len, separators=["\n\n", "\n", " ", ""] ) split_texts = [] for text in texts: split_texts.extend(text_splitter.split_text(text)) # مدل امبدینگ model = get_embedding_model() embeddings = model.encode(split_texts, show_progress_bar=True) # ساخت ایندکس FAISS dim = embeddings.shape[1] index = faiss.IndexFlatL2(dim) index.add(np.array(embeddings)) return split_texts, embeddings, index # مسیر فایل CSV csv_file_path = 'output (1).csv' try: texts, vectors, index = process_csv(csv_file_path) st.success("✅ ایندکس‌سازی با موفقیت انجام شد.") except Exception as e: st.error(f"❌ خطا در پردازش فایل: {str(e)}") # رابط چت if 'messages' not in st.session_state: st.session_state.messages = [] if 'pending_prompt' not in st.session_state: st.session_state.pending_prompt = None for msg in st.session_state.messages: with st.chat_message(msg['role']): st.markdown(msg['content'], unsafe_allow_html=True) query = st.chat_input("سؤالت را بپرس...") if query: st.session_state.messages.append({'role': 'user', 'content': query}) st.session_state.pending_prompt = query st.rerun() if st.session_state.pending_prompt: with st.chat_message("ai"): thinking = st.empty() thinking.markdown("🤖 در حال جستجو...") # امبد کردن سؤال و جستجو model = get_embedding_model() query_vector = model.encode([st.session_state.pending_prompt]) D, I = index.search(np.array(query_vector), k=3) # 3 نتیجه نزدیک results = [texts[i] for i in I[0]] response = "🧠 نزدیک‌ترین پاسخ‌ها:\n\n" + "\n\n---\n\n".join(results) thinking.empty() full_response = "" placeholder = st.empty() for word in response.split(): full_response += word + " " placeholder.markdown(full_response + "▌") time.sleep(0.02) placeholder.markdown(full_response) st.session_state.messages.append({'role': 'ai', 'content': full_response}) st.session_state.pending_prompt = None