Yerel haberde yapay zeka iki yalanla satılır. Biri “robot gazete, editör gereksiz.” Öbürü “yapay zeka kullanırsanız uydurma haber kaçınılmaz.” İkisi de tembel. Yeniden İlkhaber’de hedef ikisi de değildi. Kaynak dağınıktı, editör kaynak kovalıyordu, okuyan tek adres bulamıyordu. Bir hat kurduk. Son kapı insan. Canlı site: yndilkhaber.com.
Kaynak akışı, sadeleştirme, özet ve kategori hatta duruyor. Bu yazı kapı üzerine: haber hangi durumda, modele ne yasak, kaynak yokken ne oluyor. Üretimde bozulan yer burası. Model seçimi değil.
Doğrudan yayın yok
Modelin ürettiği metin yayınlanmaz; taslak olur. Editör kaynakla yan yana görür, düzeltir veya reddeder. Reddedilen satır “öğrensin diye tekrar basılmaz”; kayıtta kalır, vitrine çıkmaz. Bu kuralı ürün cümlesinde tutmazsanız bir gece birisi “kuyruğu boşalt” diye onay adımını atlar. Atlanınca çıkan haber sizin adınıza çıkar.
type ArticleStatus =
| "ingested"
| "draft"
| "needs_review"
| "published"
| "rejected";
function canPublish(role: Role, status: ArticleStatus) {
return role === "editor" || role === "admin"
? status === "needs_review" || status === "draft"
: false;
}
async function publish(env: Env, id: string, role: Role) {
const row = await env.DB.prepare(
"SELECT status, source_url FROM articles WHERE id = ?"
).bind(id).first();
if (!row) throw new Error("haber yok");
if (!row.source_url) throw new Error("kaynak URL yok, yayın yok");
if (!canPublish(role, row.status)) throw new Error("yetki veya durum");
await env.DB.prepare(
"UPDATE articles SET status = 'published', published_at = ? WHERE id = ?"
).bind(new Date().toISOString(), id).run();
}
API’ye gizli bir force parametresi koymayın. Koymuşsanız kayıtta görünsün; “sistem onayladı” diye yutturmayın.
Modele ne denir, ne denmez
İyi prompt “iyi gazeteci ol” değildir. İyi prompt yasaktır: kaynak metinde yoksa tarih uydurma, alıntıyı kişiden çıkarma, “belediye açıkladı” diye bağlama. Çıktı şeması sıkı durur: başlık, özet, kategori önerisi, kaynak adresi, “bilmiyorum” alanı. Şema gevşekse model doldurur. Doldurduğu yer uydurmadır.
const schema = {
type: "object",
additionalProperties: false,
required: ["headline", "summary", "category", "source_url", "unsure"],
properties: {
headline: { type: "string", maxLength: 110 },
summary: { type: "string", maxLength: 800 },
category: { type: "string" },
source_url: { type: "string", format: "uri" },
unsure: { type: "boolean" },
},
};
Model emin değilse taslak incelemede kalır, vitrine düşmez. “Eminim” deyip kaynakta olmayan bir rakam yazarsa editör yakalar; yakalayamazsa sizin hatanızdır, modelin karakteri değil. Tool calling burada şart değil. Özet ve sınıflandırma şemalı çıktı ile biter. Araca “web’de ara, eksik doldur” derseniz uydurma kapısı açılır. İlkhaber’de kaynak zaten geldi; modelin işi aramak değil, verilen metni kısaltmak ve etiketlemek.
Kaynak yoksa üretim yok
Kaynak akışı kırık, sayfa 403, metin üç cümle. Model yine “haber” üretir, çünkü dil modeli boşluğu doldurur. Kural şu: ham metin eşiğin altındaysa taslak bile yok. Editöre “kaynak alınamadı” düşer. Telif aynı kapı. Kaynağın tamamını kopyalayıp kendi domain’inizde yayınlamak gazetecilik değil, kopya. Özet, link ve mümkünse kısa alıntı. Tam metin kendi muhabirinizde veya izinli anlaşmada.
Kaynak adresini gizlemeyin. Okuyan nereden geldiğini görsün. Model “şu sitede şöyle yazıyor” diyorsa o adres taslak kartında açık durur. Editör tıklar, bakar, yayımlar. Bakmadan yayımlamak otomasyonu gazeteye çevirmez; sizi yayımcı yapar.
Önbellekle kırılan haber
Liste sayfası kenarda önbelleğe alınır; sabah pikinde asıl sunucuyu korur. Onaylanan haberin listede görünmesi için o önbelleğin düşmesi gerekir. “Yayınlandı” SQL’i yetmez. Adres veya etiket yenilenmeli. Aksi halde editör kendi önizlemesinde görür, okuyan on dakika eski listeyi görür, “sistem yavaş” der. Yavaş değil; önbellek eski.
await env.DB.prepare("UPDATE articles SET status = 'published' ...").run();
await revalidatePath("/haber");
await revalidatePath("/haber/" + slug);
Haber detayı her istekte taze de olabilir, kısa ömürlü de. Kırılma haberi ile haftalık köşe yazısı aynı ömür olmaz. Hepsini dinamik yapmak Türkiye kullanıcısına gereksiz gecikme. Hepsini 24 saat tutmak editörü delirtir. Ayırın.
Yerel haberi “tamamen otomatik” diye satmıyoruz. Model özetler, kategori önerir, hız kazandırır. Uydurursa sorumluluk yayındadır. İnsan onayı maliyet; onu kesince maliyet mahkemeye veya düzeltmeye kayar. Bandırma çevresinde okuyan tek adreste güncel haber istiyorsa bu düzen durur. Robot gazete isteyen başkasına gitsin.
Aynı onay kapısını eğitim tarafında Derslik ile kuruyoruz. Haber odası daha katı: yanlış özet, yanlış tarih. Haber ve içerik sitesi veya iletişim.