Mở Đầu
Trong lĩnh vực Hồi đáp theo Kiến thức (RAG), việc chia nhỏ văn bản (chunking) là một bước quan trọng để tối ưu hóa quy trình truy xuất và sử dụng thông tin. Các kỹ thuật chunking không chỉ cải thiện độ chính xác mà còn giúp tổ chức dữ liệu một cách hiệu quả hơn cho mô hình ngôn ngữ lớn (LLMs). Bài viết này sẽ giới thiệu các loại chunking phổ biến, đặc biệt là Semantic Chunking và Proposition-Based Retrieval, cùng với vai trò của chúng trong việc nâng cao hiệu suất RAG.
Tổng Quan Về Hệ Thống RAG Cơ Bản
Trước khi đi sâu vào bài viết, bạn có thể tham khảo một bài tổng quan về RAG và các cách tối ưu từ Phạm Văn Toàn tại đây.
Bây giờ, chúng ta sẽ bắt đầu với một cái nhìn tổng quát về Chunking
. Dưới đây là quy trình cơ bản của một hệ thống RAG:
- Chunking: Chia nhỏ tài liệu thành các đoạn văn (chunks).
- Embedding: Biến đổi các chunks thành các vector đại diện cho chúng.
- VectorDB: Lưu trữ các vector vào một cơ sở dữ liệu vector để truy vấn sau này.
- Retrieval: Nhận được truy vấn từ người sử dụng, hệ thống sẽ biến đổi truy vấn thành một vector và tìm kiếm các chunks liên quan.
- Response Generation: Gửi truy vấn và các chunks liên quan đến LLM để nhận câu trả lời.
Các Loại Chunking
Hiện tại có nhiều loại Chunking khác nhau, chủ yếu có thể chia thành 5 dạng cơ bản:
1. Fixed Size Chunking
Đơn giản là chia văn bản theo số lượng ký tự, xác định bởi Chunk_Size và Chunk_Overlap.
2. Recursive Chunking
Khắc phục nhược điểm của Fixed Size Chunking, Recursive Chunking chia văn bản thành các đoạn nhỏ trước, trước khi áp dụng Fixed Size, nhằm giữ lại cấu trúc của văn bản.
3. Document Based Chunking
Cập nhật so với Recursive Chunking, chia tài liệu thành các Chunk dựa trên cấu trúc vốn có. Tuy nhiên, nó không hiệu quả với tài liệu không có cấu trúc rõ ràng.
4. Semantic Chunking
Sẽ được đề cập chi tiết hơn ở phần sau.
5. Agentic Chunking
Sử dụng LLM để thực hiện việc chunking tự động.
Tìm Hiểu Về Semantic Chunking
Cách Hoạt Động
Cách hoạt động của Semantic Chunking dựa trên sự tương đồng về ngữ nghĩa giữa các câu hoặc đoạn văn. Quy trình có thể tóm tắt như sau:
- Chia tài liệu thành các chunks nhỏ.
- Biến đổi các chunks thành vector đại diện.
- So sánh các chunks lân cận theo nghĩa và gộp lại nếu độ tương đồng vượt qua ngưỡng nhất định.
Đầu ra cuối cùng là danh sách các chunk khác nhau về mặt nghĩa.
Thực Hành
Trong phần thực hành, chúng ta sẽ sử dụng thư viện llama-index để thực hiện Semantic Chunking. Cần lưu ý đến hai thông số chính: buffer_size và breakpoint_percentile_threshold. Dưới đây là một mã mẫu minh họa cho quy trình này.
python
from llama_index.core import SimpleDirectoryReader
from llama_index.core.node_parser import SemanticSplitterNodeParser
from llama_index.embeddings.azure_openai import AzureOpenAIEmbedding
import os
# Thông số kết nối API OpenAI
OPENAI_ENDPOINT=os.getenv("OPENAI_ENDPOINT")
OPENAI_KEY=os.getenv("OPENAI_KEY")
embed_model = AzureOpenAIEmbedding(
api_key=OPENAI_KEY,
azure_endpoint=OPENAI_ENDPOINT,
)
splitter = SemanticSplitterNodeParser(
buffer_size=3, breakpoint_percentile_threshold=95, embed_model=embed_model
)
doc_path = "data/test.txt"
documents = SimpleDirectoryReader(input_files=[doc_path]).load_data()
nodes = splitter.get_nodes_from_documents(documents)
print(nodes[0].to_dict())
Kết quả của việc thực hiện chunking có thể khác nhau tuỳ thuộc vào giá trị của các tham số đã giới thiệu.
Về Proposition-Based Retrieval
Proposition-Based Retrieval là một khái niệm mới trong hệ thống RAG, giúp tối ưu hóa quy trình tìm kiếm thông tin. Để thực hiện điều này, các mệnh đề (proposition) được tạo ra từ nội dung văn bản giúp cải thiện đáng kể độ chính xác cũng như hiệu quả của việc truy xuất thông tin.
Quy Trình Chức Năng
Quy trình bao gồm các bước:
- Chuẩn bị dữ liệu.
- Tạo ra các propositions từ văn bản.
- Kiểm tra chất lượng của propositions.
- Lập chỉ mục cho các propositions.
- Thực hiện truy vấn dựa trên propositions.
- Sử dụng trong hệ thống RAG.
Thực Hành
Thực hiện tạo propositions có thể dễ dàng bằng cách sử dụng LLM mạnh mẽ, như GPT-4, qua các yêu cầu được thiết kế đặc biệt.
python
from llama_index.llms.azure_openai import AzureOpenAI
import os
# Thông số kết nối API OpenAI
client = AzureOpenAI(
azure_endpoint=OPENAI_ENDPOINT,
azure_deployment=OPENAI_GPT_DEPLOYMENT_NAME,
api_key=OPENAI_KEY,
)
content = "Python..." # Nội dung cần tách
prompt = "Decompose the content into clear propositions..."
response = client.complete(prompt=prompt)
print(response)
Kết Luận
Trong bài viết này, đã tổng hợp và so sánh các loại chunking trong RAG, đồng thời đi sâu vào chi tiết về Semantic Chunking và Proposition-Based Retrieval. Mỗi phương pháp có ứng dụng và ưu điểm riêng, nên việc lựa chọn phụ thuộc vào yêu cầu cụ thể của dự án.
Thế nên, khi phát triển hệ thống RAG, bạn nên cân nhắc kỹ lưỡng về loại chunking phù hợp nhất với dữ liệu và mục tiêu của bạn để đạt được hiệu suất tối ưu.
source: viblo