هندسة الأوامر للمقابلات
أنماط تصميم الأوامر: من Zero-Shot إلى شجرة الأفكار
لماذا هذا مهم للمقابلات
OpenAI، Anthropic، وMeta يتوقعون من المرشحين من المستوى L5-L6 تصميم أوامر جاهزة للإنتاج فوراً. سيناريوهات المقابلة الشائعة:
- تصميم النظام: "ابنِ مساعد مراجعة كود. ما استراتيجية الأوامر التي ستستخدمها؟"
- التصحيح: "chatbot الخاص بنا يهلوس في الحالات الحدية. كيف ستصلحه باستخدام الأوامر؟"
- المقارنة: "متى ستستخدم CoT مقابل ReAct مقابل ToT؟"
سؤال المقابلة الحقيقي (Anthropic L6):
"عميل يريد من Claude حل مسائل رياضية معقدة. اشرح لي كيف ستصمم الأمر، من zero-shot إلى التقنيات المتقدمة. ما هي المقايضات؟"
تسلسل الأوامر الهرمي
من الأبسط إلى الأكثر تعقيداً:
Zero-Shot → Few-Shot → Chain-of-Thought → ReAct → Tree of Thoughts
↓ ↓ ↓ ↓ ↓
لا أمثلة أمثلة إظهار التفكير إضافة إجراءات استكشاف مسارات
سريع/رخيص أفضل أفضل بكثير استخدام الأدوات الأفضل (مكلف)
رؤية المقابلة: ابدأ دائماً بـ zero-shot، أضف التعقيد فقط إذا لزم الأمر.
أوامر Zero-Shot (الخط الأساسي)
التعريف: أمر مع وصف المهمة، بدون أمثلة.
متى تستخدمه:
- المهمة محددة جيداً وضمن قدرات LLM
- السرعة والتكلفة مهمة (لا رموز إضافية)
- نماذج بمستوى GPT-5.2 / Claude 4.5 (اتباع تعليمات قوي)
مثال - مراجعة الكود:
from openai import OpenAI
client = OpenAI()
def zero_shot_review(code):
prompt = """أنت مراجع كود خبير. راجع الكود التالي من حيث:
1. الأخطاء والحالات الحدية
2. مشاكل الأداء
3. الثغرات الأمنية
قدم ملاحظات محددة وقابلة للتنفيذ.
الكود للمراجعة:
```python
{code}
```"""
response = client.chat.completions.create(
model="gpt-5.2-mini",
messages=[
{"role": "system", "content": "أنت مراجع كود خبير."},
{"role": "user", "content": prompt.format(code=code)}
],
temperature=0.3 # درجة حرارة أقل للاتساق
)
return response.choices[0].message.content
المزايا:
- ✅ سريع: لا رموز أمر إضافية
- ✅ بسيط: سهل الاختبار والتكرار
- ✅ يعمل جيداً لنماذج GPT-5+
العيوب:
- ❌ أقل اتساقاً من few-shot
- ❌ قد يفوّت أنماط خاصة بالمجال
- ❌ يكافح مع التفكير المعقد
سؤال المقابلة: "متى سيفشل zero-shot؟"
إجابة قوية:
"يفشل zero-shot عندما: (1) تتطلب المهمة تنسيقاً خاصاً بالمجال (مثل المستندات القانونية، التقارير الطبية)، (2) تعليمات غامضة (النموذج يخمن النية)، (3) تفكير معقد متعدد الخطوات بدون إرشاد. مثال: طلب من GPT 'تصحيح هذا الكود' قد يعطي نصائح عامة، ولكن إظهار مثال إخراج تصحيح يوجه التنسيق والعمق المتوقع."
أوامر Few-Shot (التعلم في السياق)
التعريف: توفير 2-8 أمثلة إدخال-إخراج قبل المهمة الفعلية.
الرقم السحري:
- GPT-5.2: 3-5 أمثلة مثالية (عوائد متناقصة بعد 5)
- Claude Opus 4.5: 2-4 أمثلة (اتباع تعليمات أفضل)
- نماذج أصغر: 5-8 أمثلة مطلوبة
مثال - تحليل المشاعر مع الدقة:
def few_shot_sentiment(text):
prompt = """صنف المشاعر كـ: إيجابي، سلبي، أو مختلط (إذا كان متناقضاً).
أمثلة:
الإدخال: "المنتج رائع لكن الشحن استغرق وقتاً طويلاً."
الإخراج: مختلط
الإدخال: "أحبه تماماً! أفضل شراء على الإطلاق."
الإخراج: إيجابي
الإدخال: "إهدار للمال. انكسر بعد يومين."
الإخراج: سلبي
الإدخال: "يعمل بشكل جيد أعتقد، لا شيء مميز."
الإخراج: مختلط
الآن صنف:
الإدخال: "{text}"
الإخراج:"""
response = client.chat.completions.create(
model="gpt-5.2-mini",
messages=[{"role": "user", "content": prompt.format(text=text)}],
temperature=0.0, # حتمي للتصنيف
max_tokens=10
)
return response.choices[0].message.content.strip()
لماذا يعمل هذا:
- النموذج يتعلم تنسيق المهمة (التصنيف، وليس التفسير)
- النموذج يتعلم الحالات الحدية (مشاعر مختلطة)
- النموذج يتعلم أسلوب الإخراج (إجابات من كلمة واحدة)
غوص عميق في المقابلة: "كيف تختار أمثلة few-shot؟"
استراتيجية الإنتاج:
-
التنوع: غطِ أنماط إدخال مختلفة
# سيء: كل الأمثلة إيجابية examples = ["رائع!", "مذهل!", "أحبه!"] # جيد: أنماط متنوعة examples = [ ("منتج رائع!", "إيجابي"), ("جودة رهيبة", "سلبي"), ("جيد لكن باهظ الثمن", "مختلط"), ("ميه، جيد", "مختلط") ] -
التشابه: استرجع أمثلة مشابهة للإدخال الحالي (نمط RAG)
from sklearn.metrics.pairwise import cosine_similarity from openai import OpenAI client = OpenAI() def get_embedding(text): response = client.embeddings.create( model="text-embedding-3-large", input=text ) return response.data[0].embedding def select_examples(query, example_pool, k=3): """اختر أكثر الأمثلة تشابهاً مع الاستعلام.""" query_emb = get_embedding(query) similarities = [] for ex in example_pool: ex_emb = get_embedding(ex['input']) sim = cosine_similarity([query_emb], [ex_emb])[0][0] similarities.append((sim, ex)) # إرجاع أعلى k الأكثر تشابهاً similarities.sort(reverse=True) return [ex for _, ex in similarities[:k]] -
الترتيب: المثال الأكثر تعقيداً أخيراً (يهيئ النموذج)
# أفضل: مثال معقد مباشرة قبل المهمة examples = [ ("حالة بسيطة", "إخراج"), ("حالة متوسطة", "إخراج"), ("حالة حدية معقدة", "إخراج") # هذا الأكثر أهمية ]
اعتبار التكلفة:
لـ GPT-5.2 ($1.75 / $14 لكل 1M رمز):
- 5 أمثلة × 100 رمز = 500 رمز إدخال
- عند 10,000 طلب/يوم = 5M رمز/يوم = $8.75/يوم
- التحسين: خزّن الأمثلة في أمر النظام (خصم 90% مع التخزين المؤقت للأوامر)
أوامر سلسلة الأفكار (CoT)
الاختراق (Wei et al., 2022):
إضافة "دعنا نفكر خطوة بخطوة" يحسن التفكير بنسبة 30-40% في مهام الرياضيات/المنطق.
لماذا يعمل:
- يجبر النموذج على تحليل المشكلة
- يجعل التفكير قابلاً للفحص (يمكنك تصحيح الخطوات الخاطئة)
- ينشط تفكير النظام 2 (متعمد، وليس انعكاسي)
مثال - مسألة رياضية لفظية:
def cot_math_solver(problem):
prompt = """حل هذا خطوة بخطوة:
المسألة: {problem}
دعنا نفكر في هذا بعناية:
1. حدد ما نحتاج لإيجاده
2. استخرج الأرقام والعلاقات ذات الصلة
3. أعد المعادلة
4. حل خطوة بخطوة
5. تحقق من أن الإجابة منطقية
الحل:"""
response = client.chat.completions.create(
model="gpt-5.2", # نموذج أكبر للتفكير
messages=[{"role": "user", "content": prompt.format(problem=problem)}],
temperature=0.0
)
return response.choices[0].message.content
# مثال الاستخدام
problem = """قطار يسافر 120 كم في ساعتين، ثم 180 كم في 3 ساعات.
ما هي سرعته المتوسطة للرحلة بأكملها؟"""
solution = cot_math_solver(problem)
print(solution)
الإخراج:
1. نحتاج لإيجاد: السرعة المتوسطة للرحلة بأكملها
2. استخراج المعلومات:
- المرحلة الأولى: 120 كم في ساعتين
- المرحلة الثانية: 180 كم في 3 ساعات
3. إعداد المعادلة:
السرعة المتوسطة = إجمالي المسافة / إجمالي الوقت
4. الحل:
إجمالي المسافة = 120 + 180 = 300 كم
إجمالي الوقت = 2 + 3 = 5 ساعات
السرعة المتوسطة = 300 / 5 = 60 كم/ساعة
5. التحقق: 60 كم/ساعة × 5 ساعات = 300 كم ✓
الإجابة: 60 كم/ساعة
Few-Shot CoT (أفضل حتى):
def few_shot_cot_solver(problem):
prompt = """حل المسائل الرياضية خطوة بخطوة.
مثال 1:
المسألة: إذا كانت 5 تفاحات تكلف 3 دولار، كم تكلف 8 تفاحات؟
الحل:
الخطوة 1: إيجاد التكلفة لكل تفاحة: $3 ÷ 5 = $0.60 لكل تفاحة
الخطوة 2: اضرب في 8: $0.60 × 8 = $4.80
الإجابة: $4.80
مثال 2:
المسألة: مستطيل طوله 12 سم وعرضه 5 سم. ما هي مساحته؟
الحل:
الخطوة 1: استخدم الصيغة: المساحة = الطول × العرض
الخطوة 2: احسب: 12 × 5 = 60 سم²
الإجابة: 60 سم²
الآن حل:
المسألة: {problem}
الحل:"""
response = client.chat.completions.create(
model="gpt-5.2",
messages=[{"role": "user", "content": prompt.format(problem=problem)}],
temperature=0.0
)
return response.choices[0].message.content
سؤال المقابلة (OpenAI): "متى يفشل CoT؟ كيف ستكتشفه وتتعامل معه؟"
إجابة قوية:
"يفشل CoT عندما: (1) يفتقر النموذج للمعرفة بالمجال (لا يمكن للتفكير إصلاح الحقائق المفقودة)، (2) تتطلب المشكلة أدوات خارجية (مثل الحساب الدقيق - استخدم ReAct بدلاً من ذلك)، (3) مسارات حل صالحة متعددة تربك النموذج (استخدم شجرة الأفكار). الكشف: حلل إخراج CoT، تحقق من منطق كل خطوة. إذا تناقضت خطوة مع الخطوات السابقة أو قفزت بدون مبرر، ضع علامة للمراجعة البشرية أو أعد التوليد بقيود أقوى."
ReAct (التفكير + التصرف)
النمط (Yao et al., 2023):
تداخل خطوات التفكير مع استدعاءات الأدوات لتأسيس الإجابات في الحقائق.
الهيكل:
الفكرة: ما الذي أحتاج لفعله؟
الإجراء: استدعِ الأداة X بالإدخال Y
الملاحظة: الأداة تُرجع Z
الفكرة: بناءً على Z، بعد ذلك يجب أن...
الإجراء: استدعِ الأداة W
الملاحظة: ...
الإجابة: الاستجابة النهائية
مثال - دعم العملاء مع البحث في قاعدة البيانات:
import json
from datetime import datetime
def react_customer_support(query, tools):
"""
tools: قاموس الدوال المتاحة
"""
system_prompt = """أنت وكيل دعم عملاء لديه وصول إلى الأدوات.
الأدوات المتاحة:
- lookup_order(order_id): الحصول على تفاصيل الطلب
- check_inventory(product_id): التحقق من حالة المخزون
- create_refund(order_id, reason): بدء الاسترداد
استخدم هذا التنسيق:
الفكرة: [تفكيرك]
الإجراء: [tool_name(arguments)]
الملاحظة: [إخراج الأداة]
... (كرر حسب الحاجة)
الإجابة: [الاستجابة النهائية للعميل]"""
max_iterations = 5
conversation = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": query}
]
for i in range(max_iterations):
response = client.chat.completions.create(
model="gpt-5.2",
messages=conversation,
temperature=0.0
)
content = response.choices[0].message.content
conversation.append({"role": "assistant", "content": content})
# تحقق مما إذا كانت الإجابة كاملة
if "الإجابة:" in content:
return content.split("الإجابة:")[-1].strip()
# حلل ونفذ الإجراء
if "الإجراء:" in content:
action_line = [l for l in content.split("\n") if l.startswith("الإجراء:")][0]
action = action_line.replace("الإجراء:", "").strip()
# نفذ الأداة (مبسط)
observation = execute_tool(action, tools)
# أضف الملاحظة للمحادثة
conversation.append({
"role": "user",
"content": f"الملاحظة: {observation}"
})
else:
break
return "غير قادر على إكمال الطلب بعد 5 تكرارات."
def execute_tool(action, tools):
"""حلل ونفذ استدعاء الأداة."""
# محلل بسيط (الإنتاج سيستخدم API استدعاء الدوال)
import re
match = re.match(r"(\w+)\((.*?)\)", action)
if match:
tool_name = match.group(1)
args = match.group(2)
if tool_name in tools:
return tools[tool_name](args)
return "الأداة غير موجودة أو بناء جملة غير صالح."
# مثال الاستخدام
tools = {
"lookup_order": lambda order_id: json.dumps({
"order_id": order_id,
"status": "مشحون",
"tracking": "1Z999AA10123456784",
"estimated_delivery": "2026-01-05"
}),
"check_inventory": lambda product_id: json.dumps({
"product_id": product_id,
"in_stock": True,
"quantity": 47
})
}
query = "أين طلبي #12345؟ أحتاجه بحلول 4 يناير."
response = react_customer_support(query, tools)
print(response)
أثر ReAct المتوقع:
الفكرة: أحتاج للبحث عن حالة الطلب لمعرفة ما إذا كان سيصل في الوقت المحدد.
الإجراء: lookup_order("12345")
الملاحظة: {"order_id": "12345", "status": "مشحون", "tracking": "1Z999AA10123456784", "estimated_delivery": "2026-01-05"}
الفكرة: الطلب مشحون لكن لن يصل حتى 5 يناير، متأخر يوم واحد. يجب أن أُعلم العميل.
الإجابة: طلبك #12345 حالياً في الطريق برقم التتبع 1Z999AA10123456784. للأسف، التسليم المتوقع هو 5 يناير، وهو متأخر يوم واحد عما تحتاج. هل تريد مني التحقق مما إذا كان يمكننا تسريع الشحن أو إصدار استرداد جزئي للتأخير؟
سؤال المقابلة: "ReAct مقابل API استدعاء الدوال (GPT-5.2، Claude 4.5) - ما الفرق؟"
الإجابة:
"ReAct هو نمط أوامر حيث التفكير والإجراءات في نص. استدعاء الدوال هو ميزة API أصلية حيث يخرج النموذج JSON منظم لاستخدام الأدوات، وهو أكثر موثوقية. استخدم استدعاء الدوال عندما يكون متاحاً (GPT-5.2، Claude 4.5، Gemini 3 Pro كلها تدعمه). استخدم ReAct عندما: (1) تحتاج لرؤية آثار التفكير للتصحيح، (2) العمل مع نماذج بدون استدعاء الدوال، (3) تفكير معقد متعدد الخطوات حيث إظهار عملية التفكير يحسن الدقة."
شجرة الأفكار (ToT)
الفكرة (Yao et al., 2023):
للمشاكل المعقدة، استكشف مسارات تفكير متعددة (مثل شجرة البحث)، قيّم كلاً منها، واختر الأفضل.
متى تستخدمه:
- الكتابة الإبداعية (توليد عدة مخططات قصة)
- تحسين الكود (استكشاف خوارزميات مختلفة)
- التخطيط الاستراتيجي (تقييم الخيارات)
تحذير التكلفة: ToT يولد رموزاً أكثر بـ 3-5x من CoT. استخدمه فقط للمهام عالية القيمة.
مثال - تصميم خوارزمية:
from typing import List, Dict
def tree_of_thoughts_solver(problem: str, num_paths: int = 3) -> Dict:
"""
توليد مسارات حل متعددة، تقييم كل منها، اختيار الأفضل.
"""
# الخطوة 1: توليد مسارات تفكير متعددة
paths = []
for i in range(num_paths):
prompt = f"""حل هذه المشكلة. اقترح نهجاً فريداً (هذه المحاولة {i+1} من {num_paths}):
المشكلة: {problem}
النهج:"""
response = client.chat.completions.create(
model="gpt-5.2",
messages=[{"role": "user", "content": prompt}],
temperature=0.8, # درجة حرارة أعلى للتنوع
n=1
)
paths.append({
"path_id": i,
"approach": response.choices[0].message.content
})
# الخطوة 2: تقييم كل مسار
for path in paths:
eval_prompt = f"""قيّم هذا النهج على مقياس من 1-10 لـ:
- الصحة (هل سيعمل؟)
- الكفاءة (تعقيد الزمن/المساحة)
- البساطة (سهل التنفيذ؟)
النهج:
{path['approach']}
التقييم (تنسيق JSON):"""
response = client.chat.completions.create(
model="gpt-5.2",
messages=[{"role": "user", "content": eval_prompt}],
temperature=0.0,
response_format={"type": "json_object"}
)
path["evaluation"] = json.loads(response.choices[0].message.content)
path["total_score"] = sum(path["evaluation"].values())
# الخطوة 3: اختيار أفضل مسار
best_path = max(paths, key=lambda p: p["total_score"])
# الخطوة 4: تحسين أفضل مسار
refine_prompt = f"""خذ هذا النهج ونفذه بالكامل:
{best_path['approach']}
قدم كوداً كاملاً جاهزاً للإنتاج مع التعليقات:"""
response = client.chat.completions.create(
model="gpt-5.2",
messages=[{"role": "user", "content": refine_prompt}],
temperature=0.3
)
return {
"all_paths": paths,
"best_path": best_path,
"final_solution": response.choices[0].message.content
}
# مثال
problem = """صمم خوارزمية لإيجاد العناصر k الأكثر تكراراً في مصفوفة.
حسّن لـ: تعقيد زمني O(n log k)."""
result = tree_of_thoughts_solver(problem, num_paths=3)
print(f"أفضل نهج (النتيجة: {result['best_path']['total_score']/30*100:.0f}%):")
print(result['final_solution'])
رؤية المقابلة: ذكر ToT يُظهر أنك تعرف التقنيات المتطورة، ولكن اعترف بأنها مكلفة وفقط للمهام الحاسمة.
إطار اختيار النمط (ذهب المقابلة)
مصفوفة القرار:
| النمط | الأفضل لـ | التكلفة | الاتساق | مثال حالة الاستخدام |
|---|---|---|---|---|
| Zero-Shot | مهام بسيطة، محددة جيداً | $ | متوسط | التلخيص، الترجمة |
| Few-Shot | تعلم التنسيق، التصنيف | $$ | عالي | تحليل المشاعر، استخراج الكيانات |
| CoT | الرياضيات، المنطق، التفكير متعدد الخطوات | $$$ | عالي | التصحيح، التخطيط |
| ReAct | استخدام الأدوات، التأسيس الواقعي | $$$$ | عالي جداً | دعم العملاء، استرجاع البيانات |
| ToT | الإبداع، الاستراتيجية، التحسين | $$$$$ | متوسط | تصميم الخوارزمية، كتابة القصص |
سؤال المقابلة (Meta): "صمم مولد توثيق كود. اشرح استراتيجية الأوامر الخاصة بك."
إجابة قوية:
1. ابدأ بـ Zero-Shot:
- الأمر: "توليد docstring لهذه الدالة"
- اختبر على 10 دوال
- إذا كانت الجودة جيدة (>90% قبول)، أطلقه
2. إذا كان غير متسق، أضف Few-Shot:
- اجمع 5 أمثلة عالية الجودة (أنواع دوال متنوعة)
- ضمّن الحالات الحدية (دوال async، generators، إلخ.)
- أعد الاختبار
3. إذا كان لا يزال يفقد السياق، أضف CoT:
- "حلل الدالة خطوة بخطوة: المدخلات، المنطق، المخرجات، الحالات الحدية"
- ثم توليد docstring
- يحسن الجودة للدوال المعقدة
4. إذا كان يهلوس (يختلق السلوك)، أضف ReAct:
- أداة: محلل AST للتحقق من توقيع الدالة
- أداة: تشغيل الاختبارات للتحقق من السلوك
- تأسيس docstring في سلوك الكود الفعلي
سأبدأ بـ zero-shot + GPT-5.2-mini ($0.15/$0.60 لكل 1M) لكفاءة التكلفة،
ثم الترقية إلى few-shot CoT فقط للدوال التي تفشل في فحوصات الجودة (ربما 10%).
هذا يحسن التكلفة والجودة معاً.
متقدم: الاتساق الذاتي (CoT المجمع)
التقنية:
- توليد متعدد لمسارات تفكير CoT (مثل 5)
- استخراج الإجابات النهائية من كل منها
- إرجاع تصويت الأغلبية
متى تستخدمه: قرارات عالية المخاطر حيث الدقة > التكلفة (طبي، قانوني، مالي).
from collections import Counter
def self_consistency_solver(problem: str, num_samples: int = 5) -> Dict:
"""توليد حلول CoT متعددة وأخذ تصويت الأغلبية."""
solutions = []
for i in range(num_samples):
response = client.chat.completions.create(
model="gpt-5.2",
messages=[{
"role": "user",
"content": f"حل خطوة بخطوة:\n{problem}\nالإجابة النهائية:"
}],
temperature=0.7, # بعض العشوائية للتنوع
)
solutions.append(response.choices[0].message.content)
# استخراج الإجابات النهائية (مبسط)
answers = [s.split("الإجابة:")[-1].strip() for s in solutions if "الإجابة:" in s]
# تصويت الأغلبية
vote_counts = Counter(answers)
majority_answer, count = vote_counts.most_common(1)[0]
return {
"all_solutions": solutions,
"majority_answer": majority_answer,
"confidence": count / num_samples,
"vote_distribution": dict(vote_counts)
}
# مثال
result = self_consistency_solver(
"إذا استغرقت 5 آلات 5 دقائق لصنع 5 قطع، كم من الوقت ستستغرق 100 آلة لصنع 100 قطعة؟",
num_samples=5
)
print(f"الإجابة: {result['majority_answer']}")
print(f"الثقة: {result['confidence']*100:.0f}%")
التكلفة: 5x استدعاء CoT واحد. لـ GPT-5.2: ~$0.10 لكل مشكلة (إذا كان المتوسط 1K رمز).
الأخطاء الشائعة التي يجب تجنبها (تصحيح المقابلة)
الخطأ 1: تعليمات غامضة
# سيء
prompt = "اجعل هذا الكود أفضل"
# جيد
prompt = """أعد هيكلة هذا الكود لـ:
1. تقليل تعقيد الزمن من O(n²) إلى O(n log n)
2. إضافة معالجة الأخطاء للحالات الحدية
3. إضافة docstrings بأسلوب Google"""
الخطأ 2: لا قيود على الإخراج
# سيء - قد يكتب النموذج مقالة
prompt = "ما هو 2+2؟"
# جيد
prompt = "ما هو 2+2؟ أجب بالرقم فقط."
# أو استخدم max_tokens=5
الخطأ 3: تجاهل حدود النموذج
# سيء - النموذج لا يعرف البيانات الحالية
prompt = "ما هو سعر سهم AAPL الآن؟"
# جيد - استخدم ReAct مع الأداة
prompt = "تحقق من سعر سهم AAPL باستخدام أداة get_stock_price، ثم حلل الاتجاه."
النقاط الرئيسية للمقابلات
✅ ابدأ بسيطاً: Zero-shot أولاً، أضف التعقيد فقط إذا لزم الأمر ✅ اعرف التكاليف: Few-shot = 2-3x، CoT = 3-5x، ToT = 10x+ استخدام الرموز ✅ اختيار Few-shot: متنوع، مشابه للاستعلام، أمثلة معقدة أخيراً ✅ CoT يفتح التفكير: ضروري للرياضيات، المنطق، التصحيح ✅ ReAct للتأسيس: استخدم الأدوات لمنع الهلوسة ✅ ToT للاستكشاف: فقط للمهام الإبداعية/الاستراتيجية عالية القيمة
التالي: تعلم كيف يعمل التعلم في السياق فعلياً تحت الغطاء في الدرس 2.
:::