AI Engineering Academy · Ders

Geri Dönüş Sağlayıcıları ve Devre Kesiciler

Birincil sağlayıcı yavaş veya kullanılamaz olduğunda devre kesici deseniyle OpenAI'dan Anthropic'e, oradan da yerel bir modele otomatik olarak geçen bir sağlayıcı zinciri oluşturun.

3. ders / 413 adım

Geri Dönüş Sağlayıcıları ve Devre Kesiciler, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

Tek Sağlayıcı Riski

Tek bir LLM sağlayıcısına güvenmek tek bir arıza noktası oluşturur. OpenAI, çözülmesi dakikalar ile saatler süren kesintiler yaşadı. Tüm uygulamanız GPT-4o'nun kullanılabilir olmasına bağlıysa, herhangi bir sağlayıcı olayı doğrudan kullanıcıya yansıyan hizmet kesintisine dönüşür. Geri dönüş sağlayıcısı stratejisi, birincil sağlayıcı başarısız olduğunda alternatif sağlayıcılara yönlendirerek hizmet sürekliliğini korur.

Sağlayıcı Zincirini Tanımlama

Sağlayıcı zinciri, sırayla denenen sağlayıcıların ve modellerin sıralı listesidir. Birincil sağlayıcı başarısız olduğunda veya zaman aşımına uğradığında sistem otomatik olarak bir sonraki sağlayıcıyı dener. Tipik bir zincir şöyle olabilir: OpenAI GPT-4o → Anthropic Claude 3.5 Sonnet → yerel olarak dağıtılmış bir Llama modeli. Her düzey bir geri dönüş seçeneğidir; yerel model ise devre dışı kalamayacak son çare olarak hizmet eder.

from dataclasses import dataclass
from typing import Optional

@dataclass
class Provider:
    name: str
    base_url: Optional[str]
    api_key_env: str
    model: str
    priority: int  # lower = higher priority

CASCADE = [
    Provider('openai',    None,                              'OPENAI_API_KEY',    'gpt-4o',              1),
    Provider('anthropic', 'https://api.anthropic.com/v1',   'ANTHROPIC_API_KEY', 'claude-3-5-sonnet',   2),
    Provider('local',     'http://localhost:8000/v1',        'LOCAL_KEY',         'llama-3.1-8b-inst',   3),
]

Geri Dönüş Döngüsünü Uygulama

Geri dönüş döngüsünü, zincir üzerinde yineleme yapan basit bir try/except olarak uygulayın. Geçici hataları (zaman aşımları, 500'ler, 503'ler) yakalayıp bir sonraki sağlayıcıya geçin. Kimlik doğrulama hatalarını (401) veya geçersiz istek hatalarını (400) yakalamayın; bunlar başka bir sağlayıcıya geçmek yerine hemen görünür olması gereken programlama hatalarıdır.

import openai
import os

TRANSIENT_ERRORS = (openai.APITimeoutError, openai.InternalServerError, openai.APIConnectionError)

async def call_with_fallback(messages: list, **kwargs) -> str:
    for provider in CASCADE:
        try:
            client = openai.AsyncOpenAI(
                api_key=os.environ[provider.api_key_env],
                base_url=provider.base_url
            )
            resp = await client.chat.completions.create(
                model=provider.model,
                messages=messages,
                timeout=10.0,
                **kwargs
            )
            return resp.choices[0].message.content
        except TRANSIENT_ERRORS as e:
            print(f'Provider {provider.name} failed: {e}, trying next...')
    raise RuntimeError('All providers failed')

Devre Kesici Nedir

Devre kesici, bir kesinti sırasında başarısız olan bir hizmetin istek yağmuruna tutulmasını önler. Elektrik devre kesicilerinden esinlenen bu yapı üç duruma sahiptir: Kapalı (istekler normal biçimde geçer), Açık (istekler hemen reddedilir) ve Yarı Açık (hizmetin düzelip düzelmediğini denetlemek için tek bir sınama isteğinin geçmesine izin verilir). Bu, olaylar sırasında hem alt hizmeti hem de kendi uygulamanızı korur.

# Circuit breaker state machine:
#
# CLOSED --> (failure_count >= threshold) --> OPEN
#    ^                                          |
#    |     (test_request succeeds)              | (timeout expires)
#    +------------ HALF_OPEN <-----------------+
#
# In OPEN state: immediately return fallback/error
# In HALF_OPEN: allow one request through to test recovery
# In CLOSED: normal operation, count failures

Devre Kesici Uygulama

Burada en basit hâliyle bir devre kesici uygulaması yer alıyor. Hata sayısını ve devrenin açıldığı zamanı izleyin. Hata sayısı eşiği aştığında devreyi açın. Yapılandırılabilir bir sıfırlama zaman aşımından sonra bir yoklama isteğine izin verin. Yoklama başarılı olursa devreyi kapatın. Başarısız olursa devreyi açık tutup zaman aşımını sıfırlayın.

import time
from enum import Enum

class State(Enum):
    CLOSED = 'closed'
    OPEN = 'open'
    HALF_OPEN = 'half_open'

class CircuitBreaker:
    def __init__(self, failure_threshold=5, reset_timeout=60):
        self.state = State.CLOSED
        self.failure_count = 0
        self.failure_threshold = failure_threshold
        self.reset_timeout = reset_timeout
        self.opened_at = None

    def record_success(self):
        self.failure_count = 0
        self.state = State.CLOSED

    def record_failure(self):
        self.failure_count += 1
        if self.failure_count >= self.failure_threshold:
            self.state = State.OPEN
            self.opened_at = time.time()

    def can_attempt(self) -> bool:
        if self.state == State.CLOSED:
            return True
        if self.state == State.OPEN:
            if time.time() - self.opened_at > self.reset_timeout:
                self.state = State.HALF_OPEN
                return True  # allow one probe
            return False
        return True  # HALF_OPEN: allow probe

Devre Kesicileri Sağlayıcılarla Tümleştirme

Her sağlayıcı için bir devre kesiciyi koruyun. Bir sağlayıcıyı çağırmadan önce devre kesicisinin denemeye izin verip vermediğini denetleyin. Her çağrıdan sonra başarıyı veya başarısızlığı kaydedin. Bir sağlayıcının devresi açıldığında geri dönüş döngüsü bu sağlayıcıyı doğal olarak atlar ve her çağrıda zaman aşımını beklemeden zincirdeki bir sonraki sağlayıcıyı dener.

breakers = {p.name: CircuitBreaker(failure_threshold=5, reset_timeout=60) for p in CASCADE}

async def call_with_circuit_breaker(messages: list) -> str:
    for provider in CASCADE:
        breaker = breakers[provider.name]
        if not breaker.can_attempt():
            continue  # skip this provider, circuit is open
        try:
            result = await call_provider(provider, messages)
            breaker.record_success()
            return result
        except TRANSIENT_ERRORS as e:
            breaker.record_failure()
            print(f'{provider.name} failed ({breaker.failure_count}/{breaker.failure_threshold})')
    raise RuntimeError('All providers exhausted')

Yavaş Çağrıları Hata Olarak Algılama

30 saniyede yanıt veren bir sağlayıcı, kullanıcı deneyimi açısından tamamen devre dışı bir sağlayıcı kadar kötüdür. Her sağlayıcı çağrısı için zaman aşımını düşük bir değere ayarlayın ve zaman aşımı istisnalarını devre kesicide hata olarak ele alın. 10 saniyelik bir zaman aşımı, geri dönüşün yeterince hızlı devreye girmesini sağlar; böylece kullanıcı takılı kalmış bir ekran yerine yalnızca kısa bir gecikme görür.

async def call_provider(provider: Provider, messages: list) -> str:
    client = openai.AsyncOpenAI(
        api_key=os.environ[provider.api_key_env],
        base_url=provider.base_url
    )
    try:
        resp = await asyncio.wait_for(
            client.chat.completions.create(model=provider.model, messages=messages),
            timeout=10.0  # fail fast, let circuit breaker count it
        )
        return resp.choices[0].message.content
    except asyncio.TimeoutError:
        raise openai.APITimeoutError('Provider timed out')

Sağlayıcı Sağlığı Panosu

Her sağlayıcının mevcut devre kesici durumunu; hata sayısı, durum (kapalı/açık/yarı açık) ve sıfırlamaya kalan süreyle birlikte gösteren bir /health/providers uç noktası sunun. Bu, bir olay sırasında hangi sağlayıcıların sağlıklı olduğunu bir bakışta görmeyi kolaylaştırır ve sıfırlamayı elle zorlayıp zorlamamaya veya otomatik kurtarmayı beklemeye karar vermenize yardımcı olur.

from fastapi import FastAPI

app = FastAPI()

@app.get('/health/providers')
def provider_health():
    return {
        name: {
            'state': cb.state.value,
            'failure_count': cb.failure_count,
            'seconds_until_reset': (
                max(0, cb.reset_timeout - (time.time() - cb.opened_at))
                if cb.state == State.OPEN else None
            )
        }
        for name, cb in breakers.items()
    }

Sağlayıcı Çıktılarını Uyumlu Hâle Getirme

Farklı sağlayıcıların yanıt biçimleri, güvenlik filtreleri ve yetenekleri farklıdır. GPT-4o'dan Claude'a geçerken model, GPT-4o'nun yanıtlayacağı bazı istekleri reddedebilir. İstemlerinizi her sağlayıcının kurallarına uyarlayan sağlayıcıya özgü istem sarmalayıcıları bulundurun. Kullanım durumunuz için kabul edilebilir çıktı ürettiğinden emin olmak üzere her geri dönüş sağlayıcısını bağımsız olarak sınayın.

def adapt_messages_for_provider(provider: Provider, messages: list) -> list:
    if provider.name == 'anthropic':
        # Claude prefers explicit task descriptions
        system = next((m['content'] for m in messages if m['role'] == 'system'), '')
        if 'JSON' not in system:
            messages = [{'role': 'system', 'content': system + ' Respond in JSON.'}] + [
                m for m in messages if m['role'] != 'system'
            ]
    return messages

Geri Dönüş Davranışını Sınama

Birincil sağlayıcıyı (geçersiz bir API anahtarı sağlayarak veya hata fırlatan bir benzetim kullanarak) başarısız olmaya zorlayan ve geri dönüşün devreye girerek geçerli bir yanıt döndürdüğünü doğrulayan bir test yazın. Ayrıca devre kesicinin yapılandırılan hata sayısından sonra doğru şekilde açıldığını ve sıfırlama zaman aşımından sonra kurtulduğunu sınayın. Hiç sınanmamış geri dönüş mantığı gerçek bir kesintide güvenilmezdir.

import pytest
from unittest.mock import AsyncMock, patch

@pytest.mark.asyncio
async def test_fallback_on_primary_timeout():
    # Primary provider times out
    with patch('your_module.call_provider', side_effect=[
        openai.APITimeoutError('Timeout'),  # primary fails
        'Claude response'                   # fallback succeeds
    ]):
        result = await call_with_circuit_breaker([{'role': 'user', 'content': 'Hello'}])
    assert result == 'Claude response'

Sağlayıcı Zincirlerinde Maliyet Hususları

Yedek sağlayıcıların fiyatlandırması çoğu zaman birincil sağlayıcınızdan farklıdır. Anthropic Claude, model katmanına bağlı olarak OpenAI GPT-4o’dan daha pahalı veya daha ucuz olabilir. Her isteğe hangi sağlayıcının yanıt verdiğini izleyin ve maliyet dağılımını ayrı ayrı hesaplayın. Yedek sağlayıcı sürekli olarak daha pahalıysa birincil sağlayıcının yetersiz kaynakla çalışıp çalışmadığını ve daha yüksek bir hız sınırı katmanına geçmenin sık yedek sağlayıcı kullanımından daha uygun maliyetli olup olmayacağını araştırın.

# Approximate costs per 1M tokens (2026):
PROVIDER_COSTS = {
    'openai/gpt-4o':          {'input': 2.50, 'output': 10.00},
    'anthropic/claude-3.5-sonnet': {'input': 3.00, 'output': 15.00},
    'openai/gpt-4o-mini':     {'input': 0.15, 'output': 0.60},
    'local/llama-3.1-8b':     {'input': 0.00, 'output': 0.00},  # infra cost only
}

# If fallback adds $0.50/day and a Tier 2 upgrade costs $100/month:
# Tier 2 pays off if you use fallback > 200 requests/day

Kısa Kontrol

Devre kesiciler ve yedek sağlayıcılar hakkındaki anlayışınızı sınayın.

Ders Özeti

Bu derste şunları öğrendiniz: sağlayıcı zincirleri, birincil sağlayıcılardan yedek LLM sağlayıcılarına uzanan sıralı bir yedekleme dizisi tanımlar; devre kesiciler, belirli bir hata eşiğine ulaşıldığında hızlıca kısa devre yaparak arızalı bir sağlayıcıya tekrar tekrar istek gönderilmesini önler; sağlayıcı başına zaman aşımı değerleri ise yavaş çağrıların kullanıcıları bekletmek yerine hızlıca yedek sağlayıcıya geçmesini sağlar. Sırada zaman aşımı bütçelerini ayarlayıp zarif gerileme uygulayacağız.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Python öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
30
Dersler
120

Sıkça Sorulan Sorular

“Geri Dönüş Sağlayıcıları ve Devre Kesiciler” dersi ücretsiz mi?

Evet — “Geri Dönüş Sağlayıcıları ve Devre Kesiciler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“Geri Dönüş Sağlayıcıları ve Devre Kesiciler” dersinde ne öğreneceğim?

Birincil sağlayıcı yavaş veya kullanılamaz olduğunda devre kesici deseniyle OpenAI'dan Anthropic'e, oradan da yerel bir modele otomatik olarak geçen bir sağlayıcı zinciri oluşturun. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Geri Dönüş Sağlayıcıları ve Devre Kesiciler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. LLM Gecikmesini Ölçme: TTFT ve TPOT
  2. Yük Dengeleme ve Birden Çok Anahtar Stratejileri
  3. Geri Dönüş Sağlayıcıları ve Devre Kesiciler
  4. Zaman Aşımı Bütçeleri ve Zarif Bozulma
← AI Engineering Academy Sayfasına Dön