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

قوالب المحادثة متعددة الوسائط

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

وبنفس الطريقة التي تتعامل بها فئة Tokenizer مع قوالب المحادثة والتجزئة للنماذج النصية فقط، تتعامل فئة Processor مع المعالجة المسبقة والتجزئة وقوالب المحادثة للنماذج متعددة الوسائط. وطرق apply_chat_template() الخاصة بهما متطابقة تقريبًا.

ستُظهر لك هذه الدليل كيفية الدردشة مع النماذج متعددة الوسائط باستخدام ImageTextToTextPipeline على مستوى عالٍ، وعلى مستوى أدنى باستخدام طريقتي apply_chat_template() وgenerate().

ImageTextToTextPipeline

ImageTextToTextPipeline هي فئة عالية المستوى لتوليد الصور والنصوص مع وضع “المحادثة”. يتم تفعيل وضع المحادثة عند اكتشاف نموذج محادثة وأن يكون موجه المحادثة منسقًا بشكل صحيح.

أضِف كتل الصور والنصوص إلى مفتاح content في سجل المحادثة.

messages = [
    {
        "role": "system",
        "content": [{"type": "text", "text": "You are a friendly chatbot who always responds in the style of a pirate"}],
    },
    {
      "role": "user",
      "content": [
            {"type": "image", "url": "http://images.cocodataset.org/val2017/000000039769.jpg"},
            {"type": "text", "text": "What are these?"},
        ],
    },
]

أنشئ ImageTextToTextPipeline ومرر المحادثة إليه. بالنسبة للنماذج الكبيرة، يساعد تعيين device_map=“auto” في تحميل النموذج بشكل أسرع ووضعها تلقائياً على أسرع جهاز متاح. كما يساعد تعيين نوع البيانات إلى auto في توفير الذاكرة وتحسين السرعة.

import torch
from transformers import pipeline

pipe = pipeline("image-text-to-text", model="Qwen/Qwen2.5-VL-3B-Instruct", device_map="auto", dtype="auto")
out = pipe(text=messages, max_new_tokens=128)
print(out[0]['generated_text'][-1]['content'])
Ahoy, me hearty! These be two feline friends, likely some tabby cats, taking a siesta on a cozy pink blanket. They're resting near remote controls, perhaps after watching some TV or just enjoying some quiet time together. Cats sure know how to find comfort and relaxation, don't they?

بخلاف التدرج في الانتقال من لغة القراصنة إلى الإنجليزية الأمريكية الحديثة (فهو في النهاية نموذج بحجم 3B فقط)، فإن هذا صحيح!

باستخدام apply_chat_template

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

from transformers import AutoProcessor, AutoModelForImageTextToText

model = AutoModelForImageTextToText.from_pretrained("Qwen/Qwen2.5-VL-3B-Instruct", device_map="auto", torch_dtype="auto")
processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-3B-Instruct")

messages = [
    {
      "role": "system",
      "content": [{"type": "text", "text": "You are a friendly chatbot who always responds in the style of a pirate"}],
    },
    {
      "role": "user",
      "content": [
            {"type": "image", "url": "http://images.cocodataset.org/val2017/000000039769.jpg"},
            {"type": "text", "text": "What are these?"},
        ],
    },
]

مرّر messages إلى apply_chat_template() لتحويل المحتوى المدخل إلى رموز. على عكس نماذج النص، يحتوي ناتج apply_chat_template على مفتاح pixel_values يحتوي على بيانات الصورة المعالجة مسبقًا، بالإضافة إلى النص المحوّل إلى رموز.

processed_chat = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt")
print(list(processed_chat.keys()))
['input_ids', 'attention_mask', 'pixel_values', 'image_grid_thw']

مرر هذه المدخلات إلى generate().

out = model.generate(**processed_chat.to(model.device), max_new_tokens=128)
print(processor.decode(out[0]))

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

مدخلات الفيديو

تدعم بعض نماذج الرؤية أيضًا مدخلات الفيديو. يشبه تنسيق الرسائل إلى حد كبير تنسيق مدخلات الصور الموصوف في القسم السابق.

  • يجب أن يكون المحتوى "type" هو "video" للإشارة إلى أن المحتوى عبارة عن فيديو.
  • في حالة مقاطع الفيديو، يمكن أن يكون رابطًا إلى الفيديو ("url") أو مسار ملف ("path"). يتم فك ترميز مقاطع الفيديو باستخدام torchcodec. إذا لم يكن torchcodec متاحًا وكنت تستخدم إصدارًا أقدم من torchvision، فإن فك الترميز يعتمد على torchvision.
  • بالإضافة إلى تحميل مقاطع الفيديو من عنوان URL أو مسار ملف، يمكنك أيضًا تمرير بيانات الفيديو المفكوكة مباشرة. وهذا مفيد إذا كنت قد قمت مسبقًا بمعالجة إطارات الفيديو أو فك ترميزها في مكان آخر داخل الذاكرة. لا حاجة إلى حفظها في ملفات أو تخزينها في عنوان URL.

يتوفر PyAV و Decord، ولكن فقط إذا قمت بفك ترميز الفيديو بنفسك وطلبت الخلفية بشكل صريح باستخدام load_video(backend=...).

from transformers import AutoProcessor, LlavaOnevisionForConditionalGeneration

model_id = "llava-hf/llava-onevision-qwen2-0.5b-ov-hf"
model = LlavaOnevisionForConditionalGeneration.from_pretrained(model_id)
processor = AutoProcessor.from_pretrained(model_id)

messages = [
    {
      "role": "system",
      "content": [{"type": "text", "text": "You are a friendly chatbot who always responds in the style of a pirate"}],
    },
    {
      "role": "user",
      "content": [
            {"type": "video", "url": "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_10MB.mp4"},
            {"type": "text", "text": "What do you see in this video?"},
        ],
    },
]

مثال: تمرير كائنات فيديو مفكوكة

import numpy as np

video_object1 = np.random.randint(0, 255, size=(16, 224, 224, 3), dtype=np.uint8),

messages = [
    {
        "role": "system",
        "content": [{"type": "text", "text": "You are a friendly chatbot who always responds in the style of a pirate"}],
    },
    {
        "role": "user",
        "content": [
            {"type": "video", "video": video_object1},
            {"type": "text", "text": "What do you see in this video?"}
        ],
    },
]

يمكنك أيضًا استخدام الدالة الموجودة ("load_video()") لتحميل فيديو، وتعديله في الذاكرة، ثم تمريره في الرسائل.


# Make sure a video backend library (torchcodec, pyav, or decord) is available.
from transformers.video_utils import load_video

# load a video file in memory for testing
video_object2, _ = load_video(
    "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_10MB.mp4"
)

messages = [
    {
        "role": "system",
        "content": [{"type": "text", "text": "You are a friendly chatbot who always responds in the style of a pirate"}],
    },
    {
        "role": "user",
        "content": [
            {"type": "video", "video": video_object2},
            {"type": "text", "text": "What do you see in this video?"}
        ],
    },
]

مرّر messages إلى apply_chat_template() لتحويل المحتوى المدخل إلى رموز. هناك بعض المعلمات الإضافية التي يجب تضمينها في apply_chat_template() للتحكم في عملية العينة.

عدد ثابت من الإطارات
fps
قائمة إطارات الصور

يتحكم معامل num_frames في عدد الإطارات التي سيتم أخذ عينات منها بشكل متساوٍ من الفيديو. لكل نقطة تحقق (checkpoint) حد أقصى لعدد الإطارات الذي تم تدريبه المسبق عليه، وقد يؤدي تجاوز هذا العدد إلى انخفاض كبير في جودة التوليد. من المهم اختيار عدد إطارات يناسب كلًا من سعة النموذج وموارد العتاد لديك. إذا لم يتم تحديد num_frames، يتم تحميل الفيديو بالكامل دون أي أخذ عينات من الإطارات.

processed_chat = processor.apply_chat_template(
    messages,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
    num_frames=32,
)
print(processed_chat.keys())

أصبحت هذه المدخلات الآن جاهزة للاستخدام في generate().

Update on GitHub