0Pricing
AI Agents · Ders

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].text

Yapı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

  1. Geri Bildirim Toplama ve Depolama
  2. Yansıtma ve Öz Eleştiri Döngüleri
  3. Yörünge Tabanlı Öz İyileştirme
  4. Öz İyileştirme Yanlış Gittiğinde
← AI Agents Sayfasına Dön