Yansıtma ve Öz Eleştiri Döngüleri
Kendi çıktılarını değerlendiren ve iyileştirme önerileri oluşturan aracılar.
Yansıtma ve Öz Eleştiri Döngüleri, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 2. 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 Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Ajanın Öz Değerlendirmesi Nedir?
Öz değerlendirme, ajandan az önce tamamladığı çıktıyı kullanıcıya döndürmeden önce (before) veya hemen sonra değerlendirmesini isteme uygulamasıdır. Ajan kendi eleştirmeni gibi davranır.
Bu, uzman insanların çalışmalarını gözden geçirme biçimini yansıtır: taslak → eleştiri → gözden geçirme. Bu döngünün ajanlara eklenmesi, temel modelde hiçbir değişiklik yapılmadan çıktı kalitesini çoğu zaman artırır.
Öz Değerlendirme İstemi Örüntüsü
Ajan bir yanıt ürettikten sonra yanıtı yapılandırılmış bir öz değerlendirme istemiyle modele geri besleyin. Model daha sonra zayıf yönleri belirler ve iyileştirmeler önerir.
import anthropic
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
def reflect_on_response(task: str, response: str) -> str:
reflection_prompt = (
'You just completed the following task:\n\n'
f'TASK: {task}\n\n'
f'YOUR RESPONSE:\n{response}\n\n'
'Please reflect on your performance by answering:\n'
'1. What did you do well?\n'
'2. What could be improved?\n'
'3. What would you do differently if you had to redo this?\n'
'Be specific and honest.'
)
result = client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
messages=[{'role': 'user', 'content': reflection_prompt}]
)
return result.content[0].textYapılandırılmış Öz Değerlendirme Çıktısı
Yapılandırılmamış öz değerlendirme metinlerini program aracılığıyla işlemek zordur. Puanları ve eylem maddelerini güvenilir biçimde çıkarabilmek için modelden yapılandırılmış bir JSON öz değerlendirmesi üretmesini isteyin.
STRUCTURED_REFLECTION_PROMPT = '''
Reflect on the task and response above. Return ONLY valid JSON:
{
"strengths": ["..."],
"weaknesses": ["..."],
"alternative_approach": "...",
"quality_score": 0.0,
"retry_recommended": false
}
quality_score: 0.0 (terrible) to 1.0 (excellent).
retry_recommended: true if quality_score < 0.6.
'''
import json
def structured_reflect(task: str, response: str, client) -> dict:
prompt = f'TASK: {task}\n\nRESPONSE: {response}\n\n{STRUCTURED_REFLECTION_PROMPT}'
result = client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
messages=[{'role': 'user', 'content': prompt}]
)
text = result.content[0].text.strip()
# strip markdown code fences if present
if text.startswith('```'):
text = text.split('```')[1].lstrip('json').strip()
return json.loads(text)
if __name__ == '__main__':
class FakeContent:
def __init__(self, text):
self.text = text
class FakeResponse:
def __init__(self, text):
self.content = [FakeContent(text)]
class FakeMessages:
def create(self, **kwargs):
return FakeResponse(
'{"strengths": ["clear"], "weaknesses": ["too long"], '
'"alternative_approach": "be more concise", '
'"quality_score": 0.7, "retry_recommended": false}'
)
class FakeClient:
def __init__(self):
self.messages = FakeMessages()
result = structured_reflect('Summarize the article', 'A very long response...', FakeClient())
print('quality_score:', result['quality_score'])
print('weaknesses:', result['weaknesses'])
Öz Eleştiri Döngüsü: Düşük Puanla Yeniden Deneme
Öz değerlendirme puanı bir eşik değerinin altına düştüğünde, öz değerlendirmedeki zayıf yönleri ve alternatif yaklaşımı ek bağlam olarak kullanarak görevi otomatik biçimde yeniden deneyin. Böylece tek bir ajan çalışması içinde geri bildirimle yönlendirilen bir iyileştirme döngüsü oluşur.
def agent_with_self_critique(task: str, client, max_retries: int = 2) -> str:
response = run_agent(task, client)
for attempt in range(max_retries):
reflection = structured_reflect(task, response, client)
print(f'Attempt {attempt+1} quality: {reflection["quality_score"]:.2f}')
if not reflection['retry_recommended']:
break
# Enrich the task with reflection insights
improved_task = (
f'{task}\n\n'
'Previous attempt weaknesses:\n'
+ '\n'.join(f'- {w}' for w in reflection['weaknesses'])
+ f'\n\nSuggested approach: {reflection["alternative_approach"]}'
)
response = run_agent(improved_task, client)
return response
def run_agent(task: str, client) -> str:
result = client.messages.create(
model='claude-opus-4-5',
max_tokens=1024,
messages=[{'role': 'user', 'content': task}]
)
return result.content[0].textÖz Değerlendirmeler İçin Epizodik Bellek
Tek bir öz değerlendirme bir kez yararlıdır; saklanan öz değerlendirmeler, ajanın oturumlar arasında öğrenmesine yardımcı olan epizodik belleğe dönüşür. Her öz değerlendirme bir epizottur: görev bağlamı + ne olduğu + ajanın ne öğrendiği.
from datetime import datetime
from dataclasses import dataclass, asdict
from typing import Optional
@dataclass
class ReflectionEpisode:
episode_id: str
task_type: str # e.g. 'summarize', 'code_review', 'translate'
task_summary: str # short description (not full text)
quality_score: float
strengths: list
weaknesses: list
alternative_approach: str
timestamp: str = ''
def __post_init__(self):
if not self.timestamp:
self.timestamp = datetime.utcnow().isoformat()
def to_dict(self) -> dict:
return asdict(self)
# Example
episode = ReflectionEpisode(
episode_id='ep_001',
task_type='summarize',
task_summary='Summarize a 5-page financial report',
quality_score=0.55,
strengths=['Identified key figures'],
weaknesses=['Too verbose', 'Missed conclusion'],
alternative_approach='Lead with the executive summary first'
)
print(episode.to_dict())Öz Değerlendirmeleri Kalıcı Olarak Saklama
Öz değerlendirme epizotlarını bir JSON dosyasına veya veritabanına kalıcı olarak kaydedin. Başlangıçta aynı görev türüne ait son epizotları bağlam olarak eklemek üzere yükleyin — ajan geçmiş performansından öğrenir.
import json
import os
MEMORY_FILE = 'agent_episodic_memory.json'
def save_episode(episode: ReflectionEpisode):
episodes = load_all_episodes()
episodes.append(episode.to_dict())
with open(MEMORY_FILE, 'w') as f:
json.dump(episodes, f, indent=2)
def load_all_episodes() -> list:
if not os.path.exists(MEMORY_FILE):
return []
with open(MEMORY_FILE) as f:
return json.load(f)
def load_recent_episodes(task_type: str, n: int = 3) -> list:
all_ep = load_all_episodes()
matching = [e for e in all_ep if e['task_type'] == task_type]
# Sort by timestamp descending, take most recent n
matching.sort(key=lambda e: e['timestamp'], reverse=True)
return matching[:n]Geçmiş Öz Değerlendirmeleri Bağlam Olarak Ekleme
Bir görevi başlatmadan önce o görev türüne ait en güncel epizodik öz değerlendirmeleri alın ve bunları sistem istemine ekleyin. Ajan artık önceki sefer hangi hataları yaptığını bilir ve bunlardan proaktif biçimde kaçınabilir.
def build_system_prompt_with_memory(task_type: str) -> str:
base = 'You are a helpful AI assistant. Complete the task carefully.'
episodes = load_recent_episodes(task_type, n=3)
if not episodes:
return base
memory_block = '\n\nYour recent performance on similar tasks:\n'
for ep in episodes:
memory_block += (
f'- Score {ep["quality_score"]:.2f}: '
f'Weaknesses: {ep["weaknesses"]}. '
f'Better approach: {ep["alternative_approach"]}\n'
)
memory_block += '\nApply these lessons to your current response.'
return base + memory_block
# Before each task:
system_prompt = build_system_prompt_with_memory('summarize')
print(system_prompt[:300])Araç Kullanımı Üzerine Öz Değerlendirme
Öz değerlendirmeler, ajanın araç çağırma stratejisi üzerine düşünebildiği araç kullanan ajanlar için daha da değerlidir: doğru araçları, doğru sırayla ve doğru parametrelerle mi kullandı?
TOOL_REFLECTION_PROMPT = '''
You completed a multi-step task using tools. Reflect on your tool usage:
Tool call log:
{tool_log}
Final result: {result}
Answer:
1. Were all tool calls necessary?
2. Were there redundant or incorrect calls?
3. What is the optimal tool sequence for this task type?
Return JSON:
{{
"redundant_calls": [],
"incorrect_calls": [],
"optimal_sequence": [],
"efficiency_score": 0.0
}}
'''
def reflect_on_tool_use(tool_log: list, result: str, client) -> dict:
import json
log_str = json.dumps(tool_log, indent=2)
prompt = TOOL_REFLECTION_PROMPT.format(
tool_log=log_str, result=result
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
messages=[{'role': 'user', 'content': prompt}]
)
return json.loads(response.content[0].text)
if __name__ == '__main__':
class FakeContent:
def __init__(self, text):
self.text = text
class FakeResponse:
def __init__(self, text):
self.content = [FakeContent(text)]
class FakeMessages:
def create(self, **kwargs):
return FakeResponse(
'{"redundant_calls": ["search(x)"], "incorrect_calls": [], '
'"optimal_sequence": ["search", "summarize"], "efficiency_score": 0.8}'
)
class FakeClient:
def __init__(self):
self.messages = FakeMessages()
tool_log = [{'tool': 'search', 'args': {'q': 'x'}}, {'tool': 'search', 'args': {'q': 'x'}}]
reflection = reflect_on_tool_use(tool_log, 'Found the answer', FakeClient())
print('Efficiency score:', reflection['efficiency_score'])
print('Redundant calls:', reflection['redundant_calls'])
Epizodik Belleğin Eskimesi ve Budanması
Dünya değişirse veya model güncellenirse eski öz değerlendirmeler geçerliliğini yitirir. Eskime uygulayın: yakın tarihli epizotlara daha fazla ağırlık verin ve belirli bir eşikten daha eski olan veya çok düşük kalite puanına sahip epizotları budayın; bunlar aykırı değerler olabilir.
from datetime import datetime, timedelta
def prune_old_episodes(
episodes: list,
max_age_days: int = 30,
min_quality: float = 0.0
) -> list:
cutoff = datetime.utcnow() - timedelta(days=max_age_days)
kept = []
for ep in episodes:
ep_time = datetime.fromisoformat(ep['timestamp'])
if ep_time >= cutoff and ep['quality_score'] >= min_quality:
kept.append(ep)
return kept
def weighted_episodes(episodes: list) -> list:
now = datetime.utcnow()
for ep in episodes:
age_days = (now - datetime.fromisoformat(ep['timestamp'])).days
# Recency weight: 1.0 today, halves every 7 days
ep['weight'] = 0.5 ** (age_days / 7)
return sorted(episodes, key=lambda e: e['weight'], reverse=True)
if __name__ == '__main__':
now = datetime.utcnow()
episodes = [
{'timestamp': (now - timedelta(days=2)).isoformat(), 'quality_score': 0.9, 'content': 'recent good episode'},
{'timestamp': (now - timedelta(days=45)).isoformat(), 'quality_score': 0.8, 'content': 'old episode'},
{'timestamp': (now - timedelta(days=10)).isoformat(), 'quality_score': 0.3, 'content': 'low quality episode'},
]
kept = prune_old_episodes(episodes, max_age_days=30, min_quality=0.5)
print(f'Kept {len(kept)} of {len(episodes)} episodes after pruning')
for ep in weighted_episodes(kept):
print(f" weight={ep['weight']:.3f} content={ep['content']}")
Öz Değerlendirmenin Etkililiğini Ölçme
İlk denemelerin kalite puanlarını son (öz değerlendirme sonrası) denemelerin kalite puanlarıyla karşılaştırarak öz eleştirinin sonuçları gerçekten iyileştirip iyileştirmediğini takip edin. İyileşme küçükse veya olumsuzsa öz değerlendirme isteminin ayarlanması gerekebilir.
def measure_reflection_gain(run_log: list) -> dict:
"""
run_log: list of dicts with keys 'attempt', 'quality_score'
e.g. [{'attempt': 1, 'quality_score': 0.55}, {'attempt': 2, 'quality_score': 0.78}]
"""
if not run_log:
return {}
first_score = run_log[0]['quality_score']
best_score = max(r['quality_score'] for r in run_log)
final_score = run_log[-1]['quality_score']
return {
'first_attempt_score': first_score,
'final_score': final_score,
'best_score': best_score,
'absolute_gain': final_score - first_score,
'relative_gain_pct': ((final_score - first_score) / max(first_score, 0.001)) * 100,
'retries': len(run_log) - 1
}
log = [
{'attempt': 1, 'quality_score': 0.55},
{'attempt': 2, 'quality_score': 0.78}
]
print(measure_reflection_gain(log))Öz Değerlendirme Döngüsü Güvenlik Önlemleri
Sınırlar olmadan bir öz değerlendirme döngüsü sonsuza kadar çalışabilir. Her zaman şunları zorunlu kılın: en yüksek yeniden deneme sayısı, erken çıkış için asgari puan eşiği ve bir zaman bütçesi. Döngünün işleyişini denetleyebilmek için tüm öz değerlendirmeleri günlüğe kaydedin.
import time
def safe_reflection_loop(
task: str,
client,
max_retries: int = 3,
quality_target: float = 0.75,
time_budget_seconds: float = 30.0
) -> dict:
start = time.time()
response = run_agent(task, client)
run_log = []
for attempt in range(max_retries + 1):
if time.time() - start > time_budget_seconds:
print('Time budget exceeded, returning best result')
break
reflection = structured_reflect(task, response, client)
run_log.append({'attempt': attempt + 1,
'quality_score': reflection['quality_score']})
if reflection['quality_score'] >= quality_target:
print(f'Quality target reached at attempt {attempt + 1}')
break
if attempt < max_retries:
response = run_agent(task + '\n' + reflection['alternative_approach'], client)
return {'response': response, 'run_log': run_log,
'gain': measure_reflection_gain(run_log)}Bilgi Kontrolü
Öz değerlendirme epizotlarını epizodik bellek olarak saklamanın temel yararı nedir?
Özet: Öz Değerlendirme ve Öz Eleştiri Döngüleri
Mükemmel! Bu derste ele aldıklarınız:
- Öz değerlendirme istemi: güçlü yönler, zayıf yönler, kalite puanı ve yeniden deneme işareti içeren yapılandırılmış JSON
- Öz eleştiri döngüsü: düşük puanda yeniden deneme ve görevi öz değerlendirme içgörüleriyle zenginleştirme
- Epizodik bellek: öz değerlendirmeleri görev türüne göre zaman damgalı epizotlar olarak saklama
- Bellek ekleme: her çalıştırmadan önce son epizotları sistem istemine yükleme
- Güvenlik önlemleri: en fazla yeniden deneme sayısı, zaman bütçesi ve kalite hedefine ulaşıldığında erken çıkış
Sonraki konu: daha derin bir öz iyileştirme için başarılı ve başarısız yörüngelerin nasıl kullanılacağı.
Sıkça Sorulan Sorular
“Yansıtma ve Öz Eleştiri Döngüleri” dersi ücretsiz mi?
Evet — “Yansıtma ve Öz Eleştiri Döngüleri” 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 Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Yansıtma ve Öz Eleştiri Döngüleri” dersinde ne öğreneceğim?
Kendi çıktılarını değerlendiren ve iyileştirme önerileri oluşturan aracılar. AI Agents 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 Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, 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 2. dersidir.
“Yansıtma ve Öz Eleştiri Döngüleri” 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 Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents 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
- Geri Bildirim Toplama ve Depolama
- Yansıtma ve Öz Eleştiri Döngüleri
- Yörünge Tabanlı Öz İyileştirme
- Öz İyileştirme Yanlış Gittiğinde