إنتقل إلى المحتوى الرئيسي

🎁 المشروع الختامي 2027: اضبط نموذجًا لغويًا صغيرًا دقيقًا باستخدام Unsloth

تهانينا على إنهاء الدورة. في مسار Python 101 الصعب، بنيتَ نموذجًا لغويًا صغيرًا جدًا من الصفر تمامًا — عدّ الكلمات، جداول احتمالات الثنائيات (bigrams)، أخذ العينات الموزون. يواصل هذا المشروع الختامي هذا الخيط بالضبط: بدلًا من بناء رياضيات نموذج لغوي من لا شيء، ستأخذ نموذجًا حقيقيًا مُدرَّبًا مسبقًا ومفتوح المصدر وتخصصه لمهمة من اختيارك عبر الضبط الدقيق (fine-tuning) — تعديل أوزانه الحالية بكمية صغيرة من بياناتك الخاصة، باستخدام Unsloth، وهي مكتبة صُممت خصيصًا لجعل هذا سريعًا و(الأهم) مجانيًا.

هذا اختياري وغير مُقيَّم. وهو موجود هنا لأن إنهاء 10 أسابيع من الأساسيات يستحق مكافأة تشير إلى ما يأتي بعد ذلك. وهو أيضًا مشروع هذا العام — يُضاف مشروع جديد كل عام، وتبقى مشاريع الأعوام السابقة متاحة، بما في ذلك مشروع وكيل الذكاء الاصطناعي الختامي لعام 2026؛ راجع اختر مشروعك الختامي للقائمة الكاملة.

فرق صادق واحد عن مشروع 2026 الختامي

عمل مشروع 2026 الختامي بالكامل على جهازك الخاص. لا يمكن لهذا المشروع أن يفعل ذلك بالكامل — ضبط نموذج لغوي دقيقًا، حتى لو كان صغيرًا، يحتاج إلى وحدة معالجة رسومية (GPU)، ومعظم أجهزة الكمبيوتر المحمولة الشخصية لا تمتلك واحدة مناسبة لهذه المهمة. لذلك يقسّم هذا المشروع الختامي العمل: إعداد المشروع، وتحضير البيانات، وتشغيل نموذجك المكتمل يحدث محليًا باستخدام uv، تمامًا كما في 2026؛ أما خطوة الضبط الدقيق نفسها فتعمل على وحدة معالجة رسومية مستضافة مجانًا (Google Colab أو Kaggle) بدلًا من ذلك. هذا ليس اختصارًا — إنها الطريقة الصادقة والمعيارية للقيام بذلك دون إنفاق المال.

🎯 ما ستفعله

  1. تثبيت uv وإعداد مشروع محلي — نفس الخطوة الأولى في كل مشروع ختامي.
  2. تحضير مجموعة بيانات صغيرة من الأمثلة تُظهر للنموذج السلوك الذي تريده أن يتعلمه.
  3. الحصول على وصول مجاني لوحدة معالجة رسومية عبر Google Colab أو Kaggle، واستخدام Unsloth لضبط نموذج مفتوح صغير (حوالي مليار معامل) دقيقًا باستخدام LoRA على مجموعة بياناتك.
  4. تنزيل النتيجة — ملف "محوّل" (adapter) صغير، وليس نموذجًا جديدًا بالكامل — وتشغيله محليًا لرؤية نموذجك المضبوط دقيقًا وهو يعمل.

الخطوة 1: ثبّت uv

uv أداة واحدة تحل محل السلسلة المعتادة "ثبّت Python، ثم ثبّت pip، ثم ثبّت أداة بيئة افتراضية، ثم ثبّت الحزم" — يمكنها تثبيت وإدارة إصدارات Python بنفسها، إلى جانب تبعيات مشروعك.

macOS / Linux (الطرفية):

curl -LsSf https://astral.sh/uv/install.sh | sh

Windows (PowerShell):

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

أغلق طرفيتك وأعد فتحها، ثم تأكد من التثبيت:

uv --version

ثم أعدّ مشروعًا محليًا لخطوتَي تحضير البيانات والاستدلال (الأجزاء التي لا تحتاج إلى وحدة معالجة رسومية):

uv init finetune-llm
cd finetune-llm
uv add datasets huggingface_hub

الخطوة 2: حضّر مجموعة بيانات صغيرة

يُعلّم الضبط الدقيق النموذج سلوكًا محددًا، وليس حقائق جديدة من الصفر — يعمل بشكل أفضل مع مجموعة أمثلة صغيرة ومركّزة وجيدة التنسيق، وليس كومة ضخمة من النص الخام. تنسيق شائع هو قائمة من أزواج تعليمات/استجابة. اختر مهمة ضيقة وشخصية — بعض الأفكار: الإجابة على الأسئلة بنبرة أو شخصية محددة، اتباع تنسيق إخراج ثابت (مثلًا، الإجابة دائمًا بصيغة JSON صالحة)، أو تلخيص النص بالطريقة التي تفعلها أنت شخصيًا.

اكتب أمثلتك محليًا كملف JSON صغير:

# build_dataset.py
import json

examples = [
{
"instruction": "Summarize this course in one sentence.",
"response": "A free, browser-based course teaching Python and pandas from first principles through a full data-analysis project.",
},
{
"instruction": "Explain what a variable is, briefly.",
"response": "A variable is a name that points to a value stored in memory, so you can refer to that value again by name instead of retyping it.",
},
# Add at least 30-50 more examples for the model to actually pick up a
# pattern — a handful of examples is enough to see this code run, but not
# enough to see a real behavior change once fine-tuned.
]

with open("dataset.jsonl", "w") as f:
for example in examples:
f.write(json.dumps(example) + "\n")

print(f"Wrote {len(examples)} examples to dataset.jsonl")
uv run python build_dataset.py
الجودة أهم من الكمية

توثيق Unsloth نفسه ومعظم أدلة الضبط الدقيق تتفق على هذا: 50 مثالًا مكتوبًا بعناية ومتسقًا يُعلّمان النموذج سلوكًا بشكل أكثر موثوقية بكثير من 500 مثال مهمَل أو غير متسق. إذا تناقضت أمثلتك مع بعضها (الإجابة على نفس نوع السؤال بشكل مختلف في كل مرة)، فليس لدى النموذج شيء متسق ليتعلمه.

الخطوة 3: اضبط دقيقًا باستخدام Unsloth على وحدة معالجة رسومية مجانية

هذه هي الخطوة التي تحتاج إلى وحدة معالجة رسومية. يوفر Unsloth دفاتر ملاحظات جاهزة للتشغيل مصممة خصيصًا لمستويات وحدة المعالجة الرسومية المجانية في Google Colab وKaggle — لن تُثبّت أي شيء محليًا لهذا الجزء.

  1. اذهب إلى صفحة دفاتر ملاحظات Unsloth وافتح أحد دفاتر Colab المناسبة للمبتدئين لنموذج صغير (حوالي مليار معامل — صغير بما يكفي للضبط الدقيق السريع وللتنزيل والتشغيل فعليًا بعد ذلك). يُعد نموذج مفتوح بمليار معامل، مثل إصدار صغير من Llama أو Qwen، نقطة بداية معقولة ومدعومة جيدًا؛ تحقق من قائمة دفاتر Unsloth لمعرفة أي نموذج صغير لديه حاليًا قالب يعمل، حيث يتغير النموذج الأفضل دعمًا بمرور الوقت.
  2. في دفتر الملاحظات، استبدل مجموعة بياناته النموذجية بمجموعتك: ارفع ملف dataset.jsonl الذي أنشأته في الخطوة 2 (لوحة رفع الملفات في Colab، أو اربط Google Drive)، ووجّه خلية تحميل البيانات في الدفتر إليه بدلًا من ذلك.
  3. شغّل خلايا الدفتر بالترتيب. تستخدم خطوة الضبط الدقيق الأساسية LoRA (Low-Rank Adaptation): بدلًا من تحديث مليارات معاملات النموذج (بطيء، يحتاج ذاكرة كبيرة)، يُجمّد LoRA النموذج الأصلي ويدرّب زوجًا من المصفوفات المنخفضة الرتبة تُضاف فوقه — رياضيًا، إذا كانت مصفوفة الأوزان الأصلية هي WW، يتعلم LoRA تحديثًا منخفض الرتبة ΔW=BA\Delta W = BA (حيث BB و AA مصفوفتان أصغر بكثير) ويستخدم W+ΔWW + \Delta W في وقت الاستدلال. هذه هي نفس فكرة تقريب مصفوفة كبيرة بمصفوفة أقل بُعدًا — مفهوم من الجبر الخطي لديك خلفية فيه بالفعل — مُطبَّق لجعل الضبط الدقيق رخيصًا بما يكفي للعمل على وحدة معالجة رسومية مجانية.
  4. بمجرد انتهاء التدريب، يحفظ الدفتر نتيجتك كـ محوّل (adapter) صغير — فقط مصفوفتَي AA و BB، عادةً عشرات الميغابايتات، وليس نسخة من عدة غيغابايتات من النموذج بأكمله. نزّل مجلد المحوّل هذا إلى جهازك.
تحقق من التوثيق الحالي قبل أن تبدأ

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

الخطوة 4: شغّل نموذجك المضبوط دقيقًا محليًا

عد إلى جهازك الخاص، حمّل النموذج الأساسي بالإضافة إلى المحوّل الذي نزّلته وجرّبه:

uv add transformers peft torch --extra-index-url https://download.pytorch.org/whl/cpu
# infer.py
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

base_model_name = "unsloth/<the-base-model-you-fine-tuned>" # match Step 3's notebook
adapter_path = "./my-adapter" # the folder you downloaded from Colab

tokenizer = AutoTokenizer.from_pretrained(base_model_name)
base_model = AutoModelForCausalLM.from_pretrained(base_model_name)
model = PeftModel.from_pretrained(base_model, adapter_path)

prompt = "Summarize this course in one sentence."
inputs = tokenizer(prompt, return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=80)
print(tokenizer.decode(output[0], skip_special_tokens=True))
uv run python infer.py

تشغيل نموذج بحجم مليار معامل تقريبًا على المعالج (CPU) بطيء (توقع ثوانٍ حقيقية، وليس أجزاء من الثانية، لكل استجابة) لكنه يعمل — هذا جهازك الخاص يُشغّل فعليًا نموذجًا لغويًا مضبوطًا دقيقًا، بدون مفتاح API، وبدون الحاجة إلى اتصال بالإنترنت بمجرد تنزيل ملفات النموذج.

⚠️ أخطاء شائعة

  • أمثلة قليلة جدًا أو غير متسقة جدًا. مجموعة بيانات من 5 أمثلة، أو 50 مثالًا تُجيب كل منها على أسئلة متشابهة بشكل مختلف، لا تُعطي النموذج شيئًا موثوقًا للتعميم منه — ستحصل على شيء قريب من النموذج الأساسي غير المضبوط.
  • نسيان استبدال مجموعة بياناتك الخاصة فعليًا. من السهل تشغيل دفتر من البداية إلى النهاية على مجموعة بياناته النموذجية واستنتاج "لقد نجح الأمر" دون التدريب فعليًا على بياناتك الخاصة — تأكد دائمًا أن خلية تحميل البيانات تقرأ dataset.jsonl، وليس ملف العرض التوضيحي الأصلي للدفتر.
  • محاولة الضبط الدقيق محليًا على وحدة معالجة رسومية لجهاز محمول (أو بدون وحدة معالجة رسومية) بدلًا من استخدام الوحدة المستضافة مجانًا. حتى نموذج "صغير" بمليار معامل يحتاج ذاكرة وحدة معالجة رسومية حقيقية للتدريب بكفاءة — يوجد المستوى المجاني في Colab/Kaggle خصيصًا حتى لا تحتاج إلى واحدة خاصة بك.
  • الخلط بين النموذج الأساسي بين الخطوتين 3 و4. المحوّل الذي نزّلته منطقي فقط عند تحميله فوق النموذج الأساسي بالضبط الذي دُرِّب عليه — تحميله على نموذج مختلف (حتى لو كان بنفس الاسم تقريبًا) سيؤدي إما إلى خطأ أو إنتاج كلام لا معنى له بصمت.

ما بنيته للتو

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

إلى أين تذهب من هنا

  • جرّب مهمة مختلفة حقًا لضبطك الدقيق التالي — تنسيق إخراج ثابت، أو نبرة محددة، أو مجال ضيق (مثلًا، الإجابة فقط على أسئلة حول موضوع واحد) يميل إلى إظهار فروقات "قبل/بعد" أوضح وأكثر إقناعًا من تغيير واسع وعام الغرض.
  • اقرأ توثيق Unsloth نفسه حول التكميم (quantization) — تستخدم دفاتر المستوى المجاني بالفعل تكميمًا بـ4 بتات لجعل التدريب يناسب ذاكرة وحدة المعالجة الرسومية المحدودة؛ يستحق فهم ما يضحّي به ذلك (كمية صغيرة من الدقة) مقابل ما يوفره (استيعاب نموذج لا يناسب الذاكرة بخلاف ذلك) قبل الاعتماد عليه لأي شيء يتجاوز مشروع دورة دراسية.
  • قارن هذا بـمشروع وكيل الذكاء الاصطناعي الختامي لعام 2026: يغيّر ذلك المشروع سلوك النموذج بمنحه أدوات وتعليمات وقت الطلب (بدون أي تدريب)؛ بينما يغيّر هذا المشروع أوزان النموذج الفعلية مسبقًا. كلاهما منهجان حقيقيان وحاليان للبناء بنماذج لغوية — معرفة متى تلجأ إلى أحدهما دون الآخر أمر مفيد حقًا أن تكون قد شعرت به مباشرة، لا أن تكون قد قرأت عنه فقط.

شارك مشروعك مع الصف

بنيتَ شيئًا تفخر به؟ examples/student-agents/ معرض لمشاريع ختامية قدّمها طلاب آخرون — وملف README الخاص به يحتوي على دليل كامل وسهل للمبتدئين لإضافة مشروعك عبر طلب سحب (pull request)، حتى لو لم تستخدم git من قبل: عمل fork للمستودع، وإنشاء فرع، وتثبيت (commit) ملفاتك، وفتح طلب السحب، خطوة بخطوة. لا يُفترض وجود أي خبرة سابقة بـ git.

مرحبًا بك في كتابة Python خارج المتصفح. 🎓