Late Chunking
Late chunking nhúng toàn bộ tài liệu bằng model có ngữ cảnh dài, sau đó gộp các vector token theo từng chunk để embedding của mỗi chunk vẫn giữ được ngữ cảnh tài liệu.
Late chunking là phương pháp nhúng các đoạn tài liệu, trong đó model embedding ngữ cảnh dài mã hóa toàn bộ tài liệu trước, rồi chia các vector token thu được tại ranh giới đoạn và lấy trung bình để tạo một embedding cho mỗi đoạn. Mỗi token đã có thông tin từ toàn bộ tài liệu khi được gộp, nên đoạn viết “cần được thay thế” vẫn giữ được ý nghĩa của “nó”. Các nhà nghiên cứu tại Jina AI giới thiệu phương pháp này trong bài báo năm 2024 Late Chunking: Contextual Chunk Embeddings Using Long-Context Embedding Models, áp dụng phương pháp vào các model embedding hiện có mà không cần huấn luyện bổ sung.
Vì sao embedding của các chunk mất ngữ cảnh#
Các hệ thống tạo sinh tăng cường truy xuất (RAG) chia tài liệu thành các chunk để mỗi vector biểu diễn một đoạn tập trung vào một chủ đề, đồng thời văn bản truy xuất nằm gọn trong cửa sổ ngữ cảnh của model. Phương pháp chia chunk thông thường nhúng từng chunk riêng lẻ, cắt đứt mọi liên hệ với văn bản trước đó. Xét hai câu liên tiếp trong tài liệu hướng dẫn: “Bơm XR-12 tuần hoàn chất làm mát qua dây chuyền ép.” và “Bơm cần được thay thế sau 10,000 giờ vận hành.” Khi được nhúng riêng, câu thứ hai không nhắc đến bơm XR-12, nên một câu hỏi về việc thay thế bơm đó chỉ khớp yếu trong tìm kiếm vector, dù câu này chứa câu trả lời.
Cách late chunking hoạt động#
Toàn bộ tài liệu được token hóa và khoảng token của từng chunk được ghi lại; ranh giới chunk có thể được xác định bằng bất kỳ bộ chia nào, bao gồm chia theo kích thước cố định hoặc chia chunk ngữ nghĩa. Sau đó, toàn bộ chuỗi token đi qua model embedding Transformer, trong đó self-attention trộn thông tin từ mỗi token vào mọi token khác. Cuối cùng, các vector token nằm trong mỗi khoảng được lấy trung bình để tạo embedding cho chunk đó. Tài liệu dài hơn giới hạn đầu vào của model, chẳng hạn 8,192 token của các model jina-embeddings-v2 của Jina, được mã hóa thành các macro chunk chồng lấn; bài báo gọi phương pháp này là late chunking dài.
Ví dụ dưới đây nhúng câu về máy bơm theo cả hai cách bằng một model Sentence Transformers nhỏ rồi so sánh từng phiên bản với câu hỏi:
import torch
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
chunks = [
"The XR-12 pump circulates coolant through the press line.",
"It must be replaced after 10,000 operating hours.",
]
query = model.encode("When should the XR-12 pump be replaced?", convert_to_tensor=True)
# Chia chunk thông thường: nhúng riêng chunk thứ hai
naive = model.encode(chunks[1], convert_to_tensor=True)
# Late chunking: mã hóa toàn bộ tài liệu, sau đó chỉ lấy trung bình các token thuộc chunk thứ hai
tokens = model.encode(" ".join(chunks), output_value="token_embeddings")
start = len(model.tokenizer(chunks[0])["input_ids"]) - 1 # các token của [CLS] + chunk 1
late = tokens[start:-1].mean(dim=0) # loại bỏ [SEP] cuối cùng
for name, emb in [("naive", naive), ("late", late)]:
print(name, round(torch.cosine_similarity(query, emb, dim=0).item(), 3))Chunk được nhúng riêng đạt điểm 0.382 khi so với câu hỏi; phiên bản late chunking của cùng câu đạt 0.62 vì các token của phiên bản đó đã chú ý đến “Bơm XR-12” trước khi được gộp.
Phát hiện đối tượng cũng có thay đổi tương tự vào năm 2015. R-CNN chạy mạng tích chập riêng cho từng vùng đề xuất được cắt ra; Fast R-CNN chạy mạng một lần trên toàn ảnh rồi gộp từng vùng từ các feature map dùng chung, giúp phát hiện ở thời điểm kiểm thử nhanh hơn 213 lần với backbone VGG16. Ultralytics YOLO26 cũng chạy backbone một lần trên toàn ảnh và dự đoán mọi box từ các đặc trưng dùng chung đó, nên không có phát hiện nào được tính từ một vùng cắt biệt lập.
Late chunking và các phương pháp liên quan#
- Truy xuất theo ngữ cảnh: Thêm một ghi chú do LLM viết vào đầu mỗi chunk trước khi lập chỉ mục. Phương pháp này tốn một lượt gọi LLM cho mỗi chunk và cũng hỗ trợ tìm kiếm từ khóa vì ngữ cảnh bổ sung ở dạng văn bản.
- Tương tác muộn của ColBERT: Giữ lại một vector cho mỗi token và so sánh các vector này với truy vấn tại thời điểm tìm kiếm. Late chunking gộp thành một vector duy nhất cho mỗi chunk, nhờ đó kết quả tương thích với mọi chỉ mục vector tiêu chuẩn.
- Chồng lấn chunk: Lặp lại một vài câu giữa các chunk lân cận. Phương pháp này chỉ giữ lại ngữ cảnh gần kề và làm tăng kích thước chỉ mục.
- Model xếp hạng lại: Sắp xếp lại các ứng viên được truy xuất bằng model mạnh hơn sau lượt tìm kiếm đầu tiên và hoạt động hiệu quả khi kết hợp với late chunking.
Khi nào late chunking hữu ích#
Mức cải thiện lớn nhất đạt được khi các chunk phụ thuộc vào văn bản trước đó, chẳng hạn với đại từ, chữ viết tắt chỉ được định nghĩa một lần và nội dung kể chuyện như báo cáo hoặc tài liệu hướng dẫn; mức cải thiện nhỏ nhất với các bản ghi ngắn, độc lập như tiêu đề sản phẩm. Phương pháp này cần một model embedding gộp bằng cách lấy trung bình token và cho phép truy cập đầu ra ở cấp token; đồng thời phải mã hóa lại toàn bộ tài liệu mỗi khi bất kỳ phần nào thay đổi. Các vector chunk từ late chunking được đưa nguyên trạng vào cơ sở dữ liệu vector thông thường. API embedding của Jina cung cấp phương pháp này dưới dạng tham số late_chunking, dùng để nhúng một danh sách chunk liên tiếp như một tài liệu duy nhất.










