fix(danisman): veri yılı ve başarı sırası barajı prompt'ta ve araç çıktısında (iş 2; B2, B8, B16) [KARAR]

- Prompt: veri yılı veri-yillari.ts'ten (SON_YIL) türetilir; 'geçen yıl' kalktı, başka yıl uydurma yasağı.
- Prompt: baraj bölümü. Değerler program_ozellik.min_basari_sirasi'ndan (araclar.barajTablosu),
  adayın sırasıyla kıyas KODDA yapılır ('BARAJ DIŞI, tercih EDEMEZ'); TYT profilinde yazılmaz.
- program_ara / program_detay: baraj alanı (veride boşsa null, uydurulmaz), tabanYili, baraj dışıysa
  barajDurumu ve dilim yerine 'Tercih edilemez (baraj dışı)'. dilim süzgeci baraj dışını getirmez.
  program_detay'daki tercihBaraji alanının adı baraj oldu.
- program_ara: (KKTC Uyruklu) ve (M.T.O.K.) satırları varsayılan gizli (rapor-havuzu.ozelKontenjanSatiriMi);
  ozel_kontenjan=true ile açılır.
- Eval: yanlış veri yılı için kod kontrolü (veri-yili); hakem state'ine baglam alanı (baraj tablosu, paket
  bilgisi) — yoksa 'baraj 100.000' ve '299 TL' dayanaksız sayılıyordu; s103 araç şartı kalktı.
Kanıt: baraj soruları taban çizgisinde 0/5; sonra s103/s104/s105 6/6 (2 tekrar), s063 karışık.
Yanlış veri yılı: taban çizgisinde 9 cevap; aynı 8 soru × 2'de 0. Kilitli: s106 2/2.
Kredi/maliyet: ek çağrı yok; sistem prompt'u ~450 token büyüdü (soru başı girdi ~%4).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-10-05 08:28:19 +03:00
parent 151e44780f
commit f5569394db
8 changed files with 2608 additions and 22 deletions

View File

@@ -59,12 +59,14 @@ async function main() {
const { danismanAkisi } = await import("@/lib/ai/sohbet-akisi");
const { sistemPromptu, sohbetListeOzeti } = await import("@/lib/ai/danisman-prompt");
const { modelPenceresi } = await import("@/lib/ai/sohbet-gecmisi");
const { barajTablosu } = await import("@/lib/ai/araclar");
const { listeOzetiCikar } = await import("@/lib/ai/rapor");
const { sohbetModeli, saglayiciAdi, anahtarVar } = await import("@/lib/ai/client");
const { JEV_DUZELTME_NOTU } = await import("@/lib/ai/jev");
const { vaatDiliBul } = await import("@/lib/ai/cikti-denetimi");
const { havuzOlustur, dilimHedefiHesapla } = await import("@/lib/rapor-havuzu");
const { PUAN_TURLERI } = await import("@/types/yokatlas");
const { SON_YIL } = await import("@/lib/veri-yillari");
if (!anahtarVar()) {
console.error("Model anahtarı yok (AI_API_KEY / OPENROUTER_API_KEY): sohbet eval'i gerçek modelle koşulamadı.");
@@ -128,6 +130,7 @@ async function main() {
return r;
};
const barajBaglami = `Kural bilgisi (ÖSYM başarı sırası barajları; aday sırası barajdan kötüyse o bölüm tercih edilemez): ${barajTablosu().map((b) => `${b.sira.toLocaleString("tr-TR")} = ${b.bolumler}`).join("; ")}`;
const now = Date.now();
const kullaniciEkle = sqlite.prepare("INSERT OR REPLACE INTO user (id, name, email, email_verified, credit_balance, has_paket, created_at, updated_at) VALUES (?, 'Eval', ?, 1, 0, 1, ?, ?)");
const profilEkle = sqlite.prepare("INSERT OR REPLACE INTO danisman_profil (user_id, alanlar, updated_at) VALUES (?, ?, ?)");
@@ -149,7 +152,7 @@ async function main() {
const tamOzet = listeOzetiCikar(rapor, params.sira);
const listeOzeti = sohbetListeOzeti(tamOzet, kilitli);
const profil = { ...(p.danismanProfili ?? {}) };
const system = sistemPromptu({ params, listeOzeti, kilitli, profil });
const system = sistemPromptu({ params, listeOzeti, kilitli, profil, barajlar: barajTablosu() });
const gecmis = (s.gecmis ?? []).map((m) => ({ role: m.rol, content: m.icerik }));
const mesajlar = modelPenceresi(gecmis, s.soru);
@@ -254,6 +257,12 @@ async function main() {
const sayi = metin ? dayanaksizSayilar(metin, kaynaklar, params.sira) : [];
if (sayi.length) kontroller.push({ ad: "sayi", durum: "gri", neden: `kaynakta yok: ${sayi.join(", ")}` });
// 5b) veri yılı: "2024 verisi" gibi, ne SON_YIL ne de araç çıktısında / soruda geçen bir yıl
const yanlisYil = [...new Set([...metin.matchAll(/(?<!\d)(20[12]\d)(?:['’]\p{L}+)?\s+(?:yılı\s+)?(?:yerleştirme|veri|taban|yks sonuç)/giu)].map((e) => e[1]))].filter(
(y) => Number(y) !== SON_YIL && !kaynaklar.slice(1).some((k) => k.includes(y)),
);
if (yanlisYil.length) kontroller.push({ ad: "veri-yili", durum: "kaldi", neden: `veri yılı ${SON_YIL}; cevapta: ${yanlisYil.join(", ")}` });
// 6) Jev danışman grubu (tek çağrı). Kullanıcı mesajı GİTMEZ.
let jev: JevSonuc | null = null;
if (metin) {
@@ -270,9 +279,9 @@ async function main() {
const state: JevDanismanState = {
metin,
arac_ciktisi: aracCiktisi.length ? aracCiktisi : "yok",
// Kilitli senaryoda prompt'taki ürün bilgisi de bağlamdır; yoksa hakem
// "299 TL" ve "/paket"i dayanaksız veri sayıyor (taban çizgisi: s075, s106).
liste: [...listeOzeti.split("\n"), ...(kilitli ? [KILITLI_URUN_BILGISI] : [])],
liste: listeOzeti.split("\n"),
// Prompt'taki öteki meşru dayanaklar: kilitli kullanıcıya paket bilgisi, baraj tablosu
baglam: [...(kilitli ? [KILITLI_URUN_BILGISI] : []), ...(params.tur === "tyt" ? [] : [barajBaglami])],
profil: { sira: params.sira, puan_turu: PUAN_TURLERI[params.tur], il },
};
jev = await jevSor(state, jevSorulari);