Dağıtım ve Geri Alma Stratejileri
Mavi-yeşil istem dağıtımı, özellik bayrakları ve gerileme durumunda geri alma.
Dağıtım ve Geri Alma Stratejileri, CoddyKit'te ücretsiz bir AI Prompt Engineering 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 Prompt Engineering öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Prompt Engineering kursu toplamda 4 dersten oluşur.
İstem Dağıtımının Zorlukları
Yeni bir istem sürümünü üretime dağıtmak gerçek risk taşır; ortalama kaliteyi artıran bir değişiklik, uç durumlara zarar verebilir, gecikme artışlarına yol açabilir veya kullanıcıların kafasını karıştırabilir. Denetimli dağıtım stratejileri, etki alanını sınırlayarak ve hızlı geri almayı mümkün kılarak bu riski yönetir.
Mavi-Yeşil İstem Dağıtımı
Mavi-yeşil dağıtım iki ortam bulundurur: mavi (mevcut üretim) ve yeşil (yeni sürüm). Doğrulama sonrasında trafik atomik olarak maviden yeşile aktarılır. Yeşil başarısız olursa geçiş anında geri alınır.
- Sıfır kesintiyle geçişler
- Her iki sürüm de aynı anda hazır tutulur
- Geri alma, yeniden dağıtım değil, tek bir yapılandırma değişikliğidir
# prompt_router.py — blue/green traffic control
class PromptRouter:
def __init__(self):
self.slots = {
'blue': None, # {'prompt_id': ..., 'version': ...}
'green': None,
}
self.active_slot = 'blue'
def load_slot(self, slot, prompt_id, version, template):
self.slots[slot] = {
'prompt_id': prompt_id,
'version': version,
'template': template
}
print(f'Loaded {prompt_id}@{version} into {slot} slot')
def switch_to(self, slot):
if not self.slots[slot]:
raise ValueError(f'Slot {slot} is empty')
self.active_slot = slot
info = self.slots[slot]
print(f'Traffic now routed to {slot}: {info["prompt_id"]}@{info["version"]}')
def get_active_template(self):
return self.slots[self.active_slot]['template']Kademeli Yayına Alma için Trafiği Bölme
Trafiğin %100'ünü bir anda değiştirmek yerine, yeni sürüme gönderilen payı kademeli olarak artırın. Yaygın artış dizisi şöyledir: %1 → %5 → %10 → %25 → %50 → %100; her adımda kalite izlenir.
import random
class TrafficSplitter:
def __init__(self):
# version_weights: {version_id: percentage}
self.version_weights = {
'v1.1.0': 90,
'v1.2.0': 10
}
def select_version(self):
versions = list(self.version_weights.keys())
weights = list(self.version_weights.values())
return random.choices(versions, weights=weights, k=1)[0]
def update_split(self, new_weights):
assert sum(new_weights.values()) == 100, 'Weights must sum to 100'
self.version_weights = new_weights
print(f'Traffic split updated: {new_weights}')
# Usage
splitter = TrafficSplitter()
for _ in range(5):
print(splitter.select_version())
# Ramp to 25%
splitter.update_split({'v1.1.0': 75, 'v1.2.0': 25})İstem Yayına Alımı için Özellik Bayrakları
Özellik bayrakları, tam yayına almadan önce yeni bir istem sürümünü belirli kullanıcılar veya segmentler (beta kullanıcıları, kurum içi personel) için etkinleştirmenizi sağlar. Bu yaklaşım, kademeli yayına almanın güvenliğini gerçek dünyadaki kullanım örneklerine yönelik hedefli sınamayla birleştirir.
# Feature flag-based prompt selection
BETA_USER_IDS = {'user_123', 'user_456', 'user_789'}
def select_prompt_version(user_id, prompt_id, registry):
# Check if user is in beta cohort
if user_id in BETA_USER_IDS:
# Try to get a beta version tagged for this prompt
beta = registry.get_version_by_tag(prompt_id, tag='beta')
if beta:
return beta
# Default: serve active (stable) version
return registry.get_active(prompt_id)
# Example: LaunchDarkly-style flag check
def select_prompt_ld(user_id, ld_client, registry):
use_new = ld_client.variation(
'use-summarize-v2', {'key': user_id}, default=False
)
version = 'v2.0.0' if use_new else 'v1.1.0'
return registry.get_version(prompt_id='summarize-article', version=version)Yeni Sürüm Kalitesini İzleme
Yeni bir sürüme trafik yönlendirdikten sonra şu sinyalleri gerçek zamanlı olarak izleyin:
- Hata oranı: API hataları, biçimi bozuk çıktılar, ayrıştırma başarısızlıkları
- Gecikme: P95 yanıt süresi (yeni istemler daha uzun ve daha yavaş olabilir)
- Kalite puanı: bir LLM değerlendiricisinden veya ölçümden alınan otomatik değerlendirme puanı
- Kullanıcı sinyalleri: olumsuz değerlendirme oranı, yeniden deneme oranı, oturum terk oranı
from collections import defaultdict
import time
class VersionMonitor:
def __init__(self):
self.metrics = defaultdict(lambda: {
'calls': 0, 'errors': 0,
'latency_sum': 0, 'quality_sum': 0
})
def record(self, version, latency_ms, quality_score, error=False):
m = self.metrics[version]
m['calls'] += 1
m['latency_sum'] += latency_ms
m['quality_sum'] += quality_score
if error:
m['errors'] += 1
def report(self, version):
m = self.metrics[version]
n = m['calls'] or 1
return {
'version': version,
'calls': m['calls'],
'error_rate': round(m['errors'] / n, 3),
'avg_latency_ms': round(m['latency_sum'] / n),
'avg_quality': round(m['quality_sum'] / n, 2)
}Kalite Gerilemesinde Otomatik Geri Alma
Elle geri alma, üretim olayları için çok yavaştır. İhlal edildiklerinde önceki sürüme otomatik olarak dönülmesini sağlayan geri alma tetikleyicileri — eşikler — tanımlayın.
ROLLBACK_THRESHOLDS = {
'error_rate': 0.05, # > 5% errors trigger rollback
'avg_latency_ms': 10000, # > 10s avg latency triggers rollback
'avg_quality': 3.5 # < 3.5 quality score triggers rollback
}
def check_and_rollback(monitor, registry, version, previous_version):
report = monitor.report(version)
triggers = []
if report['error_rate'] > ROLLBACK_THRESHOLDS['error_rate']:
triggers.append(f'error_rate={report["error_rate"]}')
if report['avg_latency_ms'] > ROLLBACK_THRESHOLDS['avg_latency_ms']:
triggers.append(f'latency={report["avg_latency_ms"]}ms')
if report['avg_quality'] < ROLLBACK_THRESHOLDS['avg_quality']:
triggers.append(f'quality={report["avg_quality"]}')
if triggers:
print(f'ROLLBACK TRIGGERED: {triggers}')
registry.activate_version('summarize-article', previous_version)
alert_oncall(f'Prompt auto-rolled back to {previous_version}: {triggers}')
return True
return FalseKanarya Dağıtım Deseni
Kanarya, yeni istem sürümünü ilk alan küçük bir trafik dilimidir (%1-5). Kanarya, bekletme süresinin ardından sağlıklıysa trafik kademeli olarak yeni sürüme aktarılır. Değilse yalnızca kanarya kullanıcıları etkilenmiş olur.
import time
def canary_deploy(registry, splitter, monitor, new_version, prev_version,
soak_minutes=30, stages=[1, 5, 25, 50, 100]):
for pct in stages:
splitter.update_split({
prev_version: 100 - pct,
new_version: pct
})
print(f'Stage: {pct}% canary. Soaking for {soak_minutes} min...')
time.sleep(soak_minutes * 60) # wait soak period
should_rollback = check_and_rollback(
monitor, registry, new_version, prev_version
)
if should_rollback:
splitter.update_split({prev_version: 100})
print('Canary aborted. Fully reverted to', prev_version)
return False
print(f'Stage {pct}% passed quality check.')
print(f'Canary complete. {new_version} now at 100%.')
return TrueDağıtım İşlem Hattı Orkestrasyonu
Tam bir istem dağıtım işlem hattı; doğrulamayı, kanaryayı başlatmayı, izleme döngüsünü ve son yayına alma veya geri alma işlemini bir araya getirir. Tüm bunlar otomatikleştirilir ve önemli aşamalarda insan onayı kapıları bulunur.
# deploy_prompt.py — full pipeline
import argparse
def deploy(prompt_id, new_version, prev_version, dry_run=False):
print(f'=== Deploying {prompt_id}: {prev_version} -> {new_version} ===')
# 1. Validate new version exists in registry
artifact = registry.get_version(prompt_id, new_version)
print(f'Found artifact: {artifact["version"]}')
# 2. Run offline eval suite
score = run_eval_suite(artifact['template'])
if score < 0.90:
raise RuntimeError(f'Eval score {score} below threshold 0.90')
print(f'Eval passed: {score}')
if dry_run:
print('Dry run complete. Not deploying.')
return
# 3. Canary deploy with automatic rollback
success = canary_deploy(
registry, splitter, monitor,
new_version, prev_version,
soak_minutes=15, stages=[1, 5, 25, 100]
)
print('Deployment', 'SUCCEEDED' if success else 'FAILED')
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--new', required=True)
parser.add_argument('--prev', required=True)
parser.add_argument('--dry-run', action='store_true')
args = parser.parse_args()
deploy('summarize-article', args.new, args.prev, args.dry_run)Elle Geri Alma Yordamı
Otomatik geri alma tetiklenmediğinde ancak bir kişi kalite sorunlarını fark ettiğinde, elle geri alma çalışma kılavuzu hızlı ve tutarlı bir eylem yürütülmesini sağlar.
# RUNBOOK: Manual Prompt Rollback
# Estimated time to execute: 2-3 minutes
# Step 1: Identify current and target versions
python manage.py prompt list-versions --prompt-id summarize-article
# Output:
# v1.2.0 [ACTIVE] 2024-08-15 alice
# v1.1.0 [stable] 2024-07-01 alice
# Step 2: Activate previous stable version
python manage.py prompt activate --prompt-id summarize-article --version v1.1.0
# Output: Activated summarize-article@v1.1.0
# Step 3: Verify traffic is serving old version
python manage.py prompt verify --prompt-id summarize-article
# Output: Active version: v1.1.0 Serving: 100%
# Step 4: Log the incident
python manage.py incident create \
--title 'Prompt rollback: summarize-article v1.2.0 -> v1.1.0' \
--severity P2 \
--reason 'Quality score dropped from 4.1 to 3.2 after v1.2.0 deploy'Kod Olarak Dağıtım Yapılandırması
Dağıtım yapılandırmasını sürüm denetimli dosyalarda tanımlayın; böylece tüm dağıtım kararları denetlenebilir ve yeniden üretilebilir olur.
# deployments/summarize-article.yaml
prompt_id: summarize-article
current_stable: '1.1.0'
canary_config:
stages: [1, 5, 25, 50, 100]
soak_minutes_per_stage: 15
rollback_thresholds:
error_rate_max: 0.05
latency_p95_max_ms: 8000
quality_score_min: 3.5
feature_flags:
beta_group: [user_123, user_456]
alerts:
pagerduty_key: 'PD_KEY_PLACEHOLDER'
slack_channel: '#prompt-alerts'
# Load and apply with a deploy script
import yaml
with open('deployments/summarize-article.yaml') as f:
config = yaml.safe_load(f)
print('Deploying with config:', config['canary_config'])Nöbetçi Ekip Çalışma Kılavuzları ve Olay Sonrası İncelemeler
Herhangi bir geri alma işleminden veya olaydan sonra şunları belgeleyen bir olay sonrası inceleme yazın: ne oldu, temel neden, zaman çizelgesi ve yapılacaklar. Çalıştırma kılavuzları olay sonrası incelemeye referans vermeli ve edinilen derslerle güncellenmelidir.
# Post-mortem template (stored in docs/post-mortems/)
## Incident: summarize-article v1.2.0 quality regression
## Date: 2024-08-15
## Severity: P2
## Duration: 47 minutes (09:15 - 10:02 UTC)
### What happened
Deployed v1.2.0 of summarize-article. At 5% canary, quality score dropped
from 4.1 to 3.0 for articles over 2000 words.
### Root cause
New prompt template removed the explicit length constraint instruction.
Long articles caused the model to generate overly verbose summaries.
### Timeline
09:15 v1.2.0 deployed to 5% canary
09:28 Quality monitor detected avg_quality < 3.5
09:29 Auto-rollback triggered to v1.1.0
09:32 Incident acknowledged by on-call
10:02 Post-mortem drafted
### Action items
- [ ] Add length regression test to eval suite
- [ ] Update canary monitoring to separate metrics by article length
- [ ] Add changelog requirement: 'length behavior' fieldHızlı Kontrol
Mavi-yeşil istem dağıtımında, yeşil yuva kalite kontrollerinden geçemezse ne olur?
Dağıtım Stratejisi Özeti
Üretim ortamında istem dağıtımı, riski yönetmek için yapılandırılmış stratejiler gerektirir:
- Mavi-yeşil: iki canlı ortam ve anında atomik geçiş
- Canary: her aşamada kalite kontrolleriyle trafiği %1 → %5 → %25 → %100 oranında kademeli artırma
- Özellik bayrakları: geniş çaplı kullanıma sunmadan önce beta kullanıcılarını hedefleme
- Otomatik geri alma: bir eşik tetiklendiğinde geri dönme (hata oranı, gecikme, kalite)
- Çalıştırma kılavuzları: nöbetçi mühendisler için belgelenmiş manuel geri alma prosedürleri
- Olay sonrası incelemeler: her olaydan sonra sürekli iyileştirme
Yapay zeka eğitmeniyle AI Prompt Engineering öğ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
- 53
- Dersler
- 199
Sıkça Sorulan Sorular
“Dağıtım ve Geri Alma Stratejileri” dersi ücretsiz mi?
Evet — “Dağıtım ve Geri Alma Stratejileri” 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 Prompt Engineering kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Prompt Engineering kursu toplamda 4 dersten oluşur.
“Dağıtım ve Geri Alma Stratejileri” dersinde ne öğreneceğim?
Mavi-yeşil istem dağıtımı, özellik bayrakları ve gerileme durumunda geri alma. AI Prompt Engineering 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 Prompt Engineering öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Prompt Engineering, 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.
“Dağıtım ve Geri Alma Stratejileri” 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 Prompt Engineering dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Prompt Engineering 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
- İstem Kayıt Defteri Mimarisi
- İstemler İçin Sürüm Denetimi
- Dağıtım ve Geri Alma Stratejileri
- Üretimde İstem Performansını İzleme