النموذج الـ abliterated هو نموذج عادي مفتوح الأوزان أُزيل منه سلوك الرفض جراحيًا عبر تعديل أوزانه — لا بإعادة تدريبه، ولا بتغليفه في موجّه (prompt) ذكي. الاسم كلمة منحوتة من ablate (استئصال) وobliterate (محو)، وهو يصف الآلية بدقة: تحدد الاتجاه الوحيد في فضاء التنشيطات الذي يحمل معنى «ينبغي أن أرفض هذا»، ثم تجعل من المستحيل على الشبكة أن تكتب ذلك الاتجاه مرة أخرى.
تنبع هذه التقنية من أبحاث قابلية التفسير (interpretability) التي أظهرت أن الرفض في نماذج المحوّلات (transformers) المضبوطة للمحادثة يتوسّطه إلى حد بعيد اتجاه خطي واحد. تلك النتيجة هي ما يجعل الأمر كله رخيصًا. لو كان الرفض موزعًا على آلاف الخصائص المتفاعلة، لتطلبت إزالته انحدارًا تدرجيًا (gradient descent). ولأنه متركّز، فإن إزالته لا تتطلب سوى الجبر الخطي.
الرفض يسكن في التيار المتبقي
التيار المتبقي (residual stream) في المحوّل هو المتجه الجاري، واحد لكل موضع توكن، الذي تقرأ منه كل كتلة وتكتب فيه من جديد. تضيف رؤوس الانتباه وطبقات MLP مخرجاتها إليه؛ ولا شيء يستبدل محتواه. وبفضل هذه البنية الجمعية، فإن الاتجاه في التيار المتبقي يعني الشيء نفسه تقريبًا في الطبقة 10 وفي الطبقة 40، وهذه بالضبط الخاصية التي تتيح لك الحديث عن «اتجاه الرفض» بوصفه كائنًا واحدًا لا أربعين كائنًا غير مترابط.
للعثور عليه تحتاج إلى مجموعتين من الموجّهات: واحدة يرفضها النموذج باطّراد، وأخرى يجيب عنها باطّراد. شغّل المجموعتين، والتقط تنشيطات التيار المتبقي عند طبقة وموضع توكن ثابتين (التوكنات الأخيرة من التعليمات تعمل جيدًا، لأن النموذج عندها يكون قد أنهى قراءة الطلب ولم يبدأ الإجابة بعد)، ثم احسب الفرق بين المتوسطين.
import torch
def refusal_direction(harmful: torch.Tensor, harmless: torch.Tensor) -> torch.Tensor:
"""Difference-in-means estimate of the refusal direction, unit-normalised.
Both tensors are [n_prompts, d_model] residual-stream activations captured at
the same layer and token position. Difference-in-means beats a trained probe
here: with a few hundred prompts a probe overfits, a mean shift does not.
"""
r = harmful.mean(dim=0) - harmless.mean(dim=0)
return r / r.norm()تكرر ذلك عند كل طبقة وموضع مرشّحين، فتحصل على عشرات الاتجاهات المرشّحة، ثم تختار واحدًا منها. الاختيار أهم من الاستخراج: المعيار الصحيح هو استأصل هذا المرشّح، ثم قِس أمرين: كم انخفض الرفض على موجّهات ضارة محجوزة للاختبار، وكم تحرك توزيع التوكن التالي على الموجّهات غير الضارة. هذا الرقم الثاني — وهو عادةً تباعد KL مقارنةً بالنموذج غير المعدّل — هو مقياس الضرر لديك. فالمرشّح الذي يقضي على الرفض لكنه يزيح توزيع الموجّهات غير الضارة إزاحة كبيرة خيار أسوأ من مرشّح يقضي على قدر أقل قليلًا من الرفض مقابل جزء يسير من الأضرار الجانبية.
كيف يُبنى النموذج الـ abliterated
ما إن تحصل على متجه الوحدة r حتى يكون أمامك طريقتان لاستخدامه. الأولى خطّاف (hook) في وقت الاستدلال: عند كل طبقة، اطرح مركّبة التنشيط على امتداد r قبل تمريره إلى الطبقة التالية. هذا يعمل، لكنه يكلفك خطّافًا في وقت التشغيل، فلا يعود النموذج نقطة حفظ (checkpoint) عادية.
الطريقة الثانية — وهي الـ abliteration الفعلية — تُدمجه في الأوزان نفسها. كل مصفوفة تكتب في التيار المتبقي تتلقى تحديثًا من الرتبة الأولى يزيل r من فضاء مخرجاتها: مصفوفة التضمين (embedding)، وكل إسقاط إخراج في طبقات الانتباه، وكل إسقاط نزول (down-projection) في طبقات MLP.
def orthogonalize_(weight: torch.Tensor, r: torch.Tensor) -> None:
"""Project r out of a matrix that writes into the residual stream, in place.
weight is [d_model, d_in]. After W <- (I - r rT) W, the product W @ x has zero
component along r for every possible x, so no amount of prompting can put the
direction back. Rank-one per matrix; no gradients, no optimiser, no dataset of
answers — only the few hundred prompts used to estimate r.
"""
weight -= torch.outer(r, r @ weight)النتيجة نقطة حفظ عادية. البنية نفسها، وصيغة الملف نفسها، وتكلفة الاستدلال نفسها، وتُحمَّل في vLLM أو llama.cpp دون أي تغيير. على وحدة GPU واحدة يكتمل الإجراء كله في دقائق، والجزء المكلف هو مسح المرشّحين لا التعديل نفسه.
كيف يختلف عن الضبط الدقيق
الضبط الدقيق (fine-tuning) لإزالة الرفض — سواء بـ SFT أو DPO على مجموعة من الاستجابات الممتثلة — عملية مختلفة جوهريًا. فهي تحرّك كل وزن عبر الانحدار التدرجي، وتحتاج إلى مجموعة بيانات من الإجابات لا مجرد موجّهات، وتكلف ساعات من GPU، وتعلّم سلوكًا جديدًا بدلًا من حذف سلوك قائم. كما أنها تجرّ معها كل ما في مجموعة بيانات الضبط من أسلوب وانحياز في الطول وشذوذ في الحقائق، وتخاطر بنسيان كارثي لقدرات لا علاقة لها بالأمر.
أما الـ abliteration فلا تمس سوى فضاء جزئي واحد من الرتبة الأولى ولا شيء غيره. هذه الدقة هي ميزتها الأساسية ومصدر نمط فشلها الأساسي في آن واحد: إذا صادف أن شيئًا آخر غير الرفض يقع على امتداد r، فسيُدمَّر هو الآخر، ولا قدر من الحرص في المسح يتجنب ذلك تمامًا.
كيف يختلف عن موجّهات كسر الحماية (jailbreak)
كسر الحماية يترك الأوزان كما هي، ويوجّه التنشيطات بدلًا من ذلك نحو منطقة لا تنطلق فيها دارات الرفض. وهذا هشّ بطرق تهم من يعتمد على الأتمتة. فهو يستهلك توكنات من السياق في كل استدعاء. وهو غير حتمي — الموجّه نفسه قد يمتثل في عينة ويرفض في العينة التالية. وينكسر بصمت حين يحدّث المزوّد النموذج أو يرقّع الصياغة المحددة. ولأن آلية الرفض ما زالت حاضرة بالكامل، فقد تعاود الظهور في منتصف التوليد، فتمنحك ثلاث فقرات من المخرجات المفيدة تليها عبارة «في الواقع، لا أستطيع الاستمرار في هذا».
النموذج الـ abliterated ليس لديه ما يعاود الظهور. السلوك مستقر على امتداد عملية التوليد كلها وعبر صياغات الموجّهات المختلفة، وهذه هي الخاصية التي تجعله صالحًا للاستخدام في خط معالجة دفعي.
كن صريحًا بشأن المقايضات
النموذج الـ abliterated ليس نموذجًا أفضل. إنه نموذج توقف عن قول «لا»، وهذا ادعاء أضيق مما يبدو.
- انحراف القدرات. إزالة اتجاه من كل مصفوفة كتابة لها تكاليف قابلة للقياس. نقاط الحفظ الـ abliterated تُظهر عادةً التزامًا أضعف بالتعليمات في الحالات الحدّية، وموافقة أكبر على المقدمات الخاطئة في الموجّه، وتراجعات طفيفة في معايير قياس التفكير.
- الرفض ليس أحادي البعد تمامًا. اتجاه واحد يلتقط معظم السلوك لا كله. توقّع أن ينجو بعض الرفض، وتوقّع بعض الأضرار الجانبية في السلوكيات التي تشترك في الاتجاه نفسه.
- لا معرفة جديدة. الـ abliteration لا تضيف شيئًا. حيث كان النموذج الأساسي سيرفض بدافع جهل متنكّر في هيئة حذر، ستحصل الآن على اختلاق واثق — وهو ما قد يكون في خط معالجة تقييمي أسوأ من الرفض، لأن الرفض على الأقل إشارة صادقة يمكنك اكتشافها.
- مجموعات الموجّهات هي التي تحدد التعديل. مجموعة ضارة ضيقة تنتج اتجاهًا ضيقًا. عمليتا abliteration على النموذج الأساسي نفسه ليستا قابلتين للتبادل.
كثير من النماذج الـ abliterated المنشورة تخضع لاحقًا لضبط دقيق إصلاحي خفيف لاستعادة ما تدهور من القدرات — وهو ما يعيد بهدوء التكلفة التي كان يُفترض بالتقنية أن تتجنبها.
أين يكون هذا مفيدًا
حالة الاستخدام الصادقة هي العمل الذي يكون فيه الرفض خطأ قياس لا مكسبًا للسلامة: منظومات الفريق الأحمر (red-teaming)، وخطوط الأساس لمعدل الرفض، وتقييم المتانة، والتحليل الأمني الذي يستثير فيه الموضوع حاجز حماية رغم أن المهمة دفاعية. تقدّم unbleep نماذج abliterated خلف نقطة نهاية متوافقة مع OpenAI، بحيث يمكنك توجيه عميل موجود لديك إليها والحصول على خط أساس مستقر. وما تبنيه بذلك مسؤوليتك أنت — راجع سياسة الاستخدام المقبول لمعرفة الخطوط التي لا نتجاوزها.
احصل على مفتاح API وقِس الفرق بنفسك.