0Pricing
AI Agents · Lektion

Trajektorienbasiertes Selbstverbessern

Aus erfolgreichen und fehlgeschlagenen Aktionsfolgen lernen, um zukünftiges Verhalten zu verbessern.

Trajektorienbasiertes Selbstverbessern ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.

Was ist eine Trajektorie?

Eine Trajektorie ist die vollständige Abfolge von Zuständen und Aktionen, die ein Agent für eine bestimmte Aufgabe vom Anfang bis zum Ende durchlaufen hat. Sie hält nicht nur die endgültige Antwort fest, sondern auch, wie der Agent zu ihr gelangt ist: welche Tools in welcher Reihenfolge mit welchen Parametern aufgerufen wurden und welche Zwischenergebnisse beobachtet wurden.

Aufzeichnen einer Trajektorie

Umschließen Sie jede Agentenaktion mit einem Aufzeichner, der den Zustand davor und danach erfasst. Ein Zustand umfasst: das aktuelle Ziel, die Inhalte des Gedächtnisses und die letzten Beobachtungen. Eine Aktion umfasst: den Tool-Namen, die Parameter und das Ergebnis.

from dataclasses import dataclass, field
from datetime import datetime
from typing import Any

@dataclass
class TrajectoryStep:
    step_index: int
    state_summary: str    # short description of world state
    action_name: str      # tool or reasoning step name
    action_params: dict
    result: Any
    timestamp: str = ''

    def __post_init__(self):
        if not self.timestamp:
            self.timestamp = datetime.utcnow().isoformat()

@dataclass
class Trajectory:
    trajectory_id: str
    task: str
    steps: list = field(default_factory=list)
    outcome: str = 'unknown'   # 'success', 'failure', 'partial'
    final_score: float = 0.0

    def add_step(self, step: TrajectoryStep):
        self.steps.append(step)

    def mark_success(self, score: float = 1.0):
        self.outcome = 'success'
        self.final_score = score

    def mark_failure(self, reason: str = ''):
        self.outcome = 'failure'
        self.final_score = 0.0

if __name__ == '__main__':
    traj = Trajectory(trajectory_id='t-1', task='Book a flight to Tokyo')
    traj.add_step(TrajectoryStep(
        step_index=0, state_summary='searching flights',
        action_name='search_flights', action_params={'dest': 'NRT'}, result='5 options found'
    ))
    traj.mark_success(score=0.95)
    print(f'Trajectory {traj.trajectory_id}: outcome={traj.outcome}, score={traj.final_score}')
    print('Steps recorded:', len(traj.steps))

Trajektorien speichern

Trajektorien können umfangreich sein. Speichern Sie sie als komprimierte JSON-Dateien, eine pro Trajektorie. Indizieren Sie sie nach Ergebnis und Aufgabentyp, damit sie schnell abgerufen werden können. Erfolgreiche Trajektorien werden zu Few-Shot-Beispielen; fehlgeschlagene Trajektorien werden zu Trainingssignalen.

import json
import os
from dataclasses import asdict

TRAJECTORY_DIR = 'trajectories'

def save_trajectory(traj: Trajectory):
    os.makedirs(TRAJECTORY_DIR, exist_ok=True)
    filename = f'{TRAJECTORY_DIR}/{traj.trajectory_id}_{traj.outcome}.json'
    data = asdict(traj)
    with open(filename, 'w') as f:
        json.dump(data, f, indent=2)
    print(f'Saved trajectory: {filename}')

def load_successful_trajectories(task_type: str, n: int = 5) -> list:
    results = []
    for fname in os.listdir(TRAJECTORY_DIR):
        if '_success.json' not in fname:
            continue
        with open(os.path.join(TRAJECTORY_DIR, fname)) as f:
            traj = json.load(f)
        if task_type.lower() in traj['task'].lower():
            results.append(traj)
    results.sort(key=lambda t: t['final_score'], reverse=True)
    return results[:n]

Erfolgreiche Trajektorien als Few-Shot-Beispiele verwenden

Eine erfolgreiche Trajektorie ist ein ausgearbeitetes Beispiel: Der Agent kann die Abfolge der Schritte lernen, indem er sie sieht, bevor er eine neue, ähnliche Aufgabe bearbeitet. Fügen Sie die Trajektorie mit der höchsten Bewertung als Few-Shot-Präfix in den System-Prompt ein.

def trajectory_to_few_shot(traj: dict) -> str:
    lines = [f'Example task: {traj["task"]}', 'Steps taken:']
    for step in traj['steps']:
        lines.append(
            f'  [{step["step_index"]}] {step["action_name"]}'
            f'({json.dumps(step["action_params"])}) -> {str(step["result"])[:80]}'
        )
    lines.append(f'Outcome: {traj["outcome"]} (score={traj["final_score"]:.2f})')
    return '\n'.join(lines)

def build_few_shot_system_prompt(task_type: str) -> str:
    successful = load_successful_trajectories(task_type, n=2)
    if not successful:
        return 'Complete the following task step by step.'
    examples = '\n\n---\n\n'.join(
        trajectory_to_few_shot(t) for t in successful
    )
    return (
        'Here are examples of successfully completed similar tasks:\n\n'
        + examples
        + '\n\n---\n\nNow complete the new task using the same approach.'
    )

Fehlgeschlagene Trajektorien analysieren

Fehlgeschlagene Trajektorien sind ebenso wertvoll. Analysieren Sie sie, um den Fehlermodus zu ermitteln: welcher Schritt schiefgelaufen ist und warum. Häufige Fehlermodi sind: das falsche Tool ausgewählt, das richtige Tool mit falschen Parametern verwendet, ein erfundenes Zwischenergebnis erzeugt oder eine Schleife nicht beendet.

def analyze_failure(traj: dict, client) -> dict:
    steps_str = json.dumps(traj['steps'], indent=2)
    prompt = (
        f'Task: {traj["task"]}\n\n'
        f'Agent trajectory (failed):\n{steps_str}\n\n'
        'Identify the failure mode. Return JSON:\n'
        '{"failure_step": 0, "failure_mode": "", "root_cause": "", '
        '"prevention": ""}'
    )
    import anthropic
    client_obj = anthropic.Anthropic(api_key='YOUR_API_KEY')
    result = client_obj.messages.create(
        model='claude-opus-4-5',
        max_tokens=512,
        messages=[{'role': 'user', 'content': prompt}]
    )
    import json
    return json.loads(result.content[0].text)

Taxonomie der Fehlermodi

Der Aufbau einer Taxonomie von Fehlermodi aus fehlgeschlagenen Trajektorien hilft Ihnen, Muster zu erkennen. Wenn genügend Fehler dieselbe Grundursache haben, ist das ein Signal, das Tool, den Prompt oder die Logik des Agenten zu verbessern – und nicht nur einen einzelnen Durchlauf.

from collections import Counter

def build_failure_taxonomy(failed_trajectories: list, client) -> dict:
    failure_modes = []
    for traj in failed_trajectories:
        analysis = analyze_failure(traj, client)
        failure_modes.append(analysis['failure_mode'])

    counts = Counter(failure_modes)
    total = len(failure_modes)

    taxonomy = [
        {
            'failure_mode': mode,
            'count': count,
            'percentage': round(count / total * 100, 1)
        }
        for mode, count in counts.most_common()
    ]

    print('Failure Mode Taxonomy:')
    for entry in taxonomy:
        print(f'  {entry["failure_mode"]}: {entry["count"]} ({entry["percentage"]}%)')

    return {'taxonomy': taxonomy, 'total_failures': total}

Trainingspaare aus Trajektorien erstellen

Für überwachtes Fine-Tuning benötigen Sie Paare aus (input, ideal_output). Eine fehlgeschlagene Trajektorie liefert die fehlerhafte Ausgabe; die Fehleranalyse zeigt, was stattdessen hätte passieren sollen. Zusammen bilden sie ein Trainingspaar.

def trajectory_to_training_pair(
    failed_traj: dict,
    failure_analysis: dict
) -> dict:
    """
    Creates an SFT-ready training pair:
    input = task + context at failure step
    output = what the agent should have done
    """
    fail_step_idx = failure_analysis['failure_step']
    steps = failed_traj['steps']

    # Context up to (but not including) the failure step
    context_steps = steps[:fail_step_idx]
    context_str = '\n'.join(
        f'Step {s["step_index"]}: {s["action_name"]}({s["action_params"]})'
        for s in context_steps
    )
    return {
        'input': f'Task: {failed_traj["task"]}\n\nPrevious steps:\n{context_str}\n\nNext action:',
        'output': failure_analysis['prevention'],  # correct action
        'source': 'failure_trajectory',
        'trajectory_id': failed_traj.get('trajectory_id', 'unknown')
    }

if __name__ == '__main__':
    failed_traj = {
        'task': 'Cancel subscription',
        'trajectory_id': 'traj-7',
        'steps': [
            {'step_index': 0, 'action_name': 'find_account', 'action_params': {'user': 'u1'}},
            {'step_index': 1, 'action_name': 'delete_account', 'action_params': {'user': 'u1'}},
        ]
    }
    failure_analysis = {'failure_step': 1, 'prevention': 'call cancel_subscription(user="u1") instead'}
    pair = trajectory_to_training_pair(failed_traj, failure_analysis)
    print('Training input:')
    print(pair['input'])
    print('Expected output:', pair['output'])

Fine-Tuning anhand von Trajektorien

Sobald Sie genügend hochwertige Trainingspaare haben (für eine eng umrissene Aufgabe typischerweise 50–500), können Sie ein kleineres Modell feinabstimmen, damit es die erfolgreichen Muster verinnerlicht. Die Fine-Tuning-API von OpenAI akzeptiert JSONL-Dateien im messages-Format.

import json

def export_fine_tuning_jsonl(
    training_pairs: list,
    output_file: str,
    system_prompt: str = 'You are an efficient AI agent.'
):
    with open(output_file, 'w') as f:
        for pair in training_pairs:
            record = {
                'messages': [
                    {'role': 'system', 'content': system_prompt},
                    {'role': 'user', 'content': pair['input']},
                    {'role': 'assistant', 'content': pair['output']}
                ]
            }
            f.write(json.dumps(record) + '\n')
    print(f'Exported {len(training_pairs)} training pairs to {output_file}')

# Upload via OpenAI API (pseudocode):
# client.files.create(file=open('train.jsonl','rb'), purpose='fine-tune')
# client.fine_tuning.jobs.create(training_file='file-id', model='gpt-4o-mini')

if __name__ == '__main__':
    import tempfile, os
    pairs = [{'input': 'Task: Cancel subscription\n\nNext action:', 'output': 'cancel_subscription(user="u1")'}]
    out_path = os.path.join(tempfile.gettempdir(), 'demo_training.jsonl')
    export_fine_tuning_jsonl(pairs, out_path)

Trajektorien nach Qualität filtern

Nicht alle erfolgreichen Trajektorien sind gleich gut. Eine Trajektorie, die erst nach 15 Wiederholungen erfolgreich war, ist verrauschter als eine, die beim ersten Versuch erfolgreich war. Filtern Sie nach Effizienz: Erfolg mit möglichst wenigen Schritten, eine hohe Endbewertung und keine erfundenen Zwischenergebnisse.

def filter_high_quality_trajectories(
    trajectories: list,
    max_steps: int = 8,
    min_score: float = 0.85
) -> list:
    high_quality = []
    for traj in trajectories:
        if traj['outcome'] != 'success':
            continue
        if traj['final_score'] < min_score:
            continue
        if len(traj['steps']) > max_steps:
            continue
        high_quality.append(traj)

    # Sort by (score DESC, steps ASC)
    high_quality.sort(
        key=lambda t: (-t['final_score'], len(t['steps']))
    )
    print(f'High-quality trajectories: {len(high_quality)} / {len(trajectories)}')
    return high_quality

if __name__ == '__main__':
    trajectories = [
        {'outcome': 'success', 'final_score': 0.92, 'steps': [1, 2, 3]},
        {'outcome': 'failure', 'final_score': 0.10, 'steps': [1]},
        {'outcome': 'success', 'final_score': 0.60, 'steps': [1, 2]},
    ]
    filter_high_quality_trajectories(trajectories)

Trajektorien zum Gewinnen von Erkenntnissen vergleichen

Der Vergleich einer erfolgreichen und einer fehlgeschlagenen Trajektorie für denselben Aufgabentyp zeigt genau, an welcher Stelle sie voneinander abwichen. Der Abweichungspunkt ist der Ansatzpunkt mit dem größten Hebel, um die Entscheidungsfindung des Agenten zu verbessern.

def compare_trajectories(success_traj: dict, failure_traj: dict) -> dict:
    s_steps = {s['step_index']: s for s in success_traj['steps']}
    f_steps = {s['step_index']: s for s in failure_traj['steps']}

    divergences = []
    for idx in sorted(set(s_steps) & set(f_steps)):
        s_action = s_steps[idx]['action_name']
        f_action = f_steps[idx]['action_name']
        if s_action != f_action:
            divergences.append({
                'step': idx,
                'success_action': s_action,
                'failure_action': f_action
            })
            break  # First divergence is most important

    return {
        'first_divergence': divergences[0] if divergences else None,
        'success_steps': len(s_steps),
        'failure_steps': len(f_steps)
    }

# Usage:
# comparison = compare_trajectories(good_traj, bad_traj)
# print('First divergence:', comparison['first_divergence'])

if __name__ == '__main__':
    good_traj = {'steps': [{'step_index': 0, 'action_name': 'search'}, {'step_index': 1, 'action_name': 'summarize'}]}
    bad_traj = {'steps': [{'step_index': 0, 'action_name': 'search'}, {'step_index': 1, 'action_name': 'delete'}]}
    comparison = compare_trajectories(good_traj, bad_traj)
    print('First divergence:', comparison['first_divergence'])

Verbesserungs-Feedbackschleife auf Trajektorienbasis

Die vollständige Feedbackschleife: Agenten ausführen → Trajektorie aufzeichnen → Ergebnis bewerten → in der Trajektorienbibliothek speichern → Fehler analysieren → Trainingspaare erstellen → Fine-Tuning durchführen oder Prompts aktualisieren → verbesserten Agenten ausführen → neue Trajektorie aufzeichnen. Jeder Durchlauf verbessert den Agenten.

class TrajectorySelfImprovement:
    def __init__(self, agent_id: str):
        self.agent_id = agent_id
        self.trajectory_lib = []

    def run_and_record(self, task: str, agent_fn) -> Trajectory:
        traj = Trajectory(
            trajectory_id=f'{self.agent_id}_{len(self.trajectory_lib)}',
            task=task
        )
        result = agent_fn(task, traj)  # agent_fn appends steps to traj
        # Evaluate result (e.g., via reflection or user rating)
        score = evaluate_result(result)
        if score >= 0.7:
            traj.mark_success(score)
        else:
            traj.mark_failure('Low quality score')
        save_trajectory(traj)
        self.trajectory_lib.append(traj)
        return traj

    def improvement_cycle(self, client):
        failed = [t for t in self.trajectory_lib if t.outcome == 'failure']
        if len(failed) >= 10:
            taxonomy = build_failure_taxonomy([vars(t) for t in failed], client)
            print('Improvement cycle complete:', taxonomy)

def evaluate_result(result: str) -> float:
    return 0.8  # placeholder

Wissensüberprüfung

Was ist der Hauptzweck der Analyse fehlgeschlagener Trajektorien?

Zusammenfassung: Selbstverbesserung auf Trajektorienbasis

Gut gemacht! Die wichtigsten Erkenntnisse aus dieser Lektion:

  • Trajektorie: Abfolge von Schritten aus (Zustand, Aktion, Ergebnis) vom Anfang bis zum Ende
  • Erfolgreiche Trajektorien: Few-Shot-Beispiele, die vor ähnlichen Aufgaben eingefügt werden
  • Fehlgeschlagene Trajektorien: Analyse auf Fehlermodi → Trainingspaare → Fine-Tuning
  • Qualitätsfilterung: kurze Trajektorien mit erfolgreicher Ausführung und hoher Bewertung bevorzugen
  • Feedbackschleife: ausführen → aufzeichnen → analysieren → Fine-Tuning durchführen → verbessert ausführen

Als Nächstes: Was bei der Selbstverbesserung schiefgehen kann – Reward-Hacking, Verteilungsverschiebung und Guardrails.

Häufig gestellte Fragen

Ist die Lektion „Trajektorienbasiertes Selbstverbessern“ kostenlos?

Ja — der vollständige Text von „Trajektorienbasiertes Selbstverbessern“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Trajektorienbasiertes Selbstverbessern“?

Aus erfolgreichen und fehlgeschlagenen Aktionsfolgen lernen, um zukünftiges Verhalten zu verbessern. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Agents zu starten?

Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Trajektorienbasiertes Selbstverbessern“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?

Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Feedback erfassen und speichern
  2. Reflexions- und Selbstkritikschleifen
  3. Trajektorienbasiertes Selbstverbessern
  4. Wenn Selbstverbesserung schiefgeht
← Zurück zu AI Agents