การปรับปรุงตนเองโดยอิงลำดับการกระทำ
เรียนรู้จากลำดับการกระทำที่สำเร็จและล้มเหลวเพื่อปรับพฤติกรรมในอนาคต
การปรับปรุงตนเองโดยอิงลำดับการกระทำ เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
เส้นทางการดำเนินงานคืออะไร
เส้นทางการดำเนินงานคือชุดลำดับสถานะและการกระทำทั้งหมดที่เอเจนต์ดำเนินการตั้งแต่เริ่มต้นจนจบสำหรับงานที่กำหนด โดยไม่ได้บันทึกเพียงคำตอบสุดท้ายเท่านั้น แต่ยังบันทึกด้วยว่า เอเจนต์ไปถึงคำตอบนั้นได้อย่างไร ได้แก่ เรียกใช้เครื่องมือใดบ้าง เรียกตามลำดับใด ใช้พารามิเตอร์อะไร และพบผลลัพธ์ระหว่างทางใดบ้าง
การบันทึกเส้นทางการดำเนินงาน
ครอบการกระทำแต่ละรายการของเอเจนต์ด้วยตัวบันทึกที่เก็บสถานะทั้งก่อนและหลังการกระทำ สถานะประกอบด้วย เป้าหมายปัจจุบัน เนื้อหาในหน่วยความจำ และข้อสังเกตล่าสุด การกระทำประกอบด้วย ชื่อเครื่องมือ พารามิเตอร์ และผลลัพธ์
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))
การจัดเก็บเส้นทางการดำเนินงาน
เส้นทางการดำเนินงานอาจมีขนาดใหญ่ ให้จัดเก็บเป็นไฟล์ JSON ที่บีบอัดแล้ว โดยใช้หนึ่งไฟล์ต่อหนึ่งเส้นทางการดำเนินงาน จัดทำดัชนีตามผลลัพธ์และประเภทงานเพื่อให้เรียกค้นได้รวดเร็ว เส้นทางการดำเนินงานที่สำเร็จจะกลายเป็นตัวอย่างจำนวนน้อย ส่วนเส้นทางที่ล้มเหลวจะกลายเป็นสัญญาณสำหรับการฝึก
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]การใช้เส้นทางการดำเนินงานที่สำเร็จเป็นตัวอย่างจำนวนน้อย
เส้นทางการดำเนินงานที่สำเร็จคือ ตัวอย่างที่ทำเสร็จแล้ว เอเจนต์สามารถเรียนรู้ลำดับขั้นตอนได้จากการเห็นตัวอย่างนี้ ก่อนจะลองทำงานใหม่ที่คล้ายกัน ให้แทรกเส้นทางการดำเนินงานที่ได้คะแนนสูงสุดเป็นคำนำแบบตัวอย่างจำนวนน้อยไว้ในพรอมต์ระบบ
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.'
)การวิเคราะห์เส้นทางการดำเนินงานที่ล้มเหลว
เส้นทางการดำเนินงานที่ล้มเหลวมีคุณค่าไม่แพ้กัน ให้วิเคราะห์เพื่อค้นหา รูปแบบความล้มเหลว ว่าขั้นตอนไหนผิดพลาดและเพราะเหตุใด รูปแบบความล้มเหลวที่พบบ่อย ได้แก่ เลือกเครื่องมือผิด เลือกเครื่องมือถูกแต่ใช้พารามิเตอร์ผิด สร้างผลลัพธ์ระหว่างทางขึ้นเอง และไม่ยุติการวนซ้ำ
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)อนุกรมวิธานรูปแบบความล้มเหลว
การสร้างอนุกรมวิธานของรูปแบบความล้มเหลวจากเส้นทางการดำเนินงานที่ล้มเหลวช่วยให้มองเห็นรูปแบบต่าง ๆ เมื่อความล้มเหลวจำนวนมากมีสาเหตุรากเดียวกัน นั่นเป็นสัญญาณว่าควรแก้ไขเครื่องมือ พรอมต์ หรือตรรกะของเอเจนต์ ไม่ใช่แก้เฉพาะการทำงานครั้งเดียว
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}การสร้างคู่ฝึกจากเส้นทางการดำเนินงาน
สำหรับการปรับแต่งแบบมีผู้ควบคุม คุณต้องมีคู่ (อินพุต, เอาต์พุตในอุดมคติ) เส้นทางการดำเนินงานที่ล้มเหลวให้เอาต์พุตที่ไม่ถูกต้อง ส่วนการวิเคราะห์ความล้มเหลวจะบอกว่าสิ่งที่ควรเกิดขึ้นแทนคืออะไร เมื่อนำมารวมกัน ทั้งสองส่วนจะกลายเป็นคู่ฝึก
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'])
การปรับแต่งแบบละเอียดจากเส้นทางการดำเนินงาน
เมื่อมีคู่ฝึกคุณภาพสูงเพียงพอแล้ว (โดยทั่วไป 50–500 คู่สำหรับงานเฉพาะด้าน) คุณสามารถปรับแต่งโมเดลขนาดเล็กให้ซึมซับรูปแบบที่สำเร็จได้ เอพีไอการปรับแต่งแบบละเอียดของ OpenAI รองรับไฟล์ JSONL ที่มีรูปแบบ 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)
การคัดกรองคุณภาพของเส้นทางการดำเนินงาน
เส้นทางการดำเนินงานที่สำเร็จไม่ได้ดีเท่ากันทั้งหมด เส้นทางที่สำเร็จหลังลองใหม่ 15 ครั้งมีสัญญาณรบกวนมากกว่าเส้นทางที่สำเร็จตั้งแต่ครั้งแรก ให้คัดกรองตามประสิทธิภาพ ได้แก่ สำเร็จด้วยจำนวนขั้นต่ำน้อยที่สุด ได้คะแนนสุดท้ายสูง และไม่มีผลลัพธ์ระหว่างทางที่สร้างขึ้นเอง
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)
การเปรียบเทียบเส้นทางการดำเนินงานเพื่อค้นหาข้อมูลเชิงลึก
การเปรียบเทียบเส้นทางการดำเนินงานที่สำเร็จและล้มเหลวสำหรับงานประเภทเดียวกันจะแสดงให้เห็นอย่างชัดเจนว่าทั้งสองเส้นทางเริ่มแตกต่างกันตรงไหน จุดที่เริ่มแตกต่างคือจุดที่มีโอกาสสร้างการปรับปรุงต่อการตัดสินใจของเอเจนต์ได้มากที่สุด
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'])
วงจรการปรับปรุงแบบหมุนเวียนด้วยเส้นทางการดำเนินงาน
วงจรทั้งหมดมีดังนี้ เรียกใช้เอเจนต์ → บันทึกเส้นทางการดำเนินงาน → ประเมินผลลัพธ์ → จัดเก็บไว้ในคลังเส้นทางการดำเนินงาน → วิเคราะห์ความล้มเหลว → สร้างคู่ฝึก → ปรับแต่งแบบละเอียดหรืออัปเดตพรอมต์ → เรียกใช้เอเจนต์ที่ปรับปรุงแล้ว → บันทึกเส้นทางการดำเนินงานใหม่ แต่ละรอบจะช่วยปรับปรุงเอเจนต์
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ตรวจสอบความรู้
จุดประสงค์หลักของการวิเคราะห์เส้นทางการดำเนินงานที่ ล้มเหลว คืออะไร
สรุป: การปรับปรุงตัวเองด้วยเส้นทางการดำเนินงาน
ทำได้ดีมาก! ประเด็นสำคัญจากบทเรียนนี้มีดังนี้
- เส้นทางการดำเนินงาน: ลำดับขั้นของ (สถานะ, การกระทำ, ผลลัพธ์) ตั้งแต่เริ่มต้นจนจบ
- เส้นทางการดำเนินงานที่สำเร็จ: ตัวอย่างจำนวนน้อยที่แทรกไว้ก่อนงานที่คล้ายกัน
- เส้นทางการดำเนินงานที่ล้มเหลว: วิเคราะห์หารูปแบบความล้มเหลว → คู่ฝึก → การปรับแต่งแบบละเอียด
- การคัดกรองคุณภาพ: เลือกเส้นทางการดำเนินงานที่สำเร็จโดยใช้ขั้นตอนสั้นและได้คะแนนสูง
- วงจรหมุนเวียน: เรียกใช้ → บันทึก → วิเคราะห์ → ปรับแต่งแบบละเอียด → เรียกใช้เวอร์ชันที่ปรับปรุงแล้ว
ถัดไป: สิ่งที่อาจผิดพลาดในการปรับปรุงตัวเอง — การบิดเบือนรางวัล การเปลี่ยนแปลงการกระจาย และกลไกป้องกัน
คำถามที่พบบ่อย
บทเรียน “การปรับปรุงตนเองโดยอิงลำดับการกระทำ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การปรับปรุงตนเองโดยอิงลำดับการกระทำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การปรับปรุงตนเองโดยอิงลำดับการกระทำ”
เรียนรู้จากลำดับการกระทำที่สำเร็จและล้มเหลวเพื่อปรับพฤติกรรมในอนาคต คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การปรับปรุงตนเองโดยอิงลำดับการกระทำ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การรวบรวมและจัดเก็บข้อเสนอแนะ
- วงจรการไตร่ตรองและวิจารณ์ตนเอง
- การปรับปรุงตนเองโดยอิงลำดับการกระทำ
- เมื่อการปรับปรุงตนเองผิดพลาด