--- 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.