Lab: Needle-in-Haystack — Bilgi Pozisyonu Testi
100K tokenlık context'te tek bir 'needle' (kritik bilgi) sakla, farklı pozisyonlarda accuracy testi yap. Lost-in-the-middle fenomenini kendi gözlerinle göreceksin.
Şükrü Yusuf KAYA
17 min read
IntermediateLab #7: Needle-in-Haystack
Bu lab, long-context LLM'in pozisyona göre accuracy'sini sistematik ölçer. Endüstride bu test "needle-in-haystack" olarak biliniyor.
Senaryo: 100K tokenlık random metin içinde 1 cümle gizle. Sorguda o cümleyi sor. Pozisyonu değiştir, accuracy'yi ölç.
Maliyet: ~$2-3 (Anthropic ile, cache açık).
Adım 1 — Haystack ve Needle#
python
import random # 1) Haystack: 100K tokenlık random metindef make_haystack(target_tokens: int = 100_000): """Wikipedia tarzı random Türkçe paragraflar.""" sentences = [ "Türkiye'nin başkenti Ankara'dır.", "İstanbul Boğazı Asya ve Avrupa kıtalarını birbirine bağlar.", "Türk mutfağı dünyada en zengin mutfaklardan biri olarak kabul edilir.", "Anadolu medeniyetler beşiğidir, tarih boyunca 100'den fazla uygarlığa ev sahipliği yapmıştır.", "Mustafa Kemal Atatürk Türkiye Cumhuriyeti'ni 29 Ekim 1923'te kurmuştur.", # ... ek 50 cümle ] * 200 random.shuffle(sentences) text = " ".join(sentences) # Hedef token sayısına ulaşana kadar uzat while len(text) // 3 < target_tokens: # ~3 char/token TR için text += " " + random.choice(sentences) return text # 2) Needle: hatırlanması gereken benzersiz bilgiNEEDLE = "Şükrü Yusuf KAYA'nın gizli kahve tarifi Trabzon'da saklanmaktadır." # 3) Soru: needle hakkındaQUESTION = "Şükrü Yusuf KAYA'nın gizli kahve tarifi nerede saklanmaktadır?"EXPECTED = "Trabzon"Haystack + needle hazırlığı
Adım 2 — Pozisyon Test Akışı#
python
import anthropic client = anthropic.Anthropic() def insert_needle(haystack: str, needle: str, position_pct: float) -> str: """Needle'ı haystack'in belirli pozisyonuna ekle (0=başta, 1=sonda).""" insert_at = int(len(haystack) * position_pct) return haystack[:insert_at] + " " + needle + " " + haystack[insert_at:] # 100K haystack hazırla (gerçek senaryoda make_haystack(100_000))HAYSTACK = "..." * 30_000 # placeholderNEEDLE = "Şükrü Yusuf KAYA'nın gizli kahve tarifi Trabzon'da saklanmaktadır." # Test pozisyonları (% olarak)POSITIONS = [0.0, 0.1, 0.25, 0.50, 0.75, 0.90, 1.0] results = {}for pct in POSITIONS: haystack_with_needle = insert_needle(HAYSTACK, NEEDLE, pct) resp = client.messages.create( model="claude-sonnet-4-6", max_tokens=100, system=[ { "type": "text", "text": ( "Aşağıdaki uzun metin içinde özel bir bilgi gizlenmiş. " "Soruyu cevaplamak için metni dikkatle ara.\n\n" + haystack_with_needle ), # Not: needle pozisyonu değiştiği için her istek cache miss olur # Caching bu lab için açmıyoruz (gerçek pozisyon testi için) } ], messages=[{"role": "user", "content": "Şükrü Yusuf KAYA'nın gizli kahve tarifi nerede saklanmaktadır?"}], ) answer = resp.content[0].text.lower() found = "trabzon" in answer results[pct] = found print(f"Pozisyon {pct*100:>5.1f}% → {'✓ BULDU' if found else '✗ ATLADI'}: {answer[:80]}") # Özetprint(f"\n═══ ÖZET ═══")for pct, found in results.items(): bar = "█" * (10 if found else 0) print(f" {pct*100:>5.1f}% {bar:<10} {'✓' if found else '✗'}")Needle'ı farklı pozisyonlara koy, accuracy'yi ölç (cache açık)
Beklenen Sonuçlar#
Modern model'lerde U-pattern hâlâ var ama daha az ciddi:
- 0-25%: %95+ buluyor
- 40-60%: %80-90 buluyor (en zayıf nokta)
- 75-100%: %95+ buluyor
Bu rakamlar Claude Sonnet 4.6 için. GPT-4o ve Gemini'de benzer; eski modeller (GPT-3.5) çok daha kötü.
Statistical Significance
Lab notları: Her run %5-10 varyasyon normal. Aynı pozisyonu 5 kez çalıştır, ortalamasını al. Production benchmark'larda her pozisyon için 100+ run kullanılır.
Pratik Çıkarımlar#
1. RAG'da Sıralamayı Düzelt#
Eğer 10 doc retrieve ettin, score'a göre sıraladın:
Pozisyon: [En alakalı] [2.] [3.] [4.] [5.] [6.] [7.] [8.] [9.] [En az alakalı]
Lost-in-middle'a göre re-arrange:
[En alakalı] [3.] [5.] [7.] [9.] [10.] [8.] [6.] [4.] [2.]
En alakalı 2'si başta ve sonda. Orta sıralar daha az alakalı (zaten kaybolabilir).
2. Kritik Bilgiyi Tekrar Et#
Context başında: "Önemli: Sadece Türkçe cevap ver." ... [100K token] ... Context sonunda: "Hatırlat: cevap Türkçe olmalı."
Çift tekrar = unutma riski %50'den %5'e düşer.
3. Long Context Modeli Seç#
Eğer use case'in 100K+ context istiyorsa, needle-in-haystack benchmark'ına bak:
| Model | NIAH @ 100K | NIAH @ 200K | NIAH @ 1M |
|---|---|---|---|
| Claude Sonnet 4.6 | %98 | %95 | %88 (1M) |
| GPT-4o | %95 | %90 | n/a (128K max) |
| Gemini 2.5 Pro | %96 | %94 | %90 |
| Llama 3.1 70B | %85 | %75 | n/a (128K max) |
Bu sayılar Anthropic ve Google'ın benchmark sayfalarından (Mart 2026). Her release'de değişir; güncel için provider docs.
✓ Pekiştir#
Bir Sonraki Derste#
Context compression — context'i küçültme teknikleri: summarization, extraction, semantic deduplication.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
Related Content
1. Temeller — Context Penceresi Ekonomisi
Bu Eğitim Hakkında ve Prompt Caching Neden Önemli?
Start Learning1. Temeller — Context Penceresi Ekonomisi
Token Ekonomisi 101: Input vs Output Cost Asimetrisi
Start Learning1. Temeller — Context Penceresi Ekonomisi