التحسين الذاتي القائم على مسار الإجراءات
التعلّم من تسلسلات الإجراءات الناجحة والفاشلة لتحسين السلوك المستقبلي.
التحسين الذاتي القائم على مسار الإجراءات درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 مضغوطة، ملفًا واحدًا لكل مسار. وفهرسها حسب النتيجة ونوع المهمة لاسترجاعها بسرعة. وتصبح المسارات الناجحة أمثلة few-shot، بينما تصبح المسارات الفاشلة إشارات تدريب.
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]استخدام المسارات الناجحة كأمثلة few-shot
المسار الناجح مثال تطبيقي: إذ يمكن للوكيل تعلّم تسلسل الخطوات من خلال رؤيته قبل محاولة تنفيذ مهمة جديدة مشابهة. أدرج المسار الأعلى تقييمًا كبادئة few-shot في prompt النظام.
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)تصنيف أنماط الفشل
يساعدك بناء تصنيف لأنماط الفشل انطلاقًا من المسارات الفاشلة على رؤية الأنماط المتكررة. وعندما تشترك حالات فشل كثيرة في السبب الجذري نفسه، فهذه إشارة إلى ضرورة إصلاح أداة الوكيل أو prompt أو منطقه، وليس تشغيلًا واحدًا فقط.
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}إنشاء أزواج التدريب من المسارات
لإجراء الضبط الدقيق الخاضع للإشراف، تحتاج إلى أزواج (input, ideal_output). يمنحك المسار الفاشل المخرج السيئ، بينما يوضح تحليل الفشل ما كان ينبغي أن يحدث بدلًا منه. ويشكّل الاثنان معًا زوج تدريب.
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'])
حلقة التحسين المدفوعة بالمسارات
الحلقة الكاملة: شغّل الوكيل ← سجّل المسار ← قيّم النتيجة ← خزّن المسار في مكتبة المسارات ← حلّل حالات الفشل ← أنشئ أزواج التدريب ← أجرِ ضبطًا دقيقًا أو حدّث prompts ← شغّل الوكيل المحسّن ← سجّل مسارًا جديدًا. تعمل كل دورة على تحسين الوكيل.
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اختبار المعرفة
ما الغرض الأساسي من تحليل المسارات الفاشلة؟
مراجعة: التحسين الذاتي القائم على المسارات
أحسنت! أهم النقاط المستخلصة من هذا الدرس:
- المسار: تسلسل من خطوات (حالة، إجراء، نتيجة) من البداية إلى النهاية
- المسارات الناجحة: أمثلة few-shot تُدرج قبل تنفيذ مهام مشابهة
- المسارات الفاشلة: تُحلَّل لاكتشاف أنماط الفشل ← أزواج التدريب ← الضبط الدقيق
- تصفية الجودة: تفضيل مسارات النجاح القصيرة ذات النتائج المرتفعة
- الحلقة: شغّل ← سجّل ← حلّل ← أجرِ ضبطًا دقيقًا ← شغّل نسخة محسّنة
التالي: ما الذي قد يحدث خطأً في التحسين الذاتي — التحايل على المكافأة، وانزياح التوزيع، وضوابط الأمان.
الأسئلة الشائعة
هل درس «التحسين الذاتي القائم على مسار الإجراءات» مجاني؟
نعم — نص درس «التحسين الذاتي القائم على مسار الإجراءات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «التحسين الذاتي القائم على مسار الإجراءات»؟
التعلّم من تسلسلات الإجراءات الناجحة والفاشلة لتحسين السلوك المستقبلي. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «التحسين الذاتي القائم على مسار الإجراءات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- جمع الملاحظات وتخزينها
- حلقات التأمل والنقد الذاتي
- التحسين الذاتي القائم على مسار الإجراءات
- عندما يسوء التحسين الذاتي