AlienTurk commited on
Commit
6534e6f
·
verified ·
1 Parent(s): 1dff5a8

Upload README.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +160 -96
README.md CHANGED
@@ -10,78 +10,102 @@ tags:
10
  - gguf
11
  - llama.cpp
12
  - unsloth
 
13
  base_model: Qwen/Qwen2.5-3B-Instruct
14
  ---
15
 
16
- # Mira Turkish Assistant v5.1 (Qwen2.5-3B-IT-TR)
17
 
18
- Bu model Hybrid NLP Engine ile çalıştırılmak üzere eğitilmiştir.
 
 
19
 
20
- Türkçe kişisel asistan görevleri için fine-tune edilmiş Qwen2.5-3B-Instruct modeli **v5.1**.
 
21
 
22
- **v5.1 farkı (v5_hybrid üzerine minor polish):**
23
- - **Dataset:** 662 → 712 unique dialog (+%7.5 boyut)
24
- - **Yeni intent'ler:** `UPDATE_TASK` (saat güncelleme) + `CANCEL_TASK` (basit + ambiguous)
25
- - **Yeni alan:** `task_id` (UUID, ADD_TASK/SET_REMINDER'da üretilir, UPDATE/CANCEL'da korunur)
26
- - **Artifact temizliği:**
27
- - BUGÜN dağıtımı: 1 sabit tarih → 31 farklı tarih (örnek başına geçmiş 30 gün)
28
- - Dedupe: `json.dumps` → `(user, assistant)` tuple (v5_hybrid'ın 19 duplicate'i elendi)
29
- - K1 selamlama: 5 aynı "merhaba" → 5 farklı varyasyon
30
- - **Domain kapsamı:** 7 domain (değişmedi)
31
- - **Eğitim:** 2 epoch, EarlyStopping, LR=5e-5 (v5_hybrid ile aynı)
32
- - **Persona polish:** "güncellendi" reply (düzeltme akışı), Empatik CHAT (15 duygusal içerik yanıtı)
33
- - **Hedef:** v5_hybrid üzerine UPDATE/CANCEL akışlarını öğretmek, BUGÜN artifact'ini temizlemek, persona polish
34
 
35
- > **Not:** Dataset script adı `generate_training_data_v6_hybrid.py` olmasına rağmen, üretilen GGUF versiyonu **v5.1** olarak işaretlenmiştir. v5_hybrid'ın minor polish versiyonu — major v6 kırılması yoktur.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
  ## Model Detayları
38
 
39
  - **Base model:** [Qwen/Qwen2.5-3B-Instruct](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct)
40
  - **Fine-tune yöntemi:** QLoRA (r=16, alpha=32, target_modules: q,k,v,o,gate,up,down)
41
- - **Veri seti:** 712 unique diyalog serisi (Türkçe, SFT, ChatML format, 7 domain, 7 intent, dengeli dağılım)
42
- - **Eğitim:** 2 epoch, validation split %8, early stopping (patience=2, threshold=0.005), max_steps=-1, weight_decay=0.01, LR=5e-5, cosine_with_restarts scheduler
43
  - **Framework:** Unsloth + Transformers + TRL (Google Colab L4 GPU)
44
- - **Quantization:** Q4_K_M (~1.8 GB)
45
- - **Context window:** 2048 token (eğitim) / Android 768, iOS 2048 (runtime)
46
-
47
- ### Intent Dağılımı (712 dialog)
48
- | Intent | Adet | Yüzde |
49
- |--------|------|-------|
50
- | CHAT (selam, veda, motivasyon, empati, vazgeçme, clarification) | 373 | %52 |
51
- | SET_REMINDER (tek-tur + çok-turlu + typo) | 521 | %73 |
52
- | ADD_TASK | 45 | %6 |
53
- | LIST_TASKS | 21 | %3 |
54
- | NAVIGATE | 15 | %2 |
55
- | **UPDATE_TASK** (saat güncelleme) — YENİ | 10 | %1 |
56
- | **CANCEL_TASK** (basit iptal) YENİ | 10 | %1 |
57
- | CANCEL_TASK ambiguous (clarification → CHAT) | (5) | — |
 
 
 
 
 
58
 
59
  ## Kullanım
60
 
61
  ### llama.cpp ile (komut satırı)
62
 
63
  ```bash
64
- llama.cpp/main -m qwen2.5-3b-it-tr-asistant-v5.1.Q4_K_M.gguf \
65
  -c 2048 \
66
  -n 512 \
67
  --threads 3 \
68
- -p "<|im_start|>system\nSen Türkçe kişisel asistansın.<|im_end|>\n<|im_start|>user\nYarın saat 14'te fatura ödemeyi unutma.<|im_end|>\n<|im_start|>assistant\n"
69
  ```
70
 
71
- ### llama-cpp-python ile
72
 
73
  ```python
74
  from llama_cpp import Llama
 
75
 
76
  llm = Llama(
77
- model_path="qwen2.5-3b-it-tr-asistant-v5.1.Q4_K_M.gguf",
78
  n_threads=3,
79
  n_ctx=2048,
80
  )
81
 
82
- SYSTEM_PROMPT = """Sen Türkçe kişisel asistansın. BUGÜN: {today}.
83
- Sadece JSON: {"intent":"CHAT|ADD_TASK|LIST_TASKS|SET_REMINDER|UPDATE_TASK|CANCEL_TASK|NAVIGATE","task_id":"uuid|null","task_title":"…|null","datetime":"ISO8601|null","navigate_to":"…|null","reply":"Türkçe yanıt"}.
84
- Normal sohbette doğal cevap ver. Görev/hatırlatıcı istendiğinde action alanını doldur. JSON dışında bir şey yazma."""
 
 
 
 
 
85
 
86
  output = llm.create_chat_completion(
87
  messages=[
@@ -92,67 +116,114 @@ output = llm.create_chat_completion(
92
  stop=["<|im_end|>"],
93
  )
94
  print(output["choices"][0]["message"]["content"])
 
95
  ```
96
 
97
- ## Intent Şeması
98
-
99
- Model şu intent'lere sınıflandırma yapar ve JSON çıktısı üretir:
100
-
101
- ```json
102
- {
103
- "intent": "SET_REMINDER",
104
- "task_id": "550e8400-e29b-41d4-a716-446655440000",
105
- "task_title": "Fatura ödemek",
106
- "datetime": "2026-06-07T11:00:00.000",
107
- "navigate_to": null,
108
- "reply": "Tabii, yarın saat 14:00 için fatura ödeme hatırlatıcısı oluşturdum."
109
- }
110
- ```
111
-
112
- | Intent | Açıklama |
113
- |--------|----------|
114
- | `ADD_TASK` | Yeni görev oluştur (task_id üretilir) |
115
- | `SET_REMINDER` | Zamanlı hatırlatıcı kur (task_id üretilir) |
116
- | `UPDATE_TASK` | Mevcut görevin saatini güncelle (task_id korunur) |
117
- | `CANCEL_TASK` | Mevcut görevi iptal et (task_id korunur) |
118
- | `LIST_TASKS` | Mevcut görevleri listele |
119
- | `NAVIGATE` | Uygulama içi sayfa değiştir (PROFILE, SETTINGS, HOME, TASKS) |
120
- | `CHAT` | Genel sohbet (greeting, veda, sağlık durumu, out-of-scope, negation, clarification, empati) |
121
-
122
- ## Sınırlamalar
123
 
124
- **Kapsam dışı istekler** (model bunlara `CHAT` yanıtı verir):
125
- yemek siparişi, web arama, hava durumu, müzik, e-posta, çeviri, taksi, telefon, SMS, haber, alışveriş (kendi market listesi hariç), banka, sosyal medya, video, borsa, kripto, matematik, tarif, kamera, şarkı sözü, bilet, döviz, şaka, akıllı ev, hikaye yazma.
 
126
 
127
- **STT gürbüzlüğü:** Eğitim verisinde SMS kısaltmaları (`yrn`, `sbh`, `aksm`), Türkçe karakter düşmeleri (`hastane`→`hastne`, `yarın`→`yrn`), sesli harf kayıpları (`dişçi`→`diş`), devrik cümle, birleşik kelime (`kanka`, `hocm`), aşırı kısaltma (`slm`, `tmm`) için 40 örnek vardır (KISIM 10).
 
 
128
 
129
- **Negation tespiti:** "Vazgeçtim", "istemiyorum", "yapma", "iptal", "gerek yok", "bırak" gibi 30+ diyalogla (KISIM 6) eğitildi; model bunları kalıcı olarak CHAT'e yönlendirir ve yeni SET_REMINDER üretmez.
130
 
131
- **UPDATE/CANCEL akışı:** Kullanıcı "saati 4'e al" veya "iptal et" derse model `UPDATE_TASK` veya `CANCEL_TASK` intent'i ile yanıt verir. Engine guard (`hybrid_nlp_engine.dart`) fuzzy match (Levenshtein < 3) ile gerçek DB task_id'sini bulur, confirmation dialog gösterir.
 
 
 
 
 
 
 
 
 
132
 
133
- **Context:** 2048 token (eğitim). Multi-turn diyalogda 5+ tur geçince eski bağlam düşebilir — KISIM 9 (karma 5-8 turlu diyaloglar) bu duruma karşı eğitildi. Runtime tarafında RAG injection ile aktif görev listesi prompt'a enjekte edilir.
 
134
 
135
- ## Eğitim Veri Seti (712 dialog)
136
 
137
  | Kısım | Açıklama | Adet |
138
  |-------|----------|------|
139
  | 1 | Persona & Selam (jenerik) | 70 |
140
- | 2 | Tek-tur SET_REMINDER (7 domain × time × title) | 220 |
141
- | 3 | Çok-turlu SET_REMINDER ("ne zaman?" → yanıt → kur) | 140 |
142
  | 4 | ADD_TASK | 41 |
143
  | 5 | LIST_TASKS + NAVIGATE | 31 |
144
  | 6 | Negasyon / İptal (domain'ler arası) | 30 |
145
- | 7 | Düzeltme / Güncelleme (saat veya başlık değişikliği) | 12 |
146
  | 8 | Genel sohbet (hava, motivasyon, günlük, teknoloji, kitap, film, yemek) | 54 |
147
- | 9 | Karma uzun diyaloglar (5-8 turlu, domain'ler arası) | 24 |
148
- | 10 | Typo / STT dayanıklılık (tüm domain'lerde ağır bozulma) | 40 |
149
- | **11** | **"güncellendi" reply polish (UPDATE sonrası)** | **10** |
150
- | **12** | **Empatik CHAT (duygusal içerik yanıtları)** | **15** |
151
- | **13** | **UPDATE_TASK (saat güncelleme)** | **10** |
152
- | **14** | **CANCEL_TASK (basit iptal)** | **10** |
153
- | **15** | **CANCEL_TASK (ambiguous / clarification)** | **5** |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
 
155
- **Domain dağılımı (7 domain):** sağlık, iş/kariyer, finans/fatura, eğitim, seyahat/ulaşım, sosyal/kişisel, ev/günlük yaşam. Her domain'den 60-120 örnek cross-product kombinasyonuyla (template × time × title) unique olarak üretildi.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
 
157
  ## Donanım Doğrulamaları (Mobile)
158
 
@@ -161,17 +232,9 @@ yemek siparişi, web arama, hava durumu, müzik, e-posta, çeviri, taksi, telefo
161
  | POCO X4 GT (Dimensity 8100) | CPU | 2 | 768 | ~6s | ~3 GB (8 GB cihazda rahat) |
162
  | iPhone 17 Pro (M3 Max sim) | CPU | 6 | 2048 | <2s | ~2.5 GB unified memory |
163
 
164
- Vulkan backend Dimensity 8100 Android 14'te `ggml_backend_alloc_ctx_tensors_from_buft` SIGSEGV hatası veriyor (driver coopmat bug). OpenCL llama-cpp-dart 0.6.15'te implemente edilmiyor. NPU (APU 580) için llama.cpp backend'i yok.
165
-
166
- ## v5.1 Tasarım Kararları
167
-
168
- 1. **v5_hybrid üzerine minor polish:** Major kırılma yok, sadece yeni intent'ler (UPDATE/CANCEL) + artifact temizliği + persona polish.
169
- 2. **Yeni intent'ler:** `UPDATE_TASK` (saat güncelleme) + `CANCEL_TASK` (basit iptal). Ambiguous case (2+ görev) → model `CHAT` clarification sorar, engine guard fuzzy match + confirmation dialog.
170
- 3. **Task_id akışı:** ADD_TASK/SET_REMINDER'da model UUID üretir. UPDATE/CANCEL'da model aynı session'daki task_id'yi korur. Engine guard fuzzy match (Levenshtein < 3) ile DB'den gerçek ID'yi bulur.
171
- 4. **BUGÜN dağıtımı:** v5_hybrid'da 1 sabit tarih vardı, v5.1'de örnek başına farklı tarih (geçmiş 30 gün). Model artık BUGÜN'ü ezberlemez.
172
- 5. **(user, assistant) tuple dedupe:** v5_hybrid'da `json.dumps` dedupe'u 19 duplicate'i kaçırmıştı, v5.1'de `user/assistant` imzaları bazında dedupe yapılır.
173
- 6. **Persona polish:** Düzeltme akışında "kuruldu" yerine "güncellendi" (K11, 10 örnek), duygusal içerikli mesajlara empatik yanıt (K12, 15 örnek).
174
- 7. **Engine guard (kod değişikliği, fine-tune YOK):** `offset_minutes` guard — LLM alanı boş bıraktıysa user msg'den regex ile parse edip inject eder. 3B'de "her zaman alanı doldur" kuralı %50-70, engine guard %100.
175
 
176
  ## Lisans
177
 
@@ -180,9 +243,9 @@ Apache 2.0 (Qwen2.5 base modeliyle uyumlu).
180
  ## Atıf
181
 
182
  ```
183
- @misc{mira-turkish-assistant-v5.1-2026,
184
  author = {Algoritma Turk},
185
- title = {Mira Turkish Assistant v5.1: Qwen2.5-3B Fine-tuned with UPDATE/CANCEL Intents and Artifact Cleanup for 7-Domain Turkish Personal Assistant Tasks},
186
  year = {2026},
187
  publisher = {Hugging Face},
188
  url = {https://huggingface.co/AlienTurk/Turkish-Asistant-gguf}
@@ -194,3 +257,4 @@ Apache 2.0 (Qwen2.5 base modeliyle uyumlu).
194
  - **Base model:** https://huggingface.co/Qwen/Qwen2.5-3B-Instruct
195
  - **Quantized GGUF:** https://huggingface.co/AlienTurk/Turkish-Asistant-gguf
196
  - **Fine-tune framework:** [Unsloth](https://github.com/unslothai/unsloth)
 
 
10
  - gguf
11
  - llama.cpp
12
  - unsloth
13
+ - natural-language
14
  base_model: Qwen/Qwen2.5-3B-Instruct
15
  ---
16
 
17
+ # Mira Turkish Assistant v6N (Qwen2.5-3B-IT-TR) — Doğal Dil SFT
18
 
19
+ > **v6N = v6 Natural.** Bu sürüm **JSON artefaktı içermez**. Model, eğitim sırasında
20
+ > doğrudan doğal Türkçe yanıt üretmeyi öğrendi. Yapısal veri (intent, datetime, task_id)
21
+ > çıkarımı Hybrid NLP Engine tarafından runtime'da paralel olarak yapılır.
22
 
23
+ Bu model **Qwen2.5-3B-Instruct** baz modeli üzerine **Unsloth + TRL** ile ince ayar yapılmış,
24
+ **doğal dil SFT** (Supervised Fine-Tuning) ile eğitilmiş Türkçe kişisel asistan modelidir.
25
 
26
+ JSON mimarisi (v5_hybrid, v5.1) terk edilmiştir. Bunun yerine:
 
 
 
 
 
 
 
 
 
 
 
27
 
28
+ - **LLM:** Doğal Türkçe yanıt üretir (assistant_text)
29
+ - **NLPEngine:** Paralel olarak regex/heuristik tabanlı intent/taskTitle/datetime çıkarır
30
+ - **Engine guard'lar:** Title recovery, notal override, multi-turn confirmation, P33 disambiguation
31
+
32
+ Engine guard'lar LLM çıktısını **sadece gerekli durumlarda override eder** (saat uydurma,
33
+ not-al semantik, P33 listeleme). Normal akışta LLM'in doğal yanıtı kullanıcıya ulaşır.
34
+
35
+ ## v6N vs v5.1 — Temel Farklar
36
+
37
+ | Özellik | v5.1 (eski) | v6N (bu) |
38
+ |---|---|---|
39
+ | **Çıktı formatı** | JSON şeması (`{intent, task_id, ...}`) | Doğal Türkçe metin |
40
+ | **JSON artefaktı** | Olabilir (3B model ara sıra JSON dışı çıktı) | Yok (sadece doğal dil öğretildi) |
41
+ | **Yapısal veri** | LLM üretir | NLPEngine paralel çıkarır |
42
+ | **Senaryo 1.4 reply** | LLM kendi yazıyordu (format değişken) | "Yarın saat 10:00 X için hatırlatıcın 1 saat önce kuruldu." (sabit) |
43
+ | **Senaryo 2/1.5 "not al"** | NLPEngine fallback | "Yarın için X görevi kuruldu." (Senaryo 1.5 template) |
44
+ | **Senaryo 1.3 offset** | Default 1 saat | "30 dakika/saat/gün önce" kullanıcı verisine göre |
45
+ | **11:30/12:30 tokenizasyon** | Zayıf | 12 varyasyon eğitildi |
46
+ | **P33 disambiguation** | Engine + LLM clarification | Engine + K15 training |
47
+ | **Dataset** | 712 dialog (JSON) | 757 dialog (doğal dil) |
48
+ | **Pack** | JSON: `{messages, _meta}` | Doğal dil: `{messages}` (meta strip) |
49
 
50
  ## Model Detayları
51
 
52
  - **Base model:** [Qwen/Qwen2.5-3B-Instruct](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct)
53
  - **Fine-tune yöntemi:** QLoRA (r=16, alpha=32, target_modules: q,k,v,o,gate,up,down)
54
+ - **Veri seti:** 757 unique doğal Türkçe diyalog (SFT, ChatML format, 17 K-seri)
55
+ - **Eğitim:** 3 epoch, validation split %8, early stopping (patience=2, threshold=0.005), LR=3e-5 (QLoRA için orta yol), cosine_with_restarts scheduler, packing=True
56
  - **Framework:** Unsloth + Transformers + TRL (Google Colab L4 GPU)
57
+ - **Quantization:** Q4_K_M (~1.93 GB)
58
+ - **Context window:** 1024 token (eğitim), 2048 token (runtime iOS), 768 token (Android)
59
+
60
+ ## Mimari: LLM + Hybrid NLP Engine
61
+
62
+ ```
63
+ User mesajı
64
+
65
+ LLM (Qwen2.5-3B v6N) NLPEngine (rule-based) [paralel]
66
+ ↓ ↓
67
+ Doğal yanıt Intent + taskTitle + datetime
68
+ ↓ ↓
69
+ └────── ActionDispatcher DB + notification
70
+ ```
71
+
72
+ - **LLM** kişilik, doğal konuşma, onay formatı, saat sorusu sorma, P33 clarification
73
+ - **NLPEngine** tarih/saat parse, intent sınıflandırma, title extraction
74
+ - **ActionDispatcher** DB insert/update/delete + notification schedule/cancel + P33 disambiguation
75
+ - **Engine guard'lar** (mimari seviye, fine-tune gerekmez): TimeFabricationGuard, NotAlOverrideGuard, ChatUpdateCancelRecoveryGuard, MultiTurnConfirmationRecoveryGuard
76
 
77
  ## Kullanım
78
 
79
  ### llama.cpp ile (komut satırı)
80
 
81
  ```bash
82
+ llama.cpp/main -m qwen2.5-3b-it-tr-asistant-v6N.Q4_K_M.gguf \
83
  -c 2048 \
84
  -n 512 \
85
  --threads 3 \
86
+ -p "<|im_start|>system\nSen Türkçe kişisel asistansın. BUGÜN: 14 Haziran 2026, Pazar.<|im_end|>\n<|im_start|>user\nYarın saat 14'te fatura ödemeyi unutma.<|im_end|>\n<|im_start|>assistant\n"
87
  ```
88
 
89
+ ### llama-cpp-python ile (doğal dil — JSON yok)
90
 
91
  ```python
92
  from llama_cpp import Llama
93
+ from datetime import datetime
94
 
95
  llm = Llama(
96
+ model_path="qwen2.5-3b-it-tr-asistant-v6N.Q4_K_M.gguf",
97
  n_threads=3,
98
  n_ctx=2048,
99
  )
100
 
101
+ today_str = "14 Haziran 2026, Pazar"
102
+ SYSTEM_PROMPT = f"""Sen son derece yardımcı, nazik, empatik ve organize bir Türkçe kişisel asistansın.
103
+ BUGÜN: {today_str}.
104
+ Temel görevlerin:
105
+ - Kullanıcıyla doğal, samimi ve akıcı bir sohbet kurmak.
106
+ - Kullanıcının görevlerini, randevularını ve hatırlatıcılarını yönetmek.
107
+ - Detaylar (özellikle saat) eksikse kibarca sor. Detaylar netse, işlemi yaptığınız doğal bir dille onayla.
108
+ - Asla ham JSON, kod bloğu veya teknik terimler kullanma. Sadece doğal Türkçe konuş."""
109
 
110
  output = llm.create_chat_completion(
111
  messages=[
 
116
  stop=["<|im_end|>"],
117
  )
118
  print(output["choices"][0]["message"]["content"])
119
+ # Örnek çıktı: "Yarın saat 14:00 Fatura ödeme için hatırlatıcın 1 saat önce kuruldu."
120
  ```
121
 
122
+ ### Native çıktıda yapısal veri (NLPEngine tarafı — ayrı)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
 
124
+ LLM doğal yanıt üretir; `intent`, `taskTitle`, `datetime` gibi yapısal alanlar
125
+ **Hybrid NLP Engine** (`lib/core/services/hybrid_nlp_engine.dart`) tarafından runtime'da
126
+ paralel olarak çıkarılır. Bu nedenle inference kodunuzda:
127
 
128
+ 1. LLM'i doğal yanıt için kullanın (chat UI'a yazacağınız metin)
129
+ 2. NLPEngine'i arka planda çalıştırın → DB aksiyonu (SET_REMINDER, ADD_TASK, vb.)
130
+ 3. Engine guard'lar kritik durumlarda LLM çıktısını override eder (saat uydurma, P33 vb.)
131
 
132
+ ## Reply Formatları (docs/uygulama_kurallari.md)
133
 
134
+ | Senaryo | Format | Örnek |
135
+ |---------|--------|-------|
136
+ | 1.1 (saat sorma) | "Anladım [Gün] '[Aktivite]' için hangi saatte hatırlatma istersiniz? Hatırlatıcı kurmamı isterseniz saat verin, sadece görev kaydetmek isterseniz 'not al' yazmanız yeterli." | "Anladım Pazartesi 'Kahve' için hangi saatte..." |
137
+ | 1.2 (default 1 saat önce) | (kullanıcı süre vermedi → 1 saat) | — |
138
+ | 1.3 (offset) | "[Gün] saat [HH:MM] [Aktivite] için hatırlatıcın [Süre] önce kuruldu." | "Yarın saat 10:00 Doktor için hatırlatıcın 30 dakika önce kuruldu." |
139
+ | 1.4 (onay) | "[Gün] saat [HH:MM] [Aktivite] için hatırlatıcın [Süre] önce kuruldu." | "Yarın saat 12:00 Kahve için hatırlatıcın 1 saat önce kuruldu." |
140
+ | 1.5 / Senaryo 2 ("not al") | "[Gün] için [Aktivite] görevi kuruldu." | "Pazartesi için Kahve görevi kuruldu." |
141
+ | 3 (iptal onay) | "Tamam, '[Aktivite]' görevi silindi." / "korundu." | (dispatcher override eder) |
142
+ | 4 (P33 disambiguation) | "Birden fazla '[Aktivite]' göreviniz var: 1) ... 2) ..." | (engine injection) |
143
+ | 5 (UPDATE) | "[Gün] '[Aktivite]' '[Saat]' için [Süre] önce hatırlatacak şekilde güncellendi." | "Yarın 'Spor Salonu' '20:00' için 1 saat önce hatırlatacak şekilde güncellendi." |
144
 
145
+ > NOT: Senaryo 3 (iptal) ve Senaryo 5 (UPDATE) reply'leri runtime'da `ActionDispatcher` tarafından
146
+ > override edilir (Sprint 11 + Sprint 13 fix). LLM'in bu senaryolardaki doğal reply'i gösterilmez.
147
 
148
+ ## Eğitim Veri Seti (757 dialog)
149
 
150
  | Kısım | Açıklama | Adet |
151
  |-------|----------|------|
152
  | 1 | Persona & Selam (jenerik) | 70 |
153
+ | 2 | Tek-tur SET_REMINDER (7 domain × time × title) — **Senaryo 1.4 format** | 220 |
154
+ | 3 | Çok-turlu SET_REMINDER ("ne zaman?" → yanıt → kur) — **Senaryo 1.4 format** | 140 |
155
  | 4 | ADD_TASK | 41 |
156
  | 5 | LIST_TASKS + NAVIGATE | 31 |
157
  | 6 | Negasyon / İptal (domain'ler arası) | 30 |
158
+ | 7 | Düzeltme / Güncelleme (narrative) | 12 |
159
  | 8 | Genel sohbet (hava, motivasyon, günlük, teknoloji, kitap, film, yemek) | 54 |
160
+ | 9 | Karma uzun diyaloglar (5-8 turlu, domain'ler arası) — **filter düzeltildi** | 24 |
161
+ | 10 | Typo / STT dayanıklılık (tüm domain'lerde ağır bozulma) — **Senaryo 1.4 format** | 40 |
162
+ | 11 | "güncellendi" reply polish (UPDATE sonrası) | 10 |
163
+ | 12 | Empatik CHAT (duygusal içerik yanıtları) | 15 |
164
+ | 13 | UPDATE_TASK (saat güncelleme) | 10 |
165
+ | 14 | CANCEL_TASK (basit iptal) | 10 |
166
+ | 15 | CANCEL_TASK (ambiguous / clarification → P33) | 5 |
167
+ | **16** | **"not al" saatsiz görev (Senaryo 2)** — **YENİ** | **25** |
168
+ | **17** | **"X dakika/saat/gün önce" offset (Senaryo 1.3)** — **YENİ** | **20** |
169
+
170
+ **Domain dağılımı (7 domain):** sağlık, iş/kariyer, finans/fatura, eğitim, seyahat/ulaşım, sosyal/kişisel, ev/günlük yaşam.
171
+
172
+ **Tüm diyaloglar doğal Türkçedir.** JSON şeması, `intent` alanı, `task_id` alanı **yoktur**.
173
+ Asistan yalnızca konuşma metni üretir.
174
+
175
+ ## Engine Guard'lar (kod tarafı, fine-tune gerektirmez)
176
+
177
+ - **`TimeFabricationGuard`** — LLM saat uydurduğunda (kullanıcı saat vermedi) → saat sorma template'ı
178
+ - **`NotAlOverrideGuard`** — "not al" semantiği → saatsiz görev olarak işle
179
+ - **`MultiTurnConfirmationRecoveryGuard`** — Çok-turlu onay (CHAT veya SET_REMINDER+title null)
180
+ - **`ChatUpdateCancelRecoveryGuard`** — Multi-turn update/cancel + history-aware vazgeç
181
+ - **`P33 Disambiguation (task_id_resolver)`** — 2+ match'te kullanıcıya seçim listele
182
+
183
+ ## v6N Tasarım Kararları
184
+
185
+ 1. **JSON mimarisinin tamamen terk edilmesi:** v5.1'de LLM'in JSON üretemediği durumlar
186
+ (3B model "ecops", "turn", bozuk JSON) sıkça yaşanıyordu. v6N'da LLM sadece doğal dil
187
+ öğrendi — bu sorun kaynağında çözüldü.
188
+ 2. **`_meta` artifact kaçağı olmaması:** Generation sırasında `intent`/`task_id` analiz için
189
+ `_meta`'da tutulur, ancak `final_train_qwen_v8_natural.jsonl`'e **yazılmaz**. Model bunları
190
+ öğrenmez.
191
+ 3. **Senaryo 1.4 reply template sabit:** K2, K3, K10 reply'leri tek fonksiyondan üretilir
192
+ (`_reminder_reply()`), format drift riski yok.
193
+ 4. **Senaryo 2/1.5 (not al) K16 eklendi:** Sprint 8 sim smoke'da tespit edilen "not al"
194
+ pattern'inin LLM'in doğal reply formatı eğitildi. NLPEngine NotAlOverrideGuard ile
195
+ mimari seviye fallback hâlâ aktif.
196
+ 5. **Senaryo 1.3 (offset) K17 eklendi:** "30 dakika önce", "1 saat önce", "1 gün önce"
197
+ gibi spesifik sürelerin LLM doğal reply formatı.
198
+ 6. **K9 sağlık senaryosu filter düzeltmesi:** Önceki `(t[0] in u2)` yaklaşımı "önümüzdeki
199
+ cuma 9'da" gibi ifadeleri bulamıyor, random fallback saat uyumsuzluğuna neden oluyordu.
200
+ Yeni manuel eşleme (`_HEALTH_TIME_MAP`).
201
+ 7. **11:30 / 12:30 tokenizasyon varyasyonları:** "saat 12 30 dk önce hatırlat" gibi
202
+ STT/parse sorunlarına doğrudan eğitim verisi ile müdahale.
203
+ 8. **packing=True (Unsloth):** v7_natural'da `packing=False` idi, eğitim hızı düşüktü.
204
+ v6N'da Unsloth performans önerisiyle `True`.
205
+ 9. **TRL `DataCollatorForCompletionOnlyLM` (built-in):** Custom collator sınıfı kaldırıldı,
206
+ TRL'in built-in maskeleme mekanizması kullanılıyor (daha az özel kod, aynı işlevsellik).
207
+
208
+ ## Sınırlamalar
209
 
210
+ **Kapsam dışı istekler** (model bunlara doğal CHAT yanıtı verir):
211
+ yemek siparişi, web arama, hava durumu, müzik, e-posta, çeviri, taksi, telefon, SMS, haber,
212
+ alışveriş (kendi market listesi hariç), banka, sosyal medya, video, borsa, kripto, matematik,
213
+ tarif, kamera, şarkı sözü, bilet, döviz, şaka, akıllı ev, hikaye yazma.
214
+
215
+ **STT gürbüzlüğü:** Eğitim verisinde SMS kısaltmaları (`yrn`, `sbh`, `aksm`), Türkçe
216
+ karakter düşmeleri (`hastane`→`hastne`, `yarın`→`yrn`), sesli harf kayıpları
217
+ (`dişçi`→`diş`), devrik cümle, birleşik kelime (`kanka`, `hocm`), aşırı kısaltma
218
+ (`slm`, `tmm`) için 40 örnek vardır (KISIM 10).
219
+
220
+ **Negation tespiti:** "Vazgeçtim", "istemiyorum", "yapma", "iptal", "gerek yok", "bırak"
221
+ gibi 30+ diyalogla (KISIM 6) eğitildi; model bunları kalıcı olarak CHAT'e yönlendirir
222
+ ve yeni SET_REMINDER üretmez.
223
+
224
+ **Context:** 1024 token (eğitim) / 2048 token (iOS runtime). Multi-turn diyalogda 5+ tur
225
+ geçince eski bağlam düşebilir — KISIM 9 (karma 5-8 turlu diyaloglar) bu duruma karşı
226
+ eğitildi. Runtime tarafında RAG injection ile aktif görev listesi prompt'a enjekte edilir.
227
 
228
  ## Donanım Doğrulamaları (Mobile)
229
 
 
232
  | POCO X4 GT (Dimensity 8100) | CPU | 2 | 768 | ~6s | ~3 GB (8 GB cihazda rahat) |
233
  | iPhone 17 Pro (M3 Max sim) | CPU | 6 | 2048 | <2s | ~2.5 GB unified memory |
234
 
235
+ Vulkan backend Dimensity 8100 Android 14'te `ggml_backend_alloc_ctx_tensors_from_buft`
236
+ SIGSEGV hatası veriyor (driver coopmat bug). OpenCL llama-cpp-dart 0.6.15'te implemente
237
+ edilmiyor. NPU (APU 580) için llama.cpp backend'i yok.
 
 
 
 
 
 
 
 
238
 
239
  ## Lisans
240
 
 
243
  ## Atıf
244
 
245
  ```
246
+ @misc{mira-turkish-assistant-v6n-2026,
247
  author = {Algoritma Turk},
248
+ title = {Mira Turkish Assistant v6N (Natural): Qwen2.5-3B Fine-tuned with Natural-Language SFT for Turkish Personal Assistant Tasks},
249
  year = {2026},
250
  publisher = {Hugging Face},
251
  url = {https://huggingface.co/AlienTurk/Turkish-Asistant-gguf}
 
257
  - **Base model:** https://huggingface.co/Qwen/Qwen2.5-3B-Instruct
258
  - **Quantized GGUF:** https://huggingface.co/AlienTurk/Turkish-Asistant-gguf
259
  - **Fine-tune framework:** [Unsloth](https://github.com/unslothai/unsloth)
260
+ - **Mobil uygulama (runtime):** Hybrid NLP Engine mimarisi