Skip to content

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
Intermediate

Lab #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 metin
def 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 bilgi
NEEDLE = "Şükrü Yusuf KAYA'nın gizli kahve tarifi Trabzon'da saklanmaktadır."
 
# 3) Soru: needle hakkında
QUESTION = "Şü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 # placeholder
NEEDLE = "Şü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]}")
 
# Özet
print(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:
ModelNIAH @ 100KNIAH @ 200KNIAH @ 1M
Claude Sonnet 4.6%98%95%88 (1M)
GPT-4o%95%90n/a (128K max)
Gemini 2.5 Pro%96%94%90
Llama 3.1 70B%85%75n/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