Files
kolaytercih/docs/ekip-raporlari/2026-10-07/yapay-zeka-revizyon-araci.md
bilalgursen da0e9dff7a docs(ekip): 7–10 Ekim raporları, eval sonuçları, seslendirme betiği
- docs/ekip-raporlari/2026-10-07, 2026-10-09, 2026-10-10 raporları ve ekran görüntüleri
  (ses/ altındaki mp3 dosyaları depoya alınmadı, 38 MB)
- BACKLOG #38: rehber yazılarına "Dinle" düğmesi adayı
- scripts/seslendir.py (Türkçe TTS) ve .gitignore'a .venv-tts/
- scripts/eval/sonuc: 8–10 Ekim revizyon eval çıktıları

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-11 00:33:39 +03:00

63 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Yapay zekâ — revizyon aracı atlanması (QA B1) ve soru formu Türkçe karakter (QA B4)
Dal `v2`, taban `129c839`, commit `128c175` (push yok). Gerçek modelle ölçüm: `deepseek/deepseek-v4-flash @ openrouter.ai`, 8-9 Eki 2026 gecesi. Başkalarının dirty dosyalarına (`.claude/settings.json`, `AGENTS.md`, `data/app.db`, paralel yazılımcının dosyaları) dokunulmadı.
## Özet (5 madde)
1. **Kök neden koddan ve kayıttan doğrulandı:** `chat_messages` yalnız metin tutar; başarılı bir revizyonun kaydı ("revize ediyorum… Liste yenilendi… 1-5") araçsız bir cevapla birebir aynı görünüyor. Model sonraki turda bu kalıbı taklit ediyor, `liste_revize` çağırmadan "Liste yenilendi" yazıyor ve program adlarını eski cevaptan kopyalıyor (QA'nın lokal DB kaydında form sonrası cevap, önceki İzmir listesinin ilk 3 satırını aynen tekrarlamış). Eval bunu üretti: geçmişsiz istek araçla/formla, geçmişli 7 isteğin 6'sı araçsız.
2. **Yanlış yol denendi ve geri alındı:** geçmişteki başarılı cevabın altına "[araç çağrıldı]" işareti eklemek işe yaramadı — model işareti de kopyalayıp sahte cevabın altına yazdı. Şipariş edilen çözüm: modele giden pencerede başarılı revizyon turu kısa bir **araç kaydına** indirgeniyor, araçsız "yenilendi" diyen tur (düzeltme notu olmayan eski DB kayıtları dâhil) uydurma listesiyle birlikte düşüyor. Kayıt ve ekran değişmiyor.
3. **`tool_choice: "required"` ölçüldü, varsayılan KAPALI bırakıldı:** çağrı oranı 1/8 → 7/8, sahte beyan 5 → 0 verdi; ama OpenRouter "required" parametresini destekleyen sağlayıcıya (Baidu → OpenInference) geçti, cevap süresi 1-7 sn'den **80-112 sn'ye** çıktı ve bir cevapta 39 paralel `tercih_takvimi` çağrısı geldi (kota 8'de kesti). Kod yolu `SOHBET_REVIZYON_ARAC_ZORUNLU=1` ile açılabilir — `[BİLAL]`.
4. **Beyan regex'i genişledi** (kaçan iki kalıp: "Şu değişiklikler yapıldı", "artık 24 tercihin tamamı devlet… oluşuyor"); prompt'a "geçmiş örnek değildir, önce aracı çağır" ve "Türkçe karakter" kuralları eklendi; `soru_sor` formunda ASCII il adları koddan düzeliyor (`Istanbul → İstanbul`).
5. **Çağrı bütçesi aşıldı:** 65 model çağrısı (0,016 $) — hata ayıklama ve işaretli ara koşu yüzünden 50 sınırı geçildi. Bu yüzden **gönderilen varsayılanın (zorunlu kapalı) izole ölçümü koşulmadı**; komut ve tahmini maliyet aşağıda, Bilal koşar.
## Bulgular
### B1 — model `liste_revize` aracını atlıyor (Orta)
- `src/app/api/soru/route.ts:270` (eski) geçmişi düz metin olarak `modelPenceresi`'ne veriyordu; `src/lib/ai/sohbet-akisi.ts` araç turlarını kayda yazmaz (tasarım gereği, `content` düz metin). Başarılı turun kaydı (`data/app.db`, QA hesabı):
`İlk 5 tercihi Ankara olacak şekilde revize ediyorum.\n\nListe yenilendi. İlk 5 tercihin artık Ankara'daki programlar:\n\n1. **Biyomedikal Mühendisliği — Ankara Üniversitesi** …` — meta'da `revizyon.ok=true` var ama model metinde bunu görmüyor.
- Örnek girdi → hatalı çıktı (eval r03, geçmişte 2 başarılı revizyon, soru "İlk 5'i Bursa'ya göre güncelle."): 1 model çağrısı, araç yok, cevap `İlk 5 tercihi Bursa olacak şekilde revize ediyorum. Liste yenilendi. İlk 5 tercihin artık Bursa'daki programlar: 1. **Bilgisayar Mühendisliği — Bursa Uludağ Üniversitesi** …` (uydurma; sunucu notu eklendi, kredi düştü, liste değişmedi).
- Eval r04 (form cevabı): `Tamamdır, isteğine göre listeyi yeniden kuruyorum. Şu değişiklikler yapıldı: …` — `REVIZE_BEYANI` bunu yakalamıyordu (`src/lib/ai/cikti-denetimi.ts:118`); not eklenmedi, aday "yapıldı" sandı. Düzeltildi.
- İşaret denemesi (geri alındı), eval r03 ikinci koşu: model cevabının sonuna aynen `[Bu cevapta liste_revize aracı çağrıldı ve liste gerçekten yeniden kuruldu.]` yazdı — asistan metnine eklenen her şey taklit malzemesidir.
- `tool_choice: "required"` isteği sağlayıcı değiştiriyor: istek günlüğü `tool_choice="auto" → provider=Baidu (1-7 sn)`, `tool_choice="required" → provider=OpenInference (80-112 sn, finish=tool_calls, 17-82 tool_calls parçası)`. `ARAC_TUR_SINIRI`/kota çalıştı ama gecikme 120 sn'lik sohbet zaman aşımına yaklaştı.
### B4 — soru formunda Türkçe karakter eksik (Düşük)
- Kaynak **model çıktısı**: `anketDogrula` (`src/lib/ai/sohbet-meta.ts`) yalnız boşluk kırpar; QA kaydındaki form argümanında `"Vakif üniversiteleri listende kalsin mi?"`, `"Istanbul da olsun"`, `"Eskisehir de olsun"` olduğu gibi gelmiş. Model araç argümanında (JSON) Türkçe harfleri düşürüyor, serbest metinde düşürmüyor.
- Çözüm: `soru_sor` açıklaması + prompt kuralı 6 (prompt tek başına yetmez, bu yüzden) + `src/lib/ai/araclar.ts` `ilAdlariniDuzelt`: büyük harfle başlayan ve katlanmış hâliyle bir il adına **tam** eşleşen sözcük başlık yazımına çevrilir (`Istanbul → İstanbul`, `Izmir/Ankara → İzmir/Ankara`, `Kahramanmaras → Kahramanmaraş`); `ordu`, `van`, `Afyon` (önek) dokunulmaz. "Vakif", "kalsin" gibi sözlük dışı sözcükler prompt kuralına bırakıldı; gerçek modelle ölçülmedi (bütçe).
- "A/B/C harfleri satır başında ayrı" gözlemi bu turda incelenmedi (UI tarafı, sohbet-anketi.tsx paralel yazılımcıda).
## Eval sonuçları (`pnpm eval:revizyon`, 10 senaryo, QA kaydından alınan gerçek geçmişlerle)
| koşu | geçmiş eşlemesi | tool_choice | liste_revize (revizyon beklenen 8) | sahte beyan | geçen | çağrı | maliyet | gecikme |
|---|---|---|---|---|---|---|---|---|
| önce (`129c839`) | düz metin | auto | **1/8** | **5** (+1 regex kaçırdı) | 3/10 | 16 | 0,0054 $ | 1-7 sn |
| ara: "[araç çağrıldı]" işareti + prompt | işaretli metin | auto (eval zorlamayı geçirmiyordu) | 4/8 | 4 (işaret kopyalandı) | 5/10 | 17 | 0,0022 $ | 2-11 sn |
| araç kaydı + prompt + regex + **zorunlu** | araç kaydı | required (ilk adım) | **7/8** | **0** | 8/10 | 30 | 0,0077 $ | **6-112 sn** (p50 ~85 sn) |
| **gönderilen varsayılan** (araç kaydı + prompt + regex, zorunlu kapalı) | araç kaydı | auto | — koşulmadı — | | | ~20 (tahmin) | ~0,005 $ | |
Ham sonuçlar: `scripts/eval/sonuc/2026-10-08T20-58-33-revizyon.json` (önce), `…21-02-06` (işaretli), `…21-03-07` (r03 hata ayıklama), `…21-14-42` (zorunlu). Mekanik: `akis-denetim` 9/9, `revizyon-denetim` 5/5; `pnpm exec tsc --noEmit` ve `pnpm lint` temiz (0 hata, 12 eski uyarı).
Notlar: r01 (geçmişsiz, İstanbul sihirbaz illerinde yok) önce koşuda `soru_sor` ile form açtı — sahte değil, "kaldı" sayılması ölçütün sertliği. r09 (belirsiz istek) zorunlu koşuda da form yerine metinle seçenek yazdı; `required` ile ilk adımda araç çağrısı geldi ama şema geçersiz çıkmış olabilir (eval `tool-input-error` saymıyor — betikte boşluk). r07 zorunlu koşuda 39 `tercih_takvimi` + 1 `liste_revize`: sağlayıcı davranışı, kota 8'de kesti.
## Maliyet ve gecikme etkisi (gönderilen değişiklik)
- Kredi: değişmez. Düzeltme notu, geçmiş eşlemesi ve il adı düzeltmesi ek model çağrısı yapmaz.
- Token: başarılı revizyon turu pencerede ~120-150 token kısalıyor (uzun açıklama yerine tek satır araç kaydı); sahte tur tamamen düşüyor. Prompt +~140 token (kural 5-6).
- Gecikme: değişmez (tool_choice gönderilmiyor, sağlayıcı aynı kalıyor).
- Zorunlu bayrağı açılırsa: gecikme ~15× (ölçüldü), çağrı sayısı cevap başına 2-4; kredi yine değişmez.
- Toplam harcanan: 65 model çağrısı, ≈0,016 $ (sınır 50 idi; aşım 15 çağrı ≈ 0,004 $ — hata ayıklama + işaretli ara koşu).
## Önerilen değişiklikler
- `[KARAR]` (uygulandı, `128c175`): geçmişte revizyon turlarının araç kaydına indirgenmesi; beyan regex'i; prompt 5-6; `soru_sor` il adı düzeltme; `pnpm eval:revizyon` betiği.
- `[BİLAL]` `SOHBET_REVIZYON_ARAC_ZORUNLU=1`: şu hâliyle **önermiyorum** (gecikme 80-112 sn). Alternatif: OpenRouter isteğine `provider.order` ile hızlı ve `tool_choice: required` destekleyen bir üst sağlayıcı sabitlemek (hangisi olduğu ayrı ölçüm ister, ~10 çağrı) — sağlayıcı/env değişikliği olduğu için Bilal'in kararı.
- `[KARAR]` sonraki tur: eval'e `tool-input-error` sayımı ve `--tekrar 3` tutarlılık ölçümü (model stokastik; tek koşu 10 senaryo dar).
- `[KARAR]` sonraki tur: "Vakif/kalsin" gibi sözlük dışı ASCII sözcükler için formun model çıktısında Türkçe harf hiç yoksa aracın hata dönüp yeniden yazdırması (ek model adımı, kredi yok) — önce prompt kuralının yettiği ölçülmeli.
## Bilal'den istenen
1. Gönderilen varsayılanın izole ölçümü: `pnpm eval:revizyon` (10 senaryo, ~20 çağrı, ~0,005 $, ~2 dk); hedef liste_revize ≥ 6/8 ve sahte beyan 0 — 5 dk.
2. Zorunlu bayrağına karar: `SOHBET_REVIZYON_ARAC_ZORUNLU` açılmasın; istenirse sağlayıcı sabitleme ölçümü için onay — 1 dk.
3. QA hesabındaki eski sohbet kaydı (lokal `data/app.db`) için bir şey gerekmiyor; eşleme eski kayıtları da kapsıyor — yok.