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:
bilalgursen
2026-09-21 04:48:42 +03:00
parent 16c450827b
commit cae2aaab4d
3 changed files with 18 additions and 8 deletions

View File

@@ -8,6 +8,7 @@ import { turkishSlugify } from "./slug";
import type { PuanTuruKey } from "@/types/yokatlas";
import type { Dilim } from "./rapor-havuzu";
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. */
export const GENEL_KATEGORI = "genel";
@@ -76,13 +77,20 @@ export async function tadimlikSec(
),
});
if (satir) {
const program = satir.program as RaporSonuc["programlar"][string];
return {
programId: satir.programId,
dilim: satir.dilim,
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,
program: satir.program as RaporSonuc["programlar"][string],
program,
};
}
}