0

Token-Based Chunking – Cắt dữ liệu theo token và cách triển khai trong hệ thống AI

Trong bất kỳ hệ thống AI hoặc NLP nào, cách bạn chia nhỏ dữ liệu đầu vào sẽ ảnh hưởng trực tiếp đến chất lượng huấn luyện và khả năng phản hồi của mô hình. Một trong những phương pháp được sử dụng rộng rãi nhất hiện nay là Token-Based Chunking – cắt văn bản dựa trên số lượng token thay vì ký tự hay câu.

Kỹ thuật này giúp tối ưu hóa giới hạn context window của mô hình, đảm bảo input luôn “fit” với dung lượng token mà LLM hỗ trợ, đồng thời giữ nguyên mạch ngữ nghĩa trong văn bản.

Token-Based Chunking là gì và vì sao nó quan trọng

Trong thực tế, văn bản đầu vào (ví dụ file tài liệu, log, nội dung tri thức, v.v.) thường dài hơn nhiều so với dung lượng mà LLM có thể tiếp nhận trong một lần xử lý. Chunking giúp chia nhỏ chúng thành từng phần hợp lý.

Điểm khác biệt của Token-Based Chunking so với các phương pháp truyền thống là nó cắt theo token – đơn vị mà LLM thật sự hiểu, thay vì ký tự hay câu.

Một vài lưu ý quan trọng:

  • Mỗi mô hình ngôn ngữ (LLM) có ngưỡng token riêng – ví dụ: GPT-3.5 ≈ 16K token, GPT-4 ≈ 128K token.
  • Token ≠ từ: Một token có thể là một phần của từ, một dấu câu, hoặc cả khoảng trắng.
  • Khi chunking theo token, bạn có thể kiểm soát chính xác kích thước đầu vào, tránh lỗi “Input too long”, đồng thời tối ưu chi phí khi gọi API.

RecursiveCharacterTextSplitter trong LangChain

Một trong những công cụ phổ biến nhất khi xử lý chunk theo token là RecursiveCharacterTextSplitter – thành phần có sẵn trong thư viện LangChain.

Khác với cách “cắt cứng” văn bản theo giới hạn cố định, công cụ này duy trì ngữ nghĩa tự nhiên bằng cách tìm các vị trí phân tách hợp lý (dấu chấm, xuống dòng, khoảng trắng, v.v.) trước khi buộc phải cắt.

Cơ chế hoạt động tóm tắt:

  • Đặt ngưỡng chunk_size (tối đa bao nhiêu token mỗi đoạn).
  • Tìm ký tự phân tách trong danh sách separators (ưu tiên từ lớn → nhỏ).
  • Nếu không tìm thấy, cắt theo ký tự nhỏ hơn.
  • Cuối cùng, fallback bằng cách cắt cứng.

Kết quả là các đoạn chunk có độ dài vừa phải, ngữ nghĩa vẫn liền mạch, rất hữu ích cho pipeline RAG, AI Agent, hoặc fine-tuning.

Giải thích các tham số quan trọng

3.1. chunk_size – Giới hạn token mỗi đoạn

Xác định số token tối đa của một chunk.

  • Quá lớn → vượt giới hạn context → lỗi.
  • Quá nhỏ → ngữ cảnh bị vụn, mất mạch.

Khuyến nghị:

  • Fine-tuning: 512–1024 token.
  • RAG / Chatbot: 300–600 token để tối ưu tốc độ và chi phí.

chunk_overlap – Số token chồng lấn

Cho phép phần cuối của chunk trước lặp lại ở đầu chunk sau để duy trì ngữ cảnh liên tục.

Ví dụ:

chunk_size=500
chunk_overlap=50
  • → Chunk 1: token 1–500
  • → Chunk 2: token 451–950

Khuyến nghị: Overlap = 10–15% chunk_size (ví dụ 500 → overlap 50–75).

separators – Danh sách ký tự ưu tiên để cắt

Xác định danh sách ký tự mà splitter thử tách trước khi cắt cứng. Ví dụ:

separators=["\n\n", "\n", ".", " ", ""]
  • \n\n: tách theo đoạn.
  • \n: tách theo dòng.
  • ".": tách ở cuối câu.
  • " ": tách theo khoảng trắng.
  • "": fallback cuối cùng.

Tùy chỉnh:

  • Với code/log: thêm “:”, “;”, “,” hoặc “\t”.
  • Với văn bản mô tả: giữ dấu câu để bảo toàn nghĩa.

length_function – Hàm đo độ dài theo token

LLM không đếm ký tự, mà đếm token. Vì vậy cần tokenizer chính xác, ví dụ tiktoken cho mô hình của OpenAI:

import tiktoken
def tiktoken_len(text):
    tokenizer = tiktoken.get_encoding("cl100k_base")
    return len(tokenizer.encode(text))

Nếu bạn dùng model từ HuggingFace, có thể thay bằng transformers.AutoTokenizer.

keep_separator – Giữ ký tự phân tách

Nếu True, dấu phân tách (ví dụ “.” hoặc “\n”) sẽ được giữ lại trong chunk. Giúp output tự nhiên, dễ đọc, phù hợp cho chatbot UI hoặc QA hiển thị trực tiếp.

add_start_index – Trả về vị trí chunk trong văn bản gốc

Khi bật True, splitter thêm metadata:

{"start_index": 1234}

Điều này rất hữu ích khi bạn cần map chunk → vị trí gốc trong hệ thống retrieval hoặc highlight kết quả tìm kiếm.

strip_whitespace – Xóa khoảng trắng thừa

Loại bỏ các ký tự trống ở đầu/cuối chunk. Giúp làm sạch dữ liệu trước khi embedding hoặc indexing.

Demo cắt văn bản theo token

from langchain.text_splitter import RecursiveCharacterTextSplitter
import tiktoken

def tiktoken_len(text):
    tokenizer = tiktoken.get_encoding("cl100k_base")
    return len(tokenizer.encode(text))

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    length_function=tiktoken_len,
    separators=["\n\n", "\n", ".", " ", ""]
)

text = """Token-Based Chunking giúp tối ưu dữ liệu đầu vào cho AI Agent...
Nó đảm bảo văn bản không vượt giới hạn token và vẫn giữ ngữ cảnh tự nhiên."""

chunks = splitter.split_text(text)

for i, chunk in enumerate(chunks):
    print(f"--- Chunk {i+1} ({len(chunk)} ký tự) ---")
    print(chunk)

Kết quả:

  • Mỗi đoạn ~500 token.
  • Giữ chồng lấn 50 token.
  • Ngữ cảnh vẫn tự nhiên, không gãy câu.

Lợi ích khi triển khai Token-Based Chunking

  • Giữ input trong giới hạn mô hình: Không vượt quá token limit, tránh lỗi khi gọi API.
  • Bảo toàn ngữ nghĩa: Nhờ chunk_overlap, ngữ cảnh được duy trì liên tục giữa các đoạn.
  • Tăng hiệu quả tìm kiếm & truy vấn: Chunk ngắn, sạch giúp vector retrieval nhanh và chính xác hơn.
  • Ứng dụng linh hoạt: Dùng trong fine-tuning, RAG, chatbot, semantic search hoặc phân tích log.

Kết luận

Token-Based Chunking là kỹ thuật nền tảng trong xử lý dữ liệu văn bản cho AI hiện đại. Khi kết hợp với RecursiveCharacterTextSplitter trong LangChain, developer có thể tạo ra pipeline tự động chia nhỏ dữ liệu chính xác theo token, đảm bảo input vừa khít với mô hình và vẫn giữ được ngữ nghĩa tự nhiên.

Tóm tắt nhanh:

chunk_size + chunk_overlap → kiểm soát độ dài & ngữ cảnh
separators + keep_separator → duy trì ngữ nghĩa
length_function → tính token chính xác
add_start_index + strip_whitespace → phục vụ indexing và clean data

Nguồn tham khảo: https://bizfly.vn/techblog/token-based-chunking-cat-du-lieu-theo-token-va-ung-dung-trong-ai.html


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí