Peningkatan Mandiri Berbasis Trajektori
Belajar dari rangkaian tindakan yang berhasil dan gagal untuk menyempurnakan perilaku berikutnya.
Peningkatan Mandiri Berbasis Trajektori adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Apa Itu Trajektori?
Trajektori adalah rangkaian lengkap keadaan dan tindakan yang dilakukan agen dari awal hingga akhir untuk tugas tertentu. Trajektori tidak hanya mencatat jawaban akhir, tetapi juga cara agen mencapainya: alat apa yang dipanggil, dalam urutan apa, dengan parameter apa, serta hasil antara apa yang diamati.
Merekam Trajektori
Bungkus setiap tindakan agen dalam perekam yang menangkap keadaan sebelum dan sesudahnya. Suatu keadaan mencakup tujuan saat ini, isi memori, dan pengamatan terbaru. Suatu tindakan mencakup nama alat, parameter, dan hasilnya.
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))
Menyimpan Trajektori
Trajektori dapat berukuran besar. Simpan trajektori sebagai berkas JSON terkompresi, satu berkas untuk setiap trajektori. Indekskan berdasarkan hasil dan jenis tugas agar dapat diambil dengan cepat. Trajektori yang berhasil menjadi contoh pembelajaran dengan sedikit contoh; trajektori yang gagal menjadi sinyal pelatihan.
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]Menggunakan Trajektori yang Berhasil sebagai Contoh
Trajektori yang berhasil adalah contoh penyelesaian: agen dapat mempelajari urutan langkah dengan melihatnya sebelum mencoba tugas baru yang serupa. Sisipkan trajektori dengan skor tertinggi sebagai awalan berisi contoh dalam instruksi sistem.
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.'
)Menganalisis Trajektori yang Gagal
Trajektori yang gagal sama berharganya. Analisis trajektori tersebut untuk menemukan pola kegagalan: langkah mana yang salah dan mengapa. Pola kegagalan yang umum meliputi alat yang salah dipilih, alat yang benar tetapi parameternya salah, hasil antara yang diada-adakan, dan perulangan yang tidak dihentikan.
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)Taksonomi Pola Kegagalan
Membangun taksonomi pola kegagalan dari trajektori yang gagal membantu Anda melihat berbagai pola. Jika cukup banyak kegagalan memiliki akar masalah yang sama, hal itu menjadi sinyal untuk memperbaiki alat, instruksi, atau logika agen — bukan hanya satu proses.
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}Membuat Pasangan Pelatihan dari Trajektori
Untuk penyetelan terarah yang diawasi, Anda memerlukan pasangan (masukan, keluaran ideal). Trajektori yang gagal memberi Anda keluaran yang buruk; analisis kegagalan memberi tahu apa yang seharusnya terjadi. Keduanya membentuk satu pasangan pelatihan.
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'])
Penyetelan Model dari Trajektori
Setelah memiliki cukup pasangan pelatihan berkualitas tinggi (biasanya 50–500 untuk tugas yang spesifik), Anda dapat menyetel model yang lebih kecil agar menyerap pola-pola yang berhasil. Antarmuka penyetelan OpenAI menerima berkas JSONL dengan format messages.
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)
Menyaring Kualitas Trajektori
Tidak semua trajektori yang berhasil memiliki kualitas yang sama. Trajektori yang berhasil setelah 15 percobaan ulang lebih banyak mengandung gangguan daripada trajektori yang berhasil pada percobaan pertama. Saring berdasarkan efisiensi: berhasil dengan jumlah langkah minimum, memiliki skor akhir yang tinggi, dan tidak mengandung hasil antara yang diada-adakan.
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)
Membandingkan Trajektori untuk Mendapatkan Wawasan
Membandingkan trajektori yang berhasil dan yang gagal untuk jenis tugas yang sama menunjukkan dengan tepat di mana keduanya mulai berbeda. Titik perbedaan tersebut adalah tempat dengan pengaruh terbesar untuk meningkatkan pengambilan keputusan agen.
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'])
Siklus Penguatan Berbasis Trajektori
Siklus penguatan lengkapnya adalah: jalankan agen → rekam trajektori → evaluasi hasil → simpan di pustaka trajektori → analisis kegagalan → buat pasangan pelatihan → setel model atau perbarui instruksi → jalankan agen yang telah ditingkatkan → rekam trajektori baru. Setiap siklus meningkatkan kemampuan agen.
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 # placeholderUji Pemahaman
Apa tujuan utama menganalisis trajektori yang gagal?
Rangkuman: Peningkatan Mandiri Berbasis Trajektori
Bagus! Berikut inti pelajaran ini:
- Trajektori: rangkaian langkah (keadaan, tindakan, hasil) dari awal hingga akhir
- Trajektori yang berhasil: contoh dengan sedikit contoh yang disisipkan sebelum tugas serupa
- Trajektori yang gagal: dianalisis untuk menemukan pola kegagalan → pasangan pelatihan → penyetelan model
- Penyaringan kualitas: utamakan trajektori keberhasilan yang singkat dan berskor tinggi
- Siklus penguatan: jalankan → rekam → analisis → setel model → jalankan versi yang ditingkatkan
Berikutnya: hal-hal yang dapat berjalan keliru dalam peningkatan mandiri — peretasan imbalan, pergeseran distribusi, dan modifikasi mandiri yang tidak aman.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Peningkatan Mandiri Berbasis Trajektori” gratis?
Ya — teks lengkap “Peningkatan Mandiri Berbasis Trajektori” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Peningkatan Mandiri Berbasis Trajektori”?
Belajar dari rangkaian tindakan yang berhasil dan gagal untuk menyempurnakan perilaku berikutnya. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Peningkatan Mandiri Berbasis Trajektori” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pengumpulan dan Penyimpanan Umpan Balik
- Putaran Refleksi dan Kritik Mandiri
- Peningkatan Mandiri Berbasis Trajektori
- Saat Peningkatan Mandiri Berjalan Keliru