لقد بُنيت مساعد تسوّق على نموذج رائد، وهو يعمل. يطلب متسوّق «حقيبة خصر سوداء بأقل من عشرين دولارًا من متجر حاصل على 4.5 نجوم على الأقل»، فيبحث الوكيل في الكتالوج، ويفحص الخيارات المرشحة، ويتحقق من القيود، ثم يحسم توصية. لكن ما التكلفة الفعلية لذلك التفاعل؟ المساعد الوكيلي ليس نداءً واحداً للنموذج، بل هو حلقة: بحث، قراءة النتائج، تحسين، تحقق، قرار. مهمة واحدة مكتملة يمكن أن تتضمن نداءات متعددة لذلك النموذج الرائد، وتدفع ثمن كل نداء، مع كل متسوّق. على نطاق الإنتاج، تتراكم تكلفة كل مهمة، وتستنزف العائد على الاستثمار للمشروع، وتمنع المشروع من الإطلاق.
إحدى الطرق لجعل التطبيق الوكيلي أكثر كفاءة هي استخدام نموذج أصغر، فهو أسرع في الاستجابة وأقل تكلفة في الاستضافة. المشكلة هي الجودة: النموذج الأصغر غالبًا ما يقصر في أداء المهمة، وهذا سبب اختيار النموذج الأكبر في البداية أصلًا. يغلق تقطيع المعرفة هذه الفجوة بنقل سلوك النموذج «المعلّم» الأكبر إلى «طالب» أصغر، عبر تدريب الطالب على إعادة إنتاج مخارجات المعلّم، فيحتفظ بمعظم الجودة بسرعة النموذج الأصغر وتكلفته.
في هذا المنشور ستتعلم كيفية استخدام تقطيع المعرفة، وتحديدًا تقطيع المعرفة على مستوى التسلسل (SeqKD)، لضبط وكيل تسوّق دقيقًا على Amazon SageMaker AI. نغطي كيفية توليد مسارات متعددة الخطوات عالية الجودة مع معلّم رائد والاحتفاظ بالمسارات التي تحل المهمة، وكيفية ترميزها للضبط الدقيق الموجَّه، وكيفية تشغيل التدريب على بنية تحتية بلا خوادم، وكيفية تقييم الطالب مقابل معيار احتفاظي.
الشكل 1: المهمة الوكيلية الواحدة هي حلقة، لا نداء واحد: يبحث الوكيل، ويقرأ النتائج، ويحسّن، ويتحقق، ويقرر، وكل خطوة هي نداء مُفوتر منفصل للنموذج الرائد. مهمة واحدة مكتملة يمكن أن تكون نداءات متعددة، مع كل متسوّق
ما هو تقطيع المعرفة على مستوى التسلسل (SeqKD)؟
أبسط شكل قابل للتطبيق من التقطيع هو تقطيع المعرفة على مستوى التسلسل (SeqKD). يستخدم نموذج معلّم لتوليد استجابات عالية الجودة، ثم يدرب نموذج طالب على تلك الاستجابات بالضبط الدقيق الموجَّه (SFT). يحتاج SeqKD فقط إلى textالمعلّم، دون أي وصول إلى logits المعلّم ودون بنية تحتية للتعلم المعزز، لذا يعمل حتى مع معلّم مغلق أو متاح عبر واجهة برمجية فقط. مقارنةً بمناهج أخرى مثل القائمة على logits أو on-policy، فهو يقع في أقصى طيف التقطيع من حيث فعالية التكلفة وقابلية النقل. المعلّم يكتب الإجابات، والطالب يُضبط دقيقًا عليها. ولأن تلك الإجابات تُحفظ كبيانات، يمكنك إعادة استخدامها لتدريب أو اختبار طلاب مختلفين دون إعادة توليد البيانات.
من حيث المبدأ، ستودّ أن يطابق الطالب التوزيع الكامل للمعلّم على المخارج الممكنة. التحذير هنا هو أنك لا تستطيع. فضاء التسلسلات الممكنة هائل فلكيًا، لذا مطابقته تمامًا غير ممكن. يتجاوز SeqKD ذلك بتقريبه عبر العينات التي ينتجها المعلّم فعلًا.
بالنسبة لوكيل، التسلسل الذي ينتجه المعلّم ليس كتلة نثرية بل مسارًا، أي سلسلة مرتبة من الاستدلال ونداءات الأدوات والملاحظات التي تعيدها، حيث تُشترط كل خطوة بكل ما سبقها. تدريب الطالب على ذلك التسلسل الكامل يعلّمه الاستدلال الذي يقود إلى كل إجراء ومسار العمل متعدد الخطوات نفسه، لا فقرة واحدة من نص الإجابة. هذا يجعل المهمة الوكيلية من أنقى أمثلة تقطيع المعرفة على مستوى التسلسل، لأن التسلسل المنسوخ هو السلوك ذاته.
الشكل 2: ينقل SeqKD السلوك عبر مخارج المعلّم النصية وحدها: يولّد المعلّم المسارات، ويتدرب الطالب عليها، وتحافظ النتيجة على معظم جودة المعلّم بسرعة النموذج الصغير وتكلفته. لا حاجة إلى أوزان المعلّم أو logits أو التدرجات أثناء التدريب، لذا يعمل كضبط دقيق موجَّه عادي
متى يكون SeqKD الخيار الصحيح
يناسب SeqKD مجموعة محددة من الحالات:
لديك المدخلات لكن لا توجد مخارج هدف عالية الجودة
هذه هي الحالة الجوهرية لـ SeqKD، وهو في جوهره توليد بيانات. أنت توفّر المدخلات، والمعلّم يكتب الأهداف، فيمكنك الضبط الدقيق على مهمة أو مجال لا توجد له تسميات عالية الجودة سابقة. يمكن أن تكون الأهداف بسيطة كإجابات مفردة أو معقدة كمسارات استخدام أدوات متعددة الأدوار. يتناول هذا المنشور الطرف الأصعب من ذلك الطيف، المسارات الوكيلية، وهي صعبة الحصول عليها بوجه خاص. المهمة الواحدة تتفرع إلى العديد من التشغيلات الجزئية الصحيحة، وتمييز تشغيلة محلولة من فاشلة يتطلب مقيّمًا موثوقًا. المعيار المزوّد بمقيّم برمجي يوفّر ذلك بالضبط، فيمكنك ترك المعلّم يولّد المسارات والاحتفاظ فقط بتلك التي تحل المهمة.
معلّمك نموذج رائد لا يمكنك الوصول إليه إلا عبر واجهة برمجية
هذه هي الحالة المعتادة للنماذج الرائدة. لا يمكنك الوصول إلى الأوزان لاستضافته بنفسك، ولا قراءة logits الخاصة به، ولا ضبطه دقيقًا. هذا يستبعد التقطيع القائم على logits والمناهج on-policy، التي تحتاج كلها ذلك الوصول الداخلي. يحتاج SeqKD فقط إلى الاستجابات النصية للمعلّم، فهو المنهج الوحيد الذي ما زال يعمل، ويحررك من دفع أسعار النماذج الرائدة عند كل طلب بعد أن يتولى الطالب المهمة.
تريد خطوة أولى قوية وفعّالة من حيث التكلفة
بُنيت بعض أقوى نماذج الاستدلال الصغيرة بجزءٍ كبير باستخدام SeqKD (الضبط الدقيق الموجَّه على مسارات استدلال المعلّم)، لذا فهي نقطة بداية فعّالة لنقل الاستدلال عندما تكون الإعدادات مناسبة. نماذج DeepSeek-R1 المُقطَّرة تُعد نماذج Qwen وLlama مثالاً معروفاً: حيث تم تقطير استدلالات معلم كبير في طلاب أصغر من Qwen وLlama عن طريق ضبطهم بدقة على مسارات الاستدلال التي ولّدها المعلم.
المتطلبات الأساسية
لتشغيل هذا المثال، تحتاج إلى:
- حساب AWS لديه دور إدارة الهوية والوصول (IAM) في AWS لنظام SageMaker AI الذي يمتلك صلاحيات القراءة والكتابة على حاوية Amazon Simple Storage Service (Amazon S3) وإذنًا لاستدعاء نموذج المعلم الخاص بك.
- نموذج معلم رائده لتوليد المسارات (يستخدم هذا الدليل التوضيحي واحداً من Amazon Bedrock).
- الوصول إلى تخصيص نماذج SageMaker AI في منطقة مدعومة من AWS.
- أمازون SageMaker Studio (أو بيئة تطوير محلية مزودة بـ تم تكوين AWS CLI، التي تعمل بنواة Python 3.12 أو أحدث، مع SageMaker Python SDK الإصدار 3 و
boto3(ثبّت الإصدارات التي تعتمدها). استخدم نسخة ml.m5.4xlarge كحد أدنى لبيئة دفتر الملاحظات، نظراً لأن خطوتي إعداد البيانات والتسجيل المحلي تعملان على وحدة المعالجة المركزية الخاصة به. - معرفة عملية بلغة Python، وبالضبط الدقيق الخاضع للإشراف، وبالوكلاء الذين يستخدمون الأدوات.
- The مستودع الكود المرافق ومهمة مزودة ببرنامج تقييم برمجي (يستخدم هذا الشرح مجموعة اختبار ShoppingBench. استبدل مهمتك ومقيّمك الخاصين).
نظرة عامة على الحل
يتناول هذا القسم خط الأنابيب من البداية إلى النهاية. يعمل مُعلِّم متطور، وهو GLM-5.3 على Amazon Bedrock، بوصفه وكيل ShoppingBench لتوليد المسارات. يحتفظ مقيّم المعيار نفسه فقط بالمسارات التي تحل المهمة، وتُستخدم تلك المسارات المحلولة لضبط نموذج Qwen3.5-4B الطالب دقيقًا خاضعًا للإشراف بلا خادم عبر تخصيص نماذج SageMaker AI. ثم يُقيَّم الطالب المُستخلَص على جزء محجوز من ShoppingBench ويُقدَّم عبر نقطة نهاية SageMaker AI Inference للوقت الفعلي تُشغّل حلقة الأدوات.
الشكل 3: استخلاص وكيل تسوق على Amazon SageMaker AI: يعمل مُعلِّم متطور على Amazon Bedrock بوصفه وكيل ShoppingBench على مسائل التدريب، ويحتفظ مقيّم ShoppingBench نفسه فقط بالمسارات التي تحل المهمة (أخذ العينات بالرفض)، ويُرمَّز كل مسار محلول خطوة بخطوة، ويُضبط الطالب بلا خادم باستخدام تخصيص نماذج Amazon SageMaker AI، ثم تُقيَّم النتيجة على جزء الاختبار المحجوز من ShoppingBench
تحضير مجموعة البيانات
الحصول على مسارات تستحق التقليد هو الجزء الصعب، ومقيّم ShoppingBench هو ما يفصل بين المحاولات الناجحة والفاشلة. ينشر ShoppingBench 750 مسألة تسوق مُصنَّعة تلقائيًا، بواقع 250 مسألة لكل من نوايا المنتج والمتجر وقسيمة الشراء، وكل مسألة معها إجابة ذهبية مخفية والقيود التي تحدد النجاح. قسمناها مرة واحدة إلى 426 مسألة تدريب و324 مسألة تقييم محجوزة (منتجات 103، متاجر 105، قسائم 116)، ب فهارس ثابتة حتى لا تتداخل المجموعتان.
لكل مسألة تدريب، يعمل مُعلِّم متطور، وهو GLM-5.3 على Amazon Bedrock مع تشغيل الاستدلال ودرجة حرارة 1.0، بوصفه وكيل ShoppingBench. يبحث في كتالوج يضم حوالي 2.7 مليون منتج، ويفحص المرشحين، ويوصي بالمنتجات التي تستوفي القيود. نأخذ عينتين من المُعلِّم لكل مسألة، مما يعطينا 850 مسارًا، ثم نسمح لمقيّم ShoppingBench نفسه بالاحتفاظ فقط بالمسارات التي تحل المهمة. اختيار درجة الحرارة 1.0 مقصود. فالأخذ بالعينات بدلًا من الفك الجشع يجعل المحاولتين تستكشفان استعلامات ومسارات استدلال مختلفة، مما يمنح مسائل أكثر مسارًا محلولًا واحدًا على الأقل ومجموعة أكثر تنوعًا للتعلم منها. تحوّل خطوة أخذ العينات بالرفض هذه مُعلِّمًا قادرًا لكنه غير كامل إلى مجموعة تدريب نظيفة، لأن المُعلِّم لا يلزم أن يكون صائبًا دائمًا بل بشكل متكرر كافٍ لتكون المحاولات المحلولة تستحق التقليد.
كل مسار محلول هو حلقة كاملة: طلب المتسوق، وتفكير المعلم واستدعاءاته للأدوات في كل خطوة (البحث، والفحص، والتوصية، والإنهاء)، والملاحظة التي أعادتها البيئة. نحتفظ بالتفكير إلى جانب الأفعال، وهو ما تُظهر النتائج أنه ما ينقل الطالب معظم الطريق نحو معلمه.
ترميز المسارات للتدريب
التقطير على مستوى التسلسل هو تعلم بإشراف على مسارات موجودة مسبقًا، لذا لا شيء يستدعي أداة أثناء التدريب، والتطبيق لا يرى سوى النص أبدًا. ولأن هذه المسارات محادثات استخدام أدوات متعددة الخطوات، نرمّز كل واحد منها كـ messages قائمة من أدوار المحادثة وندع قالب المحادثة الخاص بالطالب نفسه يعرضها، بحيث تتطابق الرموز التي يراها المدرّب مع الرموز التي ينتجها الوكيل عند الاستدلال.
تصبح كل مسار صفّ تدريب واحدًا لكل خطوة. لفة user تحمل موجّه النظام والمحادثة حتى تلك اللحظة. لفة assistant تحمل استدلال تلك الخطوة واستدعاء الأداة الذي يفضي إليه، أي كتلة … يليها [{…}] بالشكل الأصلي لبيئة التشغيل. تقع دالة الخسارة على لفة assistant فقط، ليتعلم النموذج إنتاج الاستدلال-والإجراء التالي، لا التنبؤ بالملاحظات التي أرجعتها البيئة. المسار الذي يحتوي عدة خطوات يتمدد إلى عدة صفوف. هنا تتمدد المسارات المحلولة إلى حوالي 2,600 صف تدريب و130 صف تحقق بعد التصفية.
يربط الصف الواحد المحادثة حتى تلك اللحظة (user) بالخطوة التالية الوحيدة المراد تعلمها (assistant):
{
"messages": [
{"role": "user", "content": "You are a shopping assistant. ...\n# Task\nFind a black waist bag under $20 from a shop rated 4.5 or higher.\n# Observations so far\n(none yet)"},
{"role": "assistant", "content": "<think>Start with a broad search and let the price filter work before I narrow by shop rating.</think>\n<tool_call>[{\"name\": \"find_product\", \"parameters\": {\"q\": \"black waist bag\", \"price\": \"0-20\"}}]</tool_call>"}
]
}
تصبح كل خطوة لاحقة صفًا خاصًا بها، مع إضافة الملاحظة الجديدة إلى محتوى user والاستدلال-واستدعاء-الأداة التالي كهدف assistant حتى الوصول إلى recommend_product و terminate الأخيرة. اعرض كل صف باستخدام قالب المحادثة الدقيق الخاص بنموذجك.
قسّم البيانات حسب المشكلة، لا حسب الصف. يُسحب المعلّم مرتين لكل مشكلة، وتتمدد كل مسار إلى عدة خطوات، لذا تتشارك صفوف كثيرة مشكلة واحدة، وكان التقسيم على مستوى الصف سيُسرّب سياقًا متطابقًا تقريبًا بين التدريب والتحقق. إبقاء مشكلات كاملة خارج التدريب (حوالي خمسة بالمئة) يحافظ على صدق مجموعة التحقق.
تكلفة الترميز لكل خطوة هي تكرار السياق، لأن كل صف يعيد ذكر المحادثة المتنامية، والضبط الدقيق بلا خوادم يقتطع أي شيء يتجاوز dataset_max_len، فالصف الذي يعبر الحد يفقد جزءًا مما يحتاجه. بدلاً من ترك الحد يقرر ما يُقتطع، أبقِ الصفوف ضمن الميزانية. الإصلاح الأكثر فعالية هو ضغط ملاحظات الأدوات، فهي تهيمن على عدد الرموز. بالنسبة لنتائج البحث عن المنتجات، احتفظ فقط بالحقول التي يعتمد عليها القرار التالي (id، السعر، التقييم، والقيود قيد الفحص)، وأزل نص القوائم الخام، وضع حدًا لعدد النتائج التي تحتفظ بها لكل بحث. إذا ظلت المسارات فوق الميزانية، ضع حدًا لعدد الخطوات لكل مسار. هنا dataset_max_len تساوي 16,384 رمزًا، وهو ما يكفي معظم المسارات بعد تقليم الملاحظات.
بعد وضع ملف JSONL لكل تقسيم في S3، سجّل كل منها كأصل dataset asset للتخصيص مع DataSet.create من SageMaker Python SDK v3، التي تُرجع train_dataset و val_dataset التي يستهلكها مهمة التدريب.
ضبط الطالب بدقة
يستخدم التدريب SageMaker AI model customization مع SFT بلا خوادم. تختار نموذجًا أساسيًا من model hub، وتوجّه المهمة إلى مجموعات البيانات المرمّزة، وتقوم الخدمة المُدارة بتوفير الحوسبة وتشغيل المهمة وإرجاع النموذج المخصص، مع تتبّع المقاييس في Amazon SageMaker with MLflow. ولأن البيانات موجودة بالفعل بصيغة مدعومة، فلا توجد حاجة لسكربت تدريب أو صورة حاوية أو نسخة لإدارتها.
تكتب المهمة مخرجاتها في model package group يضع إصدارًا لكل نموذج تنتجه، لذا أنشئ المجموعة أولًا باستخدام ModelPackageGroup.create (مع إعادة استخدامها إذا كان الاسم موجودًا مسبقًا) ومرّرها للمدرّب. ثم اضبط مهمة التخصيص. اختر النموذج الأساسي ونوع التدريب، ووجّهه إلى مجموعتي بيانات التدريب والتحقق من الصحة بالإضافة إلى مجموعة حزم النموذج، ثم سمِّ تجربة MLflow لتتدفق المقاييس إلى MLflow أثناء تشغيل المهمة.
from sagemaker.train.sft_trainer import SFTTrainer
from sagemaker.train.common import TrainingType
sft_trainer = SFTTrainer(
model="huggingface-vlm-qwen3-5-4b", # Qwen3.5-4B from the JumpStart model hub
training_type=TrainingType.LORA, # TrainingType.FULL for full fine-tuning
training_dataset=train_dataset.arn,
validation_dataset=val_dataset.arn,
model_package_group=model_package_group,
mlflow_experiment_name="seqkd-shopping-exp",
s3_output_path="s3://<amzn-s3-demo-bucket>/seqkd/output/",
accept_eula=True,
)
يبدأ المدرب من مجموعة موثقة من المعاملات الفائقة الافتراضية يمكنك فحصها باستخدام sft_trainer.hyperparameters.to_dict() وتجاوزها قبل الإطلاق. في هذا التشغيل نرفع طول التسلسل ليتناسب مع المسارات متعددة الخطوات، ونستخدم رتبة تكييف منخفض الرتبة (LoRA) بقيمة 64، وندرب لثلاث حقب كاملة على مجموعة البيانات الصغيرة:
sft_trainer.hyperparameters.dataset_max_len = 16384
sft_trainer.hyperparameters.max_epochs = 3
sft_trainer.hyperparameters.global_batch_size = 64
sft_trainer.hyperparameters.learning_rate = 0.0001
sft_trainer.hyperparameters.lora_rank = 64
sft_trainer.hyperparameters.lora_alpha = 256 # alpha / rank = 4
sft_trainer.hyperparameters.lr_warmup_steps_ratio = 0.1
sft_trainer.hyperparameters.train_val_split_ratio = 0.95
تحقق من صحة الإعدادات بتشغيل تجريبي (dry run)، ثم أطلق المهمة المُدارة واقرأ ARN لحزمة النموذج المسجلة عند انتهائها. ذلك الـ ARN هو الأداة الجاهزة للنشر التي تستهلكها خطوات التقييم والخدمة:
from sagemaker.core.resources import TrainingJob
sft_trainer.train(dry_run=True) # checks the config without launching
training_job = sft_trainer.train(wait=True) # launch and wait
model_package_arn = TrainingJob.get(
training_job_name=training_job.training_job_name
).output_model_package_arn
تقييم الطالب
قيّم على مرحلتين، والأقل تكلفة أولاً. التقييم الكامل من البداية إلى النهاية مكلف من حيث الوقت والموارد معاً. فهو يقوم بتشغيل خادم بحث فوق ملايين المنتجات، ونشر نقطة النهاية، وتشغيل حلقة وكيل متعددة الخطوات على كل مسألة محجوزة. قبل تشغيل التقييم الكامل، شغّل فحصاً مسبقاً منخفض التكلفة كمهمة مُدارة باستخدام تقييم نماذج SageMaker AI، والذي يسجّل درجة لخطوة مولدة واحدة في كل مرة مقابل الإجراء المرجعي الصحيح للمعلم.
يحتاج الفحص المسبق إلى دالة تسجيل. يدعم تقييم النماذج دالة مكافأة من نوع Custom Scorer تقدمها أنت وتُشغَّل مرة واحدة لكل عينة، وتقارن الإجراء المولَّد من الطالب بإجراء المعلم. لتقطير استدعاءات الأدوات، قيّم اختيار الأدوات (هل استدعى النموذج الأدوات الصحيحة، وبالترتيب، متجاهلاً تنسيق الوسائط)، لأن ذلك هو السلوك الذي يحتاج التقطير أكثر ما يحتاج إلى نقله. ولإبقاء التركيز على الاختيار وليس على الصياغة، تقرأ دالة المكافأة أسماء الأدوات من إجراء الطالب ومن المرجع الخاص بالمعلم دون اشتراط تطابق تام في التنسيق.
def reward_function(sample, index):
pred = sample.get("model_response", "")
ref = sample.get("reference_answer", "") or sample.get("response", "")
ref_names = tool_names(ref) # tool names from the teacher's <tool_call>[...]</tool_call>
pred_names = tool_names(pred) # tool names the student emitted, parsed leniently
toolset = 1.0 if (pred_names and pred_names == ref_names) else 0.0
return {
"id": str(sample.get("id", f"sample-{index:03d}")),
"aggregate_reward_score": toolset, # the gate metric: tool selection
"metrics_list": [
{"name": "toolset_match", "value": toolset, "type": "Reward"},
],
}
سجّل تلك الدالة كإصدار مُعرَّف Evaluator مع Evaluator.create()، ثم استدعِ evaluate() لتشغيل مهمة Custom Scorer واحدة لكل مهمة، بحيث يتم تقييم النموذج الأساسي إلى جانب الطالب حتى يكون لكل نتيجة مقارنة.
قاعدة القرار واضحة ومباشرة. يجب أن يتفوق الطالب على النموذج الأساسي في هذا الفحص المسبق منخفض التكلفة. إذا فعل ذلك، فقد نجح التقطير ويستحق تشغيل التقييم الشامل من البداية إلى النهاية. إذا لم يفعل، فيجب إصلاح التدريب أولاً.
تقديم الوكيل المُقطَّر
النموذج المُقطَّر لا يشغّل الأدوات من تلقاء نفسه. التدريب الدقيق يعلمه أن يُصدر نداء الأداة الصحيح في اللحظة الصحيحة كنص، ولكن ما زال هناك شيء يجب أن ينفّذ ذلك النداء ويغذّي النتيجة обратно. في وقت الاستدلال تُغلّف النموذج بحلقة تشغيل حتمية صغيرة تطالب النموذج، وتحلل نداء الأداة الذي يُصدره، وتشغّل الأداة، وتضيف الملاحظة، ثم تطالب مرة أخرى، في حلقة مستمرة حتى يُنتج النموذج إجابة نهائية. هذا كود تطبيق عادي، أو إطار عمل تقديم جاهز، وليس تعلّماً معززاً وليس حلقة تدريب على السياسة.
الطالب هو مُحوِّل تكيف من الرتبة المنخفضة (LoRA) فوق أساس مفتوح الأوزان، وهذا يشكّل طريقة نشره. بدلاً من دمج المُحوِّل وتقديم نسخة كاملة ثانية من الأوزان، قدّم النموذج الأساسي مرة واحدة وأرفق الطالب كمُحوِّل فوقه، كمكوّني استدلال على نقطة نهاية واحدة للزمن الحقيقي. تسمية مكوّن الاستدلال عند وقت الاستدعاء تحدّد أيّهما يجيب، بحيث تخدم نقطة النهاية نفسها الأساس والطالب المُقطَّر معاً لإجراء مقارنة جنباً إلى جنب.
نقدّم النموذج مفتوح الأوزان باستخدام حاوية Deep Java Library Large Model Inference (DJL LMI)، التي تضم محرك vLLM للتوليد عالي الإنتاجية، مثبّتاً على إصدار محدد بدلاً من latest، حتى تكون عمليات إعادة النشر قابلة للتكرار. يغلّف دفتر الملاحظات المرافق استدعاءات مكوّن الاستدلال في مساعد kd_serve صغير، بحيث يقتصر نشر مكوّن الأساس مع تمكين خدمة LoRA ثم إرفاق مُحوِّل الطالب على:
from sagemaker.core import image_uris
import kd_serve
# DJL LMI container (vLLM engine bundled in); pin the version for reproducible redeploys
image_uri = image_uris.retrieve("djl-lmi", region=region, version="0.36.0")
# 1. Deploy the base model as an inference component, with LoRA serving enabled.
endpoint_name, base_ic = kd_serve.deploy_base_endpoint(
endpoint_name="seqkd-shopping-agent",
role=role,
region=region,
image_uri=image_uri,
base_model_id="Qwen/Qwen3.5-4B",
instance_types=["ml.g5.2xlarge", "ml.g6.2xlarge", "ml.g6e.2xlarge"],
max_lora_rank=64,
max_loras=4,
max_model_len=131072,
)
# 2. Resolve the student's adapter artifacts from its Model Package and attach them
# as a second inference component on the same base.
adapter_uri = kd_serve.resolve_adapter_uri(model_package_arn, region)
student_ic = kd_serve.attach_adapter(
endpoint_name=endpoint_name,
base_ic_name=base_ic,
adapter_component_name=f"{endpoint_name}-student",
adapter_s3_uri=adapter_uri,
region=region,
)
قائمة instance_types هي تفضيل مرتّب. نشر SageMaker AI Inference يتم على النوع الأول الذي تتوفر لديه سعة، مع الرجوع إلى أسفل القائمة، فيُقدَّم الطالب على ml.g5.2xlarge, ml.g6.2xlargeأو ml.g6e.2xlarge حسب التوفر. تُحمَّل أوزان الأساس مرة واحدة، ويشاركها كلا مكوّني الاستدلال، لذا فإن إضافة المُحوِّل يكلف ذاكرة بحجم المُحوِّل بدلاً من نسخة ثانية من النموذج.
النتائج
نقيّم الطالب المُقطَّر على قسم الاختبار المحجوز من ShoppingBench، مقابل مجموعة من النقاط المرجعية التي تحدد ما هو الأداء الجيد:
- الأساس Qwen3.5-4B: الطالب الجاهز دون أي تدريب دقيق. هذا هو الحد الأدنى.
- الطالب المُقطَّر (SeqKD): النموذج نفسه بحجم 4B المدرَّب بدقة على مسارات المُعلِّم، وهو النهج الذي يصفه هذا المنشور. هذه هي النتيجة المهمة.
- المُعلِّم GLM-5.3: النموذج الرائد الذي ولّد بيانات التدريب، على Bedrock. نُبلغ عنه بالأخذ العشوائي (درجة حرارة 1.0، الإعداد الذي أنتج البيانات) وبالجشع (درجة حرارة 0).
- نموذج رائد متوسط الحجم: نموذج مملوك قوي يعمل كوكيل، أُدرج كسقف عملي.
يُشغّل كل نموذج حلقة وكيل ShoppingBench نفسها دون تعديل عبر النوايا الثلاث للمتسوق (منتج، ومتجر، وقسيمة شراء). نُبلغ عن معدل النجاح المطلق (ASR)، أي نسبة المشكلات المحجوزة التي يحلها الوكيل، مُتوسطاً على النوايا الثلاث، مع احتساب المسارات المفقودة كإخفاقات. تُعد المشكلة محلوة عندما يلبّي المنتج أو المنتجات الموصى بها كل القيود المذكورة. الأرقام التالية تأتي من تشغيل واحد مع طالب LoRA، لذا توقّع بضع نقاط من التفاوت بين التشغيلات.
نجاح المهمة
النتيجة الرئيسية هي معدل النجاح المطلق على 324 مشكلة محجوزة، مُفصّلاً حسب النية ومُتوسطاً عبر الثلاث:
الشكل 4: معدل النجاح المطلق (ASR) على قسم الاختبار المحجوز من ShoppingBench، حسب نية المتسوق. يُحسّن الطالب المُقطَّر بحجم 4B (باللون البرتقالي) أداء النموذج الأساسي بمقدار 24 نقطة في المتوسط، ويبلغ مستوى المُعلِّم GLM-5.3 الذي ولّد بياناته ونموذج رائد متوسط الحجم
| النموذج | منتج | متجر | قسيمة | المتوسط |
| النموذج الأساسي Qwen3.5-4B (بدون ضبط دقيق) | 0.456 | 0.314 | 0.121 | 0.297 |
| الطالب المقطر (SeqKD) | 0.563 | 0.638 | 0.422 | 0.541 |
| المعلم GLM-5.3 (أخذ عينات، درجة حرارة 1.0) | 0.553 | 0.619 | 0.362 | 0.511 |
| المعلم GLM-5.3 (جشع، درجة حرارة 0) | 0.544 | 0.638 | 0.439 | 0.540 |
| نموذج حدودي متوسط الحجم | 0.583 | 0.667 | 0.388 | 0.546 |
باختصار، استعاد نموذج بحجم 4B فعليًا كل جودة المهمة لدى معلمه الحدودي، ليطابقه ضمن ضوضاء التشغيل المتكرر. نبلّغ عن أداء المعلم بطريقتين لأنهما تجيبان عن سؤالين مختلفين. فالفك الجشع يعيد المسار الأكثر احتمالًا على الإطلاق، وهو الخيار الأقوى عندما يحصل كل نموذج على محاولة واحدة لكل مسألة (كما في هذا التقييم)، ولهذا سجّل المعلم الجشع 0.540 مقابل 0.511 للمعلم بأخذ العينات. أما بيانات التدريب فقد ولّدّناها بالطريقة الأخرى، بأخذ عينات عند درجة حرارة 1.0 بحيث استكشفت المحاولات المتكررة مسارات مختلفة، وكان بإمكان المقيّم الإبقاء على المحاولات التي حلّت المهمة. هذا التصفية هو أيضًا سبب تمكّن الطالب من تفوق قليلًا على المعلم المأخوذ منه بالعينات، إذ إن أخذ العينات بالرفض يدرّبه فقط على محاولات المعلم الناجحة، لا على مخرجاته المتوسطة، فيقلّد شريحة أفضل المحاولات بدلًا من كامل توزيع المحاولات.
الاستدلال في الأهداف مهم
يتعلم الطالب من استدلال المعلم وكذلك من استدعاءاته للأدوات، وهذا الاختيار مسؤول عن جزء كبير من النتيجة. فتدريب الطالب نفسه على المسارات نفسها بعد إزالة الاستدلال، وترك استدعاءات الأدوات المجردة فقط، يخفض متوسط ASR من 0.541 إلى 0.415:
الشكل 5: معدل النجاح المطلق للنموذج الأساسي، والطالب المدرّب على استدعاءات الأدوات فقط، والطالب المدرّب على استدلال المعلم مع استدعاءات الأدوات. الإبقاء على الاستدلال يضيف نحو 13 نقطة إلى متوسط ASR، وتتحقق هذه المكسب على كل نية
يحقق الطالبان النتيجة على النموذج الأساسي، لذا حتى نسخة استدعاءات الأدوات فقط تمثل تحسنًا حقيقيًا، لكن الإبقاء على التفكير هو ما يوصل الطالب إلى بقية الطريق نحو معلمه. التفكير بين الإجراءات ليس سردًا يمكن تجاهله، بل هو جزء من السلوك الذي يحل المهمة.
الحفاظ على القدرة العامة
يقيس ASR المهارة التي قمنا بتقطيرها. المقابل هو ما إذا كان الطالب قد حافظ على قدرته العامة في اتباع التعليمات أو أصيب بإفراط في التخصص في مهمة التسوق. نتحقق من ذلك باستخدام IFEval، وهو معيار عام لاتباع التعليمات يسجّل تعليمات التنسيق القابلة للتحقق مثل «أجب في ثلاث نقاط بالضبط». تعامل معه كفحص للتراجع، لا كلوحة صدارة. تنخفض نقاط الطالب في معيار prompt-strict من 0.819 للنموذج الأساسي إلى 0.741، وفي معيار instruction-strict من 0.872 إلى 0.813، أي انخفاض بنحو 6 إلى 8 نقاط (الشكل 6). هذه هي التكلفة المتوقعة للتخصص. تنازل الطالب عن بعض اتباعه العام للتعليمات مقابل مكسب كبير في مهمة التسوق. أما الانخفاض الأكبر بكثير فهو علامة التحذير من أن التقطير قد ضيّق النموذج أكثر من اللازم.
الشكل 6: اتباع التعليمات العامة في IFEval للنموذج الأساسي والطالب المقطّر، وفق مقياسين prompt-strict وinstruction-strict. الانخفاض الطفيف هو التكلفة المتوقعة للتخصص في مهمة التسوق
الفوائد والمقايضات
معدل النجاح وحده لا يبرر التحويل. سبب التقطير هو أنك تحصل على معظم جودة النموذج الأقوى بتكلفة وسرعة النموذج الصغير. الدليل الأوضح هنا هو أن الطالب بحجم 4B يبلغ جودة المهمة التي يحققها معلمه الرائد ونموذج رائد متوسط الحجم، مع أنه صغير بما يكفي للعمل على مثيل واحد من عائلة G (NVIDIA A10G/L40/L40S في هذا المثال).
فرق التكلفة يتعلق بالشكل بقدر ما يتعلق بالحجم. النموذج الرائد الذي يُصل إليه عبر API يُحتسب بالتوكن في كل خطوة من كل مهمة، فتنمو التكلفة مع الاستخدام ولا تتوقف، وحلقة الوكيل المذكورة في المقدمة تدفع هذا الرسوم في كل مرة. أما الطالب المقطّر فيعمل على نقطة نهاية تستضيفها بنفسك، وتُحتسب هذه المثيل بالساعة سواء خدمت مهمة واحدة أو آلاف المهام، فلا يكلفك نمو الحركة الإضافي أي شيء حتى تقوم بالتوسع. أنت تستبدل رسومًا متغيرة لكل طلب ب رسوم ثابتة بالساعة، وكلما صغر النموذج الذي يمكنك الاكتفاء به، صغرت تلك التكلفة الثابتة.
لا ننشر هنا رقمًا للتكلفة أو زمن الاستجابة لكل مهمة لأن ذلك يعتمد على حركتك: الإنتاجية التي تتحملها مثيل من عائلة G، وبالتالي التكلفة الموزعة على كل مهمة، هي دالة في نمط طلباتك وأطوال التسلسلات والتزامن. قِس ذلك على عبء عملك الخاص وفق أسعار SageMaker AI الحالية وأسعار التوكن لدى مزوّد النموذج الرائد لديك، بدلًا من الاعتماد على رقم رئيسي واحد.
القيود وأفضل الممارسات
هل ستلائم المهمة الطالب؟ (جدار السعة)
التقطير ينقل توزيعًا يمكن للطالب تمثيله أصلًا، لا قدرة خامًا يفتقر إليها. عند فجوة كبيرة جدًا، يقلّد الطالب تنسيق المعلم دون أن يتعلم الحل. نموذج صغير مدرّب على سلاسل تفكير معلم كبير ينتج تفكيرًا طويلًا جيد التنظيم تبقى إجاباته خاطئة، ووكيل مدرّب بالطريقة نفسها يصدر استدعاءات أدوات سليمة الصيغة لا تحرز تقدمًا، ويعيد البحث باستعلامات معاد صياغتها، ويصل إلى حد خطواته دون تلبية القيود. العَرَض واحد في الحالتين: تطول المسارات بينما يبقى الإنجاز ثابتًا. حين تراه، توقف عن إضافة البيانات وكبّر الطالب أو خفّض صعوبة المهمة.
الفجوة التي تحدد هذا هي الفجوة بين المهمة والطالب، لا بين الطالب والمعلم. يمكن لطالب صغير أن يستعيد جودة معلم أكبر منه بكثير ما دامت المهمة نفسها في متناوله. لهذا يعمل وكيل التسوق هنا. المعلم هو نموذج mixture-of-experts بنحو 40 مليار معلمة نشطة، أي نحو عشرة أضعاف 4 مليارات لدى الطالب، لكن مهمة التسوق تندرج جيدًا ضمن سعة نموذج 4B، فيستعيد الطالب جودة المعلم بدلًا من مجرد إطالة مساراته.
أين يتوقف SeqKD عن الإفادة
يرفع SeqKD المشكلات السهلة والمتوسطة الصعوبة لكنه يستقر عند المستوى على الأصعب منها، حيث يجب على الطالب أن يتعافى من أخطائه هو. وهذا أوضح في الوكيل مقارنة بمهمة ذات خطوة واحدة. في حلقة متعددة الخطوات يتضاعف الخطأ المبكر، لأن الطالب لا يرى الحالات التي تؤدي إليها أخطاؤه. سد هذه الفجوة هو ما تستهدفه الطرق القائمة على السياسة (on-policy)، ولهذا يكون SeqKD عادة المرحلة الأولى لا خط النهاية. يطلب SeqKD أيضًا أقل قدر من بنيتك التحتية، لأنه يستخدم نص المعلم فقط، بينما يحتاج تقطير الـlogit إلى توزيع المعلم لكل توكن، وتسجّل الطرق القائمة على السياسة تجارب الطالب الخاصة. بداية دافئة بـSeqKD نصية فقط تليها مرحلة قائمة على السياسة هي وصفة شائعة، لذا يغطي هذا المنشور المرحلة الأولى، وتجاوز مستوى الاستقرار هو الخطوة الطبيعية التالية.
خياران يحملان النتيجة
أولًا، طابق أهداف التدريب مع السلوك الذي تريده. هنا كان ذلك يعني الإبقاء على تفكير المعلم مع كل استدعاء أداة بدلًا من ضغطه إلى إجابات نهائية، لأن التفكير جزء مما يحل المهمة (النتائج تقيس هذه الفجوة)، وعرض كل هدف بالقالب الحواري الذي يستخدمه الوكيل وقت الخدمة. ثانيًا، قيّم بصدق. قِس على بيانات لم ترها النماذج، لأن المعايير المتسربة تضخّم النتائج، وقارن بما يتجاوز النموذج الأساسي غير المدرّب الذي سيتغلب عليه الطالب حتمًا، بوضعه جنبًا إلى جنب مع المعلم ونموذج رائد مستقل حتى يُظهر الرقم مدى اقتراب الطالب مما قُطّر منه.
التنظيف بعد الانتهاء
تُفوتر نقطة الاستدلال في الوقت الفعلي (real-time inference endpoint) طالما هي قائمة التشغيل، لذا قم بتفكيك نقطة الاستدلال التي أنشأتها للخدمة بعد الحصول على نتائجك. ونظرًا لأن الطالب (student) يُقدَّم كمكوّن استدلال مُهايئ (adapter inference component) فوق مكوّن استدلال أساسي، يجب إزالة الأجزاء بترتيب الاعتماديات: مكوّن المُهايئ أولًا، ثم المكوّن الأساسي، ثم نقطة الاستدلال وإعداداتها. يقوم kd_serve المساعد المرافق بهذا نيابةً عنك، حيث يعثر على المُهايئ من الناحية الهيكلية بحيث ينظّف كل شيء بغض النظر عن الأسماء الدقيقة للمكوّنات:
import kd_serve
# Deletes the adapter IC, then the base IC, then the endpoint and its configuration
kd_serve.teardown_endpoint(endpoint_name, region=region)
مهمة التدريب نفسها لا تحتاج إلى أي تنظيف. فالتدريب بلا خادم (serverless) يوفّر الموارد الحاسوبية ويشغّلها ويحرّرها تلقائيًا، لذا فإن المهمة المكتملة ليست عبئًا مستمرًا على التكاليف. حزمة النموذج المسجّلة ومجموعتها لا تتكبدان أي تكلفة حوسبية أيضًا، لذا يمكنك الاحتفاظ بهما لتتبّع النشأة وإعادة النشر لاحقًا. الشيء الوحيد الذي يظل يكلّفك هو بياناتك في S3 (المسارات المُرمَّزة والنواتج المُخرَجة)، وهي تتكبّد تكلفة تخزين طوال المدة التي تحتفظ فيها بها، لذا احذف ما لم تعد بحاجته أو انقله إلى فئة تخزين أقل تكلفة.
الخاتمة
في هذه المقالة، عرضنا كيفية تقطير مساعد تسوّق وكيل (agentic) إلى طالب أصغر وأقل تكلفة باستخدام التقطير بالمعرفة على مستوى التسلسل (SeqKD). أنشأنا مسارات عالية الجودة أحادية النوبة ومتعددة الخطوات باستخدام نموذج معلّم رائد (frontier) على Bedrock، واحتفظنا فقط بتلك التي حلّت المهمة باستخدام أداة التقييم الخاصة بـ ShoppingBench نفسها، ورمّزنا كل خطوة كرسائل بصيغة محادثة تحافظ على استدلال المعلّم إلى جانب استدعاءاته للأدوات، وضبطنا الطالب بدقة على بنية بلا خادم باستخدام تخصيص النماذج في SageMaker AI، وتتبّعنا التدريب باستخدام MLflow، وأجرينا فحص بوابة الجودة باستخدام تقييم النماذج في SageMaker AI، وقدّمنا النتيجة خلف نقطة استدلال تُشغّل حلقة الأدوات. وكانت النتيجة طالبًا بحجم 4B يستعيد عمليًا كل جودة أداء المعلّم الرائد في المهمة. ولأن SeqKD لا يحتاج إلا إلى المخرجات النصية للمعلّم، فهو يعمل حتى عندما يكون المعلّم نموذجًا رائدًا مغلقًا تصل إليه عبر واجهة برمجية (API)، ويمكنك التوقف عن دفع أسعار النماذج الرائدة في كل خطوة بعد تولّي الطالب المهمة.
يُعد SeqKD خطوة أولى قوية لكن له حدود حقيقية. طابق حجم الطالب مع المهمة، وقيّم على مجموعة اختبار محجوزة مقابل مراجع قوية وليس فقط النموذج الأساسي غير المدرَّب، وعندما تُقاوم أصعب حوّة من المشكلات التقليد، تابع SeqKD بأساليب on-policy غير المشمولة هنا التي تتيح للطالب أن يتعلم من محاولاته الخاصة.
لتجربة هذا بنفسك، راجع مستودع الكود المرافق و وثائق SageMaker AI.