Transformers documentation

Mẫu chat đa phương thức

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

Mẫu chat đa phương thức

Mô hình chat đa phương thức nhận các đầu vào như hình ảnh, âm thanh hoặc video, bên cạnh văn bản. Khóa content trong lịch chat đa phương thức là một danh sách chứa nhiều mục có các kiểu khác nhau. Điều này khác với các mô hình chat chỉ dùng văn bản, nơi khóa content là một chuỗi duy nhất.

Tương tự cách lớp Tokenizer xử lý các mẫu chat và token hóa cho các mô hình chỉ có văn bản, lớp Processor xử lý tiền xử lý, token hóa và các mẫu chat cho các mô hình đa phương thức. Phương thức apply_chat_template() của chúng gần như giống hệt nhau.

Hướng dẫn này sẽ cho bạn thấy cách trò chuyện với các mô hình đa phương thức bằng ImageTextToTextPipeline ở cấp độ cao và ở cấp độ thấp hơn bằng cách sử dụng các phương thức apply_chat_template() và generate().

ImageTextToTextPipeline

ImageTextToTextPipeline là lớp tạo ảnh và văn bản cấp cao có “chế độ chat”. Chế độ chat được kích hoạt khi phát hiện mô hình hội thoại và prompt chat được định dạng đúng.

Thêm các khối hình ảnh và văn bản vào khóa content trong lịch sử trò chuyện.

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

Tạo một ImageTextToTextPipeline và truyền chat vào đó. Đối với các mô hình lớn, việc đặt device_map=“auto” giúp tải mô hình nhanh hơn và tự động đặt nó trên thiết bị nhanh nhất có sẵn. Việc đặt kiểu dữ liệu thành auto cũng giúp tiết kiệm bộ nhớ và cải thiện tốc độ.

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?

Ngoài việc dần chuyển từ giọng nói của cướp biển sang tiếng Anh hiện đại (cuối cùng thì nó cũng chỉ là một mô hình 3B mà thôi), điều này là chính xác!

Sử dụng apply_chat_template

Tương tự như mô hình chỉ văn bản, hãy sử dụng phương thức apply_chat_template() để chuẩn bị các tin nhắn chat cho các mô hình đa phương thức. Phương thức này xử lý việc token hóa và định dạng các tin nhắn chat, bao gồm hình ảnh và các loại phương tiện khác. Các đầu vào kết quả sẽ được truyền vào mô hình để tạo ra nội dung.

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

Truyền messages vào apply_chat_template() để mã hóa nội dung đầu vào. Khác với các mô hình văn bản, kết quả của apply_chat_template chứa khóa pixel_values với dữ liệu ảnh đã tiền xử lý, bên cạnh văn bản đã mã hóa.

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

Truyền các đầu vào này vào generate().

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

Đầu ra đã giải mã bao gồm toàn bộ cuộc trò chuyện cho đến hiện tại, bao gồm cả thông điệp của người dùng và các token giữ chỗ chứa thông tin hình ảnh. Bạn có thể cần cắt bỏ phần cuộc trò chuyện trước đó khỏi đầu ra trước khi hiển thị cho người dùng.

Đầu vào video

Một số mô hình thị giác cũng hỗ trợ đầu vào video. Định dạng tin nhắn rất giống với định dạng cho đầu vào hình ảnh được mô tả trong phần trước đó.

  • Nội dung "type" nên là "video" để chỉ ra rằng nội dung là một video.
  • Đối với video, đây có thể là liên kết đến video ("url") hoặc đường dẫn tệp ("path"). Video được giải mã bằng torchcodec. Nếu torchcodec không khả dụng và bạn đang dùng phiên bản torchvision cũ hơn, quá trình giải mã sẽ chuyển sang torchvision.
  • Ngoài việc tải video từ URL hoặc đường dẫn tệp, bạn cũng có thể truyền trực tiếp dữ liệu video đã giải mã. Điều này hữu ích nếu bạn đã tiền xử lý hoặc giải mã các khung hình video ở nơi khác trong bộ nhớ. Bạn không cần phải lưu vào tệp hoặc lưu trữ trong một URL.

PyAV và Decord có sẵn, nhưng chỉ khi bạn tự giải mã video và yêu cầu backend một cách rõ ràng bằng 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?"},
        ],
    },
]

Ví dụ: Truyền các đối tượng video đã giải mã

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

Bạn cũng có thể sử dụng hàm ("load_video()") có sẵn để tải video, chỉnh sửa video trong bộ nhớ và truyền nó vào các tin nhắn.


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

Truyền messages vào apply_chat_template() để mã hóa nội dung đầu vào. Có một số tham số bổ sung cần bao gồm trong apply_chat_template() để kiểm soát quá trình lấy mẫu.

số khung hình cố định
fps
danh sách các khung hình

Tham số num_frames kiểm soát số lượng khung hình được lấy mẫu đều từ video. Mỗi checkpoint có một số lượng khung hình tối đa mà nó đã được tiền huấn luyện với, và việc vượt quá số lượng này có thể làm giảm đáng kể chất lượng sinh thành. Việc chọn số lượng khung hình phù hợp với cả năng lực của mô hình và tài nguyên phần cứng của bạn là rất quan trọng. Nếu num_frames không được chỉ định, toàn bộ video sẽ được tải mà không có bất kỳ việc lấy mẫu khung hình nào.

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

Các đầu vào này giờ đã sẵn sàng để sử dụng trong generate().

Update on GitHub