Semantic Chunking
Phân đoạn ngữ nghĩa chia tài liệu tại những chỗ chủ đề thay đổi, được đo bằng độ tương đồng embedding giữa các câu liền kề, nhờ đó mỗi đoạn chứa một ý.
Chia đoạn ngữ nghĩa phân tách tài liệu thành các đoạn cho sinh tăng cường truy xuất (RAG) và tìm kiếm tại những điểm chủ đề thay đổi, được xác định bằng cách so sánh embedding của các câu liền kề, thay vì cứ sau một số ký tự hoặc token cố định. Mỗi đoạn khi đó bao quát một ý, nên vector duy nhất của đoạn trong cơ sở dữ liệu vector thể hiện tốt ý đó; đoạn được truy xuất sẽ cung cấp cho mô hình ngôn ngữ lớn (LLM) một ý hoàn chỉnh thay vì phần cuối của mục này và phần đầu của mục kế tiếp.
Cách chia đoạn ngữ nghĩa hoạt động#
Thuật toán phổ biến, được các hướng dẫn phân tách văn bản của Greg Kamradt phổ biến rộng rãi và được triển khai dưới dạng SemanticChunker trong LangChain, gồm bốn bước. Văn bản được chia thành câu, rồi embedding từng câu, thường gom cùng các câu lân cận để giảm nhiễu. Độ tương đồng cosine giữa từng cặp câu liên tiếp được chuyển thành khoảng cách. Một ngưỡng đánh dấu điểm ngắt tại nơi khoảng cách lớn bất thường: LangChain mặc định dùng phân vị thứ 95 của mọi khoảng cách trong tài liệu, đồng thời cung cấp ngưỡng theo độ lệch chuẩn, khoảng tứ phân vị và gradient. Các câu nằm giữa những điểm ngắt tạo thành một đoạn. Bộ chia tách ngữ nghĩa trong LlamaIndex dùng cùng điểm ngắt theo phân vị.
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
"The XR-12 coolant pump circulates water through the press line.",
"Inspect the XR-12 pump seals for leaks every week.",
"A worn pump bearing grinds loudly before it fails.",
"The staff cafeteria now opens for breakfast at 7:00.",
"The cafeteria menu adds vegetarian lunches in May.",
]
# Khoảng cách cosine giữa mỗi câu và câu tiếp theo
embeddings = model.encode(sentences, normalize_embeddings=True)
distances = 1 - np.sum(embeddings[:-1] * embeddings[1:], axis=1)
# Bắt đầu đoạn mới tại nơi khoảng cách vượt phân vị thứ 95
threshold = np.percentile(distances, 95)
chunks = [[sentences[0]]]
for sentence, distance in zip(sentences[1:], distances):
if distance > threshold:
chunks.append([])
chunks[-1].append(sentence)
print(np.round(distances, 2))
print(*[" ".join(chunk) for chunk in chunks], sep="\n")Khoảng cách giữa các câu liền kề là 0.56, 0.64, 0.98 và 0.62; do đó, điểm ngắt duy nhất nằm ở bước nhảy 0.98 từ ổ trục máy bơm sang căn-tin, và đầu ra gồm một đoạn ba câu về máy bơm XR-12 cùng một đoạn hai câu về căn-tin.
So sánh các chiến lược chia đoạn#
- Chia đoạn kích thước cố định: Chia sau mỗi N token, thường có phần chồng lấn giữa các đoạn kề nhau. Phương pháp này nhanh, dễ dự đoán và bỏ qua ranh giới chủ đề.
- Chia tách đệ quy: Chia theo dấu ngắt đoạn, rồi dấu ngắt dòng, rồi câu, cho đến khi mỗi phần đáp ứng giới hạn kích thước. LangChain khuyến nghị bộ chia tách ký tự đệ quy cho văn bản thông thường.
- Chia tách theo cấu trúc: Tuân theo tiêu đề, mục Markdown, phần tử HTML hoặc bố cục trang PDF.
- Chia đoạn ngữ nghĩa: Tuân theo những thay đổi về ý nghĩa, đổi lại phải tạo embedding cho từng câu khi lập chỉ mục và kích thước đoạn có thể chênh lệch lớn; vì vậy, các phương pháp triển khai bổ sung độ dài tối thiểu và tối đa.
- Chia đoạn trễ và truy xuất theo ngữ cảnh: Giải quyết vấn đề đoạn thiếu ngữ cảnh từ phần còn lại của tài liệu, chẳng hạn đại từ có đối tượng quy chiếu nằm ở đoạn trước, và có thể kết hợp với bất kỳ phương pháp xác định ranh giới nào ở trên.
Chia đoạn hành động trong robotics chỉ trùng tên gọi: ở đó, một policy dự đoán một chuỗi lệnh điều khiển động cơ trong tương lai như một đơn vị.
Chia đoạn ngữ nghĩa ngoài văn bản#
Bản chép lời từ các hệ thống chuyển lời nói thành văn bản không có dấu ngắt đoạn, nên điểm ngắt dựa trên embedding là cách phổ biến để xác định lúc cuộc họp hoặc podcast chuyển chủ đề. Video cũng có thể được chia đoạn theo nội dung, để mỗi clip thể hiện một sự kiện cho tác vụ hiểu video hoặc RAG đa phương thức, thay vì một lát cắt 10 giây tùy ý. Ultralytics YOLO26 cung cấp các ranh giới như vậy cho cảnh có người và phương tiện: chế độ tracking gán cho mỗi vật thể được phát hiện một ID ổn định qua các khung hình, nhờ đó pipeline có thể mở clip khi ID mới xuất hiện trong cảnh và đóng clip khi mọi ID đang được tracking đã rời đi.
Chia đoạn ngữ nghĩa có cải thiện khả năng truy xuất không?#
Ranh giới theo chủ đề quan trọng nhất khi các chủ đề không liên quan nằm cạnh nhau mà không có tiêu đề, như trong bản chép lời, trang web thu thập được và ghi chú ghép nối. Đoạn ngữ nghĩa cũng phụ thuộc vào model embedding và ngưỡng; vì vậy, cùng một tài liệu sẽ được chia khác đi khi một trong hai thay đổi, và cả hai cần được tinh chỉnh dựa trên recall trên các truy vấn thực tế. Nghiên cứu Chia đoạn ngữ nghĩa có đáng với chi phí tính toán? (2024) so sánh chia đoạn ngữ nghĩa với chia đoạn kích thước cố định trong truy xuất tài liệu, truy xuất bằng chứng và tạo câu trả lời dựa trên truy xuất; kết quả cho thấy chi phí tính toán bổ sung của chia đoạn ngữ nghĩa không đem lại cải thiện nhất quán so với đoạn kích thước cố định.










