تجميع المطالبات وتحسينها
تطبيق BootstrapFewShot وMIPRO وغيرهما من محسّنات DSPy عمليًا
تجميع المطالبات وتحسينها درس مجاني في AI Prompt Engineering على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Prompt Engineering، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
ماذا يعني التحسين في DSPy
يبحث التحسين في DSPy (ويُسمى التجميع) عن أفضل إعداد للمطالبة لبرنامجك، استنادًا إلى مجموعة تدريب ومقياس. ويبحث المحسّن بين أمثلة few-shot والتعليمات والأمثلة التوضيحية للاستدلال المحتملة.
تشغّل التجميع مرة واحدة، وتحفظ النتيجة، ثم تنشر البرنامج المحسّن. وعند وقت الاستدلال، لا تكون هناك سوى استدعاءات LLM سريعة، من دون تكلفة إضافية للتحسين.
تعريف دالة مقياس
يحتاج كل محسّن في DSPy إلى دالة مقياس تقيّم التنبؤ بالنظر إلى المخرج المتوقع. وتُرجع رقمًا (أو قيمة منطقية)، وتكون القيمة الأعلى أفضل.
المقياس هو الإشارة التي يستخدمها المحسّن لتحديد ما إذا كان إعداد المطالبة جيدًا.
# Metric: exact match on answer field
def exact_match_metric(example, prediction, trace=None):
"""
example: a training example with .answer
prediction: the module's output with .answer
Returns 1.0 if correct, 0.0 otherwise
"""
expected = example.answer.strip().lower()
predicted = prediction.answer.strip().lower()
return float(expected == predicted)
# Metric: F1 score for token overlap (common in QA)
def token_f1_metric(example, prediction, trace=None):
gold_tokens = set(example.answer.lower().split())
pred_tokens = set(prediction.answer.lower().split())
if not pred_tokens:
return 0.0
precision = len(gold_tokens & pred_tokens) / len(pred_tokens)
recall = len(gold_tokens & pred_tokens) / len(gold_tokens)
if precision + recall == 0:
return 0.0
return 2 * precision * recall / (precision + recall)إعداد مجموعة تدريب
يحتاج DSPy إلى مجموعة تدريب من كائنات dspy.Example. يحدد كل مثال المدخلات والمخرج المتوقع. وغالبًا ما تكفي حتى 20 إلى 50 مثالًا مع BootstrapFewShot.
import dspy
# Build training examples
trainset = [
dspy.Example(
question='What is the capital of Germany?',
answer='Berlin'
).with_inputs('question'),
dspy.Example(
question='Who wrote Romeo and Juliet?',
answer='William Shakespeare'
).with_inputs('question'),
dspy.Example(
question='What year did World War II end?',
answer='1945'
).with_inputs('question'),
# ... add more examples
]
print(f'Training set size: {len(trainset)} examples')
print(trainset[0].question, '->', trainset[0].answer)محسّن BootstrapFewShot
يُعد BootstrapFewShot أكثر محسّنات DSPy شيوعًا. إذ يشغّل برنامجك على مجموعة التدريب، ويجمع عمليات التتبع الناجحة (أزواج المدخلات والمخرجات التي ينجح فيها المقياس)، ثم يستخدم عمليات التتبع هذه كأمثلة few-shot توضيحية في المطالبة المجمّعة.
import dspy
from dspy.teleprompt import BootstrapFewShot
# Define your program
class QA(dspy.Signature):
"""Answer factual questions."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# Set up the optimizer
optimizer = BootstrapFewShot(
metric=exact_match_metric,
max_bootstrapped_demos=4, # Up to 4 few-shot examples per predictor
max_labeled_demos=4, # Use labeled examples directly if available
)
# Compile!
compiled_program = optimizer.compile(program, trainset=trainset)
print('Compilation complete')محسّن MIPRO
MIPRO (Multi-prompt Instruction Proposal and Optimization) هو محسّن أكثر قوة. فهو لا يختار أمثلة few-shot فحسب، بل يبحث أيضًا عن نص تعليمات أفضل لإدراجه في المطالبة.
يتطلب MIPRO عددًا أكبر من استدعاءات LLM أثناء التجميع، لكنه يحقق غالبًا دقة أعلى بكثير.
import dspy
from dspy.teleprompt import MIPROv2
class QA(dspy.Signature):
"""Answer factual questions."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# MIPRO: optimizes both instructions AND few-shot examples
optimizer = MIPROv2(
metric=exact_match_metric,
auto='medium', # 'light' / 'medium' / 'heavy' for optimization budget
num_threads=4, # Parallel evaluation threads
)
compiled_program = optimizer.compile(
program,
trainset=trainset,
num_trials=20, # Number of candidate prompts to evaluate
)
print('MIPRO compilation complete')كيف تبدو المطالبة المجمّعة
بعد التجميع، يضمّن DSPy أمثلة few-shot المحسّنة في المطالبة. ويمكنك فحص ذلك من خلال استعراض المتنبئات في البرنامج المجمّع.
import dspy
# After compiling, inspect the optimized state
compiled_program = dspy.ChainOfThought('question -> answer')
# (Assume this was returned by optimizer.compile(...))
# Inspect the demos that were found
for demo in compiled_program.demos:
print('Input:', demo.question)
print('Reasoning:', demo.get('reasoning', 'N/A'))
print('Answer:', demo.answer)
print('---')
# Save the compiled state
compiled_program.save('compiled_qa_program.json')
print('Saved compiled program')واجهة teleprompter.compile()
تشترك جميع محسّنات DSPy في واجهة compile() نفسها. ويعني هذا الاتساق أنه يمكنك تبديل المحسّنات من دون تغيير رمز برنامجك.
from dspy.teleprompt import BootstrapFewShot, MIPROv2, COPRO
# All optimizers use the same interface:
# compiled = optimizer.compile(program, trainset=trainset)
# BootstrapFewShot: fast, uses successful traces as demos
opt1 = BootstrapFewShot(metric=exact_match_metric)
# MIPRO: slower, optimizes instructions too
opt2 = MIPROv2(metric=exact_match_metric, auto='light')
# COPRO: coordinate descent over instruction proposals
opt3 = COPRO(metric=exact_match_metric, depth=3)
# Swap between them with one line change:
compiled = opt1.compile(program, trainset=trainset)
# or: compiled = opt2.compile(program, trainset=trainset)BootstrapFewShotWithRandomSearch
يوسّع BootstrapFewShotWithRandomSearch وظيفة BootstrapFewShot من خلال إنشاء مجموعات متعددة من الأمثلة التوضيحية واختيار المجموعة الأفضل أداءً على مجموعة تحقق.
وهو حل وسط جيد بين بساطة BootstrapFewShot وقوة MIPRO.
from dspy.teleprompt import BootstrapFewShotWithRandomSearch
# Split data into train and validation
trainset = examples[:40]
devset = examples[40:60]
optimizer = BootstrapFewShotWithRandomSearch(
metric=exact_match_metric,
max_bootstrapped_demos=4,
num_candidate_programs=8, # Try 8 different demo sets
num_threads=4,
)
compiled_program = optimizer.compile(
program,
trainset=trainset,
valset=devset, # Picks the best program based on validation
)
print('Best program selected from 8 candidates')اعتبارات تكلفة التجميع
ينفذ التجميع استدعاءات إضافية لـ LLM لإنشاء المطالبات المرشحة وتقييمها. لذا خطط للميزانية وفقًا لذلك:
- BootstrapFewShot: نحو 1 إلى 2 ضعف حجم مجموعة التدريب من استدعاءات LLM
- RandomSearch مع 8 مرشحين: نحو 8 إلى 10 أضعاف
- MIPRO medium: نحو 30 إلى 50 ضعفًا
نفّذ التجميع دون اتصال، واحفظ النتيجة، ثم انشر البرنامج المحفوظ. ولا تتغير تكلفة الاستدلال في بيئة الإنتاج.
التحقق من البرنامج المجمّع
بعد التجميع، قيّم البرنامج دائمًا على مجموعة اختبار محجوزة للتأكد من أن البرنامج المحسّن يعمم فعلًا. ولا تكتفِ بفحص الأداء على مجموعة التدريب.
import dspy
# Evaluate on test set
evaluate = dspy.Evaluate(
devset=testset,
metric=exact_match_metric,
num_threads=4,
display_progress=True,
)
# Compare uncompiled vs compiled
uncompiled_score = evaluate(uncompiled_program)
compiled_score = evaluate(compiled_program)
print(f'Uncompiled accuracy: {uncompiled_score:.1%}')
print(f'Compiled accuracy: {compiled_score:.1%}')
print(f'Improvement: +{compiled_score - uncompiled_score:.1%}')جمع كل الأجزاء معًا
سير عمل DSPy الكامل للتحسين: تعريف التوقيع ← بناء الوحدة ← إعداد بيانات التدريب ← اختيار المحسّن ← التجميع ← التقييم ← الحفظ. هذه هي الدورة الكاملة من الفكرة إلى مسار مطالبات محسّن جاهز للإنتاج.
import dspy
from dspy.teleprompt import BootstrapFewShot
# 1. Configure LM
dspy.configure(lm=dspy.LM('openai/gpt-4o-mini', api_key='sk-...'))
# 2. Define signature and module
class QA(dspy.Signature):
"""Answer questions accurately."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# 3. Compile
optimizer = BootstrapFewShot(metric=exact_match_metric)
compiled = optimizer.compile(program, trainset=trainset)
# 4. Save
compiled.save('production_qa.json')
print('Production program ready')اختبار المعرفة: BootstrapFewShot
ما الذي يستخدمه BootstrapFewShot من مجموعة التدريب لتحسين المطالبة المجمّعة؟
مراجعة: التجميع والتحسين
يبحث تحسين DSPy عن أفضل إعداد للمطالبة باستخدام دالة مقياس ومجموعة تدريب. ويعثر BootstrapFewShot على أمثلة few-shot توضيحية جيدة من عمليات التتبع الناجحة. ويبحث MIPROv2 بالإضافة إلى ذلك عن نص تعليمات أفضل. وتشترك جميع المحسّنات في واجهة compile(program, trainset=...). والتجميع تكلفة تُدفع مرة واحدة دون اتصال، لذا احفظ النتيجة باستخدام program.save() وانشر البرنامج المحسّن من دون تكلفة إضافية عند وقت الاستدلال.
تعلم AI Prompt Engineering مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 53
- الدروس
- 199
الأسئلة الشائعة
هل درس «تجميع المطالبات وتحسينها» مجاني؟
نعم — نص درس «تجميع المطالبات وتحسينها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Prompt Engineering، انتقل إلى CoddyKit PRO. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
ماذا ستتعلم في «تجميع المطالبات وتحسينها»؟
تطبيق BootstrapFewShot وMIPRO وغيرهما من محسّنات DSPy عمليًا تتمرن على AI Prompt Engineering مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Prompt Engineering؟
لا تُشترط خبرة سابقة. AI Prompt Engineering على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «تجميع المطالبات وتحسينها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Prompt Engineering هذا؟
نعم. كل درس في AI Prompt Engineering يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مقدمة إلى إطار DSPy
- تعريف التوقيعات والوحدات
- تجميع المطالبات وتحسينها
- تقييم مسارات DSPy