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 # placeholderWissensü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
- Feedback erfassen und speichern
- Reflexions- und Selbstkritikschleifen
- Trajektorienbasiertes Selbstverbessern
- Wenn Selbstverbesserung schiefgeht