chatbot / app.py
Havvanur20's picture
Upload 8 files
65792b6 verified
import streamlit as st
import logging
import os
import requests
import zipfile
from dotenv import load_dotenv
from data_processing import hf_load_dataset, create_documents
from embedding_model import load_embedding_model
from vector_store import create_vector_store, get_vector_store, check_vector_store_exists
from rag_pipeline import rag_query
from gemini_integration import setup_gemini
load_dotenv()
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
st.set_page_config(
page_title="Tıbbi Tarayıcı",
page_icon="🏥",
layout="wide",
initial_sidebar_state="expanded"
)
def download_chroma_from_drive():
"""Google Drive'dan ChromaDB indir ve aç"""
if not os.path.exists('./chroma_db'):
file_id = os.getenv('GOOGLE_DRIVE_FILE_ID')
if not file_id:
st.error("GOOGLE_DRIVE_FILE_ID bulunamadı!")
return False
try:
import gdown
url = f"https://drive.google.com/uc?id={file_id}"
output = "temp_chroma.zip"
progress_bar = st.progress(0)
status_text = st.empty()
status_text.text("ChromaDB indiriliyor...")
progress_bar.progress(25)
gdown.download(url, output, quiet=False)
status_text.text("Zip açılıyor...")
progress_bar.progress(50)
os.makedirs('./chroma_db', exist_ok=True)
with zipfile.ZipFile(output, 'r') as zip_ref:
zip_ref.extractall('./chroma_db/')
os.remove(output)
status_text.text("ChromaDB hazır!")
progress_bar.progress(100)
st.empty()
return True
except Exception as e:
st.error(f"ChromaDB indirilemedi: {e}")
return False
return True
@st.cache_resource
def load_everything():
"""Tüm sistemi bir kez yükle - cache'li"""
embedding_model = load_embedding_model()
if check_vector_store_exists():
vector_store = get_vector_store(embedding_model)
else:
st.error("Vector store bulunamadı!")
return None, None
if not setup_gemini():
st.error("Gemini API kurulamadı!")
return None, None
return embedding_model, vector_store
def main():
"""Ana uygulama"""
st.markdown("""
<div style="text-align: center; padding: 2rem 0;">
<h1 style="color: #1f77b4; font-size: 3rem; margin-bottom: 1rem;">Tıbbi Tarayıcı</h1>
<p style="font-size: 1.2rem; color: #666; margin-bottom: 2rem;">
Türk hastanelerinin tıbbi makalelerinden yararlanarak sorularınızı yanıtlar
</p>
</div>
""", unsafe_allow_html=True)
col1, col2 = st.columns(2)
with col1:
st.markdown("""
<div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
padding: 1.5rem; border-radius: 10px; color: white; text-align: center;">
<h3>2,000+ Makale</h3>
<p>Türkiyede hastanelerinin tıbbi makaleleri</p>
</div>
""", unsafe_allow_html=True)
with col2:
st.markdown("""
<div style="background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
padding: 1.5rem; border-radius: 10px; color: white; text-align: center;">
<h3>AI Destekli</h3>
<p>Google Gemini ile güçlendirilmiş</p>
</div>
""", unsafe_allow_html=True)
with st.spinner("Sistem başlatılıyor..."):
embedding_model, vector_store = load_everything()
if vector_store is None:
st.error("Sistem yüklenemedi. Lütfen sayfayı yenileyin.")
return
with st.sidebar:
st.markdown("### Örnek Sorular")
example_questions = [
"Migren ağrısı nasıl geçer?",
"Kalp krizi belirtileri nelerdir?",
"Grip aşısı ne zaman yaptırmalıyım?",
"Yüksek tansiyon nasıl kontrol edilir?",
]
for question in example_questions:
if st.button(question, key=f"example_{question}", use_container_width=True):
st.session_state.messages.append({"role": "user", "content": question})
with st.spinner("Düşünüyorum..."):
try:
answer = rag_query(vector_store, question) # vector_store gerekli!
st.session_state.messages.append({"role": "assistant", "content": answer})
except Exception as e:
error_msg = f"Hata oluştu: {str(e)}"
st.session_state.messages.append({"role": "assistant", "content": error_msg})
st.rerun()
st.header("Soru Sorun")
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
if prompt := st.chat_input("Tıbbi sorunuzu yazın..."):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
with st.chat_message("assistant"):
with st.spinner("Düşünüyorum..."):
try:
answer = rag_query(vector_store, prompt)
st.markdown(answer)
st.session_state.messages.append({"role": "assistant", "content": answer})
except Exception as e:
error_msg = f"Hata oluştu: {str(e)}"
st.error(error_msg)
st.session_state.messages.append({"role": "assistant", "content": error_msg})
if not os.path.exists('./chroma_db'):
if not download_chroma_from_drive():
st.error("ChromaDB yüklenemedi!")
st.stop()
if __name__ == "__main__":
main()