Transformers documentation

Çok modlu sohbet şablonları

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

and get access to the augmented documentation experience

to get started

Çok modlu sohbet şablonları

Çok modlu sohbet modelleri, metnin yanı sıra görüntü, ses veya video gibi girdileri kabul eder. Çok modlu bir sohbet geçmişindeki content anahtarı, farklı türlerde birden çok öğe içeren bir listedir. Bu, content anahtarı tek bir dize olan yalnızca metin tabanlı sohbet modellerinden farklıdır.

Aynı şekilde Tokenizer sınıfı yalnızca metin modelleri için sohbet şablonlarını ve tokenizasyonu ele alırken, Processor sınıfı çok modlu modeller için ön işleme, tokenizasyon ve sohbet şablonlarını ele alır. apply_chat_template() yöntemleri neredeyse aynıdır.

Bu kılavuz, yüksek seviyeli ImageTextToTextPipeline ile ve daha düşük seviyede apply_chat_template() ile generate() yöntemlerini kullanarak multimodal modellerle sohbet etmenin nasıl yapılacağını gösterecektir.

ImageTextToTextPipeline

ImageTextToTextPipeline, “sohbet modu”na sahip yüksek düzeyde bir görüntü ve metin üretim sınıfıdır. Konuşmacı bir model algılandığında ve sohbet istemi doğru biçimlendirildiğinde sohbet modu etkinleştirilir.

Sohbet geçmişindeki content anahtarına görsel ve metin blokları ekleyin.

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?"},
        ],
    },
]

Bir ImageTextToTextPipeline oluşturun ve sohbeti ona iletin. Büyük modeller için device_map=“auto” ayarını yapmak, modelin daha hızlı yüklenmesine yardımcı olur ve onu otomatik olarak kullanılabilir en hızlı cihaza yerleştirir. Veri türünü auto olarak ayarlamak da bellek tasarrufu sağlamaya ve hızı artırmaya yardımcı olur.

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?

Korsan jargonundan modern Amerikan İngilizcesine kademeli geçiş dışında (zaten sadece 3B parametreli bir model), bu doğru!

apply_chat_template kullanılarak

Sadece metin modelleri gibi, multimodal modeller için sohbet mesajlarını hazırlamak üzere apply_chat_template() yöntemini kullanın. Bu yöntem, görüntüler ve diğer medya türleri dahil olmak üzere sohbet mesajlarının belirteçlere ayrılmasını ve biçimlendirilmesini yönetir. Sonuç olarak elde edilen girdiler, üretim için modele iletilir.

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?"},
        ],
    },
]

Girdi içeriğini belirteçleştirmek için messages değerini apply_chat_template() fonksiyonuna iletin. Metin modellerinden farklı olarak, apply_chat_template çıktısı, belirteçlenmiş metnin yanı sıra ön işlenmiş görüntü verisini içeren bir pixel_values anahtarı da içerir.

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']

Bu girdileri generate() işlevine iletin.

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

Çözümlenmiş çıktı, kullanıcı mesajını ve görsel bilgilerini içeren yer tutucu jetonları da dahil olmak üzere bugüne kadarki tüm sohbeti içerir. Kullanıcıya göstermeden önce çıktıdaki önceki sohbeti kırpmanız gerekebilir.

Video girdileri

Bazı görme modelleri video girdilerini de destekler. Mesaj biçimi, önceki bölümde açıklanan görüntü girdileri için kullanılan biçime çok benzer.

  • İçerik "type" alanı, içeriğin bir video olduğunu belirtmek için "video" olmalıdır.
  • Videolar için bir video bağlantısı ("url") veya bir dosya yolu ("path") olabilir. Videolar torchcodec ile çözümlenir. torchcodec kullanılamıyorsa ve eski bir torchvision sürümünü kullanıyorsanız, çözümleme torchvision'a geri düşer.
  • Bir URL veya dosya yolundan video yüklemenin yanı sıra, çözümlenmiş video verilerini doğrudan da iletebilirsiniz. Bu, video karelerini bellekte başka bir yerde zaten ön işlemiş veya çözmüş olmanız durumunda kullanışlıdır. Dosyalara kaydetmenize veya bir URL'de saklamanıza gerek yoktur.

PyAV ve Decord kullanılabilir, ancak yalnızca videoyu kendiniz çözümlerseniz ve load_video(backend=...) ile arka ucu açıkça belirtirseniz.

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?"},
        ],
    },
]

Örnek: Çözümlenmiş video nesnelerini iletme

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?"}
        ],
    },
]

Mevcut ("load_video()") işlevini de bir video yüklemek, videoyu bellekte düzenlemek ve mesajlarda iletmek için kullanabilirsiniz.


# 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?"}
        ],
    },
]

Girdi içeriğini belirteçleştirmek için messages değerini apply_chat_template() fonksiyonuna iletin. Örnekleme sürecini kontrol eden, apply_chat_template() fonksiyonuna dahil edilecek birkaç ek parametre vardır.

sabit sayıda kare
fps
görsel kareleri listesi

num_frames parametresi, videodan eşit aralıklarla örneklenen kare sayısını kontrol eder. Her kontrol noktası, ön eğitimi sırasında kullanılan maksimum kare sayısına sahiptir ve bu sayının aşılması, üretim kalitesini önemli ölçüde düşürebilir. Hem model kapasitesine hem de donanım kaynaklarınıza uygun bir kare sayısı seçmek önemlidir. num_frames belirtilmezse, video herhangi bir kare örneklemesi yapılmadan tamamen yüklenir.

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())

Bu girdiler artık generate() içinde kullanılmaya hazırdır.

Update on GitHub