Kendini İyileştiren İstem Sistemleri
İstemleri otomatik olarak iyileştiren geri bildirim → eleştiri → yeniden yazma döngüleri.
Kendini İyileştiren İstem Sistemleri, 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.
Kendi Kendini İyileştirme Döngüsü
Kendi kendini iyileştiren bir istem sistemi bir geri bildirim döngüsü oluşturur: istemi sınama durumlarında çalıştırır, çıktıları değerlendirir, istemi eleştirir, yeniden yazar ve tekrarlar. Her yineleme ölçülebilir biçimde daha iyi sonuçlar üretmelidir. Bu, her döngüde insan müdahalesi olmadan gerçekleştirilen otomatik istem optimizasyonudur.
Döngü Mimarısına Genel Bakış
Kendi kendini iyileştirme döngüsünün beş bileşeni vardır: Yürütücü (istemi çalıştırır), Değerlendirici (çıktılara puan verir), Eleştirmen (istemin zayıflıklarını belirler), Yeniden Yazıcı (istemi iyileştirir) ve Geçmiş (tüm yinelemeleri izler). Her biri bir LLM çağrısı olarak uygulanır.
import anthropic
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
class SelfImprovingPromptSystem:
def __init__(self, initial_prompt, test_cases, eval_fn, max_iterations=5):
self.current_prompt = initial_prompt
self.test_cases = test_cases
self.eval_fn = eval_fn
self.max_iterations = max_iterations
self.history = [] # [(iteration, prompt, score, critique)]
def run(self):
for i in range(self.max_iterations):
print(f'=== Iteration {i+1}/{self.max_iterations} ===')
score = self._evaluate_prompt()
print(f'Score: {score:.2f}')
self.history.append((i, self.current_prompt, score))
if score >= 0.95:
print('Target score reached. Stopping.')
break
critique = self._critique_prompt(score)
self.current_prompt = self._rewrite_prompt(critique)
return self.best_prompt()
def best_prompt(self):
return max(self.history, key=lambda x: x[2])[1]Yürütücü: İstemi Çalıştırma
Yürütücü, mevcut istemi her sınama durumuna uygular ve çıktıları toplar. Bu, standart bir LLM çağrısı döngüsüdür; burada özel bir şey yoktur, ancak hangi sınama durumunun hangi çıktıyı ürettiğini izlemek çok önemlidir.
def _execute_prompt(self, prompt):
outputs = []
for case in self.test_cases:
response = client.messages.create(
model='claude-haiku-4-5', # use cheaper model for execution
max_tokens=500,
messages=[
{'role': 'user', 'content': prompt + '\n\nInput: ' + case['input']}
]
)
outputs.append({
'case_id': case['id'],
'input': case['input'],
'expected': case['expected'],
'actual': response.content[0].text
})
return outputs
# Bind method to class (demonstration)
SelfImprovingPromptSystem._execute = _execute_prompt
# Sample test cases
test_cases = [
{'id': 1, 'input': 'The meeting was cancelled.', 'expected': 'negative'},
{'id': 2, 'input': 'Great product, love it!', 'expected': 'positive'},
{'id': 3, 'input': 'It arrived on time.', 'expected': 'neutral'},
]
print(f'Test suite: {len(test_cases)} cases')Değerlendirici: Çıktılara Puan Verme
Değerlendirici, yürütücünün çıktılarına beklenen yanıtlarla karşılaştırarak puan verir. Tam eşleşme, yaklaşık eşleşme veya açık uçlu görevler için ayrı bir LLM değerlendiricisi kullanabilir.
def _evaluate_prompt(self):
outputs = self._execute(self.current_prompt)
correct = 0
failed_cases = []
for out in outputs:
# Exact match for classification tasks
if out['expected'].lower() in out['actual'].lower():
correct += 1
else:
failed_cases.append(out)
score = correct / len(outputs)
self._last_failed_cases = failed_cases
return score
# For open-ended tasks: LLM-as-judge evaluator
JUDGE_PROMPT = '''Rate the quality of this AI response (1-5).
Task: {task_description}
Input: {input}
Expected approach: {expected}
Actual response: {actual}
Return only the integer score (1-5). No explanation.'''
def llm_judge_score(task_desc, input_text, expected, actual):
response = client.messages.create(
model='claude-haiku-4-5', max_tokens=5,
messages=[{'role': 'user', 'content':
JUDGE_PROMPT.format(
task_description=task_desc, input=input_text,
expected=expected, actual=actual
)}]
)
try:
return int(response.content[0].text.strip()) / 5.0
except ValueError:
return 0.5Eleştirmen: İstem Zayıflıklarını Belirleme
Eleştirmen, belirli zayıflıkları saptamak için başarısız durumları ve mevcut istemi analiz eder. Bu, meta-istem oluşturmanın temel adımıdır: model kendi istemini eleştirir.
CRITIC_PROMPT = '''You are a prompt engineering expert analyzing why a prompt fails.
Current prompt:
{current_prompt}
Failed test cases (where the prompt gave wrong outputs):
{failed_cases}
For each failure, explain:
1. What went wrong in the output
2. Which part of the prompt caused or failed to prevent this
3. A specific, actionable fix
End with a prioritized list of the top 3 prompt improvements to make.
Be specific — quote the relevant prompt section and suggest the exact replacement.'''
def _critique_prompt(self, score):
failed_json = '\n'.join(
f'Input: {c["input"]}\nExpected: {c["expected"]}\nActual: {c["actual"]}'
for c in self._last_failed_cases[:5]
)
response = client.messages.create(
model='claude-opus-4-5', max_tokens=1000,
messages=[{'role': 'user', 'content':
CRITIC_PROMPT.format(
current_prompt=self.current_prompt,
failed_cases=failed_json
)}]
)
return response.content[0].textYeniden Yazıcı: İstemi İyileştirme
Yeniden yazıcı, eleştirmenin analizini alır ve istemin iyileştirilmiş bir sürümünü üretir. Temel kısıt şudur: bu, tamamen yeniden yazma değil, hedefli bir iyileştirme olmalıdır.
REWRITER_PROMPT = '''You are a prompt engineer. Improve the prompt based on the critique below.
Current prompt:
{current_prompt}
Critique and suggested improvements:
{critique}
Rules for rewriting:
1. Make TARGETED changes based on the critique — do not rewrite everything
2. Keep all parts of the prompt that were working well
3. Apply all prioritized fixes from the critique
4. Do not add unnecessary verbosity — conciseness is a quality
5. Output ONLY the improved prompt, no explanation
Improved prompt:'''
def _rewrite_prompt(self, critique):
response = client.messages.create(
model='claude-opus-4-5', max_tokens=1000,
messages=[{'role': 'user', 'content':
REWRITER_PROMPT.format(
current_prompt=self.current_prompt,
critique=critique
)}]
)
new_prompt = response.content[0].text.strip()
print(f'Prompt updated. Length: {len(new_prompt)} chars '
f'(was {len(self.current_prompt)} chars)')
return new_promptTam Döngü: Bir Araya Getirme
Tüm bileşenlerin birbirine bağlandığı ve temel yakınsama tespitinin eklendiği eksiksiz kendi kendini iyileştirme döngüsü aşağıda gösterilmiştir.
def run_improvement_loop(initial_prompt, test_cases, max_iterations=5,
target_score=0.90):
history = []
current_prompt = initial_prompt
last_failed_cases = []
for i in range(max_iterations):
print(f'\n--- Iteration {i+1} ---')
# Execute
outputs = execute_prompt(current_prompt, test_cases)
# Evaluate
score, failed_cases = evaluate_outputs(outputs)
last_failed_cases = failed_cases
print(f'Score: {score:.2f} ({len(failed_cases)} failures)')
history.append({'iteration': i, 'prompt': current_prompt, 'score': score})
if score >= target_score:
print(f'Target score {target_score} reached!')
break
if not failed_cases:
print('No failures to learn from. Stopping.')
break
# Critique and rewrite
critique = critique_prompt(current_prompt, failed_cases)
current_prompt = rewrite_prompt(current_prompt, critique)
best = max(history, key=lambda x: x['score'])
print(f'\nBest prompt at iteration {best["iteration"]+1} with score {best["score"]:.2f}')
return best['prompt'], historyKendi Kendini İyileştirme Döngülerinde Maliyet Yönetimi
Kendi kendini iyileştirme döngüleri pahalı olabilir; her yineleme birden çok API çağrısı yapar. Maliyet yönetimi stratejileri döngünün uygun maliyetli kalmasını sağlar.
# Cost optimization strategies
# 1. Use cheap model for execution, expensive model for critique/rewrite
def execute_prompt(prompt, test_cases):
# Use cheapest capable model
model = 'claude-haiku-4-5'
# ... execute ...
pass
def critique_prompt(prompt, failed_cases):
# Use best model for reasoning about why the prompt fails
model = 'claude-opus-4-5'
# ... critique ...
pass
# 2. Limit test suite size (sample from larger set)
import random
def get_evaluation_sample(full_test_suite, sample_size=20):
if len(full_test_suite) <= sample_size:
return full_test_suite
return random.sample(full_test_suite, sample_size)
# 3. Early stopping: stop if score doesn't improve
def has_converged(history, patience=2, min_delta=0.02):
if len(history) < patience + 1:
return False
recent_scores = [h['score'] for h in history[-patience:]]
best_recent = max(recent_scores)
baseline = history[-(patience+1)]['score']
return (best_recent - baseline) < min_delta
print('Cost optimization: cheap model for execution, expensive for critique')İstem Soy Geçmişini İzleme
Kendi kendini iyileştirme döngüsünde her istem sürümü, onu tetikleyen başarısızlık analizine kadar izlenebilmelidir. Bu soy geçmişi, beklenmeyen gerilemelerin hatalarının ayıklanmasına yardımcı olur ve insan incelemesini destekler.
class PromptLineage:
def __init__(self):
self.lineage = []
def record(self, iteration, prompt, score, critique=None,
failed_case_ids=None):
self.lineage.append({
'iteration': iteration,
'prompt': prompt,
'score': score,
'critique_summary': critique[:100] if critique else None,
'failed_case_ids': failed_case_ids or [],
'prompt_length': len(prompt.split())
})
def print_history(self):
print('Prompt improvement history:')
for entry in self.lineage:
print(
f' Iter {entry["iteration"]}: '
f'score={entry["score"]:.2f} '
f'words={entry["prompt_length"]} '
f'failures={len(entry["failed_case_ids"])}'
)
def get_best(self):
return max(self.lineage, key=lambda x: x['score'])
lineage = PromptLineage()
lineage.record(0, 'Initial simple prompt', 0.60)
lineage.record(1, 'Improved with examples', 0.75, 'Missing edge cases')
lineage.record(2, 'Added edge case handling', 0.92, 'Minor format issue')
lineage.print_history()İstem Sürümü Geçmişini Görselleştirme
Yinelemeler boyunca puanların ilerleyişini görselleştirmek, döngünün yakınsayıp yakınsamadığını ve ne kadar hızlı yakınsadığını belirlemeye yardımcı olur. Basit bir metin grafiği, grafik kitaplığı olmadan eğilimleri hemen görünür kılar.
def visualize_improvement_history(history):
'''
history: list of (iteration, prompt, score)
Prints an ASCII chart of score progression.
'''
if not history:
print('No history to visualize.')
return
max_score = 1.0
bar_width = 40
print('\nScore Progression:')
print('-' * (bar_width + 20))
for iteration, prompt, score in history:
filled = int(score * bar_width)
bar = '#' * filled + '-' * (bar_width - filled)
marker = ' <-- BEST' if score == max(h[2] for h in history) else ''
print(f'Iter {iteration:2d}: [{bar}] {score:.3f}{marker}')
final_score = history[-1][2]
best_score = max(h[2] for h in history)
gain = best_score - history[0][2]
print('-' * (bar_width + 20))
print(f'Initial: {history[0][2]:.3f} -> Best: {best_score:.3f} (gain: +{gain:.3f})')
# Example
sample_history = [
(0, 'v0', 0.60),
(1, 'v1', 0.72),
(2, 'v2', 0.78),
(3, 'v3', 0.77),
(4, 'v4', 0.85)
]
visualize_improvement_history(sample_history)Gerileme Tespiti
Yeniden yazılmış bir istem bazı başarısızlıkları düzeltirken daha önce başarılı olan durumları bozabilir; buna gerileme denir. Her yinelemeden sonra hangi belirli sınama durumlarının durum değiştirdiğini karşılaştırarak gerilemeleri mutlaka denetleyin.
def detect_regressions(old_outputs, new_outputs):
old_results = {o['case_id']: o['correct'] for o in old_outputs}
new_results = {o['case_id']: o['correct'] for o in new_outputs}
regressions = []
improvements = []
for case_id in old_results:
was_correct = old_results[case_id]
is_correct = new_results.get(case_id, False)
if was_correct and not is_correct:
regressions.append(case_id)
elif not was_correct and is_correct:
improvements.append(case_id)
print(f'Fixed: {len(improvements)} cases. Regressed: {len(regressions)} cases.')
if regressions:
print(f'WARNING: Regression on cases: {regressions}')
print('Consider reverting to previous prompt version.')
return regressions, improvements
# Example
old = [{'case_id': 1, 'correct': True}, {'case_id': 2, 'correct': False}]
new = [{'case_id': 1, 'correct': False}, {'case_id': 2, 'correct': True}]
detect_regressions(old, new) # Fixed: 1, Regressed: 1Hızlı Kontrol
Kendi kendini iyileştiren bir istem döngüsünde Eleştirmen bileşeninin amacı nedir?
Kendi Kendini İyileştiren İstem Sistemleri Özeti
Kendi kendini iyileştiren istem sistemleri, istem optimizasyonu döngüsünü otomatikleştirir:
- Döngü yapısı: Yürüt → Değerlendir → Eleştir → Yeniden Yaz → tekrarla
- Yürütücü: istemi sınama durumlarında çalıştırır (ucuz bir model kullanın)
- Değerlendirici: çıktılara tam eşleşme veya LLM değerlendiricisiyle puan verir
- Eleştirmen: başarısızlıklardan hareketle belirli istem zayıflıklarını belirleyen meta-istemi kullanır
- Yeniden yazıcı: eleştiriyi kullanarak hedefli iyileştirme yapar (en iyi modeli kullanın)
- Yakınsama: hedef puana ulaşıldığında veya puan artık iyileşmediğinde durur
- Gerileme tespiti: iyileştirmelerin başarılı durumları bozmadığını her zaman denetler
Sıkça Sorulan Sorular
“Kendini İyileştiren İstem Sistemleri” dersi ücretsiz mi?
Evet — “Kendini İyileştiren İstem Sistemleri” 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.
“Kendini İyileştiren İstem Sistemleri” dersinde ne öğreneceğim?
İstemleri otomatik olarak iyileştiren geri bildirim → eleştiri → yeniden yazma döngüleri. 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.
“Kendini İyileştiren İstem Sistemleri” 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
- Meta-İstem Oluşturma Nedir
- İstem Üreten İstemler
- Kendini İyileştiren İstem Sistemleri
- Kendini İyileştirmede Değerlendirme ve Seçim