Tại sao lỗi này xảy raNếu bạn đã dành hơn mười phút làm việc với thư viện Transformers, có lẽ bạn đã gặp cảnh báo này. Bạn có thể đang lấy văn bản từ web scraper hoặc cơ sở dữ liệu SQL và đưa trực tiếp vào tokenizer. Lỗi này xảy ra vì văn bản đầu vào của bạn quá lớn so với kiến trúc của mô hình.
Các mô hình tiêu chuẩn như bert-base-uncased có giới hạn cứng là 512 token. Đây không phải là một con số ngẫu nhiên; nó được tích hợp sẵn trong positional embeddings của mô hình. Nếu bạn cố gắng đưa 1.523 token vào một kiến trúc 512 vị trí, mô hình sẽ không biết cách lập chỉ mục cho 1.011 token dư thừa. Sự không khớp này dẫn đến lỗi sau:
Token indices sequence length is longer than the specified maximum sequence length for this model (1523 > 512). Running this sequence through the model will result in indexing errors
Quy trình gỡ lỗi (Debug)Bắt đầu bằng việc tìm hiểu tại sao các chuỗi của bạn lại tăng vọt. Trong các pipeline thực tế, chuỗi dài thường bắt nguồn từ hai vấn đề cụ thể:
- Dữ liệu nhiễu (Noisy Data): Văn bản thô của bạn có thể chứa nhiều thẻ HTML, khối CSS hoặc các chuỗi mã hóa URL khổng lồ làm tăng số lượng token.- Nội dung dài: Bạn đang xử lý các hợp đồng pháp lý, bài báo y khoa hoặc các bài luận dài vượt quá ngưỡng 512 token một cách tự nhiên.Luôn kiểm tra độ dài chuỗi trước khi thực hiện tokenization. Nếu bạn thấy một chuỗi có 10.000 ký tự, đó là một dấu hiệu cảnh báo. Đôi khi, một URL dài có thể tiêu tốn hơn 100 token. Tôi thường sử dụng URL Decoder này để kiểm tra xem một chuỗi lớn thực sự là nội dung hữu ích hay chỉ là rác theo dõi cần được loại bỏ trước khi đưa vào GPU.
Các giải pháp### 1. Cách khắc phục nhanh nhất: Truncation (Cắt ngắn)Nếu dữ liệu giá trị nhất của bạn nằm ở đầu văn bản—thường thấy trong phân tích sắc thái tin tức hoặc phân loại chủ đề—chỉ cần cắt bỏ phần đuôi. Đây là cách nhanh nhất để mã của bạn hoạt động.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
text = "Văn bản rất dài của bạn ở đây..."
# Cách khắc phục: Cho phép truncation một cách rõ ràng
inputs = tokenizer(
text,
truncation=True,
max_length=512,
return_tensors="pt"
)
2. Cách khắc phục tiêu chuẩn: Padding và TruncationKhi bạn xử lý một nhóm (batch) các câu, tất cả chúng cần có cùng độ dài để GPU có thể xử lý. Kết hợp truncation với padding để đảm bảo mỗi tensor trong batch đều có độ dài chính xác là 512 token.
inputs = tokenizer(
batch_of_sentences,
padding="max_length",
truncation=True,
max_length=512,
return_tensors="pt"
)
3. Cách khắc phục "Giữ lại tất cả": Sliding Windows (Cửa sổ trượt)Sometimes you can't afford to lose a single word. In these cases, use return_overflowing_tokens. This technique slices one long document into several overlapping chunks (windows).
inputs = tokenizer(
text,
truncation=True,
max_length=512,
stride=128, # Phần chồng lấp giữa các đoạn
return_overflowing_tokens=True,
return_offsets_mapping=True,
padding="max_length",
return_tensors="pt"
)
Điều này tạo ra một batch các đoạn từ một tài liệu duy nhất. Nếu bạn đang thực hiện phân loại, bạn sẽ cần một chiến lược để hợp nhất các kết quả, chẳng hạn như lấy trung bình điểm số từ tất cả các đoạn.
Xác minhXác minh việc khắc phục bằng cách kiểm tra shape của input_ids. Nếu bạn đặt max_length=512, chiều thứ hai của tensor không được vượt quá 512.
print(inputs['input_ids'].shape)
# Kết quả mong đợi: torch.Size([1, 512])
Nếu bạn vẫn thấy các con số như 1523, hãy kiểm tra kỹ xem bạn có vô tình ghi đè model_max_length hoặc quên cờ truncation=True hay không.

