File size: 6,046 Bytes
efc4680
 
 
 
 
 
 
 
 
 
6919acc
efc4680
6919acc
efc4680
6919acc
efc4680
6919acc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efc4680
6919acc
efc4680
6919acc
efc4680
6919acc
 
 
 
 
 
 
 
 
 
efc4680
6919acc
efc4680
6919acc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efc4680
6919acc
efc4680
6919acc
efc4680
 
 
6919acc
efc4680
6919acc
 
 
 
 
efc4680
6919acc
efc4680
 
6919acc
efc4680
6919acc
efc4680
 
 
 
 
 
 
6919acc
efc4680
 
 
 
 
 
6919acc
efc4680
 
6919acc
efc4680
 
6919acc
efc4680
 
 
 
 
6919acc
efc4680
6919acc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
---
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.