Transformers documentation

مقسّمات الرموز

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

مقسّمات الرموز

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

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer("Sphinx of black quartz, judge my vow.", return_tensors="pt")
{
    'input_ids': tensor([[     2, 235277,  82913,    576,   2656,  30407, 235269,  11490,    970,  29871, 235265]]),
    'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
}

يتناول هذا الدليل التحميل، والترميز، وفك الترميز، ومعالجة الدفعات، والخوادم الخلفية المتاحة لمعالج النص.

تحميل مُجزِّئ

حمّل مُجزِّئًا (tokenizer) باستخدام فئة AutoTokenizer أو فئة مُجزِّئ محددة لنموذج معين.

AutoTokenizer
مُقسِّم خاص بالنموذج

AutoTokenizer.from_pretrained() reads the model config, resolves the correct tokenizer class, and returns an instance of it. You don’t need to know the tokenizer class beforehand. Most tokenizers resolve to a subclass of TokenizersBackend, a fast Rust-based tokenizer from the Tokenizers library.

يُعد التحميل باستخدام AutoTokenizer الطريقة الموصى بها.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")

ترميز وفك الترميز

تقوم طريقة TokenizersBackend.call() بتشفير النص أو دفعة من النصوص إلى input_ids وattention_mask ومدخلات النموذج الأخرى. كما تتحكم في عملية الحشو (padding) والقطع (truncation) وإدراج الرموز الخاصة.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer("Sphinx of black quartz, judge my vow.", return_tensors="pt")
{
    'input_ids': tensor([[     2, 235277,  82913,    576,   2656,  30407, 235269,  11490,    970,  29871, 235265]]),
    'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
}

يشبه TokenizersBackend.encode() ذلك، لكنه يعيد input_ids فقط.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
input_ids = tokenizer.encode("Sphinx of black quartz, judge my vow.")
[2, 235277, 82913, 576, 2656, 30407, 235269, 11490, 970, 29871, 235265]

تحوّل TokenizersBackend.decode() تسلسلًا واحدًا أو دفعة من input_ids المُرمّزة إلى نص.

tokenizer.decode(input_ids)
'<bos>Sphinx of black quartz, judge my vow.'

يحافظ TokenizersBackend.decode() على مسافات الترميز الدقيقة. اضبط clean_up_tokenization_spaces لإزالة المسافات قبل علامات الترقيم، وskip_special_tokens لإزالة الرموز الخاصة من المخرجات.

tokenizer.decode(input_ids, skip_special_tokens=True)
'Sphinx of black quartz, judge my vow.'

رموز خاصة

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

input_ids = tokenizer.encode("Sphinx of black quartz, judge my vow.")
[2, 235277, 82913, 576, 2656, 30407, 235269, 11490, 970, 29871, 235265]
tokenizer.decode(input_ids)
'<bos>Sphinx of black quartz, judge my vow.'

سجّل الرموز الخاصة المسمّاة الإضافية باستخدام الحجة extra_special_tokens. تستخدم النماذج متعددة الوسائط هذه الرموز كعناصر بديلة للصور أو الفيديو أو الصوت.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(
    "google/gemma-3-4b-pt",
    extra_special_tokens={"image_token": "<image>"}
)

المعالجة الدفعية

يعالج المعالجة الدفعية (Batch processing) تسلسلات متعددة في استدعاء واحد. يتعامل TokenizersBackend مع الدفعات الكبيرة بشكل أسرع لأن واجهته الخلفية (backend) المبنية على Rust تُوازٍ العمل عبر عدة خيوط (threads).

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer(
    [
        "Sphinx of black quartz, judge my vow.",
        "Pack my box with five dozen liquor jugs.",
        "How vexingly quick daft zebras jump!"
    ],
    return_tensors="pt"
)

يتطلب المعالجة الدفعية أن تتشارك جميع التسلسلات في نفس الطول. وتُعدّ الحشو (Padding) والقطع (Truncation) استراتيجيات للتعامل مع التسلسلات ذات الأطوال المتغيرة.

الحشو

تضيف عملية الحشو رموزًا خاصةً حتى تتطابق التسلسلات الأقصر مع أطول تسلسل في الدفعة. يحدد قناع الانتباه مواضع الحشو على أنها 0 حتى يتجاهلها النموذج. اضبط padding=True للحشو حتى أطول تسلسل، أو مرّر max_length للحشو حتى حجم ثابت.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer(
    [
        "Sphinx of black quartz, judge my vow.",
        "Pack my box with five dozen liquor jugs.",
        "How vexingly quick daft zebras jump!"
    ],
    return_tensors="pt",
    padding=True,
)
{
    'input_ids': tensor([
        [     2, 235277,  82913,    576,   2656,  30407, 235269,  11490,    970,  29871, 235265],
        [     0,      2,   6519,    970,   3741,    675,   4105,  25955,  42184, 225789, 235265],
        [     0,      2,   2299,  73378,  17844,   4320, 224463,   4949,  48977,  9902, 235341]
    ]),
    'attention_mask': tensor([
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    ])
}

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

الاقتطاع

يقوم التقصير (Truncation) بقص الرموز (tokens) بحيث تتناسب التسلسلات مع الحد الأقصى للطول. فعّله عن طريق تعيين truncation=True وتحديد max_length.

يعمل الحشو (Padding) والقطع (Truncation) معًا. حيث تكتسب التسلسلات القصيرة رموز حشو بينما تفقد التسلسلات الطويلة الرموز النهائية. وبمجموعهما، ينتجان متجهًا مستطيلًا مضغوطًا.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer(
    [
        "Sphinx of black quartz, judge my vow.",
        "Pack my box with five dozen liquor jugs.",
        "How vexingly quick daft zebras jump!"
    ],
    return_tensors="pt",
    padding=True,
    truncation=True,
    max_length=5
)
{
    'input_ids': tensor([
        [     2, 235277,  82913,    576,   2656],
        [     2,   6519,    970,   3741,    675],
        [     2,   2299,  73378,  17844,   4320]
    ]),
    'attention_mask': tensor([
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1]
    ])
}

واجهات الخلفية

يُعرَّف كل نموذج مُجزِّئ في ملف واحد ويدعم أربعة أنظمة خلفية للتجزئة.

الواجهة الخلفيةالتنفيذالوصف
TokenizersBackendمقسّمات الرموزالافتراضي لمعظم النماذج
SentencePieceBackendSentencePieceالنماذج التي تتطلب SentencePiece
PythonBackendPythonالنماذج التي تتطلب مُجزِّئات مخصصة متخصصة
MistralCommonBackendmistral-commonنماذج Mistral وPixtral

تورث جميع الخوادم الخلفية من PreTrainedTokenizerBase وتشارك نفس واجهات برمجة التطبيقات (APIs) للتشفير وفك التشفير والتعبئة والتقطيع والحفظ والتحميل. والفرق هو خط أنابيب الترميز الذي يعمل في الخلفية.

يختار AutoTokenizer أفضل واجهة خلفية متاحة عند استدعاء from_pretrained().

  1. يقوم بقراءة ملف tokenizer_config.json من أجل الحقل tokenizer_class.
  2. يطابق السجل tokenizer_class مع اسم فئة. الفئة المُحلَّلة ترث من أحد الخلفيات الأربعة. على سبيل المثال، ترث GemmaTokenizer من TokenizersBackend، وترث SiglipTokenizer من SentencePieceBackend. بعض النماذج، مثل GLM، تُخاط مباشرة إلى TokenizersBackend لأن ملف tokenizer.json يصف خط المعالجة بالكامل. توجد GemmaTokenizer كفئة فرعية لأنها تُعرّف إعدادات إضافية خاصة بالنموذج بلغة بايثون لا يلتقطها tokenizer.json. عندما لا يكون الخلفية مثل mistral-common مثبّتًا، يلجأ AutoTokenizer إلى TokenizersBackend.

العودة إلى TokenizersBackend

بعض النماذج لا تملك فئة مخصّصة لمُقسّم الرموز (tokenizer)، وبعض نقاط التفتيش تحتوي على tokenizer_class لا يتطابق مع ملف tokenizer.json الفعلي الخاص بها. يتعامل AutoTokenizer مع الحالتين من خلال تحميل خط الأنابيب من tokenizer.json عبر TokenizersBackend العام. ويُعطي الأولوية للمُقسّم المُسلسَل (serialized tokenizer) على اسم الفئة من Hub، مما يُصلح مشاكل مثل تلك التي تنشأ عندما يُنتج tokenizer_class غير متطابق معرّفات رموز (token ids) غير صحيحة.

يُحلّ نقطة التفتيش إلى TokenizersBackend عامّة لأحد ثلاثة أسباب.

السببالسلوكأمثلة
لا توجد فئة مخصّصة لمُقسِّميُطابق نوع النموذج مباشرةً TokenizersBackend لأن tokenizer.json يصف خط الأنابيب بالكامل.GLM، Granite، OLMo 2، GPT BigCode
فئة مُجزِّئ Hub غير الصحيحة المعروفةtokenizer_class المسجّل على Hub غير صحيح لنوع النموذج، لذا يتجاهله AutoTokenizer ويحمّل tokenizer.json بدلاً منه.DeepSeek V3، LLaVA، Qwen2، ModernBERT
تجاوز نقطة التفتيش المحددةيتم مطابقة نقطة تفتيش لا يزال تكوينها في Hub بحاجة إلى إصلاح عبر معرّف النموذج الخاص بها، ثم يُجبر على استخدام الخلفية.deepseek-ai/DeepSeek-R1-Distill-*, Salesforce/blip2-*, google/umt5-small

تزداد أنواع النماذج ونقاط التفتيش المتأثرة مع تصحيح الإعدادات على Hub. للاطلاع على المجموعة الحالية، راجع تعريفات MODELS_WITH_INCORRECT_HUB_TOKENIZER_CLASS وMODEL_IDS_TO_TOKENIZERS_BACKEND في tokenization_auto.py.

تكون آلية الاحتياط تلقائية ولا تُغيّر طريقة استدعاء from_pretrained(). يقوم المُرمِّز الناتج بتشفير وفك التشفير تماماً كما يحدده tokenizer.json.

تحقق من الخلفية التي يستخدمها مُجزِّئ الرموز (tokenizer) باستخدام خاصية backend.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer.backend
'tokenizers'

فحص بنية مُجزّئ النص

افحص المكونات الداخلية لمُجزّئ الرموز (المُطَبِّع، مُجزّئ الرموز المسبق، النموذج، المُفكِّك) باستخدام الخاصية _tokenizer.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
print(tokenizer._tokenizer.normalizer)
print(tokenizer._tokenizer.pre_tokenizer)
print(tokenizer._tokenizer.model)
print(tokenizer._tokenizer.decoder)

الموارد

Update on GitHub