Exploring Infinite Possibilities on FrontEnd 🚀
Burak Sağlık
Search...

Mon Aug 24 2026

Hibrit AI Ajansı Kurulumu: Yerel + Bulut LLM Yönlendirme Rehberi

Hibrit AI Ajansı Kurulumu: Yerel + Bulut LLM Yönlendirme Rehberi

🎯 Hibrit AI Ajanslarına Hoş Geldiniz: Neden Bu Konu Şimdi Önemli?

Selam! 👋

Ben de geçenlerde tek bir soru için saçma sapan bir durum yaşadım: "Bu PDF'i özetle" diyerek 50 sayfalık bir sözleşmeyi bir bulut modeline yolladım. Sonuç? 15 dakika bekledim, fatura şişti, ve verim şirket sunucularından geçti. 😅

O an düşündüm: "Ya bunu yerel modelimle yapsaydım?" Yerel model 3 saniyede cevap verirdi, veri hiç çıkmayacak, maliyet sıfır olacaktı. Ama... o karmaşık bir hukuki analiz isteseydim? Yerel model takılır, bulut modeli ise parlardı ✨.

İşte hibrit AI ajansları tam bu noktada devreye giriyor.


Ne Demek Bu "Hibrit Ajan"? 🤔

Kısaca: Doğru işi, doğru modele, doğru anda yönlendiren bir orkestratör.

🎭 Rol 🏠 Yerel (Local) Modeller ☁️ Bulut (Cloud) Modeller
Gizlilik Veri asla makineni terk etmez Veri sağlayıcıya gider
Maliyet Tek seferlik donanım + elektrik Token başına ödeme (birikir!)
Gecikme Saniyeler, hatta milisaniyeler Ağ + kuyruk + işlem süresi
Güç Basit/orta görevlerde yeterli Karmaşık rasyonelleme, kod, analiz

Hibrit ajan bu ikisini akıllı bir router gibi birleştirir:

  • Basit özet, sınıflandırma, format dönüşümü → Yerel 🏠
  • Çok adımlı planlama, kod yazma, derin analiz → Bulut ☁️

Bu Makalede Ne Öğreneceksin? 📚

Sana pratik bir çerçeve veriyorum, theory değildir:

  1. Routing Mantığı → Hangi isteği nereye göndeririz? (Kural tabanlı, embedding tabanlı, LLM-as-judge)
  2. Karar Kriterleri → Gizlilik, maliyet, gecikme, kalite dengesi nasıl kurulur?
  3. Pattern'lerCascade (şelale), Fallback (yedek), Ensemble (birlik) — hangisi ne zaman?
  4. Kod → Çalışan bir HybridRouter sınıfı + test senaryoları
  5. Production İpuçları → Logging, cost tracking, graceful degradation

Neden Şimdi? ⏰

  • Yerel modeller (Llama 3, Phi-3, Gemma 2) son 6 ayda olağanüstü ilerledi 🚀
  • Bulut maliyetleri küçülmüyor, hatta enterprise katmanlarda artıyor 📈
  • Gizlilik yasaları (KVKK, GDPR, AI Act) "veri nerede işleniyor?" sorusunu zorunlu kılıyor ⚖️
  • Geliştirici deneyimi artık: ollama run llama3 yazıp modelin hazır olması kadar basit 🛠

Hazırsan Başlayalım 🎬

Bu yazıyı bitirdiğinde:

  • ✅ Kendi hibrit routing mantığını yazmış olacaksın
  • Maliyet/gizlilik/performans üçgenini nasıl dengeleceğini bileceksin
  • ✅ Production'da "şey bulut modeli düştü, ne yaparız?" diye panik yapmayacaksın 😌

Hadi ilk adımı atalım: routing stratejinizi nasıl tasarlarsınız? ➡️


❗️ Sorun: Tek Yönlü Yaklaşımların Getirdiği Sıkıntılar

Ben de bu duvarlara çarptım, hatta birden fazla kez. 🎯 Hem sadece bulut hem de sadece yerel model seçtiklerinde yaşadığım sıkıntıları paylaşayım; belki siz de benzer bir hikaye yaşıyorsunuzdur.

☁️ Sadece Bulut Kullanmanın Getirdiği Sorunlar

  • Veri gizliliği riski 🔐

    • Finansal işlem logları, hasta kayıtları ya da müşteri PII verileri buluta gittiğinde, uyumluluk (KVKK, GDPR, HIPAA) süreçleri birden karmaşık hale geliyor.
    • Ben bir fintech projesinde, müşteri kart numaralarının bulut API’sine gitmesi yasaklandı; tüm pipeline’ı yeniden yazmak zorunda kaldım.
  • Token maliyeti 💸

    • Her istek bir maliyet. Günlük milyonlarca çağrı yaptığınızda fatura şaşırtıcı büyüklere ulaşabiliyor.
    • Küçük bir startup için aylık 10‑15 bin $ token harcamak, bütçe planlamasını bozuyor.
  • Gecikme (latency)

    • Ağ gecikmesi + kuyruk bekleme süresi = gerçek zamanlı karar mekanizmaları için yetersiz.
    • Sağlık cihazından anlık alarm üretmeye çalıştığımda, 300‑500 ms bulut gecikmesi yaşamı tehdit edici bir gecikmeye dönüştü.

🖥️ Sadece Yerel Model Kullanmanın Getirdiği Sorunlar

  • Donanım sınırlamaları 🛠

    • GPU/TPU yoksa veya kiralanamazsa, model boyutu ve batch size kısıtlı kalıyor.
    • 7 B parametreli bir LLM’i bir RTX 3080’de çalıştırmak, inference süresini 5‑10× yavaşlattı.
  • Model kapasitesi 📉

    • Küçük modeller (ör. 1‑3 B) belirli alanlarda (tıbbi terimler, hukuki dil) yetersiz kalıyor.
    • Ben bir hukuk asistanı prototype’ı yerelde denedim; karmaşık madde yorumlarında halüsinasyon oranı %30’un üzerine çıktı.
  • Bakım ve güncelleme yükü 🔁

    • Model sürüm takibi, veri seti yeniden eğitimi, güvenlik yamaları… Hepsi sizin sorumluluğunuz.
    • Bir ayda bir “model drift” tespit edip, yeniden fine‑tune etmek için veri mühendisliği ekibi ayırdım; bu da geliştirme hızını yavaşlattı.

🎭 Gerçek Hayat Senaryoları ile Empati

Senaryo Sadece Bulut Sadece Yerel Benim Deneyimim
Finansal fraud detection Veri gizliliği ihlali riski, yüksek token maliyeti GPU yok → inference 2 sn, gerçek zamanlı engellenemez Hem gizlilik hem gecikme sorunu yaşadım, hibrit çözüm aradım
Hasta takip sistemi (IoT) Ağ kesintisinde alarm gecikiyor Edge cihazda 1 B model → düşük doğruluk Cihazda hafif model + bulut fallback kombinasyonu kurtardı
İçerik moderasyon (Sosyal medya) Milyonlarca gönderi → fatura patlıyor CPU‑only sunucuda 5 sn/gönderi Batch‑processing + önbellekleme ile maliyet %60 düştü

📌 Özetle

  • Tek yönlü bir strateji her zaman bir trafik ışığı gibi: ya yeşil (her şey yolunda) ya da kırmızı (büyük bir engel).
  • Hibrit yaklaşımlar (edge + cloud, küçük model + büyük model fallback) bu ışığı sarıya çeviriyor; esneklik kazandırıyor.

Bir sonraki bölümde bu hibrit mimariyi nasıl kuracağımızı, hangi araçları kullanacağımızı ve “nasıl başlarım?” sorusuna cevap arayacağız. 🚀


🔁 Mimari Bileşenler: Hibrit Sistemin Kalbi

Hibrit bir LLM sistemini kurarken üç temel bileşen birbirine bağlanır. Her birinin ne yaptığını, nasıl konuştuğunu ve veri nasıl aktığını kısaca gözden geçirelim 👇

1️⃣ Yerel LLM Sunucusu (Ollama / vLLM)

  • Rol: Modeli kendi donanımında çalıştırır, gizlilik ve maliyet kontrolü sağlar.
  • İletişim: Genellikle HTTP/REST (Ollama) ya da gRPC (vLLM) üzerinden istek alır.
  • Avantaj: Veri merkezden çıkmaz, soğuk başlatma (cold‑start) süresi küçülür.

2️⃣ Bulut LLM API’si (OpenAI, Anthropic, vb.)

  • Rol: Büyük modelleri (GPT‑4, Claude…) pay‑as‑you‑go modeliyle sunar.
  • İletişim: Standart HTTPS/REST endpoint’leri, API‑key ile kimlik doğrulama.
  • Avantaj: Ölçeklenebilirlik, en güncel model sürümleri, donanım yönetimi yok.

3️⃣ Routing / Orchestration Katmanı

  • Rol: Gelen isteği kural tabanlı (gizlilik, maliyet, gecikme) yerel veya buluta yönlendirir.
  • İletişim: Her iki tarafı da HTTP ya da gRPC ile sarar; genellikle bir API Gateway (NGINX, Traefik, Kong) veya özel bir router servisi (Python/Go) olur.
  • Ekstra: Logging, metrik toplama, retry/fallback mantığı burada yaşar.

📐 Basit Veri Akışı (diyagram açıklaması)

Client → [Router] ──► (eğer yerel uygun) ──► [Ollama / vLLM] ──► Yanıt
                └─► (aksi halde) ──► [Cloud LLM API] ──► Yanıt
  • Client isteği Router’a gönderir.
  • Router policy’e bakar (ör. “kişisel veri varsa yerel”).
  • Uygun hedefe HTTP POST (veya gRPC Unary) ile istek atar.
  • Yanıt aynı yolla Client’a döner.

🛠 Pratik: Yerel Ollama Servisini Docker Compose ile Ayağa Kaldırmak

Aşağıdaki docker-compose.yml dosyası Ollama’yı, port映射, veri kalıcılığı ve basit bir healthcheck ile çalıştırır. Dosyayı proje köküne koyup docker compose up -d derseniz servis hazır 🚀

version: "3.9"

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama-local
    restart: unless-stopped
    ports:
      - "11434:11434"          # HTTP API portu
    volumes:
      - ollama-data:/root/.ollama   # Modeller ve cache kalıcı
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s

volumes:
  ollama-data:

Ne oluyor burada?

  • ports: Host 11434 → Container 11434 (Ollama REST endpoint).
  • volumes: Modeller indirildikçe ollama-data adlı named volume’de saklanır, container yeniden başlasa bile kaybolmaz.
  • healthcheck: Her 30 saniyede bir /api/tags endpoint’ine istek atar; 3 ardışık başarısızlıkta container unhealthy işaretlenir ve restart politikası devreye girer.

✅ Özet

Bileşen Protokol Ne Zaman Kullanılır?
Yerel LLM HTTP / gRPC Gizli veri, düşük maliyet, düşük gecikme
Bulut LLM HTTPS (REST) Büyük model gerektiğinde, hızlı prototip
Router HTTP / gRPC (her iki taraf) Política motoru, logging, fallback

Bu üç taş hibrit mimarinin kalbini oluşturur. Router sayesinde “doğru model, doğru yerde, doğru maliyetle” çalışırsınız. 🎯


🛠 Orchestration Pattern'leri: Cascade, Ensemble ve Fallback

Hazırsan bu üç pattern'i tek tek inceleyelim. Her birinin avantaj/dezavantaj, kullanım senaryosu ve basit bir akış şeması açıklaması olacak. Kod kısmında da hepsini bir arada tutan bir HybridRouter sınıfı hazırladım 🎯.


1️⃣ Cascade (Kademeli Yönlendirme)

Mantık:
Önce yerel (local) model çalıştırılır. Güven skoru (confidence) eşik değerinin altına düşerse istek bulut (cloud) modeline yönlendirilir.

Avantajlar

  • Maliyet düşük: Çoğu isteği yerel model halleder.
  • Gecikme az: Basit sorular anında cevaplanır.

Dezavantajlar

  • Eşik ayarı kritik: Yanlış eşik ya gereksiz bulut çağrısı ya da kötü cevaplara yol açar.
  • İki model bakımı: Hem local hem cloud pipeline’ını izlemek gerekir.

Kullanım Senaryosu 🛠

  • SSS botları, basit komutlar (hava durumu, saat) → yerel model.
  • Karmaşık analitik sorular, uzun metin özetleme → bulut modeli.

Akış Şeması (metin)

İstek → Yerel Model → Güven ≥ Eşik? → Evet → Cevap Dön
                                 ↓ Hayır
                           Bulut Modeli → Cevap Dön

Not: Cascade benim favorim çünkü çoğu günlük sorguyu yerel model çözüyor ve maliyet/gecikme dengesi çok iyi oluyor. 😊


2️⃣ Ensemble (Birleştirme)

Mantık:
Aynı isteği her iki modele de gönderirsin. Dönen cevapları birleştirirsin (ör. oylama, weighted merge, en yüksek güvenli olanı seçme).

Avantajlar

  • Doğruluk artışı: İki modelin ortak kararı genelde daha sağlam.
  • Hata toleransı: Bir model yanlış çıkarsa diğeri düzeltebilir.

Dezavantajlar

  • Çift maliyet: Her istek iki modele gider.
  • Gecikme artışı: En yavaş model bitene kadar beklemek zorundasın.

Kullanım Senaryosu 🛠

  • Hassas kararlar (ticaret onayı, yasal metin analizi).
  • Çok dilli destekte farklı dillerde güçlü modelleri birleştirme.

Akış Şeması (metin)

İstek → Yerel Model ──┐
                       ├──→ Birleştirme (Oylama / Weighted Merge) → Nihai Cevap
İstek → Bulut Model ──┘

3️⃣ Fallback (Yedek Model)

Mantık:
Birincil model (genelde bulut) çalışır. Hata (timeout, 5xx, boş cevap) oluşursa ikincil model (yerel veya daha küçük bir bulut modeli) devreye girer.

Avantajlar

  • Yüksek kullanılabilirlik: Birincil model çökerse sistem ayakta kalır.
  • Basit mantık: Sadece hata kontrolü yeterli.

Dezavantajlar

  • Sadece hata durumunda devreye girer: Normalde performans artışı sağlamaz.
  • İkinci modelin kalitesi düşükse kullanıcı deneyimi bozulabilir.

Kullanım Senaryosu 🛠

  • Üretim ortamında SLA garantisi gereken servisler.
  • Bulut sağlayıcısı bakım/kesinti zamanlarında.

Akış Şeması (metin)

İstek → Birincil Model → Başarılı? → Evet → Cevap Dön
                                 ↓ Hayır (Hata/Timeout)
                           İkincil Model → Cevap Dön

🐍 HybridRouter İskelet Kodu

Aşağıda üç pattern’i de içeren minimal bir HybridRouter sınıfı var. Gerçek projede local_model, cloud_model ve confidence hesaplama mantığını doldurman yeterli.

class HybridRouter:
    def __init__(self, local_model, cloud_model, confidence_threshold=0.75):
        self.local_model = local_model
        self.cloud_model = cloud_model
        self.threshold = confidence_threshold

    # ---------- Cascade ----------
    def cascade(self, prompt: str) -> str:
        """Önce yerel, güven düşükse buluta yönlendir."""
        local_resp, confidence = self.local_model.predict(prompt)
        if confidence >= self.threshold:
            return local_resp
        # Güven yetersiz → bulut
        cloud_resp, _ = self.cloud_model.predict(prompt)
        return cloud_resp

    # ---------- Ensemble ----------
    def ensemble(self, prompt: str, strategy: str = "vote") -> str:
        """Her iki modelden cevap al, birleştir."""
        local_resp, local_conf = self.local_model.predict(prompt)
        cloud_resp, cloud_conf = self.cloud_model.predict(prompt)

        if strategy == "vote":
            # Basit oylama: güven yüksek olan kazanır
            return local_resp if local_conf >= cloud_conf else cloud_resp
        elif strategy == "weighted":
            # Ağırlıklı birleştirme (örnek)
            # Gerçek implementasyonda metinleri merge edebilirsin
            return local_resp if local_conf * 0.6 + cloud_conf * 0.4 > 0.5 else cloud_resp
        else:
            raise ValueError(f"Bilinmeyen strateji: {strategy}")

    # ---------- Fallback ----------
    def fallback(self, prompt: str) -> str:
        """Birincil model hata verirse ikincil modeli dene."""
        try:
            # Varsayılan: bulut birincil
            primary_resp, _ = self.cloud_model.predict(prompt)
            return primary_resp
        except Exception as exc:
            # Logla, sonra yerel modeli dene
            print(f"[Fallback] Birincil model hata: {exc}")
            secondary_resp, _ = self.local_model.predict(prompt)
            return secondary_resp

Bu sayede ne oluyor?

  • cascade() → maliyet/gecikme dengesi.
  • ensemble() → doğruluk artışı (maliyet artışıyla).
  • fallback() → hizmet kesintisizliği.

Hangi pattern projen için uygun? Küçük bir tablo yapıp karşılaştırıp karar verelim 👇 (sonraki bölümde detaylandıracağız).


🛠 Pratik Uygulama: Basit Bir Hybrid Router Yazalım

Hazırsan FastAPI ile tek dosyalık, kopyala‑yapıştır çalışan bir hybrid router yazalım 🚀
İstersen kendi projene uyarlayıp, yerel Ollama ile bulut OpenAI arasında akıllı yönlendirme yaparsın.


📦 Gereksinimler

pip install fastapi uvicorn httpx pydantic python-dotenv

.env dosyasına OPENAI_API_KEY eklemeyi unutma ❗️


🧩 Kod – main.py

# main.py
import os
import logging
from typing import Literal

import httpx
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
from dotenv import load_dotenv

# -------------------------------------------------
# 1️⃣  Ortam & Logging
# -------------------------------------------------
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OLLAMA_URL = os.getenv("OLLAMA_URL", "http://localhost:11434/api/generate")  # varsayılan yerel endpoint

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s | %(levelname)-8s | %(message)s",
)
logger = logging.getLogger(__name__)

# -------------------------------------------------
# 2️⃣  Pydantic Modelleri
# -------------------------------------------------
class RouteRequest(BaseModel):
    task: str = Field(..., description="Yapılacak görev (ör. 'code', 'summary')")
    latency_budget_ms: int = Field(..., ge=0, description="Maksimum tolerans süresi (ms)")
    sensitivity: Literal["low", "medium", "high"] = Field(..., description="Veri hassasiyeti")

class RouteResponse(BaseModel):
    model_used: Literal["ollama", "openai"]
    answer: str
    latency_ms: int

# -------------------------------------------------
# 3️⃣  Karar Fonksiyonu – Basit Heuristic
# -------------------------------------------------
def decide_model(req: RouteRequest) -> Literal["ollama", "openai"]:
    """
    Basit kural:
    - Hassas veri (high) → yerel Ollama
    - Çok düşük latency budget (<200 ms) → yerel
    - Aksi halde bulut OpenAI
    """
    if req.sensitivity == "high":
        logger.info("Yüksek hassasiyet → Ollama seçildi")
        return "ollama"
    if req.latency_budget_ms < 200:
        logger.info("Latency budget düşük → Ollama seçildi")
        return "ollama"
    logger.info("Standart istek → OpenAI seçildi")
    return "openai"

# -------------------------------------------------
# 4️⃣  Model İstemcileri
# -------------------------------------------------
async def call_ollama(prompt: str) -> str:
    payload = {"model": "llama3", "prompt": prompt, "stream": False}
    async with httpx.AsyncClient(timeout=30.0) as client:
        resp = await client.post(OLLAMA_URL, json=payload)
        resp.raise_for_status()
        return resp.json().get("response", "")

async def call_openai(prompt: str) -> str:
    headers = {"Authorization": f"Bearer {OPENAI_API_KEY}"}
    payload = {
        "model": "gpt-4o-mini",
        "messages": [{"role": "user", "content": prompt}],
        "max_tokens": 512,
    }
    async with httpx.AsyncClient(timeout=30.0) as client:
        resp = await client.post("https://api.openai.com/v1/chat/completions", json=payload, headers=headers)
        resp.raise_for_status()
        return resp.json()["choices"][0]["message"]["content"]

# -------------------------------------------------
# 5️⃣  FastAPI Uygulaması
# -------------------------------------------------
app = FastAPI(title="Hybrid Router Demo")

@app.post("/route", response_model=RouteResponse)
async def route_request(req: RouteRequest):
    start = __import__("time").perf_counter()
    model = decide_model(req)

    try:
        if model == "ollama":
            answer = await call_ollama(req.task)
        else:
            answer = await call_openai(req.task)
    except httpx.HTTPStatusError as exc:
        logger.error("Model çağrısı hata verdi: %s", exc)
        raise HTTPException(status_code=502, detail="Model servisine ulaşılamadı")
    except Exception as exc:  # genel yakalama
        logger.exception("Beklenmeyen hata")
        raise HTTPException(status_code=500, detail="İç sunucu hatası")

    latency_ms = int((__import__("time").perf_counter() - start) * 1000)
    logger.info("Yanıt süresi: %d ms | Model: %s", latency_ms, model)

    return RouteResponse(model_used=model, answer=answer, latency_ms=latency_ms)

# -------------------------------------------------
# 6️⃣  Çalıştırma (CLI)
# -------------------------------------------------
if __name__ == "__main__":
    import uvicorn
    uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)

🚀 Çalıştırma

# 1️⃣  .env dosyası oluştur
echo "OPENAI_API_KEY=sk-..." > .env
# OLLAMA_URL varsayılan localhost:11434, farklıysa .env'e ekle

# 2️⃣  Sunucuyu başlat
uvicorn main:app --reload

Artık http://localhost:8000/route endpoint’ine POST atabilirsin:

{
  "task": "Python ile fibonacci fonksiyonu yaz",
  "latency_budget_ms": 150,
  "sensitivity": "low"
}

Yanıt örneği:

{
  "model_used": "ollama",
  "answer": "def fib(n):\n    a, b = 0, 1\n    for _ in range(n):\n        a, b = b, a + b\n    return a",
  "latency_ms": 112
}

🛠 Kendi Projene Uyarlama İpuçları

  • Karar mantığını ihtiyacına göre zenginleştir (ör. maliyet, model yeteneği, token limiti).
  • Ollama modelini model alanından değiştirerek farklı yerel modeller dene.
  • OpenAI modelini gpt-4o-mini yerine gpt-4o veya gpt-3.5-turbo yapabilirsin.
  • Logging seviyesini DEBUG yaparak akışları daha detaylı izle.
  • Testler yaz (pytest + httpx.AsyncClient) – CI/CD pipeline’ına ekle 🚦

Bu dosyayı kopyala, .env’ı doldur, uvicorn main:app --reload de ve hybrid router’ın canlıya gelmesini izle!


🛠 Maliyet Optimizasyonu: Token Basına Düşük Maliyet, Yüksek Performans

Hazırsan başlayalım 🚀 — maliyeti ölçmek, optimize etmek ve takip etmek aslında küçük adımların birikimi. İşte benim günlük hayatta kullandığım yöntemler ve bir de basit bir Bash script 🎯.


1️⃣ Maliyet Hesaplama: Bulut vs Yerel

Yaklaşım Nasıl Hesaplanır? Avantaj Dezavantaj
Bulut token maliyeti Token Sayısı × $/1K token (ör. GPT‑4 ≈ $0.03/1K) Ölçeklenebilir, donanım yok Uzun vadede pahalı
Yerel donanım amortisman (GPU fiyatı + elektrik + soğutma) / Ömür (gün) × Günlük token Tek seferlik yatırım, veri gizliliği Başlangıç maliyeti yüksek, bakım sizin

Küçük bir kural: Günlük token kullanımınız 10 M üzerindeyse bulut genelde daha ucuz; altındaysa yerel donanımları değerlendirin 🤔.


2️⃣ Hızlı Kazanım Teknikleri

  • Prompt Caching 🔁
    Aynı sistem/yardımcı mesajları tekrar göndermiyorsunuz. Önbellekte tutup %30‑%50 token tasarrufu yakalayabilirsiniz.

  • Quantization 📦

    • 8‑bit → Model boyutu ≈ ½, performans kaybı < 2 %.
    • 4‑bit → Boyut ≈ ¼, kayip ≈ 4‑5 %.
      Ben 8‑bit'i üretimde, 4‑bit'i testlerde kullanıyorum.
  • Model Distillation 🎓
    Büyük model (teacher) → Küçük model (student).
    Örnek: 70B → 7B, %90 performans, %10 maliyet.


3️⃣ Benim Ayarladığım Eşik Değerleri 📊

Metrik Eşik Aksiyon
Günlük token 8 M Uyarı e‑postası gönder
Günlük maliyet (bulut) $120 Otomatik scaling durdur
GPU kullanım oranı 85 % Yeni batch kuyruğa al
Model latency (p95) 350 ms Quantization / caching tetikle

Bu sayılar benim iş yüküme göre; siz kendi trafiğinize göre %10‑%20 play yapabilirsiniz ⚙️.


4️⃣ Basit Maliyet Takip Scripti (Bash) 🛠

#!/usr/bin/env bash
# -------------------------------------------------
# daily_token_cost.sh
# Günlük token kullanımını loglar, maliyet tahmini yapar
# ve eşik aşıldığında uyarı maili atar.
# -------------------------------------------------

# ---- AYARLAR ----
LOG_DIR="/var/log/llm_cost"
mkdir -p "$LOG_DIR"
DATE=$(date +%F)
TOKEN_LOG="${LOG_DIR}/tokens_${DATE}.log"
COST_PER_1K=0.03          # $/1K token (bulut fiyatı)
THRESHOLD_TOKENS=8000000  # 8 M token
THRESHOLD_COST=120        # $120
ALERT_EMAIL="ops@example.com"

# ---- YARDIMCI FONKSİYON ----
send_alert() {
    local subject="$1"
    local body="$2"
    echo "$body" | mail -s "$subject" "$ALERT_EMAIL"
}

# ---- ANA AKİŞ ----
# 1. Günlük token sayısını topla (örnek: API yanıtındaki usage.total_tokens)
#    Burada `jq` ile JSON loglarını parse ediyoruz.
total_tokens=$(jq -s 'map(.usage.total_tokens) | add' /var/log/llm_api/*.json 2>/dev/null || echo 0)

# 2. Logla
echo "${DATE} ${total_tokens}" >> "$TOKEN_LOG"

# 3. Maliyet hesapla
cost=$(echo "scale=2; $total_tokens / 1000 * $COST_PER_1K" | bc)

# 4. Konsola özet
echo "🗓 ${DATE} | Token: ${total_tokens} | Tahmini Maliyet: \$${cost}"

# 5. Eşik kontrolü
if (( total_tokens > THRESHOLD_TOKENS )); then
    send_alert "⚠️ Token Eşiği Aşıldı (${DATE})" \
        "Günlük token kullanımı ${total_tokens} (eşik: ${THRESHOLD_TOKENS})."
fi

if (( $(echo "$cost > $THRESHOLD_COST" | bc -l) )); then
    send_alert "💰 Maliyet Eşiği Aşıldı (${DATE})" \
        "Tahmini maliyet \$${cost} (eşik: \$${THRESHOLD_COST})."
fi

Nasıl çalışıyor?

  1. jq ile tüm API yanıt loglarından usage.total_tokens toplar.
  2. Günlük dosyaya tarih token satırı yazar.
  3. bc ile basit bir çarpım yapar → tahmini maliyet.
  4. Eşikler aşıldığında mail komutu ile ops ekibine uyarı atar.

İpucu: Cron’a 0 1 * * * /usr/local/bin/daily_token_cost.sh ekleyerek her gece 01:00’de otomatik çalıştırın ⏰.


5️⃣ Küçük Hatırlatmalar ✅

  • Log dosyalarını günlük rotasyona (logrotate) bağlayın, disk dolmasın.
  • Quantization ve caching değişikliklerini yapmadan önce A/B test yapın 📈.
  • Maliyet eşiklerinizi haftalık gözden geçirin; trafik dalgalanır.

Hadi şimdi scripti sunucunuza atın, cron’a ekleyin ve maliyetleriniz kontrol altında kalsın 🎉. Herhangi bir sorunda yanınızdayım!


❗️ Güvenlik ve Gizlilik: Veri Kaçışlarını Önlemek

Hibrit mimarilerde routing kararı alırken hassas verinin buluta sızmaması kritiktir 🚦.
Basit bir kural: PII (Kişisel Tanımlayıcı Bilgi) tespit edilirse, istek on‑premise kalmalı.

Ne yapmalıyız?

  • PII tespiti → regex + Presidio (veya kendi kütüphaneniz)
  • Veri maskeleme → bulunan alanları *** ile değiştir
  • Policy enforcement → maskeleme sonrası loglama ve routing
  • Audit logging → her maskeleme ve routing kararını kaydet
  • Compliance → KVKK & GDPR gereksinimlerini karşılayan kayıt tutma

Benim kullandığım basit bir maskeleme fonksiyonu 🛠

import re

def mask_pii(text: str) -> str:
    """
    Basit regex tabanlı PII maskeleme.
    - E‑posta, TC Kimlik No, telefon (TR) ve kredi kartı numaralarını maskeleyerek döner.
    """
    # E‑posta
    text = re.sub(r'\b[\w\.-]+@[\w\.-]+\.\w{2,}\b', '***@***.***', text)
    # TC Kimlik No (11 haneli, başta 0 olmaz)
    text = re.sub(r'\b[1-9]\d{9}\b', '***********', text)
    # Türk telefon (05xx xxx xx xx veya +90 5xx xxx xx xx)
    text = re.sub(r'(\+90\s?)?0?5\d{2}\s?\d{3}\s?\d{2}\s?\d{2}', '*** *** ** **', text)
    # Kredi kartı (16 hane, boşluk/çizgi ile)
    text = re.sub(r'\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b', '**** **** **** ****', text)
    return text

Nasıl çalışıyor?

  1. Gelen text içindeki her bir pattern için re.sub çağrılır.
  2. Bulunan değerler *** / *********** gibi sabit maskeyle değiştirilir.
  3. Maskeleme sonrası metin güvenli bir şekilde loglanabilir veya buluta gönderilebilir.

Not: Gerçek ortamda Presidio, spaCy NER veya cloud‑native DLP servisleri daha kapsamlı sonuç verir. Bu fonksiyon hızlı prototip veya düşük hacimli işler için yeterlidir ✅.


Audit Logging & Compliance 📋

Adım Ne Kaydedilir? Neden?
Maskeleme öncesi hash (SHA‑256) Orijinal verinin hash’i (veri kendisi değil) KVKK 12. maddesi – veri işlenme kanıtı
Maskeleme sonrası metin Maskelemeli metin GDPR 30. madde – işlem kayıtları
Routing kararı on_premise / cloud + timestamp Denetim izi & incident response
Kullanıcı / servis kimliği user_id, service_name Sorumluluk zinciri
  • Log formatı: JSON Lines (ELK / Loki uyumlu)
  • Saklama süresi: KVKK için en az 3 yıl, GDPR için “gerekli olduğu sürece”
  • Erişim kontrolü: Sadece güvenlik ekibi ve DPO (Veri Koruma Sorumlusu) okuyabilir 🔐

Özet

  • PII tespiti → regex / Presidio
  • Maskelememask_pii() ile anında güvenli hale getir
  • Policy → maskelemeli veri buluta gider, orijinal veri on‑premise kalır
  • Audit → her adımı logla, KVKK & GDPR uyumunu kanıtla

Bu akışı CI/CD pipeline’ınıza da ekleyebilirsiniz: test → mask → log → route 🎯.

Hazırsanız bir sonraki bölümde policy engine (OPA / Kyverno) ile bu kararları nasıl otomatikleştireceğimize bakalım!


🎯 Bonus Tavsiye: Küçük Başlayın, Ölçeklendirin

Merhaba! 📚 Hazırsan başlayalım ve biraz pratik yapalım. Küçük bir pilot projeyle başlamak, hem motivasyonunu yüksek tutar hem de beklenmedik sürprizlerle karşılaşmazsın.

Hızlı bir özet 🎯

  • Pilot = az riskli, yüksek öğrenme
  • İteratif = gelişim döngüsü (önce cascade, sonra ensemble)
  • Topluluk = kod, kanallar, örnekler

1️⃣ Pilot Projesi: Dahili Doküman Soru-Cevap Botu

Neler yapabilirsin?

  • Birkaç markdown dosyasını veya Confluence sayfasını dizine ekle.
  • Basit bir arayüz sağlayarak soruları hazır modeller aracılığıyla sorgula.
  • Yanıtları düzenli olarak iyileştirip yeni bölümler ekle.

Basit bir akış 🔁

  1. Cozunurluk – Minimum bağlam (örneğin birkaç belgenin özetleri).
  2. Sorgu – Kullanıcı bilgisayar klavyesine yazıyor.
  3. Tamamlama – Model yanıtı döndürüyor.
  4. Geri Bildirim – Kullanıcı doğruluyor veya düzeltme talep ediyor.

“Siz de deneyin!” ✅ Kendi projeniz için ilham almak isterseniz aşağıdaki adımları deneyebilirsiniz:

# Örnek: InternalDocBot (basit bir Python servisi)
- Kullanılan kütüphaneler: fastapi, langchain, pypdf2
- Depo linki: https://github.com/yourorg/InternalDocBot
- Discord geliştirici kanalı: https://discord.gg/yourorg-dev

2️⃣ İteratif Gelişim: İlk Önce Cascade, Sonra Ensemble

Cascade (adım adım ilerleme) 🛠

  • Önce tek model ile başla (örneğin OpenAI’s GPT‑3.5-turbo).
  • Minimum bağlam ile tek bir kaynaktan (tek bir markdown klasörü) besle.
  • Yanıt kalitesi ve gecikme sürelerini ölç.

Ensemble (karıştırma ve eşleştirme) 🎯

  • İlk modelin temelini aldıktan sonra ikinci bir model (örneğin bir açık kaynaklı LLM) dahil et.
  • Ağırlıklı oylama veya küçük bir Prolog kural tabanı ile karıştırma.
  • Dynamik yönlendirme: basit sorular için hızlı modele, karmaşık sorular için ikinci modele yönlendirme.

Sonuçlar neler olur? ❗️

  • Daha doğru ve öz verimli yanıtlar.
  • Model çağrılarını etkin bir şekilde bölmek için sıcaklık ve maksimum uzunluk gibi parametreleri ayarlama olasılığı artar.
  • Pilot projeyi büyütürken orijinallik ve güvenilirlik aynı anda korunur.

3️⃣ Topluluk Kaynakları (ve daha fazlası)


4️⃣ Sizin De Denemeniz Gerekiyor!

Siz de deneyin, sonuçları paylaşın! 🚀 Birkaç içerik ile nasıl başardığınızı, karşılaştığınız zorlukları ve elde ettiğiniz kazanımları bize bildirin. Her pilot projenin bir sonucu olur ve topluluk hepimizi ilerletir.

Bakalım senin projen neler getirecek? 🎉

(Umarım fikir verici oldu. Bir dahaki sefere başka bir öneri ile görüşürüz!)


Bu içerik tamamen yapay zeka destekli otomasyon sistemi ile üretilmiştir.

Burak Sağlık

Burak Saglik

©2024 Desing and Developed by @Burak Sağlık

All rights reserved