LLM sağlayıcısını (Ollama → Bedrock/OpenAI) nasıl soyutlamalıyım?
Soru
Uygulamaya kod analizi ve metin özetleme yapan bir AI özelliği ekliyoruz. Geliştirici makinelerinde maliyet olmasın diye Ollama + yerel LLM (Llama 3) kullanıyoruz; üretimde AWS Bedrock veya OpenAI planlıyoruz. LLM sağlayıcısını soyutlamak için hangi tasarım kalıbını uygulamalıyım? Lokaldeki token sınırları ve yanıt süreleriyle üretimdeki yapısal farkları mimaride nasıl tolere ederim?
Cevap
Kısa cevap: Sağlayıcının etrafına değil, yeteneğin etrafına dar bir port/adapter (Strategy) kurun. Küçük bir arayüz + config’le seçilen gerçek implementasyonlar; daha fazlası değil.
Sizin asıl tehlikeniz aşırı soyutlama: insanlar bunu jenerik bir “AI framework”e çevirmeye çalışıp aylarını yiyor. İhtiyacınız olan tek bir ince arayüz.
- Arayüzü yetenek üzerinden tanımlayın, vendor üzerinden değil.
complete(prompt, opts): Resultgibi minik bir kontrat yeter. Ollama, Bedrock ve OpenAI bunun üç implementasyonu olur; hangisinin çalışacağınıconfig/envseçer. Sağlayıcıya özel parametreleri core mantığa sızdırmayın — arayüz küçük ve yetenek-tabanlı kalsın. - Farkları açık timeout + ucuz fallback ile tolere edin. Üretimde sağlayıcı yavaşlar veya rate-limit yer; her çağrıya net bir timeout koyun ve gerektiğinde ucuz/yerel bir fallback’e düşün. Bu, mimariyi tek bir sağlayıcının kapris yapmasına bağımlı olmaktan kurtarır.
- Token bütçesini kenarda yönetin. Her modelin context penceresi farklı; girdiyi modele sığacak şekilde kenarda truncate/özetleyin. “Lokalde küçük, üretimde büyük pencere” gibi farklar iş mantığında
ifolmamalı — config olmalı. - Streaming’i aynı arayüzün arkasına koyun. İhtiyaç varsa stream desteğini opsiyonel olarak aynı kontratta tutun; çağıran taraf sağlayıcının stream API’sını bilmesin.
- Golden-prompt test seti tutun. Aynı prompt setini her sağlayıcıya karşı çalıştırın; çıktı kalitesi ve regresyon kıyaslamasını otomatikleştirin. Sağlayıcı değiştirdiğinde neyin bozulduğunu bu yakalar.
Sonuç: Ben olsam tek bir küçük arayüz, üç gerçek implementasyon ve config-tabanlı seçim kurardım — fazlası YAGNI. Yerel Ollama dev maliyeti ve hızlı iterasyon içindir; üretimdeki context penceresi, gecikme, rate-limit ve maliyet farklarını konfigürasyon olarak ele alın, iş mantığına dallanma olarak değil. Soyutlama dar oldukça sağlam olur.
İlgili Yazılar
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.