Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Sohbet Geçmişini Saklamak: Stateless API, ConversationId, EF Core ve Chat Reducer'lar
Stateless bir provider'da sohbet geçmişini senin kodun tutar: ChatMessage'ları tool call ve tool result content'leriyle birlikte AIJsonUtilities ile JSON'a çevirip EF Core'da kullanıcı ve conversation bazında saklıyoruz. Sahiplik kontrolünü sorguya koyuyor, ConversationId ile stateful provider'ları da destekliyor ve MessageCountingChatReducer ile SummarizingChatReducer'ın gerçek çıktılarını karşılaştırıyoruz.
ASP.NET Core'da LLM Streaming: Minimal API, IAsyncEnumerable ve Server-Sent Events
LLM cevabını tarayıcıya akıtmanın güvenilir yolu .NET 10'un TypedResults.ServerSentEvents'i: delta, thinking, tool, usage, done ve error event'leri, sessiz bekleyişte heartbeat ve modele kadar taşınan CancellationToken. Düz IAsyncEnumerable'ın sınırlarını, kullanıcı sekmeyi kapatınca modelin gerçekten durduğunu ve token'ı vermeyi unutan endpoint'in 1024 token'ı boşa harcadığını gerçek ölçümlerle gösteriyoruz.
ASP.NET Core'a IChatClient Bağlamak: AddChatClient, Keyed Client'lar, Options ve Secret'lar
IChatClient'ı ASP.NET Core'a AddKeyedChatClient ile singleton olarak kaydediyor, "fast" ve "smart" iki model için keyed client, provider ve model seçimi için açılışta doğrulanan options kullanıyoruz. Standard resilience handler'ın 10 sn/30 sn varsayılanlarının LLM çağrısını üç kez baştan ürettirip 500'le bitirdiğini gerçek log'la gösteriyor, timeout ve retry'ı LLM'e göre ayarlıyoruz.
IChatClient Pipeline'ı: ChatClientBuilder, Middleware Sırası ve Kendi DelegatingChatClient'ın
ChatClientBuilder'da ilk eklenen middleware en dışta durur ve sıra davranışı değiştirir: cache function invocation'ın dışındaysa tool hiç çalışmaz, içindeyse her istekte taze veri okur. Bookstore için token bütçesi ve kişisel veri maskeleyen iki DelegatingChatClient yazıyor, streaming override'ını unutmanın sessizce veri sızdırdığını gerçek koşuyla gösteriyoruz.
.NET'te Yapay Zeka Yığını: Microsoft.Extensions.AI, VectorData, Evaluation ve Agent Framework Nerede Durur?
Uygulama Microsoft.Extensions.AI ve bir provider paketi alır, library yalnız Abstractions'a bağlanır; VectorData, DataIngestion, Evaluation ve Agent Framework bu IChatClient katmanının üstünde ya da yanında durur. Paket haritasını çıkarıyor, aichatweb template'ini yerel Ollama ile çalıştırıp katman sınırlarında çıkan üç gerçek hatayı düzeltiyoruz.
LLM API'lerinin Evrimi: Completions'tan Tool Calling, Structured Outputs ve MCP'ye
Metni sürdüren ilk API'den chat biçimine, function calling'den JSON mode ve structured outputs'a, reasoning parametrelerinden Model Context Protocol'e ve agent'lara kadar LLM API'lerinin doğrulanmış tarihlerle evrimi. Her adımın serideki hangi örneğe karşılık geldiğini görüyor ve serinin sonunda sıradaki yapay zeka serilerine köprü kuruyoruz.
2023'ten Bugüne LLM'ler: Open-Weight Modeller, Uzun Context ve Reasoning
GPT-4'ten bugüne LLM dünyasının doğrulanmış tarihlerle özeti: Llama, Mistral, Qwen ve Gemma ile open-weight modellerin yükselişi, context window'un 2.048 token'dan milyon token'a büyümesi, görüntü okuyan modeller ve o1, DeepSeek-R1 ile gelen reasoning modelleri. Open-weight ile açık kaynak farkını ve neden bir model sıralaması vermediğimizi de konuşuyoruz.
Transformer'dan ChatGPT'ye: LLM'lerin Doğuşu (2017–2022)
2017'deki "Attention Is All You Need" makalesinden ChatGPT'nin çıkışına kadar bugünkü LLM'leri mümkün kılan adımlar: Transformer, GPT-1 ve BERT ile pre-training, GPT-2'nin aşamalı yayını, ölçeklenme yasaları ve GPT-3, InstructGPT ve RLHF. Her adımın serideki hangi kavramın kökü olduğunu ve geliştirici için ne değiştirdiğini görüyoruz.
Sağlayıcıdan Bağımsız LLM Kodu: IChatClient, OpenAI Uyumlu /v1 ve DI
IChatClient abstraction'ıyla aynı kodu Ollama'nın kendi API'si ve OpenAI uyumlu /v1 endpoint'i üzerinden çalıştırıyor, sağlayıcıyı configuration'dan 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 abstraction'ın sınırlarına bakıyoruz.
LLM Maliyeti, Latency ve Model Seçimi: Token'dan Faturaya
Token sayısından istek başına ve aylık maliyeti hesaplıyor, latency'yi 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 chunk'ları prompt'a koyuyor ve modele context'te olmayanı bilmediğini söyletiyoruz. C#'ta bellekte minimal bir RAG ve sınırları.