Bỏ qua đến nội dung chính

Text chunking strategies

📖 Nội dung bài học

Summary

Text chunking là một trong những bước quan trọng nhất khi xây dựng một RAG (Retrieval Augmented Generation) pipeline. Cách bạn chia nhỏ tài liệu ảnh hưởng trực tiếp đến chất lượng của toàn bộ hệ thống. Một chiến lược chunking kém có thể dẫn đến việc đưa ngữ cảnh không liên quan vào prompt, khiến AI đưa ra câu trả lời hoàn toàn sai.

Hãy xem xét ví dụ này: bạn có một tài liệu với các phần về nghiên cứu y khoa và kỹ thuật phần mềm. Nếu bạn chunking kém, người dùng hỏi "Kỹ sư đã sửa bao nhiêu lỗi trong năm nay?" có thể nhận được thông tin về nghiên cứu y khoa thay vì kỹ thuật phần mềm, chỉ vì phần y khoa tình cờ chứa từ "bug" (lỗi) trong một ngữ cảnh khác.

Điều này cho thấy tại sao chiến lược chunking lại quan trọng đến vậy. Mục tiêu là tạo ra các chunk giữ được sự mạch lạc về ngữ nghĩa và cung cấp ngữ cảnh hữu ích khi được truy xuất.

Ba chiến lược chunking chính

Có ba cách tiếp cận chính để chia văn bản thành các chunk:

  • Dựa trên kích thước (Size-based): Chia văn bản thành các chuỗi có độ dài bằng nhau.
  • Dựa trên cấu trúc (Structure-based): Chia dựa trên cấu trúc tài liệu (tiêu đề, đoạn văn, phần).
  • Dựa trên ngữ nghĩa (Semantic-based): Nhóm các câu hoặc phần liên quan bằng các kỹ thuật NLP.

Chunking dựa trên kích thước

Chunking dựa trên kích thước là cách tiếp cận đơn giản nhất. Bạn chỉ cần chia tài liệu của mình thành các chunk có độ dài ký tự hoặc từ gần bằng nhau. Cách này dễ triển khai và hoạt động đáng tin cậy trên các loại tài liệu khác nhau.

Tuy nhiên, cách tiếp cận này có những nhược điểm rõ ràng:

  • Từ bị cắt giữa câu.
  • Các chunk mất đi ngữ cảnh quan trọng từ văn bản xung quanh.
  • Nội dung liên quan có thể bị chia thành nhiều chunk.

Thêm chồng lấn (Overlap)

Để giải quyết vấn đề ngữ cảnh, bạn có thể triển khai chiến lược chồng lấn. Mỗi chunk bao gồm một số ký tự từ các chunk liền kề, cung cấp thêm ngữ cảnh và đảm bảo thông tin quan trọng không bị mất ở ranh giới chunk.

Mặc dù điều này tạo ra một số trùng lặp, sự đánh đổi thường xứng đáng với ngữ cảnh được cải thiện mà mỗi chunk nhận được.

Chunking dựa trên cấu trúc

Khi tài liệu của bạn có định dạng nhất quán (như markdown với các tiêu đề rõ ràng), chunking dựa trên cấu trúc có thể mang lại kết quả tuyệt vời. Bạn chia theo các yếu tố cấu trúc như tiêu đề, tạo ra các chunk phù hợp với tổ chức tự nhiên của tài liệu.

Cách này hoạt động tốt đẹp cho các tài liệu được định dạng tốt nhưng yêu cầu đảm bảo về cấu trúc tài liệu. Nó sẽ không hoạt động đáng tin cậy với các tệp văn bản thuần túy hoặc các tài liệu có định dạng không nhất quán.

Ví dụ triển khai

Dưới đây là ba hàm chunking thực tế bạn có thể triển khai:

Chunking dựa trên ký tự

def chunk_by_char(text, chunk_size=150, chunk_overlap=20):
    chunks = []
    start_idx = 0
    
    while start_idx < len(text):
        end_idx = min(start_idx + chunk_size, len(text))
        chunk_text = text[start_idx:end_idx]
        chunks.append(chunk_text)
        
        start_idx = (
            end_idx - chunk_overlap if end_idx < len(text) else len(text)
        )
    
    return chunks

Chunking dựa trên câu

def chunk_by_sentence(text, max_sentences_per_chunk=5, overlap_sentences=1):
    sentences = re.split(r"(?<=[.!?])\s+", text)
    chunks = []
    start_idx = 0
    
    while start_idx < len(sentences):
        end_idx = min(start_idx + max_sentences_per_chunk, len(sentences))
        current_chunk = sentences[start_idx:end_idx]
        chunks.append(" ".join(current_chunk))
        
        start_idx += max_sentences_per_chunk - overlap_sentences
        
        if start_idx < 0:
            start_idx = 0
    
    return chunks

Chunking dựa trên phần

def chunk_by_section(document_text):
    pattern = r"\n## "
    return re.split(pattern, document_text)

Chọn chiến lược phù hợp

Lựa chọn chiến lược chunking của bạn hoàn toàn phụ thuộc vào trường hợp sử dụng cụ thể của bạn:

  • Dựa trên ký tự: Phương pháp dự phòng đáng tin cậy nhất, hoạt động với mọi loại tài liệu.
  • Dựa trên câu: Cân bằng tốt giữa ngữ cảnh và ý nghĩa cho văn xuôi.
  • Dựa trên phần: Kết quả tuyệt vời khi bạn có tài liệu có cấu trúc.

Đối với tài liệu do người dùng tải lên mà không có đảm bảo định dạng, chunking dựa trên ký tự thường là lựa chọn an toàn nhất của bạn. Đối với các tài liệu nội bộ được cấu trúc tốt, chunking dựa trên phần có thể mang lại kết quả vượt trội. Chunking dựa trên câu hoạt động tốt với hầu hết văn xuôi nhưng có thể gặp khó khăn với mã hoặc tài liệu kỹ thuật sử dụng dấu chấm theo những cách không mong muốn.

Hãy nhớ rằng chunking thường là một quá trình lặp đi lặp lại. Bắt đầu với một phương pháp đơn giản, kiểm tra nó với các tài liệu và trường hợp sử dụng cụ thể của bạn, sau đó tinh chỉnh dựa trên chất lượng kết quả bạn nhận được từ hệ thống RAG của mình.

Downloads

🔁 Bài học liên quan

📚 Nguồn & ghi nhận

Bài học có hữu ích không?

Góp ý / Báo lỗiPhát hiện sai sót hoặc có ý tưởng cải thiện?