# الترميز بمساعدة

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

يتناول هذا الدليل طرق فك الترميز المُساعَد في Transformers.

## التفكيك التخميني

يستخدم [التفكيك التخميني](https://hf.co/papers/2211.17192) نموذجًا مساعدًا أصغر حجمًا لصياغة رموز مرشحة. يتحقق النموذج الرئيسي من هذه الرموز في مسار واحد. تدخل الرموز المُعتمدة إلى المخرجات النهائية، بينما تُطلق الرموز المرفوضة عملية أخذ عينات قياسية. تكون عملية التوليد أسرع لأن النموذج الرئيسي يُنفذ عددًا أقل من عمليات المرور الأمامي المكلفة.

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

مرّر `assistant_model` إلى [generate()](/docs/transformers/main/ar/main_classes/text_generation#transformers.GenerationMixin.generate). اضبط `do_sample=True` لإعادة أخذ العينة إذا فشلت عملية التحقق من الرموز.

```py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, assistant_model=assistant_model)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that provides a platform for developers to build and deploy machine'
```

يتوفر الحجة `assistant_model` أيضًا في واجهة [Pipeline](/docs/transformers/main/ar/main_classes/pipelines#transformers.Pipeline).

```python
import torch
from transformers import pipeline

pipeline = pipeline(
    "text-generation",
    model="meta-llama/Llama-3.1-8B",
    assistant_model="meta-llama/Llama-3.2-1B",
    dtype="auto"
)
pipeline("Hugging Face is an open-source company, ", max_new_tokens=50, do_sample=False)
```

اضبط `temperature` للتحكم في العشوائية. غالبًا ما تحسّن درجات الحرارة المنخفضة زمن الاستجابة.

```py
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, assistant_model=assistant_model, do_sample=True, temperature=0.5)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that is dedicated to creating a better world through technology.'
```

## فك الترميز بالبحث عن الاستدعاء

لا يحتاج فك التشفير بالبحث في الاستعلام إلى نموذج مساعد. فهو يبحث عن n-grams المتداخلة في الاستعلام (prompt) لاقتراح الرموز المرشحة. وإذا لم يوجد تطابق، فإنه يعود إلى فك التشفير الذاتي التكراري (autoregressive) العادي. يناسب هذا النهج المهام المعتمدة على المدخلات مثل التلخيص والترجمة، لأن الرموز المرشحة غالباً ما تعكس الأنماط المحلية في النص المصدر.

مرّر `prompt_lookup_num_tokens` إلى [generate()](/docs/transformers/main/ar/main_classes/text_generation#transformers.GenerationMixin.generate). يحدد هذا عدد الرموز التي يحاول الخوارزمية نسخها من الجزء السابق من الموجه عند اكتشافها لنمط متكرر.

```py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, prompt_lookup_num_tokens=5)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that provides a platform for developers to build and deploy machine learning models. It offers a variety of tools'
```

```py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, prompt_lookup_num_tokens=5, do_sample=True, temperature=0.5)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that provides a platform for developers to build and deploy machine learning models. It offers a variety of tools'
```

## الترميز التخميني الذاتي

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

بما أن الأمر يتعلق بنموذج واحد، فإن الأوزان والذاكرة المؤقتة مشتركة، مما يعزز السرعة دون زيادة في استهلاك الذاكرة. لا تعمل هذه التقنية إلا مع النماذج المدرَّبة على دعم قيم اللوجيت (logits) المبكرة من الطبقات الوسيطة.

مرّر `assistant_early_exit` إلى [generate()](/docs/transformers/main/ar/main_classes/text_generation#transformers.GenerationMixin.generate) لضبط طبقة الخروج.

```py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("facebook/layerskip-llama3.2-1B")
model = AutoModelForCausalLM.from_pretrained("facebook/layerskip-llama3.2-1B", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, assistant_early_exit=4, do_sample=False, max_new_tokens=20)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
```

## طبقة التنبؤ متعدد الرموز (MTP)

تقوم طبقة التنبؤ متعدد الرموز (MTP) بصياغة رموز مرشحة باستخدام طبقات تنبؤ إضافية مستمدة من نقطة الفحص (checkpoint) الخاصة بالنموذج الرئيسي نفسه. تعيد طبقات MTP استخدام تمثيلات (embeddings) ورأس الإخراج (output head) الخاص بالنموذج الرئيسي. تقوم كل طبقة MTP بصياغة رمز واحد، لذا فإن عدد المرشحين في كل خطوة يتطابق مع عدد طبقات MTP في نقطة الفحص. يتحقق النموذج الرئيسي من المسودات في تمريرة أمامية واحدة.

يعمل MTP فقط مع نقاط التفتيش المدربة بطبقات MTP، مثل [DeepSeek-V3](https://huggingface.co/deepseek-ai/DeepSeek-V3) و[GLM-4.5](https://huggingface.co/zai-org/GLM-4.5). تحمل هذه النقاط التفتيشية أوزان MTP وتضبط `num_mtp_layers` في إعداداتها، حيث تُذكر باسم `num_nextn_predict_layers` في `config.json`.

مرّر `use_mtp=True` إلى [generate()](/docs/transformers/main/ar/main_classes/text_generation#transformers.GenerationMixin.generate)، حيث يثير خطأً إذا لم يحتوي النموذج على طبقات MTP. وكما هو الحال في فك التشفير التخميني، يدعم MTP البحث الجشع والعينة لكنه لا يدعم المدخلات المجمعة.

هنا، يشير MTP إلى طبقات التنبؤ المضمنة في نقطة الفحص المستهدفة، كما هو الحال في DeepSeek-V3 وGLM-4.5. يستخدم Gemma 4 نقطة فحص مساعد منفصلة لفك ترميز MTP. قم بتمريرها كـ`assistant_model` (انظر [مسودة التنبؤ متعدد الرموز](#multi-token-prediction-drafter)).

يقبل خط أنابيب `text-generation` و[generate()](/docs/transformers/main/ar/main_classes/text_generation#transformers.GenerationMixin.generate) كلاهما `use_mtp=True`.

```py
from transformers import pipeline

pipe = pipeline(
    "text-generation",
    model="zai-org/GLM-4.5-Air",
    device_map="auto",
)

outputs = pipe(
    "Hugging Face is an open-source company",
    use_mtp=True,
    do_sample=False,
    max_new_tokens=50,
    add_special_tokens=True,
    return_full_text=True,
)

[output["generated_text"] for output in outputs]
```

بديلًا عن ذلك، يمكنك الاستدلال على النحو التالي.

```py
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("zai-org/GLM-4.5-Air")
model = AutoModelForCausalLM.from_pretrained("zai-org/GLM-4.5-Air", device_map="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt").to(model.device)

outputs = model.generate(**inputs, use_mtp=True, do_sample=False, max_new_tokens=50)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
```

## مسودة التنبؤ متعدد الرموز

نموذج MTP drafter هو نموذج مساعد خفيف يُحمَّل من نقطة تفتيش منفصلة. يقترح هذا النموذج رموزًا مرشحة ليُتحقق منها النموذج المستهدف. يستخدم نموذج المسودة تضمينات الإدخال الخاصة بالنموذج المستهدف، ويتفاعل مع ذاكرة KV الخاصة به. يبدأ من الحالات المخفية للنموذج المستهدف، ثم يصوغ الرموز بشكل ذاتي التراجع. لكل رمز تالٍ، يعيد إدخال حالته المخفية المُساقطة إلى نموذج المسودة. يتحقق النموذج المستهدف من الرموز المُصاغة في تمريرة أمامية واحدة، كما في فك التشفير التخميني.

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

```py
from transformers import AutoProcessor, AutoModelForCausalLM

processor = AutoProcessor.from_pretrained("google/gemma-4-E4B-it")
target_model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-4-E4B-it",
    dtype="auto",
    device_map="auto",

)

assistant_model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-4-E4B-it-assistant",
    dtype="auto",
    device_map="auto",
)

messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Write a short joke about saving RAM."},
]

inputs = processor.apply_chat_template(
    messages,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
    add_generation_prompt=True,
    enable_thinking=False
).to(target_model.device)
input_len = inputs["input_ids"].shape[-1]

outputs = target_model.generate(
    **inputs,
    assistant_model=assistant_model,
    max_new_tokens=256,
)
response = processor.decode(outputs[0][input_len:], skip_special_tokens=False)

processor.parse_response(response)
```

## الترميز المساعد الشامل

يجعل فك التشفير المُساعَد الشامل (UAD) فك التشفيد التخميني ممكنًا حتى عندما يكون لدى النموذج الرئيسي ونموذج المساعد مُرمِّزات مختلفة. يتيح لك إقران أي نموذج مساعد صغير مع النموذج الرئيسي. يتم إعادة ترميز الرموز المرشحة ويحسب الخوارزمية أطول تسلسل مشترك جزئيًا بحيث يبقى الاستمرار متوافقًا.

مرّر `tokenizer` و`assistant_tokenizer` و`assistant_model` إلى [generate()](/docs/transformers/main/ar/main_classes/text_generation#transformers.GenerationMixin.generate) لتفعيل UAD.

```py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

assistant_tokenizer = AutoTokenizer.from_pretrained("double7/vicuna-68m")
tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-9b")
model = AutoModelForCausalLM.from_pretrained("google/gemma-2-9b", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("double7/vicuna-68m", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, assistant_model=assistant_model, tokenizer=tokenizer, assistant_tokenizer=assistant_tokenizer)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that is dedicated to creating a better world through technology.'
```

### التحقق من التجميع الثابت

التخمين القياسي (Standard speculative decoding) *خالي من الفقد* — فهو يضمن تطابق توزيع المخرجات مع نموذج الهدف تمامًا. [التحقق عبر التجميع الثابت](https://arxiv.org/abs/2604.07622) يخفف من هذا الشرط من خلال التحقق مقابل خليط من توزيعي الهدف والمسودة، مما يزيد من معدل القبول (استدلال أسرع) على حساب جعل توزيع المخرجات خليطًا بدلاً من توزيع الهدف الدقيق. القيمة الابتدائية الموصى بها هي `0.7`.

```python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, assistant_model=assistant_model, assistant_ensemble_weight=0.7, do_sample=True)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
```

يتطلب هذا الأمر قيم التوقعات المرشحة من نموذج المساعد، وهو غير مدعوم مع فك ترميز البحث في الاستعلام.

## الموارد

- اقرأ منشور المدونة [التوليد المُساعَد: اتجاه جديد نحو توليد نصوص منخفض الكمون](https://huggingface.co/blog/assisted-generation) للحصول على مزيد من السياق حول كمون توليد النصوص والتوليد المُساعَد.

