Transformers documentation

Cơ bản về Chat

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

Cơ bản về Chat

Mô hình chat là các mô hình hội thoại mà bạn có thể gửi tin nhắn và nhận phản hồi. Hầu hết các mô hình ngôn ngữ từ giữa năm 2023 trở đi đều là mô hình chat và có thể được gọi là mô hình “instruct” hoặc “instruction-tuned”. Các mô hình không hỗ trợ chat thường được gọi là mô hình “base” hoặc “pretrained”.

Các mô hình lớn hơn và mới hơn thường có khả năng mạnh mẽ hơn, nhưng các mô hình chuyên biệt cho một số lĩnh vực nhất định (y khoa, văn bản pháp lý, ngôn ngữ không phải tiếng Anh, v.v.) thường có thể vượt trội hơn so với các mô hình lớn hơn này. Hãy thử các bảng xếp hạng như OpenLLM và LMSys Chatbot Arena để giúp bạn xác định mô hình tốt nhất cho trường hợp sử dụng của mình.

Hướng dẫn này cho bạn cách nhanh chóng nạp các mô hình chat trong Transformers từ dòng lệnh, cách xây dựng và định dạng một cuộc hội thoại, và cách trò chuyện bằng TextGenerationPipeline.

chat CLI

Sau khi bạn đã cài đặt Transformers, bạn có thể trò chuyện trực tiếp với một model ngay từ dòng lệnh. Lệnh bên dưới khởi động một phiên tương tác với model, kèm theo một số lệnh cơ bản được liệt kê ở đầu phiên.

Đối với các lệnh sau, hãy đảm bảo rằng transformers serve đang chạy.

transformers chat Qwen/Qwen2.5-0.5B-Instruct

Bạn có thể khởi chạy CLI với các cờ generate tùy ý, theo định dạng arg_1=value_1 arg_2=value_2 ...

transformers chat Qwen/Qwen2.5-0.5B-Instruct do_sample=False max_new_tokens=10

Để xem danh sách đầy đủ các tùy chọn, hãy chạy lệnh bên dưới.

transformers chat -h

Trò chuyện được triển khai trên nền AutoClass, sử dụng công cụ từ text generation và chat. Nó sử dụng CLI transformers serve bên trong (tài liệu).

TextGenerationPipeline

TextGenerationPipeline là một lớp sinh 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.

Các mô hình chat nhận vào một danh sách các tin nhắn (lịch sử chat) làm đầu vào. Mỗi tin nhắn là một từ điển có các khóa role và content. Để bắt đầu cuộc trò chuyện, hãy thêm một tin nhắn user duy nhất. Bạn cũng có thể tùy chọn bao gồm một tin nhắn system để đưa ra các chỉ dẫn cho mô hình về cách ứng xử.

chat = [
    {"role": "system", "content": "You are a helpful science assistant."},
    {"role": "user", "content": "Hey, can you explain gravity to me?"}
]

Tạo TextGenerationPipeline và truyền chat vào nó. Đố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.

import torch
from transformers import pipeline

pipeline = pipeline(task="text-generation", model="HuggingFaceTB/SmolLM2-1.7B-Instruct", dtype="auto", device_map="auto")
response = pipeline(chat, max_new_tokens=512)
print(response[0]["generated_text"][-1]["content"])

Nếu quá trình này thành công, bạn sẽ thấy phản hồi từ mô hình! Nếu bạn muốn tiếp tục cuộc trò chuyện, bạn cần cập nhật lịch sử trò chuyện với phản hồi của mô hình. Bạn có thể làm điều này bằng cách thêm văn bản vào chat (sử dụng vai trò assistant), hoặc bằng cách đọc response[0]["generated_text"], bao gồm lịch sử trò chuyện đầy đủ, kể cả phản hồi mới nhất.

Khi đã có phản hồi của mô hình, bạn có thể tiếp tục cuộc trò chuyện bằng cách thêm một thông điệp user mới vào lịch sử chat.

chat = response[0]["generated_text"]
chat.append(
    {"role": "user", "content": "Woah! But can it be reconciled with quantum mechanics?"}
)
response = pipeline(chat, max_new_tokens=512)
print(response[0]["generated_text"][-1]["content"])

Bằng cách lặp lại quy trình này, bạn có thể tiếp tục cuộc trò chuyện tùy ý, ít nhất là cho đến khi mô hình hết cửa sổ ngữ cảnh hoặc bạn hết bộ nhớ.

Hiệu suất và mức sử dụng bộ nhớ

Transformers nạp mô hình với độ chính xác float32 đầy đủ theo mặc định, và đối với một mô hình 8B, điều này đòi hỏi ~32GB bộ nhớ! Hãy sử dụng đối số torch_dtype="auto", thường dùng bfloat16 cho các mô hình được huấn luyện với định dạng này, để giảm mức sử dụng bộ nhớ của bạn.

Tham khảo tài liệu Quantization để biết thêm thông tin về các backend lượng tử hóa khác nhau có sẵn.

Để giảm mức sử dụng bộ nhớ xuống thấp hơn nữa, bạn có thể lượng tử hóa mô hình xuống 8-bit hoặc 4-bit bằng bitsandbytes. Tạo một BitsAndBytesConfig với các cài đặt lượng tử hóa mong muốn và truyền nó vào tham số model_kwargs của pipelines. Ví dụ bên dưới lượng tử hóa một mô hình xuống 8-bit.

from transformers import pipeline, BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(load_in_8bit=True)
pipeline = pipeline(task="text-generation", model="meta-llama/Meta-Llama-3-8B-Instruct", device_map="auto", model_kwargs={"quantization_config": quantization_config})

Nhìn chung, kích thước và hiệu suất của mô hình có mối tương quan trực tiếp. Các mô hình lớn hơn sẽ chạy chậm hơn, đồng thời đòi hỏi nhiều bộ nhớ hơn, vì mỗi tham số hoạt động phải được đọc từ bộ nhớ cho từng token được tạo ra. Đây là nút thắt cổ chai trong việc tạo văn bản của LLM và các lựa chọn chính để cải thiện tốc độ tạo là hoặc lượng tử hóa mô hình, hoặc sử dụng phần cứng có băng thông bộ nhớ cao hơn. Việc tăng thêm sức mạnh tính toán không mang lại lợi ích đáng kể.

Bạn cũng có thể thử các kỹ thuật như speculative decoding, trong đó một mô hình nhỏ hơn tạo ra các token ứng viên để mô hình lớn hơn xác minh. Nếu các token ứng viên là chính xác, mô hình lớn hơn có thể tạo ra nhiều hơn một token mỗi lần. Điều này giảm đáng kể nút thắt cổ chai về băng thông và cải thiện tốc độ tạo.

Các mô hình Mixture-of-Expert (MoE) như Mixtral, Qwen2MoE và GPT-OSS có rất nhiều tham số, nhưng chỉ “kích hoạt” một phần nhỏ trong số đó để tạo ra mỗi token. Do đó, các mô hình MoE thường có yêu cầu về băng thông bộ nhớ thấp hơn nhiều và có thể nhanh hơn so với một LLM thông thường cùng kích thước. Tuy nhiên, các kỹ thuật như speculative decoding không hiệu quả với các mô hình MoE vì số tham số được kích hoạt sẽ tăng lên với mỗi token dự đoán mới.

Update on GitHub