هندسة الأوامر للمقابلات
آليات التعلم في السياق
لماذا هذا مهم للمقابلات
كل مقابلة مهندس LLM في OpenAI، Anthropic، Meta، وGoogle ستسأل:
- "اشرح كيف يعمل التعلم في السياق" (الآلية، وليس فقط التعريف)
- "متى ستستخدم ICL مقابل RAG مقابل الضبط الدقيق؟" (إطار القرار)
- "كيف تحسن اختيار أمثلة few-shot؟" (استراتيجيات الاسترجاع)
سؤال المقابلة الحقيقي (Meta L5):
"تبني chatbot لدعم العملاء. يحتاج للتعلم من 10,000 محادثة سابقة. هل ستستخدم التعلم في السياق، RAG، أو الضبط الدقيق؟ اشرح لي عملية اتخاذ القرار والمقايضات."
ما هو التعلم في السياق؟
التعريف: LLMs تتعلم من الأمثلة في الأمر بدون تحديث أوزان النموذج.
الاكتشاف المفاجئ (GPT-3، 2020):
- أعطِ GPT-3 بعض أمثلة الترجمة → يترجم
- أعطه أمثلة كود → يكتب كود
- أعطه أمثلة تحليل المشاعر → يصنف المشاعر
كل هذا بدون تحديث تدرج واحد.
لماذا هذا مهم:
- ✅ لا حاجة للتدريب: نشر مهام جديدة فوراً
- ✅ لا حاجة لبيانات: فقط بعض الأمثلة (2-8)
- ✅ مرن: تغيير السلوك بتغيير الأمثلة
كيف يعمل ICL فعلياً؟
الآلية (منظور البحث)
الفرضية 1: مطابقة الأنماط (سطحي)
- النموذج يتعرف على الأنماط السطحية في الأمثلة
- المشكلة: لا يشرح لماذا يمكن لـ GPT-5 القيام بـ مهام غير مرئية
الفرضية 2: رؤوس الاستقراء (قابلية التفسير الميكانيكي)
- رؤوس انتباه محددة تتعلم نسخ الأنماط من السياق
- "رؤوس الاستقراء" في الطبقات 10-20 تكتشف وتكرر الأنماط
- الدليل: إزالة هذه الرؤوس يدمر قدرة ICL
الفرضية 3: التعلم الوصفي أثناء التدريب المسبق
- النموذج يرى ملايين "أمثلة المهام" في التدريب المسبق
- يتعلم خوارزمية عامة لـ "استنتاج المهمة من الأمثلة"
- ICL هو تعلم وصفي ضمني
إجابة المقابلة:
"يعمل ICL من خلال رؤوس الاستقراء - دوائر انتباه تكتشف الأنماط في السياق وتطبقها على مدخلات جديدة. أثناء التدريب المسبق على تريليونات الرموز، يواجه النموذج سيناريوهات few-shot ضمنية لا حصر لها (مثل مقالة ويكيبيديا تعرّف مصطلحاً، ثم تستخدمه). هذا يدرب النموذج على استنتاج المهام من الأمثلة. في الاستنتاج، إعطاء 3-5 أمثلة ينشط رؤوس الاستقراء هذه لتطبيق النمط على استعلامك."
مثال الكود - تصور الانتباه على الأمثلة:
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
def visualize_icl_attention(model_name="gpt2"):
"""
إظهار أي أجزاء من الأمر يهتم بها GPT أثناء ICL.
"""
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, output_attentions=True)
# أمر few-shot
prompt = """ترجم الإنجليزية إلى الفرنسية:
الإنجليزية: Hello
الفرنسية: Bonjour
الإنجليزية: Goodbye
الفرنسية: Au revoir
الإنجليزية: Thank you
الفرنسية:"""
inputs = tokenizer(prompt, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
attentions = outputs.attentions # Tuple of (num_layers, batch, num_heads, seq_len, seq_len)
# افحص الطبقة الأخيرة، الرأس الأخير (غالباً رأس الاستقراء)
last_layer_attn = attentions[-1][0, -1, :, :] # (seq_len, seq_len)
# أين يهتم النموذج عند التنبؤ بالترجمة الفرنسية؟
last_token_attn = last_layer_attn[-1, :] # الانتباه من الرمز الأخير
tokens = tokenizer.convert_ids_to_tokens(inputs['input_ids'][0])
print("الرموز الأكثر اهتماماً (النموذج ينسخ الأنماط من):")
top_indices = last_token_attn.argsort(descending=True)[:5]
for idx in top_indices:
print(f" {tokens[idx]}: {last_token_attn[idx]:.3f}")
# الإخراج يظهر أن النموذج يهتم أكثر بـ "Bonjour" و"Au revoir" (الأمثلة الفرنسية)
ICL مقابل RAG مقابل الضبط الدقيق: مصفوفة القرار
هذا الإطار الأكثر أهمية للمقابلات.
جدول المقارنة
| البُعد | التعلم في السياق (ICL) | RAG (المُعزز بالاسترجاع) | الضبط الدقيق |
|---|---|---|---|
| وقت الإعداد | فوري (فقط الأمر) | ساعات (بناء الفهرس) | أيام-أسابيع (التدريب) |
| البيانات المطلوبة | 2-8 أمثلة | 100s-1000s مستندات | 1000s-100Ks أمثلة |
| التكلفة لكل طلب | $$$ (أوامر أكبر) | $$ (تضمين + LLM) | $ (الاستنتاج فقط) |
| عمق التخصيص | سطحي (التنسيق، الأسلوب) | متوسط (المعرفة) | عميق (السلوك، المجال) |
| تحديثات المعرفة | فوري (تغيير الأمثلة) | سريع (تحديث الفهرس) | بطيء (إعادة التدريب) |
| حد نافذة السياق | نعم (يناسب الأمر؟) | جزئي (الاسترجاع يرشح) | لا |
| الأفضل لـ | مهام جديدة، تعلم التنسيق | أسئلة كثيفة المعرفة | تكيف المجال، السلوك |
إطار القرار (ذهب المقابلة)
استخدم ICL عندما:
- ✅ المهمة جديدة/تجريبية (اختبار الأفكار)
- ✅ تحتاج نشر فوري (لا وقت تدريب)
- ✅ أمثلة قليلة متاحة (2-10)
- ✅ المهمة تتغير بشكل متكرر (اختبار A/B للأوامر)
استخدم RAG عندما:
- ✅ تحتاج معرفة خارجية (مستندات، قواعد بيانات)
- ✅ المعرفة تُحدث بشكل متكرر (أخبار، مخزون)
- ✅ الأسئلة تتطلب تفكير متعدد القفزات عبر المستندات
- ✅ تريد الاستشهاد بالمصادر (الشفافية)
استخدم الضبط الدقيق عندما:
- ✅ تحتاج سلوك متسق على مهمة محددة
- ✅ المهمة محددة جيداً ومستقرة
- ✅ لديك 1000+ أمثلة عالية الجودة
- ✅ تريد كمون وتكلفة أقل لكل طلب (نموذج أصغر)
مثال استجابة المقابلة:
القائم بالمقابلة: "10,000 محادثة دعم عملاء. ICL، RAG، أو ضبط دقيق؟"
إجابة قوية:
التحليل:
- حجم البيانات: 10,000 مثال → كافٍ للضبط الدقيق
- استقرار المهمة: دعم العملاء مستمر → مهمة مستقرة
- تحديثات المعرفة: السياسات تتغير → تحتاج معلومات جديدة
القرار: نهج هجين (جاهز للإنتاج)
1. RAG للمعرفة:
- فهرسة جميع المحادثات 10K + مستندات الشركة
- استرجاع أعلى 3 محادثات سابقة مشابهة
- استرجاع مستندات السياسة ذات الصلة
- هذا يتعامل مع: "ما هي سياسة الإرجاع لدينا؟" (استشهد بأحدث سياسة)
2. Few-shot ICL للتنسيق:
- 2-3 أمثلة لأسلوب الاستجابة المثالي
- "كن موجزاً، متعاطفاً، اعرض دائماً الخطوات التالية"
- هذا يضمن: نبرة متسقة
3. الضبط الدقيق (اختياري، إذا كانت الميزانية تسمح):
- ضبط دقيق لـ GPT-5.2-mini على 10K محادثة
- تكلفة أقل لكل طلب ($0.15 مقابل $1.75 لكل 1M رمز إدخال)
- أسرع (عبء أمر أقل)
- استخدم للحجم الكبير (>100K طلب/شهر)
لماذا ليس ICL نقياً؟
- 10K محادثة لن تناسب نافذة السياق (128K رمز ≈ 2000 محادثة كحد أقصى)
- مكلف: 2000 رمز مثال لكل طلب × 1M طلب/شهر = $3,500/شهر فقط للأمثلة
لماذا ليس ضبط دقيق نقي؟
- لا يمكن تحديث المعرفة بدون إعادة التدريب
- قد يهلوس سياسات قديمة
تحسين اختيار أمثلة Few-Shot
المشكلة: مع 10,000 مثال، أي 3-5 تدرجها في الأمر؟
الاستراتيجية 1: العينة العشوائية (الخط الأساسي)
import random
def random_few_shot(examples, k=3):
"""النهج الأبسط: k أمثلة عشوائية."""
return random.sample(examples, k)
# المزايا: سريع، لا تحيز
# العيوب: قد يختار أمثلة غير ذات صلة
الاستراتيجية 2: عينة التنوع
الهدف: تغطية أنماط إدخال مختلفة.
from sklearn.cluster import KMeans
from sentence_transformers import SentenceTransformer
import numpy as np
def diversity_few_shot(examples, k=3):
"""
اختيار k أمثلة متنوعة باستخدام التجميع.
"""
model = SentenceTransformer('all-MiniLM-L6-v2')
# تضمين جميع الأمثلة
texts = [ex['input'] for ex in examples]
embeddings = model.encode(texts)
# تجميع في k مجموعات
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(embeddings)
# اختيار مثال الأقرب لكل مركز مجموعة
selected = []
for i in range(k):
cluster_points = np.where(kmeans.labels_ == i)[0]
center = kmeans.cluster_centers_[i]
# إيجاد أقرب نقطة للمركز
distances = np.linalg.norm(embeddings[cluster_points] - center, axis=1)
closest_idx = cluster_points[distances.argmin()]
selected.append(examples[closest_idx])
return selected
# مثال
examples = [
{"input": "منتج رائع!", "output": "إيجابي"},
{"input": "جودة رهيبة", "output": "سلبي"},
{"input": "جيد أعتقد", "output": "محايد"},
{"input": "أحبه كثيراً!", "output": "إيجابي"},
{"input": "ليس ما توقعته", "output": "سلبي"},
{"input": "جيد", "output": "محايد"},
]
diverse_examples = diversity_few_shot(examples, k=3)
# يُرجع: مثال إيجابي واحد، سلبي واحد، محايد واحد
الاستراتيجية 3: الاسترجاع المبني على التشابه (الأفضل للإنتاج)
الهدف: اختيار أمثلة الأكثر تشابهاً مع الاستعلام الحالي.
from sentence_transformers import SentenceTransformer, util
import torch
class FewShotRetriever:
"""
استرجاع أكثر أمثلة few-shot ذات صلة لكل استعلام.
يُستخدم في الإنتاج في OpenAI، Anthropic.
"""
def __init__(self, example_pool):
self.examples = example_pool
self.model = SentenceTransformer('all-MiniLM-L6-v2')
# حساب التضمينات مسبقاً (افعل مرة، خزّن)
self.embeddings = self.model.encode(
[ex['input'] for ex in example_pool],
convert_to_tensor=True
)
def retrieve(self, query, k=3):
"""استرجاع k أمثلة الأكثر تشابهاً مع الاستعلام."""
query_embedding = self.model.encode(query, convert_to_tensor=True)
# حساب تشابه جيب التمام
similarities = util.cos_sim(query_embedding, self.embeddings)[0]
# الحصول على أعلى k
top_k = torch.topk(similarities, k=k)
selected = []
for idx in top_k.indices:
selected.append(self.examples[idx.item()])
return selected
# الاستخدام
retriever = FewShotRetriever(examples)
query = "أنا محبط من هذا الشراء"
relevant_examples = retriever.retrieve(query, k=3)
# من المحتمل إرجاع: "جودة رهيبة"، "ليس ما توقعته"، "جيد أعتقد"
# (كلها سلبية/محايدة، مشاعر مشابهة)
تحليل التكلفة:
لمجموعة 10,000 مثال:
- تكلفة التضمين: 10,000 × 384 بُعد × 4 بايت = 15 MB (ضئيل)
- كمون الاسترجاع: <10ms مع FAISS/Annoy
- تكلفة API: $0 (بحث تشابه محلي)
رؤية المقابلة: ذكر "سنستخدم sentence-transformers للاسترجاع، نخزّن التضمينات، ونستخدم FAISS للتوسع" يُظهر تفكير الإنتاج.
الاستراتيجية 4: تعدين الأمثلة الصعبة
الهدف: تضمين أمثلة تحدّي تعلم الحالات الحدية.
def hard_example_mining(examples, model, k=3):
"""
اختيار الأمثلة التي يخطئ فيها النموذج حالياً.
يحسن الأداء على الحالات الصعبة.
"""
scores = []
for ex in examples:
# اختبار النموذج بـ zero-shot
prediction = model.predict_zero_shot(ex['input'])
# النتيجة بالصعوبة (1 إذا صحيح، 0 إذا خطأ)
correct = (prediction == ex['output'])
scores.append(1 - correct) # نتيجة أعلى = أصعب
# اختيار أعلى k أمثلة صعبة
hard_indices = np.argsort(scores)[-k:]
return [examples[i] for i in hard_indices]
# هذا تعلم few-shot تكيفي
# النموذج يتحسن على نقاط ضعفه
أوامر Few-Shot الديناميكية مقابل الثابتة
Few-Shot الثابت (بسيط)
STATIC_EXAMPLES = [
{"input": "رائع!", "output": "إيجابي"},
{"input": "سيء.", "output": "سلبي"},
{"input": "جيد.", "output": "محايد"}
]
def static_prompt(query):
prompt = "صنف المشاعر:\n\n"
for ex in STATIC_EXAMPLES:
prompt += f"الإدخال: {ex['input']}\nالإخراج: {ex['output']}\n\n"
prompt += f"الإدخال: {query}\nالإخراج:"
return prompt
المزايا:
- ✅ بسيط، حتمي
- ✅ يمكن تخزين بادئة الأمر مؤقتاً (تخفيض التكلفة بنسبة 90% مع التخزين المؤقت لأوامر GPT-5.2)
العيوب:
- ❌ نفس الأمثلة لجميع الاستعلامات (ليس مثالياً)
Few-Shot الديناميكي (الإنتاج)
def dynamic_prompt(query, retriever, k=3):
"""استرجاع أمثلة ذات صلة لكل استعلام."""
examples = retriever.retrieve(query, k=k)
prompt = "صنف المشاعر:\n\n"
for ex in examples:
prompt += f"الإدخال: {ex['input']}\nالإخراج: {ex['output']}\n\n"
prompt += f"الإدخال: {query}\nالإخراج:"
return prompt
المزايا:
- ✅ دقة أفضل (أمثلة ذات صلة)
- ✅ يتعامل مع الحالات الحدية
العيوب:
- ❌ أكثر تعقيداً
- ❌ لا يمكن التخزين المؤقت (أمثلة مختلفة لكل استعلام)
مقايضة المقابلة:
"سأبدأ بـ few-shot ثابت + تخزين مؤقت للأوامر لتحسين التكلفة. إذا لم تكن الدقة جيدة بما فيه الكفاية، الترقية إلى الاسترجاع الديناميكي لأدنى 10% من الاستعلامات (بناءً على درجات الثقة)."
اعتبارات طول السياق
الرياضيات:
لـ GPT-5.2 (نافذة سياق 128K):
- 1 رمز ≈ 4 أحرف
- 128K رمز ≈ 512,000 حرف ≈ 100-150 صفحة من النص
ميزانية Few-Shot:
def calculate_few_shot_budget(max_context=128000, query_tokens=100,
output_tokens=500, safety_margin=0.1):
"""
حساب كم من أمثلة few-shot تناسب السياق.
"""
# احتفظ بمساحة للاستعلام والإخراج
reserved = query_tokens + output_tokens
# هامش أمان لأمر النظام، التنسيق
available = max_context * (1 - safety_margin) - reserved
return available
# لـ GPT-5.2
available = calculate_few_shot_budget()
print(f"الرموز المتاحة للأمثلة: {available:,.0f}")
# إذا كان كل مثال ~200 رمز (إدخال + إخراج + تنسيق):
max_examples = available // 200
print(f"أمثلة few-shot كحد أقصى: {max_examples}")
# الإخراج: ~570 مثال كحد أقصى (لكن عوائد متناقصة بعد 5-10)
سؤال المقابلة: "لديك 1000 مثال لكن فقط 5 تناسب الأمر. كيف تختار؟"
الإجابة:
- استخدم الاسترجاع لاختيار الأكثر صلة 5 (مبني على التشابه)
- أو: عينة طبقية (1-2 من كل فئة/مجموعة)
- أو: نهج التعلم الوصفي (تعلم أي الأمثلة تعمم بشكل أفضل)
عندما يفشل ICL: المزالق الشائعة
وضع الفشل 1: المهمة تتطلب الحفظ
# استخدام سيء لـ ICL
examples = [
{"employee_id": "E12345", "manager": "Alice"},
{"employee_id": "E67890", "manager": "Bob"},
# ... 1000 أكثر
]
query = "من هو مدير E12345؟"
# النموذج سيخمن، ولن يحفظ 1000 تعيين
الحل: استخدم RAG (فهرس بيانات الموظفين، استرجع التطابق الدقيق).
وضع الفشل 2: الأمثلة متنوعة جداً
# سيء: الأمثلة ليس لها نمط مشترك
examples = [
{"input": "ترجم: Hello", "output": "Bonjour"},
{"input": "2 + 2 = ؟", "output": "4"},
{"input": "المشاعر: أحبه", "output": "إيجابي"}
]
query = "ترجم: Goodbye"
# النموذج مشوش حول المهمة
الحل: احتفظ بالأمثلة مركزة على مهمة واحدة.
وضع الفشل 3: حساسية الترتيب
# ICL يمكن أن يكون حساساً لترتيب الأمثلة
examples_v1 = [سهل, متوسط, صعب] # الدقة: 85%
examples_v2 = [صعب, متوسط, سهل] # الدقة: 78%
# تحيز الحداثة: المثال الأخير له تأثير أكبر
الحل:
- ضع المثال الأكثر تعقيداً/تمثيلاً أخيراً
- أو: اختبر ترتيبات متعددة، اختر الأفضل
التخزين المؤقت للأوامر لـ ICL (تحسين التكلفة)
المشكلة: أوامر few-shot طويلة → مكلفة.
الحل (GPT-5.2، Claude 4.5):
- خزّن بادئة الأمر الثابت مؤقتاً
- ادفع 90% أقل للرموز المخزنة مؤقتاً
مثال:
from openai import OpenAI
client = OpenAI()
def cached_few_shot_classifier(query):
# أمثلة ثابتة (سيتم تخزينها مؤقتاً)
system_prompt = """أنت مصنف مشاعر.
أمثلة:
الإدخال: منتج رائع، سعيد جداً!
الإخراج: إيجابي
الإدخال: جودة رهيبة، انكسر فوراً.
الإخراج: سلبي
الإدخال: جيد، لا شيء مميز.
الإخراج: محايد"""
# سيتم تخزين هذا الأمر مؤقتاً بعد الاستدعاء الأول
response = client.chat.completions.create(
model="gpt-5.2-mini",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"الإدخال: {query}\nالإخراج:"}
]
)
return response.choices[0].message.content
# توفير التكلفة:
# الاستدعاء الأول: 500 رمز × $1.75/1M = $0.000875
# الاستدعاءات اللاحقة (مخزنة مؤقتاً): 500 رمز × $0.175/1M = $0.0000875
# توفير 90%!
رؤية المقابلة: "للإنتاج، سأستخدم أمثلة few-shot ثابتة في أمر النظام مع تمكين التخزين المؤقت للأوامر. هذا يقلل التكلفة بنسبة 90% مع الحفاظ على الجودة."
متقدم: نماذج مضبوطة على التعليمات مقابل ICL
الفرق الرئيسي:
| نوع النموذج | أداء ICL | لماذا |
|---|---|---|
| النموذج الأساسي (GPT-2، Llama 3 base) | يتطلب أمثلة كثيرة (5-10) | غير مدرب على اتباع التعليمات |
| مضبوط على التعليمات (GPT-5.2، Claude 4.5) | يعمل مع 1-3 أمثلة | مدرب على اتباع التعليمات |
مثال الكود:
# النموذج الأساسي: يحتاج أمثلة أكثر
base_prompt = """السؤال: ما هو 2+2؟
الإجابة: 4
السؤال: ما هو 3+3؟
الإجابة: 6
السؤال: ما هو 5+5؟
الإجابة: 10
السؤال: ما هو 7+7؟
الإجابة:"""
# مضبوط على التعليمات: يحتاج أمثلة أقل
instruct_prompt = """أجب على السؤال الرياضي.
السؤال: 2+2 = ؟
الإجابة: 4
السؤال: 7+7 = ؟
الإجابة:"""
# النماذج المضبوطة على التعليمات تستخرج النمط أسرع
استنتاج المقابلة: "النماذج الحديثة المضبوطة على التعليمات (GPT-5، Claude 4.5) تحتاج أمثلة أقل من النماذج الأساسية. لهذا السبب أصبح تعلم few-shot عملياً للإنتاج."
النقاط الرئيسية للمقابلات
✅ آلية ICL: رؤوس الاستقراء تنشط أثناء التدريب المسبق، تطبق الأنماط في الاستنتاج ✅ مصفوفة القرار: ICL للمهام الجديدة، RAG للمعرفة، الضبط الدقيق للمهام المستقرة ✅ اختيار الأمثلة: استخدم الاسترجاع (مبني على التشابه) لأفضل دقة ✅ تحسين التكلفة: أمثلة ثابتة + تخزين مؤقت للأوامر = توفير 90% ✅ حدود السياق: 128K رمز ≈ 5-10 أمثلة جيدة (عوائد متناقصة بعد ذلك) ✅ مضبوط على التعليمات: GPT-5/Claude تحتاج 1-3 أمثلة مقابل 5-10 للنماذج الأساسية
التالي: تعلم كيفية استخدام أوامر النظام لتقييد السلوك ومنع الاختراقات في الدرس 3.
:::