Özetleme, Yeniden Yazma ve Çeviri: Uzunluk Kontrolü, Ton, Terim Sözlüğü ve TR/EN Lokalizasyon
Metin üreten görevlerde uzunluk, zorunlu bilgi, yeni sayı, placeholder, HTML tag ve terim sözlüğü kodla kontrol edilir; model karakter sayamaz, fiyat ve tarih biçimi CultureInfo işidir. Bookstore kampanyalarında v1 beşte sıfır geçti, açık kurallar ve kodun ölçtüğü bir düzeltme döngüsüyle 3/5'e çıktı; kitap açıklaması çevirisinde ayrıntılı kurallar 0/6 kalırken kısa talimat ve tek örnek 4/6 verdi.
Sürüm notu: Bu yazıdaki kodlar .NET 10 ile derlenip denenmiştir; Microsoft.Extensions.AI 11.0.0, OllamaSharp 5.5.2 ve xUnit v3 4.0.3 kullanılmıştır. Model çıktıları yerelde Ollama 0.34.4 üzerinde çalışan küçük bir açık model olan gemma3:4b'den (4,3 milyar parametre, Q4_K_M) alınmıştır; bulut sağlayıcıyla koşulmamıştır.
Önce Tahmin Et
Sitedeki serilerin ortak örnek uygulaması Bookstore'da (bir online kitapçı) pazarlama ekibi kampanyaları uzun bir metinle yazıyor; mobil uygulama ise en fazla 120 karakterlik push bildirimi gösteriyor. Prompt'a "120 karakterin altına kısalt" yazdın ve beş kampanya metni verdin. Kaç tanesi sınırın altında kalır, kaç tanesinde indirim oranı, kampanya kodu ve son gün eksiksiz durur?
İkinci soru çeviriyle ilgili: kitap açıklamaları HTML, içinde {price} gibi placeholder'lar ve "Kurumsal Sipariş" gibi ürün terimleri var. Model "Translate to English" talimatıyla HTML'i korur mu? Terimi sözlükteki gibi mi çevirir, kendi bulduğu bir karşılıkla mı?
Sınıflandırmada doğru cevap tekti ve kontrol etmek kolaydı. Metin üreten görevlerde tek doğru yok; ama bu, doğruluğun ölçülemeyeceği anlamına gelmiyor. Bu yazıda her görev için önce "kodla kontrol edilebilen ne?" sorusunu soracağız.
Metin Üreten Görevde Neyi Kontrol Edebilirsin?
Özet, kısaltma ve çeviri görevlerinde kontrol edilebilir kuralların çoğu deterministik: uzunluk, kaynakta geçen sabit bilgilerin (kod, oran, tarih) çıktıda kalması, kaynakta olmayan bir sayının çıktıda görünmemesi, placeholder ve HTML tag'lerinin aynı kalması, terim sözlüğüne uyum. Bunlar regex ve string karşılaştırmasıyla yazılır, her koşuda ve her commit'te çalışabilir. Ton, akıcılık ve anlamın kaynağa sadık kalması ise kural yazılarak tam kontrol edilemez; onlar için LLM-as-judge ve insan değerlendirmesi gerekiyor, serinin son yazısında ele alacağız. Bu yazıdaki kontrollerin çoğu şu küçük yardımcıya dayanıyor:
// "1.240,50" ile "1,240.50" aynı sayıdır: yalnız rakamları karşılaştır
public static HashSet<string> Numbers(string text) =>
[.. NumberPattern().Matches(text).Select(m => new string([.. m.Value.Where(char.IsDigit)]))];
// Çıktıda olup kaynakta hiç geçmeyen sayılar
public static List<string> NewNumbers(string source, string output) =>
[.. Numbers(output).Except(Numbers(source)).Order()];
Sayıları yalnız rakamlarıyla karşılaştırmak, biçim farkını (1.240,50 ve 1,240.50) yeni bilgi saymamayı sağlıyor. Modelin özete eklediği bir sayı ise hemen görünüyor; özet çıkarma ve kısaltmada en tehlikeli hata, kaynağa bilgi eklemek.
Kampanya Metnini Kısaltmak
v1 tek cümle: "kampanya metnini push bildirimi için 120 karakterin altına kısalt, Türkçe kalsın". Kontrol fonksiyonu uzunluğa, pazarlamanın işaretlediği zorunlu bilgilere, yeni sayılara, ünlem işaretine ve emoji'ye bakıyor:
dotnet run --project src/Bookstore.Prompts.Lab -- campaign v1
campaign-push v1 | gemma3:4b | 5 cases
FAIL cp-01 attempts=1 length=141 141 characters, limit is 120; exclamation mark; emoji; missing "30 Kasım"; new numbers: 120
FAIL cp-02 attempts=1 length=978 978 characters, limit is 120; exclamation mark; new numbers: 1, 120, 2, 3
FAIL cp-03 attempts=1 length=1471 1471 characters, limit is 120; exclamation mark; emoji; missing "31 Aralık"; new numbers: 1, 120, 3, 3112
FAIL cp-04 attempts=1 length=108 exclamation mark; emoji
FAIL cp-05 attempts=1 length=138 138 characters, limit is 120; exclamation mark; emoji; missing "23 Kasım"; new numbers: 120
0/5 passed
Beşte sıfır. cp-02 ve cp-03'te model bildirim yerine "Option 1, Option 2, Option 3" diye alternatifler, İngilizce çeviriler ve bir öneri paragrafı yazmış; çıktı 978 ve 1471 karakter. cp-01 ve cp-05'te cevap "İşte 120 karakteri aşmayan bir versiyon:" diye başlıyor; "yeni sayı: 120" uyarısı bu cümleden geliyor. cp-03'te son gün "31 Aralık" yerine "31.12" olmuş. Kısaltmak, bilgi atmak demek; hangi bilginin atılamayacağı prompt'ta yazmıyorsa model önce son günü atıyor.
v2 bildirimin ne olduğunu tanımlıyor ve sınırı sayıyla veriyor. Hedefi 80–110 karakter olarak verip mutlak sınırı ayrıca yazmak, modele pay bırakıyor; model uzunluğu karakter karakter saymıyor, token üzerinden tahmin ediyor:
System: $"""
You write Turkish push notifications for Bookstore campaigns.
## Rules
- One sentence, 80 to 110 characters including spaces. Never more than {MaxLength}.
- Keep the discount, the campaign code and the last day exactly as written.
- No emoji, no exclamation marks, no information that is not in the campaign text.
- Output only the notification text.
""",
dotnet run --project src/Bookstore.Prompts.Lab -- campaign v2
FAIL cp-01 attempts=1 length=96 exclamation mark
FAIL cp-02 attempts=1 length=118 exclamation mark
FAIL cp-03 attempts=1 length=160 160 characters, limit is 120
FAIL cp-04 attempts=1 length=94 exclamation mark
PASS cp-05 attempts=1 length=107
1/5 passed
Zorunlu bilgilerin hepsi yerinde, yeni sayı yok, dört bildirim sınırın altında. Ama model "ünlem işareti yok" kuralını dört kez çiğnemiş ve cp-03'ü hiç kısaltmadan, kampanya metninin ilk iki cümlesi olarak bırakmış (160 karakter).
Uzunluğu Kod Ölçer: Düzeltme Döngüsü
Model karakter sayamıyor, kod sayabiliyor. Bu iş bölümünü bir döngüye çeviriyoruz: model yazıyor, kod kontrol ediyor, başarısız kontroller somut bir geri bildirimle aynı konuşmaya ekleniyor ve model tekrar yazıyor. En fazla üç deneme:
// Kod ölçer, model yeniden yazar: başarısız kontroller geri bildirim olarak döner
public sealed class ConstrainedRewriter(IChatClient client, ChatOptions options)
{
public async Task<RewriteResult> RewriteAsync(
PromptVersion prompt,
string input,
Func<string, List<string>> check,
int maxAttempts = 3,
CancellationToken cancellationToken = default)
{
List<ChatMessage> messages = prompt.Render(input);
string text = "";
List<string> issues = [];
for (int attempt = 1; attempt <= maxAttempts; attempt++)
{
ChatResponse response = await client.GetResponseAsync(messages, options, cancellationToken);
text = response.Text.Trim();
issues = check(text);
if (issues.Count == 0)
{
return new RewriteResult(text, attempt, issues);
}
messages.Add(new ChatMessage(ChatRole.Assistant, text));
messages.Add(new ChatMessage(ChatRole.User,
$"Your text has {text.Length} characters. Fix these problems and output only the new text: {string.Join("; ", issues)}"));
}
return new RewriteResult(text, maxAttempts, issues);
}
}
dotnet run --project src/Bookstore.Prompts.Lab -- campaign repair
campaign-push repair | gemma3:4b | 5 cases
FAIL cp-01 attempts=3 length=96 exclamation mark
Tüm klasik romanlarda %25 indirim! KITAP25 koduyla alışveriş yapın, 30 Kasım'a kadar kaçırmayın.
PASS cp-02 attempts=3 length=118
Öğretmenler Günü'ne özel: okul ve kütüphaneler için Kurumsal Sipariş ile %5 indirim, kod: OGRETMEN5, 24 Kasım'a kadar.
FAIL cp-03 attempts=3 length=134 134 characters, limit is 120
Hediye Paketi seçen herkese paket ücretsiz, üstelik 2 kitap alana üçüncü kitapta %50 indirim. HEDIYE50 kodu 31 Aralık'a kadar geçerli.
PASS cp-04 attempts=2 length=94
Dune serisinin yeni ciltli baskısı için DUNE15 koduyla %15 indirim kazanın, 12 Aralık'a kadar.
PASS cp-05 attempts=1 length=107
Bu hafta sonu tüm Jane Austen kitaplarında %20 indirim. AUSTEN20 kodu 23 Kasım Pazar 23.59'a kadar geçerli.
3/5 passed
Döngü 1/5'i 3/5'e çıkardı, ama iki ders veriyor. Birincisi, cp-01'de model üç denemede de ünlemi bırakmadı. "Ünlem kullanma" gibi bir biçim kuralını kod tek satırla uygulayabilir (ünlemi noktaya çevirmek); modelden bunu istemek için üç çağrı harcamak gereksiz. İkincisi, cp-03 160'tan 134'e indi ve orada kaldı: model ilk cümleyi attı, ama kalan metni kısaltmadı. Döngünün bir üst sınırı olmalı ve sınıra ulaşan metin bir insana gitmeli; burada da pazarlamadan biri cp-03'ü elle yazacak. Döngünün her denemesi bir model çağrısı demek; maliyeti deneme sayısıyla birlikte izle.
Özet Kimin İçin?
"Bu raporun özetini çıkar" eksik bir talimat; özetin ne içereceğini okuru belirler. Aynı olay raporu yönetim için etkiyi, nedeni ve aksiyonu sayılarla göstermeli. Müşteriye giden bildirim ise siparişine ne olduğunu ve Bookstore'un ne önerdiğini söylemeli; kaç siparişin etkilendiği, kuponların maliyeti ve hangi job'un hata verdiği müşteriyi ilgilendirmiyor. Bu yüzden iki ayrı prompt yazıyoruz:
public static readonly PromptVersion Customer = new(
Task: "incident-summary",
Version: "customer",
System: """
Write a short Turkish notification to an affected Bookstore customer based on the
incident report. At most 2 sentences and 300 characters. Say what happened to their
order and what Bookstore offers. Do not mention internal details: order counts,
costs, system or team names, root cause. Output only the notification.
""",
BuildUser: report => $"<report>\n{report}\n</report>");
Kontrol fonksiyonları da okura göre farklı. Yönetici özeti tam üç madde olmalı ve kaynakta olmayan sayı içermemeli. Müşteri bildirimi 300 karakteri aşmamalı ve olay başına tanımlanmış iç detay listesini (sipariş sayısı, maliyet, module ve job adları) içermemeli. İki olay raporuyla sonuç:
dotnet run --project src/Bookstore.Prompts.Lab -- summary
FAIL in-01 management expected 3 bullet lines, got 4 lines
Here’s a summary of the bookstore incident report for the management team, in Turkish, using only the provided numbers and bullet points:
- : 2 gün boyunca 318 sipariş gecikmeli ve 41 müşteri siparişini iptal etti.
- : Hata, 14 Kasım'da düzeltildi.
- : Etkilenen müşterilere toplam 15.900 TL değerinde 50 TL indirim kuponu tanımlandı.
PASS in-01 customer
Siparişiniz gecikmeli teslim edildi, üzgünüz. Size 50 TL değerinde bir indirim kuponu tanımladık, lütfen kullanmayı unutmayın!
FAIL in-02 management expected 3 bullet lines, got 4 lines
Here’s a summary of the bookstore incident report for the management team, in Turkish, using only the provided numbers and bullet points:
- : 76 ödeme iki kez çekildi (18.00-19.30 arasında) ve toplam iade tutarı 31.480 TL oldu.
- : Kesinti, 3 Aralık 2026’da ödeme sağlayıcısında meydana geldi.
- : Payments ekibi, çift çekimleri 4 Aralık’ta iade etti ve iadelerin hesaplara yansıması 3 iş günü sürebilir.
PASS in-02 customer
Siparişinizdeki sorun için üzgünüz. Ücretsiz kargo kodu ile yeni bir sipariş verebilirsiniz.
Yönetim için yazılan iki özette de model, prompt'taki "impact, cause, action" başlıklarını yazmaya başlayıp boş bırakmış (- :) ve başa İngilizce bir giriş cümlesi eklemiş. Sayılar doğru, kaynakta olmayan sayı yok; biçim kontrolü hatayı yakaladı. Daha öğretici olan in-02'nin müşteri bildirimi: kontrolden geçti, çünkü kısa, iç detay yok, yeni sayı yok. Ama müşteriye asıl söylenmesi gerekeni, kartından iki kez çekilen paranın 4 Aralık'ta iade edildiğini ve hesaba yansımasının üç iş günü sürebileceğini söylemiyor. Deterministik kontroller "yanlış bir şey söyledi mi?" sorusunu iyi cevaplıyor, "söylemesi gerekeni söyledi mi?" sorusunu cevaplayamıyor. İkincisi için ya zorunlu bilgileri kampanyadaki gibi tek tek işaretlemek ya da LLM-as-judge kullanmak gerekiyor.
Çeviri: Terim Sözlüğü ve Placeholder'lar
Catalog'daki kitap açıklamaları Türkçe yazılıyor ve sitenin İngilizce sürümü için çevriliyor. Altı açıklamalık sette HTML tag'leri, {price}, {stock}, {customerName} gibi placeholder'lar, üç ürün terimi (Kurumsal Sipariş, Hediye Paketi, Okul Listesi) ve çevrilmemesi gereken adlar (Bookstore, kitap adları) var. Kontrol fonksiyonu bunların hepsine, çıktının HTML'le başlayıp başlamadığına ve İngilizce metinde Türkçe harf kalıp kalmadığına bakıyor. v1, "Translate the book description from Turkish to English":
dotnet run --project src/Bookstore.Prompts.Lab -- translate v1
FAIL tr-01 text before the HTML: "Here's the English translation of the..."; HTML tags changed; glossary: "Kurumsal Sipariş" should be "Institutional Order"
FAIL tr-02 text before the HTML: "Here’s the English translation of the..."; HTML tags changed; glossary: "Hediye Paketi" should be "Gift Wrap"
FAIL tr-03 text before the HTML: "Here's the English translation of the..."; HTML tags changed; glossary: "Okul Listesi" should be "School List"
FAIL tr-04 text before the HTML: "Here's the English translation of the..."; placeholders {stock} -> {stock} {stock}; HTML tags changed; "Bookstore" was changed
FAIL tr-05 text before the HTML: "Here's the English translation of the..."; HTML tags changed; glossary: "Kurumsal Sipariş" should be "Institutional Order"; glossary: "Hediye Paketi" should be "Gift Wrap"
FAIL tr-06 text before the HTML: "Here's the translation of the Turkish..."; HTML tags changed
0/6 passed (0%)
Altıda sıfır. Model HTML'i Markdown'a çevirmiş (<b>Dune</b> yerine **Dune**), her cevabın başına bir giriş cümlesi, bazılarının sonuna "Would you like me to translate anything else?" eklemiş. Terimlerde kendi karşılıklarını seçmiş: Kurumsal Sipariş "Corporate Order", Hediye Paketi "Gift Package", Okul Listesi "Wish List" olmuş. Sonuncusu yalnız terim hatası değil, anlam hatası: okul listesi ile istek listesi farklı özellikler. "Bookstore'a özel baskı" da "exclusive to the bookstore" olmuş; mağazanın adı sıradan bir isme dönmüş.
v2'de kuralları ayrıntılı yazdık: yalnız HTML döndür, tag'leri ve placeholder'ları koru, sayı ekleme, sözlüğü kullan ve "Never translate: Bookstore, Dune, Emma..." listesi. Sonuç yine 0/6, ama başka hatalarla: model cevabı kod bloğuna (```html) sardı, tag'lere id, translate ve data-glossary attribute'ları ekledi, iki açıklamayı hiç çevirmeden Türkçe bıraktı ve tr-06'da fiyatları {price} ve {original_price} diye uydurduğu placeholder'larla değiştirdi. Çevrilmeyecek adlar listesi küçük modeli, HTML'i işaretlemesi gereken bir göreve yöneltmiş gibi. Daha fazla kural her zaman daha iyi sonuç vermiyor; bunu ancak ölçünce görüyorsun.
v3 daha kısa: tek paragraf talimat, sözlük satır içinde ve tam olarak istenen çıktının şeklini gösteren tek bir örnek:
// v3: daha az kural, satır içi sözlük ve çıktının tam şeklini gösteren tek örnek
public static PromptVersion V3(Glossary glossary) => new(
Task: "description-translation",
Version: "v3",
System: $$"""
Translate Bookstore catalog descriptions from Turkish to English.
Return the same HTML with only the Turkish text translated: same tags, no new
attributes, no code fences, no notes. Placeholders such as {price} stay as they are.
Book titles and the store name Bookstore stay in English as written.
Glossary: {{string.Join("; ", glossary.Terms.Select(t => $"{t.Key} = {t.Value}"))}}.
Example input:
<p><b>Walden</b>, Thoreau'nun 1854 tarihli kitabı. Fiyat: {price}</p>
Example output:
<p><b>Walden</b>, Thoreau's book from 1854. Price: {price}</p>
""",
BuildUser: description => description);
dotnet run --project src/Bookstore.Prompts.Lab -- translate v3
description-translation v3 | gemma3:4b | 6 cases
PASS tr-01
PASS tr-02
PASS tr-03
PASS tr-04
FAIL tr-05 HTML tags changed
FAIL tr-06 Turkish number format: 1.240,50, 989,90
4/6 passed (67%)
Dört açıklama temiz: tag'ler aynı, placeholder'lar yerinde, terimler sözlükteki gibi, "Bookstore exclusive bound edition" doğru. tr-05'te model <i>Modern Prometheus</i> yerine bozuk bir <i/>Modern Prometheus/) yazmış; tag kontrolü yakaladı.
Tarih ve Para Biçimi Koda Aittir
tr-06'nın hatası lokalizasyonun klasik tuzağı: İngilizce cümlenin içinde "on sale: 1.240,50 TL instead of 989,90 TL". Sayılar doğru, biçim Türkçe; İngilizce okuyan biri 1.240,50'yi bin iki yüz kırk değil, bir virgül iki yüz kırk elli diye okuyabilir. Kontrol, ondalık virgüllü sayıları İngilizce metinde arıyor. Asıl çözüm ise prompt'ta değil, içerikte: fiyatı ve tarihi metne gömmek yerine placeholder olarak bırakmak ve her dil için kodla biçimlendirmek:
// Fiyat ve tarih her dil için kodla biçimlendirilir, metne placeholder olarak girer
public static class LocalizedPrice
{
static readonly CultureInfo Tr = CultureInfo.GetCultureInfo("tr-TR");
static readonly CultureInfo En = CultureInfo.GetCultureInfo("en-US");
public static string Format(decimal amount, string language) => language switch
{
"tr" => string.Create(Tr, $"{amount:N2} TL"),
_ => string.Create(En, $"TRY {amount:N2}"),
};
public static string FormatDate(DateOnly date, string language) => language switch
{
"tr" => date.ToString("d MMMM yyyy", Tr),
_ => date.ToString("MMMM d, yyyy", En),
};
}
İngilizce sürümde para birimi TRY (Türk lirasının uluslararası para birimi kodu) ile yazılıyor: LocalizedPrice.Format(1240.50m, "en") "TRY 1,240.50" döndürüyor; test projesinde iki dil için de testi var. Kampanya açıklaması {originalPrice} ve {campaignPrice} ile yazılırsa model sayıya hiç dokunmuyor; çeviri yalnız dil işi oluyor. Aynı kural tarihler için de geçerli: tr-06'da model "15 Aralık 2026"yı doğru çevirdi ("December 15, 2026"), ama buna güvenmek yerine tarihi de placeholder yapmak daha sağlam.
Bu Sitenin TR/EN Akışından Bir Ders
Okuduğun yazının kendisi de TR'den EN'e giden bir akıştan geçiyor ve oradaki kurallar bu yazıdaki kontrollerle aynı mantıkta. Yazılım terimleri iki dilde de İngilizce kalıyor (bir terim sözlüğü); Türkçe yazıda ilk geçişte verilen parantez içi açıklamalar İngilizce yazıda yok; kod blokları, yorum satırları dışında iki dilde birebir aynı olmalı. Bu son kural bir script'le kontrol ediliyor: iki dosyadaki kod bloklarını yorumları atarak karşılaştırıyor ve tek bir karakter farkında yayını durduruyor. Yani kural bir talimat olarak kalmıyor, tıpkı placeholder kontrolü gibi her yazıda koşan deterministik bir test oluyor. Çeviriyi kim yaparsa yapsın, insan ya da model, korunması gereken parçalar kodla doğrulanıyor.
Üretimde Dikkat
Kontrolleri prompt'la birlikte versiyonla. Kampanyadaki MustKeep listesi pazarlamanın kampanya metniyle birlikte verdiği bir veri; prompt değişince kontroller değişmez, kampanya değişince değişir.
Kodla düzeltilebileni modele düzelttirme. Ünlemi noktaya çevirmek, baştaki "İşte..." cümlesini ya da kod bloğu işaretini atmak deterministik bir son işlem. Ama bunu yaparken orijinal çıktıyı da log'la; temizlenen şeyin sıklığı prompt'un nerede zayıf olduğunu gösteriyor.
Düzeltme döngüsünün tavanı olsun. Üç denemede düzelmeyen metin dördüncüde de düzelmeyebilir; cp-03 134 karakterde kaldı. Tavana ulaşan çıktı otomatik yayına çıkmaz, insana gider.
Müşteriye giden metinde zorunlu bilgiyi açıkça işaretle. Müşteri bildirimi için "iade tarihi" ve "hesaba yansıma süresi" gibi zorunlu bilgiler, olay raporunu yazan ekip tarafından ayrıca işaretlenirse, kontrol "söylemesi gerekeni söyledi mi?" sorusunun bir kısmını da kodla cevaplayabilir.
Sık Düşülen Tuzaklar
Modelden karakter saymasını beklemek. Model token görüyor; "120 karakterin altında" diyen v1 çıktıları 138, 141 ve 1471 karakterdi.
Özette bilgi eklenmesini gözden kaçırmak. Kaynakta olmayan her sayı ve ad bir uyarı olmalı; NewNumbers bu yüzden her kontrolde var.
Daha fazla kuralın daha iyi sonuç vereceğini varsaymak. Çeviride ayrıntılı v2, kısa v1'den farklı ama aynı kötülükte hatalar üretti; kısa talimat ve tek örnekle v3 en iyisi oldu.
Fiyatı ve tarihi çevirtmek. Biçim lokalizasyonu bir dil işi değil, bir CultureInfo işi. Placeholder kullan, biçimi kodla ver.
Kontrolden geçmeyi doğru sanmak. in-02'nin müşteri bildirimi bütün kontrollerden geçti ve asıl bilgiyi vermedi.
Küçük Bir Deneme
★☆☆ CampaignRewrite.Check'ten önce çalışan bir son işlem yaz: ünlemleri noktaya çevirsin ve baştaki "İşte ... :" satırını atsın. v2'yi bu son işlemle tekrar koş; kaç kampanya döngüye hiç girmeden geçiyor?
★★☆ in-02 için müşteri bildiriminin zorunlu bilgilerini (4 Aralık, 3 iş günü) incidents.jsonl'a ekle ve CheckCustomer'ı bu listeyi de kontrol edecek şekilde genişlet. Sonra prompt'u bu bilgileri isteyecek şekilde değiştirip sonucu ölç.
★★★ tr-06'yı {originalPrice} ve {campaignPrice} placeholder'larıyla yeniden yaz, çeviriden sonra placeholder'ları LocalizedPrice ile dolduran küçük bir render adımı ekle ve tr ile en çıktılarını yan yana gösteren bir test yaz.
Sıradaki yazıda metinler uzuyor: kırk sayfalık bir tedarikçi sözleşmesinden iade koşullarını çıkaracağız. Uzun dokümanı prompt'un neresine koyacağımız, cevabı alıntılara dayandırmak, dokümanı bölmek ve sabit kısmı başa koyarak prompt caching'den yararlanmak orada ölçülecek.