المستوى المستهدف: متوسط — يفترض إنك جرّبت تستدعي LLM من كود وعندك فكرة عن البرومبتنج وtool use، لكن لسه ما اشتغلتش على وكلاء متعددي الخطوات.
الـ Reflection Pattern في سطر واحد: بدل ما الوكيل يرد على المستخدم في الخطوة الأولى، بنخليه يراجع رده، يلاقي الأخطاء، ويصلّحها قبل ما يخرجها. الورقة الأصلية Reflexion (Shinn et al., NeurIPS 2023) قاست تحسن من 80% لـ 91% pass@1 على HumanEval باستخدام GPT-4 مع reflection.
Reflection Pattern: لما يراجع الوكيل نفسه قبل ما يسلّم
المشكلة باختصار
لو بنيت وكيل AI بيكتب SQL queries، أو بيرد على عملاء، أو بيحلل تذاكر دعم، أنت غالبًا لاحظت إن أول رد بيطلع فيه أخطاء واضحة: شرط WHERE ناقص، اسم عمود غلط، أو نبرة مش مناسبة. لو سألت نفس النموذج "راجع الرد ده وقولي إيه اللي ممكن يكون غلط فيه"، بيلاقي الغلطة في 60-70% من الحالات.
Reflection Pattern بياخد الملاحظة دي ويحوّلها لـ loop منظّم داخل الوكيل بدل ما تستنى المستخدم يبلغ عن المشكلة.
مثال للمبتدئ: المراجع في الجريدة
تخيّل صحفي بيكتب خبر. الـ workflow القديم: يكتب الخبر ويبعته للنشر مباشرة. لو فيه غلطة في رقم، بتخرج للقراء. الـ workflow الأذكى: في كرسي تاني قدامه شخص اسمه Editor (المراجع). الصحفي يكتب، المراجع يقرأ بسؤال واحد: "هل في رقم متشكك فيه؟ هل في اسم مكتوب غلط؟ هل في جملة بتقول حاجة مش متأكد منها؟" لو لقى مشكلة، بيرجّع الخبر للصحفي يصلّح. بعد جولتين أو تلاتة، الخبر بيخرج أنضف بكتير.
Reflection Pattern في الـ AI هو نفس الفكرة: نموذج واحد بياخد دور الكاتب، ونموذج تاني (أو نفس النموذج بـ system prompt مختلف) بياخد دور المراجع.
التعريف العلمي الدقيق
Reflection Pattern هو نمط معماري في الـ Agentic Systems بيقسّم خطوة الإنتاج لمرحلتين: Generator اللي بينتج المسودة، وReflector اللي بيقيّم المسودة بناءً على معيار محدد (rubric)، ويرجّع feedback نصي. الـ Generator بيستلم الـ feedback ويولّد نسخة معدّلة. الـ loop بيقف لما يحقق إحدى ثلاث حالات: المراجع يقول "OK"، أو نوصل لحد أقصى من التكرارات (max_iterations)، أو ما حصلش تحسن بين تكرارين متتاليين.
الفرق بين Reflexion (الورقة الأصلية) و Self-Refine (Madaan et al., 2023): Reflexion بتحفظ الـ feedback في ذاكرة طويلة المدى عبر مهام متعددة، بينما Self-Refine تكرار داخل نفس الطلب فقط. اللي هنطبقه هنا أقرب لـ Self-Refine لأنه أبسط وكافي لـ 80% من حالات الإنتاج.
الكود الشغّال (Python + Anthropic SDK)
المثال ده بياخد طلب مستخدم، يولّد إجابة بـ Claude Haiku (سريع ورخيص)، يراجعها بـ Claude Sonnet (أدق)، ويعدّلها بحد أقصى تكرارين.
import anthropic
client = anthropic.Anthropic()
GENERATOR_SYSTEM = "أنت كاتب SQL. ارجع query فقط بدون شرح."
REFLECTOR_SYSTEM = (
"أنت مراجع SQL. شوف الquery دي وقول لو فيها مشكلة "
"في WHERE أو JOIN أو أسماء أعمدة. لو سليم رد OK فقط."
)
def generate(prompt, feedback=None):
user_msg = prompt if not feedback else f"{prompt}\n\nملاحظات المراجع: {feedback}"
resp = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=400,
system=GENERATOR_SYSTEM,
messages=[{"role": "user", "content": user_msg}],
)
return resp.content[0].text
def reflect(query):
resp = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=300,
system=REFLECTOR_SYSTEM,
messages=[{"role": "user", "content": query}],
)
return resp.content[0].text.strip()
def run_with_reflection(prompt, max_iters=2):
draft = generate(prompt)
for i in range(max_iters):
feedback = reflect(draft)
if feedback.startswith("OK"):
return draft, i
draft = generate(prompt, feedback=feedback)
return draft, max_iters
query, iters = run_with_reflection(
"اكتبلي query تجيب أعلى 5 منتجات مبيعًا في 2025 من جدول orders"
)
print(f"بعد {iters} مراجعة:\n{query}")