İçeriğe geç

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 dakikalık okuma
Orta

Lab #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 **1.25civarı.100sorgu×cacheyok=1.25** civarı. 100 sorgu × cache yok = 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ın
karşılıklı edim yükümlülüklerinin çerçevesini belirlemektir. Bu madde, Türk
Borçlar Kanunu'nun 27. maddesi ile bağlantılı olarak yorumlanır. İlgili
maddelerle birlikte değerlendirildiğinde, akdin geçerliliği için tarafların
fiil ehliyetine sahip olması, sözleşmenin objektif unsurlarının belirli veya
belirlenebilir 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 iradi
zekası sınırlandırılmış olması durumlarıdır. Pratikte bu unsurlardan birinin
eksikliğ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 genai
import 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 yarat
start = 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() - start
print(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 genai
import 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 çıkar
QUESTIONS = QUESTIONS[:100]
 
# Cache'e bağlı modeli kullan
model = genai.GenerativeModel.from_cached_content(cache)
 
total_cached_tokens = 0
total_input_tokens = 0
total_output_tokens = 0
total_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/M
cost_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.25
total_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 extrapolate
import 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ğız
sample_latency = 0.0
sample_input = 0
sample_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 extrapolate
avg_input = sample_input / 5
avg_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#

MetrikCache AÇIKCache YOKFark
Cost (100 sorgu)~$25~$1004× ucuz
Latency avg2.09s~15-30s10-15× hızlı
First-token latency~3s (cache create)~15s/sorgu
Storage cost$0.25/saat$0TTL 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...

İlgili İçerikler