Spaces:
Sleeping
Sleeping
| title: ilacChat | |
| emoji: 💊 | |
| colorFrom: blue | |
| colorTo: green | |
| sdk: gradio | |
| app_file: app.py | |
| pinned: false | |
| # 💊 İlaç KT Chatbot | |
| Türkiye'de satılan ilaçların resmî **Kullanma Talimatı** (KT) belgelerine dayanarak Türkçe soru-cevap yapan, retrieval-augmented bir sohbet asistanı. Yalnızca dahili PDF kaynaklarını kullanır; bağlamda olmayan bilgi için "Bilmiyorum" der, tıbbi tahmin yürütmez. | |
| 🔗 **Canlı Demo:** [huggingface.co/spaces/emrecn/ilacChatBot](https://huggingface.co/spaces/emrecn/ilacChatBot) | |
| --- | |
| ## ✨ Özellikler | |
| ### 🔎 Retrieval ve Yanıt | |
| - **2.202 ilaç** Türkiye'de satılan TABLET ilaçların KT belgeleriyle indekslenmiş | |
| - **Bölüm-duyarlı chunking**: 5 standart KT bölümü (ne için kullanılır, dikkat edilmesi gerekenler, nasıl kullanılır, yan etkiler, saklama) | |
| - **Jina Embeddings v3** + **ChromaDB** vektör arama (top-20 aday) | |
| - **Cross-encoder reranking** (Jina Reranker v2 multilingual): top-20 → top-5 | |
| - **Gemini Flash** ile düşük gecikmeli yanıt üretimi | |
| - Sıkı bağlam kuralı: bağlamda olmayan iddialar için "Bilmiyorum" | |
| - Düşük güven eşiği (rerank skoru < 0.2) → otomatik "Bilmiyorum" | |
| ### 💬 Çoklu-Tur Sohbet | |
| - **Akıllı sorgu yeniden yazma** (query rewriting): "yan etkileri ne?" gibi takip soruları önceki ilaca otomatik bağlanır | |
| - **Karşılaştırma soruları**: "X ile Y arasındaki fark nedir?" hem ikisini korur | |
| - **Konu değişimi**: yeni ilaç adı tespit edildiğinde geçmiş otomatik atlanır | |
| - **Türkçe karakter-duyarsız** normalize: `selincro` ↔ `SELİNCRO`, `parol` ↔ `PAROL` | |
| ### 🎯 Metadata Filtering | |
| - Sorguda ilaç adı tespit edilirse retrieval o ilacın chunk'larına filtrelenir → daha hızlı ve daha alakalı sonuçlar | |
| - Çok-tokenli ilaç adları (örn. `abizol 10 mg`) tam eşleşmeyle önceliklendirilir | |
| ### 🛡️ Güven ve Güvenlik | |
| - Her yanıta otomatik **doktor / eczacı uyarısı** eklenir | |
| - Kota / rate-limit hatalarında kullanıcı dostu mesaj | |
| - Hayalet ilaç (yanlış / eksik isim) durumunda spekülasyon yapmaz | |
| - Bağlamda olmayan kullanım soruları için "Bilmiyorum" fail-safe | |
| ### 📚 Kaynak Gösterimi (Citation) | |
| - Her yanıtın altında kullanılan KT bölümleri ve ilaç adları listelenir | |
| - Birden fazla ilaçtan chunk gelirse uyarı log'lanır | |
| ### 🖥️ Kullanıcı Arayüzü | |
| - Gradio sohbet arayüzü, varsayılan **dark tema** | |
| - **İşlenen ilaçlar listesi**: aranabilir accordion, Türkçe-duyarsız substring filtre | |
| - Toplam işlenen ilaç sayısı dinamik gösterilir | |
| - Çok-turlu sohbet desteği | |
| ### 📊 Gözlemlenebilirlik | |
| - **JSONL sorgu logları** (`logs/queries.jsonl`): ham sorgu, yeniden yazılmış sorgu, tespit edilen ilaç, retrieval skorları, latency breakdown (rewrite / retrieval / rerank / llm), flag'ler | |
| - **Detaylı retrieval logu**: aday chunk'lar (rerank öncesi), seçilen chunk'lar (rerank sonrası) tam metadata ile | |
| --- | |
| ## 🧱 Teknolojiler | |
| | Katman | Bileşen | | |
| |---|---| | |
| | Embedding | Jina Embeddings v3 | | |
| | Vector Store | ChromaDB (persistent) | | |
| | Reranker | Jina Reranker v2 (multilingual) | | |
| | LLM | Google Gemini (`gemini-flash-latest`, temperature=0) | | |
| | Orchestration | LangChain | | |
| | UI | Gradio 5.x | | |
| | PDF | pypdf | | |
| | Deployment | Hugging Face Spaces (Git LFS) | | |
| --- | |
| ## 🔄 Akış | |
| ``` | |
| Kullanıcı sorusu + sohbet geçmişi | |
| │ | |
| ▼ | |
| ┌──────────────────────────┐ | |
| │ Query Rewrite │ ← geçmiş yoksa atlanır | |
| └──────────────────────────┘ | |
| │ | |
| ▼ | |
| ┌──────────────────────────┐ | |
| │ Drug ID Detection │ ← Türkçe-normalize, çok-token eşleşme | |
| └──────────────────────────┘ | |
| │ | |
| ▼ | |
| ┌──────────────────────────┐ | |
| │ ChromaDB Similarity │ ← top-20, drug_id metadata filtresi | |
| │ Search │ | |
| └──────────────────────────┘ | |
| │ | |
| ▼ | |
| ┌──────────────────────────┐ | |
| │ Jina Reranker v2 │ ← top-5; skor < 0.2 → "Bilmiyorum" | |
| └──────────────────────────┘ | |
| │ | |
| ▼ | |
| ┌──────────────────────────┐ | |
| │ Gemini Flash Yanıt │ ← KT bağlamı + geçmiş ile sıkı prompt | |
| └──────────────────────────┘ | |
| │ | |
| ▼ | |
| Cevap + Kaynaklar + Doktor uyarısı | |
| ``` | |
| --- | |
| ## 📁 Proje Yapısı | |
| ```text | |
| . | |
| ├── app.py # Gradio launcher | |
| ├── app/ | |
| │ ├── ui.py # Sohbet arayüzü + işlenen ilaç listesi | |
| │ ├── retrieval.py # Query rewrite, retrieval, rerank, answer | |
| │ ├── ingest.py # PDF parse + chunk + embed → ChromaDB | |
| │ └── logger.py # Yapılandırılmış (JSONL + text) log | |
| ├── chroma_db/ # Persisted vector store (Git LFS) | |
| ├── requirements.txt | |
| └── README.md | |
| ``` | |
| --- | |
| ## 🚀 Yerel Kurulum | |
| ```bash | |
| python -m venv venv | |
| .\venv\Scripts\activate | |
| pip install -r requirements.txt | |
| ``` | |
| `.env` dosyası oluştur ve API anahtarlarını ekle: | |
| ```ini | |
| GOOGLE_API_KEY=your_gemini_key | |
| JINA_API_KEY=your_jina_key | |
| ``` | |
| PDF'leri indekse al (yalnızca ilk kurulumda veya yeni PDF eklendiğinde): | |
| ```bash | |
| python -m app.ingest --pdf-dir ./allpdfs --mode full | |
| ``` | |
| Uygulamayı başlat: | |
| ```bash | |
| python app.py | |
| ``` | |
| ## ⚠️ Yasal Uyarı | |
| Bu asistan yalnızca **bilgilendirme amaçlıdır**. Yanıtlar resmî KT belgelerine dayanır, ancak güncel olmayabilir veya eksik bilgi içerebilir. **Her tıbbi karar öncesinde mutlaka doktorunuza veya eczacınıza danışın.** Uygulama bir teşhis aracı değildir. | |