Turkish
text-generation-inference
no-transformers / README.md
sixfingerdev's picture
Update README.md
03a5838 verified
---
license: mit
datasets:
- sixfingerdev/turkish-qa-multi-dialog-dataset
- sixfingerdev/Turkish-Knowledge-extraction_topic-summary
language:
- tr
tags:
- text-generation-inference
---
# 🤖 Türkçe QA Language Model
N-gram tabanlı soru-cevap ve metin tamamlama modeli. 21K temiz QA/diyalog verisiyle eğitilmiştir.
## 📊 Model Bilgileri
- **Model Tipi**: Trigram Language Model + Retrieval
- **Dil**: Türkçe
- **Parametre Sayısı**: ~45K kelime vocabulary
- **Eğitim Verisi**: 21K QA çifti + diyalog
- **Model Boyutu**: ~15-30 MB
- **Lisans**: MIT
## 🎯 Özellikler
- ✅ Soru-cevap (Q&A mode)
- ✅ Metin tamamlama (Complete mode)
- ✅ Hybrid yaklaşım (Retrieval + Generation)
- ✅ Repetition penalty
- ✅ Temperature ve Top-k kontrolü
- ✅ Mobil uyumlu (Pydroid 3)
## 📦 Kurulum
```bash
# Gerekli kütüphaneler (sadece Python stdlib)
# Ekstra kurulum gerekmez!
```
## 🚀 Hızlı Başlangıç
### Temel Kullanım
```python
import pickle
# Modeli yükle
with open('qa_lm.pkl', 'rb') as f:
data = pickle.load(f)
model = QALM()
model.trigram = data['trigram']
model.bigram = data['bigram']
model.unigram = data['unigram']
model.qa_pairs = data['qa_pairs']
model.ready = True
# Soru sor
answer = model.answer(
"Python nedir?",
max_tokens=50,
temperature=0.7,
stream=False
)
print(answer)
```
### Tam Örnek (Kopyala-Yapıştır)
```python
import pickle
import random
class QALM:
def __init__(self):
self.trigram = {}
self.bigram = {}
self.unigram = {}
self.qa_pairs = []
self.ready = False
def load(self, path='qa_lm.pkl'):
with open(path, 'rb') as f:
data = pickle.load(f)
self.trigram = data['trigram']
self.bigram = data['bigram']
self.unigram = data['unigram']
self.qa_pairs = data['qa_pairs']
self.ready = True
print(f"✓ Model yüklendi! ({len(self.qa_pairs)} QA)")
def find_similar(self, query):
query_tokens = set(query.lower().split())
scores = []
for inp, out in self.qa_pairs:
inp_tokens = set(inp.split())
intersection = len(query_tokens & inp_tokens)
union = len(query_tokens | inp_tokens)
if union > 0:
score = intersection / union
if score > 0.1:
scores.append((inp, out, score))
scores.sort(key=lambda x: x[2], reverse=True)
return scores[:3]
def predict_next(self, tokens, generated, temperature=0.7, top_k=20):
candidates = {}
if len(tokens) >= 2:
key = (tokens[-2], tokens[-1])
if key in self.trigram:
candidates = dict(self.trigram[key])
if not candidates and tokens:
if tokens[-1] in self.bigram:
candidates = dict(self.bigram[tokens[-1]])
if not candidates:
return None
recent = set(generated[-10:])
for w in candidates:
if w in recent:
candidates[w] /= 3
items = list(candidates.items())
weights = [max(c, 0.01) ** (1.0/temperature) for _, c in items]
if len(items) > top_k:
indexed = sorted(enumerate(weights), key=lambda x: x[1], reverse=True)[:top_k]
items = [items[i] for i, _ in indexed]
weights = [weights[i] for i, _ in indexed]
total = sum(weights)
r = random.random() * total
cumsum = 0
for (word, _), weight in zip(items, weights):
cumsum += weight
if r <= cumsum:
return word
return items[0][0] if items else None
def answer(self, query, max_tokens=50, temperature=0.7, top_k=20):
similar = self.find_similar(query)
if similar and similar[0][2] > 0.3:
return similar[0][1]
if similar:
seed = similar[0][1].split()[:3]
else:
seed = query.lower().split()[-2:]
generated = list(seed)
for _ in range(max_tokens):
next_word = self.predict_next(
generated[-5:],
generated,
temperature,
top_k
)
if not next_word:
break
generated.append(next_word)
if next_word in '.!?' and len(generated) > 10:
break
return ' '.join(generated)
# Kullanım
model = QALM()
model.load('qa_lm.pkl')
# Soru-Cevap
print(model.answer("Python nedir?"))
print(model.answer("Türkiye'nin başkenti neresi?"))
print(model.answer("Yapay zeka nedir?"))
```
## 📝 Kullanım Örnekleri
### Q&A Modu
```python
# Yüksek benzerlikli soru (direkt retrieval)
>>> model.answer("Python nedir?", temperature=0.7)
"python bir programlama dilidir. kolay öğrenilebilir ve güçlüdür."
# Düşük benzerlikli soru (generation)
>>> model.answer("Bugün ne yapsam?", temperature=0.8)
"bugün hava güzel olacak. dışarı çıkabilirsin."
```
### Temperature Kontrolü
```python
# Düşük (tutarlı)
>>> model.answer("Merhaba", temperature=0.3, top_k=5)
"merhaba nasılsın?"
# Orta (dengeli)
>>> model.answer("Merhaba", temperature=0.7, top_k=20)
"merhaba ben bir yapay zeka asistanıyım."
# Yüksek (yaratıcı)
>>> model.answer("Merhaba", temperature=1.2, top_k=50)
"merhaba dostum! bugün sana nasıl yardımcı olabilirim?"
```
## ⚙️ Parametreler
| Parametre | Varsayılan | Açıklama |
|-----------|-----------|----------|
| `max_tokens` | 50 | Maksimum üretilecek kelime sayısı |
| `temperature` | 0.7 | Yaratıcılık (0.1-1.5 arası) |
| `top_k` | 20 | Seçilecek en iyi k aday |
| `stream` | True | Kelime kelime yazdırma |
## 📈 Performans
- **Retrieval başarısı**: ~70% (yüksek benzerlikte)
- **Generation kalitesi**: Orta (trigram limiti)
- **Hız**: ~0.1 saniye/cevap
- **RAM kullanımı**: ~50-100 MB
## ⚠️ Sınırlamalar
- Sadece 21K QA verisi (sınırlı kapsam)
- Trigram modeli (5 kelime context)
- Uzun bağlam hatırlanamaz
- Bazen tekrar edebilir
- Wikipedia bilgisi filtrelenmiş
## 🎛️ Ayar Önerileri
### Tutarlı Cevaplar İçin
```python
temperature=0.5
top_k=10
max_tokens=30
```
### Yaratıcı Cevaplar İçin
```python
temperature=1.0
top_k=40
max_tokens=80
```
### Kısa ve Net Cevaplar
```python
temperature=0.3
top_k=5
max_tokens=20
```
## 🔧 Gelişmiş Kullanım
### Batch İşleme
```python
questions = [
"Python nedir?",
"Türkiye'nin başkenti?",
"Yapay zeka nasıl çalışır?"
]
for q in questions:
answer = model.answer(q, stream=False)
print(f"S: {q}")
print(f"C: {answer}\n")
```
### Custom Tokenizer
```python
def clean_query(text):
import re
text = text.lower()
text = re.sub(r'[^a-zçğıöşü\s]', '', text)
return text.strip()
query = clean_query("PYTHON NEDİR???")
answer = model.answer(query)
```
## 📚 Eğitim Detayları
- **Veri Kaynağı**: merged_dataset.jsonl
- **Filtreleme**: Wikipedia makaleleri hariç
- **Eğitim Süresi**: ~3-5 dakika
- **N-gram**: Trigram (3-kelime)
- **Retrieval**: Jaccard similarity
## 🐛 Bilinen Sorunlar
1. Çok uzun cevaplar tekrar edebilir
2. Nadir konularda zayıf performans
3. Context window sadece 5 kelime
4. Matematik/hesaplama yapamaz
## 💡 İpuçları
- Kısa sorular daha iyi sonuç verir
- `temperature=0.7` dengeli başlangıç
- Tekrar varsa `top_k` artır
- QA modunda benzerlik %30'un altındaysa üretim modu devreye girer
## 📄 Lisans
MIT License - Ticari kullanım dahil serbestçe kullanılabilir.
## 🤝 Katkı
Model açık kaynak prensipleriyle geliştirilmiştir. İyileştirme önerileri memnuniyetle karşılanır.
## 📞 İletişim
Sorularınız için issue açabilirsiniz.
---
**Not**: Bu model eğitim/araştırma amaçlıdır. Production kullanımı için transformer tabanlı modeller önerilir.