fix(ai): tadımlık risk notu deterministik + prompt dili
Girişsiz /sonuc tadımlığının riskNotu'su LLM üretimiydi ve DB'den olduğu gibi servis ediliyordu; prompt'u da açıkça "yüksek/orta/düşük ihtimal dili kullan" diyordu. Rozet ise aynı satırda canlı hesaplanıyor → metinle rozet çelişebiliyordu. - tadimlikSec(): riskNotu okuma anında riskNotuMetni(riskHesapla(...) ?? dilimdenRisk(...)) ile üretilir (rozetle aynı formül). DB satırları ve şema değişmez; prod'da havuzu yeniden üretmek gerekmez, /api/tadimlik de kapsanır - tadimlik-uret prompt'u + mock metinleri: ihtimal dili yasaklandı, "son 4 yıl" → "son 5 yıl" (çıktı şeması aynı; script koşulmadı) - danışman sohbeti sistem prompt'u: "ihtimal dili kullan" → olasılık/yüzde/ ihtimal yasak, risk etiketleri + taban sıralarıyla konuş Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -67,9 +67,10 @@ KURALLAR (kesin):
|
|||||||
- METİN DİYETİ: her alan TEK kısa cümle, dolgu söz yok.
|
- METİN DİYETİ: her alan TEK kısa cümle, dolgu söz yok.
|
||||||
- gerekce: bu programın bu aday için neden mantıklı olduğu (TEK cümle,
|
- gerekce: bu programın bu aday için neden mantıklı olduğu (TEK cümle,
|
||||||
en fazla ~15 kelime, Türkçe).
|
en fazla ~15 kelime, Türkçe).
|
||||||
- riskNotu: yerleşme ihtimali değerlendirmesi (TEK kısa cümle). ASLA "garanti",
|
- riskNotu: geçmiş taban verisine dayalı risk değerlendirmesi (TEK kısa cümle).
|
||||||
"kesin", "yüzde yüz" deme; "yüksek/orta/düşük ihtimal" dili kullan.
|
ASLA garanti/kesin/yüzde/olasılık/ihtimal deme; "güvenli / az riskli /
|
||||||
- trendOzeti: son 4 yılın taban sıralaması hareketi, TEK cümle (ör. "2022'den
|
riskli" etiketleriyle konuş.
|
||||||
|
- trendOzeti: son 5 yılın taban sıralaması hareketi, TEK cümle (ör. "2022'den
|
||||||
beri taban 45B'den 38B'ye indi, bölüm zorlaşıyor").
|
beri taban 45B'den 38B'ye indi, bölüm zorlaşıyor").
|
||||||
- Adayın sıralaması yaklaşıktır; kesin sıra telaffuz etme, banda göre konuş.`;
|
- Adayın sıralaması yaklaşıktır; kesin sıra telaffuz etme, banda göre konuş.`;
|
||||||
|
|
||||||
@@ -82,9 +83,9 @@ function mockMetin(p: Program, temsiliSira: number, kategori: string | null) {
|
|||||||
return {
|
return {
|
||||||
gerekce: `(Dev mock) ${p.isim}, ${kategori ? `${kategori} ilgisiyle ve ` : ""}~${temsiliSira.toLocaleString("tr-TR")} bandındaki sıralamanla uyumlu bir aday.`,
|
gerekce: `(Dev mock) ${p.isim}, ${kategori ? `${kategori} ilgisiyle ve ` : ""}~${temsiliSira.toLocaleString("tr-TR")} bandındaki sıralamanla uyumlu bir aday.`,
|
||||||
riskNotu:
|
riskNotu:
|
||||||
"(Dev mock) Taban sıralaması senin civarında; orta-yüksek ihtimalle yerleşilebilir.",
|
"(Dev mock) Son taban sıralaması sırana yakın; küçük bir kayma sonucu değiştirebilir.",
|
||||||
trendOzeti:
|
trendOzeti:
|
||||||
"(Dev mock) Son 4 yılda taban sıralaması görece stabil seyretti.",
|
"(Dev mock) Son 5 yılda taban sıralaması görece stabil seyretti.",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ KURALLAR:
|
|||||||
sıralaması adayın belirgin altında, Az riskli (sarı) = adayın sıralaması
|
sıralaması adayın belirgin altında, Az riskli (sarı) = adayın sıralaması
|
||||||
civarında, Riskli (kırmızı) = geçen yıl adayın sıralamasının üzerinde
|
civarında, Riskli (kırmızı) = geçen yıl adayın sıralamasının üzerinde
|
||||||
kapandı. Risk sorularında bu etiketleri ve taban sıralarını kullan.
|
kapandı. Risk sorularında bu etiketleri ve taban sıralarını kullan.
|
||||||
- ASLA yerleşme garantisi verme; "yüksek/orta/düşük ihtimal" dili kullan.
|
- ASLA yerleşme garantisi verme; olasılık, yüzde ya da "ihtimal" dili kullanma —
|
||||||
|
güvenli / az riskli / riskli etiketleri ve taban sıralarıyla konuş.
|
||||||
- Bilmediğin güncel veriyi uydurma; emin değilsen YÖK Atlas'a bakmasını söyle.
|
- Bilmediğin güncel veriyi uydurma; emin değilsen YÖK Atlas'a bakmasını söyle.
|
||||||
- Taban sıralamalarının her yıl değiştiğini gerektiğinde hatırlat.
|
- Taban sıralamalarının her yıl değiştiğini gerektiğinde hatırlat.
|
||||||
- Cevapları kısa ve öz tut (genelde 3-6 cümle); istenirse detaylandır.
|
- Cevapları kısa ve öz tut (genelde 3-6 cümle); istenirse detaylandır.
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { turkishSlugify } from "./slug";
|
|||||||
import type { PuanTuruKey } from "@/types/yokatlas";
|
import type { PuanTuruKey } from "@/types/yokatlas";
|
||||||
import type { Dilim } from "./rapor-havuzu";
|
import type { Dilim } from "./rapor-havuzu";
|
||||||
import type { RaporSonuc } from "@/features/rapor/types/rapor";
|
import type { RaporSonuc } from "@/features/rapor/types/rapor";
|
||||||
|
import { dilimdenRisk, riskHesapla, riskNotuMetni } from "./risk";
|
||||||
|
|
||||||
/** Sihirbaz kategorisi seçilmemiş kullanıcı için kova×tür başına fallback satır. */
|
/** Sihirbaz kategorisi seçilmemiş kullanıcı için kova×tür başına fallback satır. */
|
||||||
export const GENEL_KATEGORI = "genel";
|
export const GENEL_KATEGORI = "genel";
|
||||||
@@ -76,13 +77,20 @@ export async function tadimlikSec(
|
|||||||
),
|
),
|
||||||
});
|
});
|
||||||
if (satir) {
|
if (satir) {
|
||||||
|
const program = satir.program as RaporSonuc["programlar"][string];
|
||||||
return {
|
return {
|
||||||
programId: satir.programId,
|
programId: satir.programId,
|
||||||
dilim: satir.dilim,
|
dilim: satir.dilim,
|
||||||
gerekce: satir.gerekce,
|
gerekce: satir.gerekce,
|
||||||
riskNotu: satir.riskNotu,
|
// DB'deki riskNotu batch'te LLM'in temsili sıraya göre yazdığı
|
||||||
|
// cümledir; servis EDİLMEZ. Not, rozetle (tadimlik-satiri.tsx) aynı
|
||||||
|
// formülden adayın gerçek sırasına göre okuma anında üretilir — metin
|
||||||
|
// ile rozet çelişemez, olasılık dili sızamaz.
|
||||||
|
riskNotu: riskNotuMetni(
|
||||||
|
riskHesapla(program.efektifSira, sira) ?? dilimdenRisk(satir.dilim),
|
||||||
|
),
|
||||||
trendOzeti: satir.trendOzeti,
|
trendOzeti: satir.trendOzeti,
|
||||||
program: satir.program as RaporSonuc["programlar"][string],
|
program,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user