Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Sağlayıcıdan Bağımsız LLM Kodu: IChatClient, OpenAI Uyumlu /v1 ve DI
IChatClient soyutlamasıyla aynı kodu Ollama'nın kendi API'si ve OpenAI uyumlu /v1 endpoint'i üzerinden çalıştırıyor, sağlayıcıyı yapılandırmadan ve ortam değişkeniyle değiştiriyoruz. ASP.NET Core minimal API'ye DI ile bağlıyor, API anahtarlarını user secrets ve ortam değişkenleriyle saklıyor, TypeScript'te openai paketiyle aynı fikri kuruyor ve soyutlamanın sınırlarına bakıyoruz.
LLM Maliyeti, Gecikme ve Model Seçimi: Token'dan Faturaya
Token sayısından istek başına ve aylık maliyeti hesaplıyor, gecikmeyi yükleme, girdi işleme ve çıktı üretimi olarak üçe ayırıyoruz. gemma3:4b ile 12b'yi gerçek tokens/s ölçümüyle karşılaştırıyor, Q4_K_M'nin ne demek olduğunu tensor tiplerine bakarak görüyor, Microsoft.Extensions.AI ile cevapları cache'liyor ve yerel ile bulut arasındaki kararı tartışıyoruz.
LLM Halüsinasyonu ve Güvenilirlik: Kaynak Göster, Doğrula, Ölç
gemma3:4b'ye var olmayan bir romanın yazarını sorunca kendinden emin bir ad ve yıl uydurdu. Halüsinasyonun neden olduğuna bakıyor, cevabı structured output ile kaynak göstermeye zorluyor, kaynakları kodla doğruluyor ve on soruluk bir golden set ile üç yaklaşımı sayılarla karşılaştırıyoruz.
LLM ve RAG: Modelin Bilmediği Veriyle Cevap Vermek
gemma3:4b'ye kitapçının iade süresini sorunca kendinden emin bir şekilde 30 gün dedi; doğrusu 21. Politikaları chunk'lara bölüyor, nomic-embed-text ile indeksliyor, en yakın parçaları prompt'a koyuyor ve modele bağlamda olmayanı bilmediğini söyletiyoruz. C#'ta bellekte minimal bir RAG ve sınırları.
LLM'lerde Embedding ve Benzerlik: Metni Anlamına Göre Aramak
Embedding nedir, cosine similarity nasıl hesaplanır? nomic-embed-text ile 768 boyutlu vector'ler üretiyor, C# ve TypeScript'te elle cosine similarity yazıyor, bellekte küçük bir semantic search kurup anahtar kelime aramasıyla karşılaştırıyoruz. Olumsuz cümle tuzağı ve Türkçe sorgularla sınırlar gerçek puanlarla.
LLM Tool Calling (1): Model Fonksiyon Çağırmaz, Çağrı İster
Tool calling'de model hiçbir fonksiyonu çalıştırmaz; bir çağrı isteği üretir, çalıştırmak senin koduna kalır. Ollama'nın /api/chat endpoint'ine qwen3:4b ile ham tools isteği atıyor, sonucu tool rolüyle geri gönderiyor, döngüyü TypeScript'te ve paketsiz C#'ta kuruyoruz.
LLM ile Structured Output: JSON Mode, JSON Schema ve GetResponseAsync<T>
Serbest metni regex ile parse etmenin neden kırıldığını, JSON mode'un neden yetmediğini ve JSON schema'nın biçimi nasıl sabitlediğini görüyoruz. TypeScript'te Zod, C#'ta GetResponseAsync<T> kullanıyor, schema'ya uyan ama yanlış bir cevabı yakalıyor ve iki katmanlı doğrulama kuruyoruz.
LLM için Prompt Yazmak (2): Adım Adım Düşündürmek ve Reasoning Modelleri
Adım adım düşün demek doğru cevabı garanti eder mi? Tuzaklı bir sipariş hesabını gemma3:4b'ye üç biçimde soruyor, qwen3:4b'nin think parametresiyle düşünmeyi cevaptan ayırıyor, C#'ta ReasoningOptions kullanıyor ve düşünmenin token ile süre olarak bedelini ölçüyoruz.
LLM için Prompt Yazmak (1): Açık Talimat, Ayraçlar ve Few-shot
Prompt bir spesifikasyondur: bağlam, görev, girdi, biçim ve kısıt. Kötü ve iyi prompt'u aynı yorum üzerinde token sayılarıyla karşılaştırıyor, ayraçlarla talimatı veriden ayırıyor, few-shot örneklerin bir sınıflandırıcıyı nasıl düzelttiğini ve nasıl yanılttığını gemma3:4b'nin gerçek çıktılarıyla görüyoruz.
LLM Cevabında Streaming: NDJSON, IAsyncEnumerable ve İlk Token Süresi
Streaming cevabı hızlandırmaz, beklemeyi kısaltır. Ollama'nın NDJSON ve OpenAI uyumlu SSE akışlarına curl ile bakıyor, C#'ta GetStreamingResponseAsync ve TypeScript'te async iterator ile cevabı okuyup ilk token süresini ölçüyor, akışı iki SDK'da iptal edip davranış farkını görüyoruz.
LLM'lerde Sampling: Temperature, Top-p, Top-k ve Seed
Aynı soruya neden farklı cevaplar geliyor? logprobs ile modelin aday token'larına bakıp temperature, top-k ve top-p'nin bu dağılımı nasıl değiştirdiğini hesaplıyor, seed'in tekrarlanabilirlik sözünü ve sınırlarını, num_predict ve stop sequence'leri gemma3:4b üzerinde gerçek çıktılarla görüyoruz.
LLM Mesaj Rolleri ve System Prompt: Bookstore Asistanına Kimlik Vermek
system, user ve assistant rolleri ne işe yarar ve Gemma 3'ün chat template'i onları modele nasıl taşır? Bookstore asistanına bir system prompt yazıyor, iyi bir system prompt'un parçalarını görüyor, istemcide uydurulan bir assistant mesajının modeli nasıl kandırdığını ve kullanıcı metnini talimattan ayırmanın prompt injection'a karşı ilk adım olarak ne kadar işe yaradığını gerçek çıktılarla deniyoruz.