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