ilacChatBot / app /ui.py
emrecn's picture
HF Spaces deploy: temiz tek-commit history, chroma_db Git LFS üzerinden
efc4680
import argparse
import gradio as gr
import dotenv
from app.retrieval import get_answer, DRUG_IDS, _normalize
dotenv.load_dotenv()
DRUG_LIST_SORTED = sorted(DRUG_IDS, key=_normalize)
DRUG_NORMALIZED = [(d, _normalize(d)) for d in DRUG_LIST_SORTED]
DRUG_COUNT = len(DRUG_LIST_SORTED)
MAX_LIST_DISPLAY = 100
def filter_drugs(query: str) -> str:
q = _normalize(query or "").strip()
if not q:
shown = DRUG_LIST_SORTED[:MAX_LIST_DISPLAY]
body = "\n".join(f"- {d}" for d in shown)
if DRUG_COUNT > MAX_LIST_DISPLAY:
body += f"\n\n_İlk {len(shown)} ilaç gösteriliyor (toplam {DRUG_COUNT}). Daraltmak için yukarıya yazın._"
return body
matches = [d for d, n in DRUG_NORMALIZED if q in n]
if not matches:
return f"_Eşleşme bulunamadı: **{query}**_"
shown = matches[:MAX_LIST_DISPLAY]
body = "\n".join(f"- {d}" for d in shown)
if len(matches) > MAX_LIST_DISPLAY:
body += f"\n\n_{len(shown)} / {len(matches)} sonuç gösteriliyor._"
else:
body += f"\n\n_{len(matches)} sonuç_"
return body
def chat_interface(message, history):
if not message:
return ""
# RAG sistemi 3 parametre dönüyor (Cevap, İlaç ID, Kullanılan Chunklar).
answer, drug_id, chunks_str = get_answer(message, history)
final_response = answer
# Text chunklarını Colab hücresinin çıktısına (console) yazdırıyoruz
"""if chunks_str:
print("\n" + "="*60)
print(f"🧐 KULLANICI SORUSU: {message}")
print("-" * 60)
print(f"📄 MODELE GÖNDERİLEN KAYNAK METİNLER (CHUNKLAR):\n\n{chunks_str}")
print("="*60 + "\n") """
return final_response
FORCE_DARK_JS = """
() => {
const url = new URL(window.location);
if (url.searchParams.get('__theme') !== 'dark') {
url.searchParams.set('__theme', 'dark');
window.location.href = url.href;
}
}
"""
# Module-level demo — `gradio app/ui.py` ile hot-reload için gerekli
with gr.Blocks(title="İlaç KT Chatbot", theme=gr.themes.Default(), js=FORCE_DARK_JS) as demo:
gr.Markdown("## İlaç Sohbet Botu RAG Q&A")
gr.Markdown("""
⚠️ İLAC ADLARINI YAZARKEN DOĞRU ŞEKİLDE YAZIN. BU SAYEDE SİSTEMİN DOĞRU KULLANMA TALİMATI BELGESİNİ BULMASI VE DOĞRU CEVAPLAR VERMESİ DAHA MUHTEMEL OLUR. ÖRNEK SORU: **Parol hamilelikte kullanılır mı?**
⚠️ Bu asistan yalnızca geliştirme amaçlıdır. Her tıbbi karar öncesinde mutlaka doktorunuza veya eczacınıza danışın.
""")
gr.Markdown(
f"""📋 Sistemimiz şu anda **{DRUG_COUNT}** TABLET ilacın resmî Kullanma Talimatı (KT) belgesini işliyor.\n
Kullanılan model gemini-flash-latest free tier olduğu için, günlük istek limiti bulunmakta bu nedenle bazen cevap veremeyebilir."""
)
with gr.Accordion("İşlenen ilaçların tam listesi", open=False):
drug_search = gr.Textbox(
placeholder="İlaç ara... (örn: parol)",
show_label=False,
container=False,
)
drug_list_view = gr.Markdown(filter_drugs(""))
drug_search.change(fn=filter_drugs, inputs=drug_search, outputs=drug_list_view)
gr.ChatInterface(
fn=chat_interface,
chatbot=gr.Chatbot(height=400),
textbox=gr.Textbox(placeholder="İlacın adını belirterek sorunuzu girin... (Örn: Parol hamilelikte kullanılır mı?)", container=False, scale=7),
title="Sadece İlaç KT PDF'lerine Dayanarak Cevap Veren Asistan",
)
def main(host, port, share=False):
demo.launch(server_name=host, server_port=port, share=share)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--host", type=str, default="0.0.0.0")
parser.add_argument("--port", type=int, default=7860)
parser.add_argument("--share", action="store_true", help="Create a public link for Gradio")
args = parser.parse_args()
main(args.host, args.port, True)