مقالات معمّقة حول التكنولوجيا التي تشكّل المستقبل.

فك الترميز المقيّد: حوّل LLM إلى نماذج قرار سريعة

فك الترميز المقيّد يحوّل نموذج LLM إلى مصنِّف سريع. تعرّف على حجب اللوجيت وتدريج درجة الحرارة لجعل نماذج القرار موثوقة.

شعاع ضوء ينقسم إلى خمسة أشعة ملونة عبر بوابات، يوضح مخرجات التوكنات المقيّدة.
حجب المفردات يُجبر التوزيع الكامل لمخرجات النموذج على المرور عبر عدد محدود من البوابات المسموحة.

إليك حيلة رخيصة ومفيدة بهدوء: إذا كان يهمّك فقط أول توكن قد يُصدره نموذج LLM، فيمكنك أن تطرح عليه سؤال اختيار من متعدد وتحصل على الإجابة في تمريرة أمامية واحدة. فك الترميز المقيّد — أي حجب كل توكن في المفردات باستثناء القليل الذي تقبله — يحوّل نموذجاً توليدياً إلى شيء يشبه المصنِّف إلى حد كبير. لا تحليل لـ JSON، ولا حلقات إعادة محاولة، ولا أحد عشر خطوة توليد تلقائي لإنتاج أحد عشر حرفاً. تمريرة واحدة، ودالة softmax واحدة، وإجابة واحدة مع احتمال مرتبط بكل خيار.

تداول هذه الفكرة منذ مدة تحت أسماء مثل «نماذج القرار» أو استدلال «النظام الأول»، وانتشرت مؤخراً على Hacker News بفضل شرح يوضح كيفية بناء واحد من نموذج Qwen بحجم 1.7 مليار معامل في نحو أربعين سطراً من Python. ولم يتأخر كبار مهندسي تعلم الآلة في التعليقات عن الصراخ المتوقع: هذا مصنِّف، ولدينا مصنفات منذ البيرسبترون. وهم محقون، لكنهم يفوّتون الفكرة قليلاً. الجديد ليس المفهوم، بل أنك تحصل على مصنِّف zero-shot من نموذج لغوي عام دون تدريب أي شيء. السؤال الهندسي المثير هو متى يتفوق هذا النهج المقيّد على ترك النموذج يتكلم بحرية، ومتى يخدعك بصمت باحتمالات واثقة أكثر من اللازم.

طريقتان للحصول على إجابة من LLM

الوضع الافتراضي للتعامل مع نموذج لغوي هو التوليد. تطرح سؤالاً، فيصدر النموذج التوكنات واحداً تلو الآخر، ثم تحلل ما خرج لاحقاً. إذا احتجت مخرجات منظمة، تضيف مخطط بيانات: وضع JSON، أو أخذ عينات مقيّدة بالقواعد النحوية، أو آلات الحالة المنتهية على طريقة Outlines. هذه الأساليب تعمل، لكن النموذج ما زال يمشي توكناً توكناً عبر الإجابة كاملة. إجابة اختيار من متعدد بسيطة قد تحتاج أحد عشر خطوة فك ترميز، وكل خطوة تكلف تمريرة أمامية كاملة عبر مليارات المعاملات.

البديل ألا تسمح له بالمشي أصلاً. بعد معالجة الموجّه، تنظر إلى اللوجيتات عبر المفردات عند الموضع الأخير، وتتجاهل كل شيء ما عدا معرّفات التوكنات الموافقة لخياراتك — مثلاً «A» و«B» و«C» و«D» و«E» — ثم تطبق softmax على هذه فقط. الـ argmax هو توقعك، وقيم softmax هي الدرجات. التكلفة الإجمالية: تمريرة أمامية واحدة، وهي نفسها تمريرة الـ prefill التي كنت تدفعها أصلاً. إليك جوهر الفكرة، مقتبساً من النهج المبني على Qwen الذي يتداوله الناس:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Qwen/Qwen3-1.7B"
options = ["A", "B", "C", "D", "E"]
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name, torch_dtype="auto", device_map="auto"
)
# First token the model would emit for each option
option_token_ids = [
tokenizer.encode(opt, add_special_tokens=False)[0] for opt in options
]
prompt = (
"What color is the sky?\n"
"A. Red\nB. Blue\nC. Green\nD. Purple\nE. I don't know\nAnswer:"
)
messages = [{"role": "user", "content": prompt}]
text = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True,
enable_thinking=False
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
logits = model(**inputs).logits[0, -1]
# Constrained decoding: softmax over only the option tokens
probs = torch.softmax(logits[option_token_ids].float(), dim=-1)
print(options[probs.argmax().item()])  # -> B

هذا هو المحرك كله. المفردات تضم أكثر من 150,000 توكن، وقد اختزلنا القرار إلى خمسة أرقام. لا لعب بدرجة الحرارة وقت التوليد، ولا محلل قد يفشل، ولا طريقة لأن يختلق النموذج خياراً ليس في القائمة. فضاء المخرجات مغلق بحكم البناء.

إنه مصنِّف، وهذا لا بأس به

لنمنح المشككين حقهم. ما بنيناه هو مصنِّف تمييزي على مجموعة تسميات ثابتة، وهو امتداد لأفكار تعود إلى بيرسبترون Rosenblatt في خمسينيات القرن الماضي، ثم الانحدار اللوجستي، ثم كل شبكة عصبية برأس softmax في عصر التعلم العميق. وإذا نظرت بعين مدققة، فإن فك الترميز المقيّد ليس إلا قراءة خطية فوق الحالة المخفية الأخيرة، وهذا ما كان دائماً رأس التصنيف. ومهندس تعلم الآلة الذي ظل سنوات يتوسل إلى فريقه لتدريب مصنِّف فقط، من حقه أن يشعر بقليل من الغضب وهو يرى هذا يُعاد تسميته «نموذج قرار».

لكن التاريخ يوضح أيضاً سبب أهمية النسخة الجديدة. المصنفات القديمة كانت ضيقة: تجمع بيانات موسومة، وتدرّب، فتحصل على نموذج يعرف مهمة واحدة ولا شيء غيرها. والسبب في أن الأنظمة المبنية على LLM تستمر في التهام المهام التي «يفترض» أن تستخدم مصنِّفاً حقيقياً هو خاصية zero-shot: النموذج الأساسي استوعب قدراً كافياً من العالم بحيث يصبح الموجّه نفسه بيانات التدريب. عندما جربت إعداداً كهذا على مجموعة اختبار محجوزة من CommonsenseQA، وصل نموذج 1.7 مليار إلى دقة نحو 59% دون أي ضبط دقيق، وارتفعت إلى قرابة 62% بعد ضبط سريع على مجموعة التدريب. هذا ليس أفضل ما هو متاح، لكنه كلّف فترة بعد ظهر واحدة ولم يتطلب بيانات موسومة من عندي. قد يتفوق مصنِّف مبني خصيصاً، لكنه كان سيتطلب خط معالجة، ومجموعة بيانات، وخطة إعادة تدريب في كل مرة تتغير فيها التسميات.

هناك إطار مفيد هنا مستمد من النقاش القديم بين المولِّد والتمييزي. المصنفات التوليدية تنمذج التوزيع كاملاً، وهي مرنة لكنها مُكلفة، أما التمييزية فتنمذج حد القرار، وهي كفؤة لكنها جامدة. فك الترميز المقيّد هجين غريب: نموذج توليدي يُستخدم كأداة تمييزية وقت الاستدلال. تحصل على كفاءة القراءة التمييزية مع اتساع التدريب المسبق التوليدي. هذا المزيج لم يكن متاحاً من قبل بهذا الشكل، حتى لو كانت قطعه قديمة.

أين يتفوق فك الترميز المقيّد

  • زمن الاستجابة. تمريرة أمامية واحدة بدلاً من N خطوة انحدارية ذاتية. على النماذج الصغيرة يكون هذا الفرق بين «سريع بما يكفي لمسار الطلب» و«يحتاج إلى طابور». ويذكر ممارسون يشغّلون نماذج قرار خالصة داخل المتصفح أن الاستجابات تكون أقل من 200 ميلي ثانية، فجرّب ذلك مع JSON التوليدي.
  • الصحة البنيوية. النموذج لا يستطيع إنتاج مخرجات خارج المجموعة المسموحة. لا JSON مشوه، ولا «الإجابة على الأرجح B لأن...» وكلام مطوّل، ولا حاجة إلى طبقة حماية لالتقاط مخالفات الشكل.
  • الإنتاجية. بما أن كل طلب تمريرة واحدة بالشكل نفسه، فإن التجميع دفعات أمر بسيط ومتوقع. أما توليد إجابات متغيرة الطول فيُفسد كفاءة التجميع.
  • درجة لكل خيار. تحصل على التوزيع كاملاً وليس الفائز فقط. وهذا يفتح الباب لمنطق الامتناع: إذا كان أعلى احتمال أقل من عتبة، فوجّه الحالة إلى إنسان أو إلى نموذج أكبر.

نقطة الامتناع تستحق التأكيد. الإجابة التوليدية قطعة واحدة إما تثق بها أو لا. أما توزيع الاحتمالات على الخيارات فيتيح بناء توجيه: الحالات عالية الثقة تمر تلقائياً، والمنخفضة تُحال للتصعيد. هذا هو النمط خلف كثير من أنظمة الفرز في الإنتاج، مثل توجيه تذاكر الدعم، والفحص المسبق للمحتوى، وكشف النية، وهنا تكسب هذه التقنية قيمتها. إذا كانت مهمتك تتفكك طبيعياً إلى «اختر واحداً من K تسميات، وأخبرني بمدى تأكدك»، فإن فك الترميز المقيّد هو الأداة الصحيحة على الأرجح.

أين تتفوق المخرجات التوليدية

الآن الجانب الآخر. بمجرد أن لا تتناسب مهمتك مع مجموعة تسميات ثابتة، يتهاوى فك الترميز المقيّد. إذا كانت الإجابة كياناً حراً، أو رقماً، أو قطعة من الشيفرة، أو أي شيء تركيبي، فأنت بحاجة إلى التوليد، ربما مع قيود بنية المخرجات، لكنه يبقى توليداً. وهناك خسارة أدق: الاستدلال. عندما يولّد النموذج سلسلة تفكير قبل الإجابة، فإنه غالباً يؤدي أداء أفضل بكثير في الأسئلة الصعبة. أما رأس القرار ذو التمريرة الواحدة فلا يمنحك مسودة تفكير. أنت تطلب تفكيراً من النظام الأول، سريعاً وحدسياً، وتحصل عليه تماماً، بما فيه إخفاقاته المميزة.

وهناك أيضاً مشكلة الحساسية للصياغة. المصنِّف المقيّد على «A/B/C/D/E» يقيس في الحقيقة تفضيل النموذج لنص كل خيار في موقعه. أعد صياغة الخيار C قليلاً، أو أعد ترتيب القائمة، أو غيّر «Answer:» إلى «The best answer is»، وستتحرك الدرجات. الإجابات التوليدية مع التفكير تميل إلى أن تكون أكثر متانة أمام تغييرات السطح، لأن النموذج مضطر إلى الالتزام بالمحتوى، لا بالتوكن فقط. إذا كنت تقيّم أياً من النهجين، فغيّر العرض وانظر ماذا ينكسر، فهذا اختبار متانة رخيص، ومزعج في الوقت نفسه.

مساران عبر مشهد طبيعي، أحدهما مباشر والآخر متعرج، يرمزان إلى الاستدلال السريع مقابل الاستدلال المتأني.
فك الترميز المقيّد هو الطريق المباشر، والتوليد مع التفكير هو المسار الملتوي الذي يصل أحياناً إلى أرض أعلى.

مشكلة المعايرة: درجات ثقتك تكذب

هذا هو الفخ الذي يوقع كل من يبني واحداً من هذه النماذج. تحصل على احتمالات من softmax، فلا بد أنها احتمالات، صحيح؟ ليس تماماً. إنها ثقة النموذج في أن توكناً معيناً يأتي بعد غيره، وهي عبارة عن قول عن اللغة، لا عن الصحة. اسأل النموذج «أين تتوقع أن تجد الخفاش على الأرجح؟» مع خيارات تشمل «كهف» و«مباراة بيسبول»، وسيعطي «كهف» قيمة مثل 0.998، وهو سؤال ملتبس لا توجد له إجابة يقينية يمكن الدفاع عنها، ومع ذلك يُجاب عليه بيقين شبه تام.

إذا صنّفت التوقعات حسب الثقة على تقييم حقيقي، تصبح الصورة أسوأ. في أحد تشغيلات CommonsenseQA، كانت شريحة الثقة 0.9–1.0 صحيحة في نحو 70% فقط من الحالات، وبالكاد وصلت شريحة 0.8–0.9 إلى 40%. النموذج المعاير جيداً يجب أن يكون محقاً في نحو 90% من الحالات عندما يقول 0.9. هذا النموذج واثق أكثر من اللازم بشكل منهجي، وهو ما يعكس، إذا تأملت، الملاحظة القديمة بأن الشبكات العميقة الحديثة واثقة أكثر من اللازم عموماً. وقد بيّن Guo وزملاؤه عام 2017 أن مخرجات softmax لشبكة ResNet عادية غير معايرة بشكل سيئ مقارنة بالشبكات الضحلة في التسعينيات. كل قديم يعود جديداً، ونحن فقط أعدنا اكتشاف المشكلة عند 1.7 مليار معامل.

الحل، لحسن الحظ، قديم أيضاً وبسيط إلى درجة محرجة: تدريج درجة الحرارة. اقسم اللوجيتات على عدد قياسي مُتعلَّم واحد T قبل softmax:

def scaled_probs(logits, option_ids, temperature):
selected = logits[option_ids].float() / temperature
return torch.softmax(selected, dim=-1)
# Fit T on a validation set by minimizing negative log-likelihood
# of the correct option. For the CommonsenseQA run above, T ~= 3.8
temperature = 3.7973
probs = scaled_probs(logits, option_token_ids, temperature)

عندما يكون T أكبر من 1 يُسطّح التوزيع، وعندما يكون أقل من 1 يُحدّه. إن ضبط رقم واحد على مجموعة محجوزة حوّل جدول المعايرة البائس إلى شيء صادق: شريحة 0.9–1.0 أصبحت تقارب دقة 95%، وشريحة 0.5–0.6 تقارب 55%. الدقة لا تتغير أبداً، لأن argmax ثابت أمام التحويل الرتيب، لكن الدرجات صارت تعني ما كنت تظن أنها تعنيه. وإذا كنت تنوي التوجيه بناءً على هذه الاحتمالات، فعاير أولاً، وإلا فلا داعي لجمعها أصلاً.

هل ضبط درجة الحرارة على معيار قياسي غش؟

سؤال منطقي طُرح في النقاش: ألا يُعد ضبط T بحيث يبدو النموذج معايراً على معيار قياسي نوعاً من التلاعب الإحصائي؟ سيكون كذلك لو ضبطته على مجموعة الاختبار. أما إذا فعلته بشكل سليم، أي تضبط T على مجموعة تحقق ثم تبلّغ المعايرة على مجموعة اختبار محجوزة، فهو مجرد انحدار بمعامل واحد، وهو المعيار المتبع في الأدبيات لهذا السبب تحديداً. الانضباط المهم هو نفسه في كل مكان في تعلم الآلة: حافظ على تقسيم بياناتك نزيهاً، وشكّك في أي ادعاء معايرة يُقاس على بيانات لامست عملية الضبط. وإذا انحرف مجال النشر عن مجال التقييم، فسينحرف T معه أيضاً، لذلك يجب أن تكون إعادة المعايرة جزءاً من حلقة الصيانة إلى جانب كل شيء آخر.

هذه في الحقيقة نسخة من مشكلة أوسع: الفجوة بين ما يُفترض أن يعنيه النظام وما يحسبه فعلاً، وهي الفجوة التي جادلت سابقاً بأن الأخطاء تسكن فيها. «الثقة» تُعرَّف بأنها احتمال الصحة، لكن التنفيذ يعطيك معقولية التوكن التالي فقط. تدريج درجة الحرارة رقعة فوق هذه الفجوة، لا حل لها. تذكّر هذا الفرق كلما أغرتك الفكرة بربط مخرجات softmax بعتبة تنبيه.

إجراء عملي لاتخاذ القرار

عندما أختار بين الوضعين الآن، أمرّ على قائمة تحقق قصيرة:

  1. هل المخرجات مجموعة ثابتة من التسميات؟ إذا كانت الإجابة نعم، ففك الترميز المقيّد مطروح على الطاولة. إذا لا، فولّد.
  2. هل أحتاج إلى التفكير لأحصل على دقة مقبولة؟ جرّب النهجين كنماذج أولية. إذا تخلّف رأس التمريرة الواحدة عن سلسلة التفكير بأكثر مما تحتمل، فالتوليد يفوز رغم زمن الاستجابة.
  3. هل أحتاج إلى درجات لكل خيار من أجل التوجيه أو الامتناع؟ إذا كانت الإجابة نعم، فإن فك الترميز المقيّد مع تدريج درجة الحرارة يكلف شبه لا شيء، والتوليد لا يمنحك شيئاً مماثلاً.
  4. ما حجم مجموعة التسميات؟ خمسة خيارات أمر تافه، وخمسة آلاف هي نطاق الاسترجاع. مع فضاءات التسميات الكبيرة، ضمّن تسمياتك، واختصر القائمة بالبحث المتجهي، ثم استخدم النموذج لاختيار بين المرشحين النهائيين، وهي حيلة توسيع المصنِّفات المعتمدة منذ عصر أنظمة التوصية.
  5. هل ستتغير التسميات بكثرة؟ خاصية zero-shot هي جوهر الفكرة. إذا كانت التسميات تتبدل أسبوعياً، فالمصنِّف المعاد تدريبه عبء صيانة، أما تعديل الموجّه فليس كذلك.

softmax الخاص بالنموذج ادعاء عن التوكن التالي، لا عن الحقيقة. عايره، أو لا تثق به.

ملاحظة أخيرة: حجم النموذج يتفاعل مع الاختيار. رأس التمريرة الواحدة في النموذج الصغير رخيص بما يكفي لتشغيله مع كل طلب، حتى من جهة العميل. وهناك أشخاص يشحنون بالفعل نماذج قرار تعمل داخل المتصفح باستجابات دون 200 ميلي ثانية. التصميم المتتالي، أي نموذج مقيّد صغير للحالات السهلة التي تمثل نحو 80%، ونموذج توليدي كبير للذيل الصعب، يتفوق غالباً على الطرفين في التكلفة والدقة معاً. وهو نفس الحدس خلف فك الترميز التخميني، لكن مطبقاً على مستوى النظام لا على مستوى التوكن.

التوصية

موقفي: إذا كانت مهمتك قراراً ثابت الخيارات فعلاً، مثل التوجيه أو الفرز أو تحديد النية أو تقييم الاختيار من متعدد، فابنِ رأس القرار المقيّد ولا تلتفت إلى الوراء. ميزة زمن الاستجابة وحدها تبرر ذلك، والضمانات البنيوية تلغي فئة كاملة من أخطاء التحليل، والدرجات لكل خيار تمنحك منطق توجيه لا يضاهيه التوليد. لكن تعامل مع softmax الخام كأداة غير معايرة. اضبط النموذج على مهمتك الفعلية إن استطعت جمع حتى مجموعة بيانات متواضعة، واضبط درجة الحرارة على مجموعة تحقق نظيفة، وتحقق من المعايرة على بيانات لم يرها الضبط أبداً.

احتفظ بالمخرجات التوليدية، مع قيود بنية المخرجات حيث تحتاجها، للمهام التركيبية فعلاً أو التي تستفيد من التفكير المرئي. ولا تدع أحداً يبيعك «نموذج القرار» على أنه فئة جديدة: إنه مصنِّف يرتدي معطف LLM، سليل ستين عاماً من النمذجة التمييزية، وهو أنفع ما يكون عندما تحترم هذا النسب بما يكفي لتقوم بعمل المعايرة الذي أصرّ عليه الرعيل الأول دائماً. الأدوات جديدة، أما الانضباط فليس كذلك.