Gemini Lab: 1M Token Doküman + 100 Soru
Gemini 2.5 Pro'nun 1M context'inde gerçek bir kullanım: kalın bir teknik dokümana 100 farklı soru. Caching açık vs kapalı maliyet ve latency karşılaştırması.
Şükrü Yusuf KAYA
18 min read
IntermediateLab #4: Gemini 1M Context + Caching
Senaryo: Türk bir hukuk firması için kanun metinlerinde Q&A. Hukuk metinleri 800K-1M token aralığında, sorular spesifik.
Hedef: 100 sorgu yap, caching ON vs OFF kıyasla.
Bütçe Uyarısı
Bu lab maliyetli olabilir — Gemini Pro 1M context sorgusu cache olmadan **125. Cache ile $15-20'ye iniyor. Dikkat et.
Adım 1 — Mock Bir 800K Token Doküman Üret#
python
def make_huge_legal_doc(): """Türk Borçlar Kanunu + Ticari Kanun + İş Kanunu kombinasyonu (~800K token).""" legal_template = """MADDE {num}. Bu maddenin amacı, sözleşmenin akdedildiği tarihte taraflarınkarşılıklı edim yükümlülüklerinin çerçevesini belirlemektir. Bu madde, TürkBorçlar Kanunu'nun 27. maddesi ile bağlantılı olarak yorumlanır. İlgilimaddelerle birlikte değerlendirildiğinde, akdin geçerliliği için taraflarınfiil ehliyetine sahip olması, sözleşmenin objektif unsurlarının belirli veyabelirlenebilir olması ve kanunda öngörülen şekil şartlarına uyulması gerekir.İstisnaları: a) Akdin imkansız bir edim içermesi, b) Akdin Türk kamu düzenine,genel ahlaka veya kişilik haklarına aykırı olması, c) Tarafların iradizekası sınırlandırılmış olması durumlarıdır. Pratikte bu unsurlardan birinineksikliği akdi başlangıçtan itibaren batıl kılar... """ return "\n\n".join([legal_template.format(num=i) for i in range(1, 5000)])800K token civarı sahte hukuk metni
Adım 2 — Cache'i Yarat#
python
import google.generativeai as genaiimport time genai.configure(api_key=os.environ["GOOGLE_API_KEY"]) LEGAL_DOC = make_huge_legal_doc()print(f"Doküman: {len(LEGAL_DOC):,} karakter (~{len(LEGAL_DOC)//4:,} token)") # Cache yaratstart = time.perf_counter()cache = genai.caching.CachedContent.create( model="gemini-2.5-pro", contents=[{"role": "user", "parts": [{"text": LEGAL_DOC}]}], system_instruction=( "Sen bir Türk hukuk uzmanısın. Verilen kanun metinlerini referans alarak " "sorulara madde numaralarıyla birlikte cevap ver." ), ttl="3600s", # 1 saat display_name="legal-corpus-2026-01-15",)create_time = time.perf_counter() - startprint(f"Cache yaratıldı: {cache.name} ({create_time:.1f}sn)")Cache create — bir kere yapılır
Adım 3 — Caching ON: 100 Sorgu#
python
import google.generativeai as genaiimport time QUESTIONS = [ "Sözleşmenin geçersizlik nedenleri nelerdir?", "Akdin objektif unsuru ne anlama gelir?", "Fiil ehliyeti ne demek?", "Madde 27 hangi konuyu düzenler?", "Hangi sözleşmeler kanunen geçersizdir?", # ... 95 daha (kısaltılmış)] * 20 # 100'e çıkarQUESTIONS = QUESTIONS[:100] # Cache'e bağlı modeli kullanmodel = genai.GenerativeModel.from_cached_content(cache) total_cached_tokens = 0total_input_tokens = 0total_output_tokens = 0total_latency = 0.0 for i, q in enumerate(QUESTIONS, 1): start = time.perf_counter() response = model.generate_content(q) latency = time.perf_counter() - start total_latency += latency usage = response.usage_metadata total_cached_tokens += usage.cached_content_token_count total_input_tokens += usage.prompt_token_count - usage.cached_content_token_count total_output_tokens += usage.candidates_token_count if i <= 5 or i % 20 == 0: print(f"{i:>3} {latency:>5.2f}s | cached={usage.cached_content_token_count:>7} input={usage.prompt_token_count - usage.cached_content_token_count:>4}") # Maliyet (Gemini 2.5 Pro): input $1.25/M, cached $0.31/M, output $10/Mcost_cached = ( total_cached_tokens / 1e6 * 0.31 + total_input_tokens / 1e6 * 1.25 + total_output_tokens / 1e6 * 10.0) # Storage (1 saat tuttuk)storage_cost = 800_000 / 1e6 * 0.31 * 1 # ~$0.25total_cost = cost_cached + storage_cost print(f"\n═══ Cache AÇIK SONUÇ ═══")print(f"Toplam cached: {total_cached_tokens:>12,}")print(f"Toplam fresh: {total_input_tokens:>12,}")print(f"Toplam output: {total_output_tokens:>12,}")print(f"Toplam latency: {total_latency:>9.2f}sn (avg {total_latency/100:.2f}sn/sorgu)")print(f"Read cost: ${cost_cached:.4f}")print(f"Storage cost: ${storage_cost:.4f}")print(f"Toplam: ${total_cost:.4f} | {total_cost * 33.5:.2f} TL")Cache açık 100 sorgu — latency + cost
Adım 4 — Cache OFF Karşılaştırma#
Yüksek Maliyet
DİKKAT: Aşağıdaki kodu çalıştırırsan 100 × 800K = 80M token full price geçirir — yaklaşık $100+ harcama. Sadece ufak bir N (örn. 5) ile test et, gerisini hesapla.
python
# CACHE YOK senaryosu — referans amaçlı 5 sorgu, gerisi extrapolateimport google.generativeai as genai model_no_cache = genai.GenerativeModel( model_name="gemini-2.5-pro", system_instruction=( "Sen bir Türk hukuk uzmanısın. Verilen kanun metinlerini referans al." ),) # Sadece 5 sorgu — diğerlerini hesaplayacağızsample_latency = 0.0sample_input = 0sample_output = 0 for q in QUESTIONS[:5]: start = time.perf_counter() response = model_no_cache.generate_content(LEGAL_DOC + "\n\nSORU: " + q) latency = time.perf_counter() - start sample_latency += latency u = response.usage_metadata sample_input += u.prompt_token_count sample_output += u.candidates_token_count # 100'e extrapolateavg_input = sample_input / 5avg_output = sample_output / 5 total_cost_no_cache = ( avg_input * 100 / 1e6 * 1.25 + avg_output * 100 / 1e6 * 10.0) print(f"Cache YOK (extrapolated to 100):")print(f" Avg input/sorgu: {avg_input:>10,.0f}")print(f" Avg output/sorgu: {avg_output:>10,.0f}")print(f" Avg latency: {sample_latency/5:.2f}sn (cache açıkta 2.09sn)")print(f" Toplam (100): ${total_cost_no_cache:.2f} | {total_cost_no_cache * 33.5:.2f} TL")Cache YOK — sadece 5 sample, gerisi extrapolate
Beklenen Karşılaştırma#
| Metrik | Cache AÇIK | Cache YOK | Fark |
|---|---|---|---|
| Cost (100 sorgu) | ~$25 | ~$100 | 4× ucuz |
| Latency avg | 2.09s | ~15-30s | 10-15× hızlı |
| First-token latency | ~3s (cache create) | ~15s/sorgu | — |
| Storage cost | $0.25/saat | $0 | TTL kontrolü |
Long Context'in Vazgeçilmezi
Gemini 1M context'inde caching olmadan yaşanamaz. 4× ucuz, 10× hızlı. Bu yüzden Gemini'nin tüm uzun context tutorialllarında cache opening default.
Cache'i Temizle#
Lab bittikten sonra cache'i temizle ki storage faturası birikmesin:
python
cache.delete()print(f"Cache silindi: {cache.name}")Manuel cleanup
✓ Pekiştir#
Bir Sonraki Derste#
OpenRouter ile çoklu provider'ı tek API'den nasıl yöneteceğimizi göreceğiz. Vendor lock-in'den kurtulmak için kritik bir araç.
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