Chuẩn bị và xử lý dữ liệu văn bản
1. Tạo thư mục chứa tài liệu nguồn
Tạo thư mục data để lưu trữ các file văn bản thô (txt, pdf) cần xử lý. Đây là nơi LlamaIndex sẽ đọc file đầu vào.
Thư mục này giúp tổ chức cấu trúc dự án gọn gàng, tách biệt giữa code và dữ liệu.
Thư mục /app/data được tạo thành công, sẵn sàng chứa file.
mkdir -p /app/data
2. Chuẩn bị file dữ liệu mẫu
Đưa một file văn bản mẫu vào thư mục vừa tạo để thực hiện test. Nội dung file cần có đủ độ dài để chứng minh khả năng phân mảnh (chunking).
Chúng ta cần dữ liệu thật để kiểm tra quy trình, không thể chạy script trên file rỗng.
File sample_docs.txt xuất hiện trong thư mục với nội dung tiếng Việt.
cat > /app/data/sample_docs.txt
3. Cài đặt công cụ đọc PDF (nếu cần)
Cài đặt thư viện PyMuPDF (còn gọi là fitz) để LlamaIndex có thể đọc được file PDF nếu bạn có tài liệu dạng này.
LlamaIndex tự động phát hiện loại file, nhưng cần có backend đọc file tương ứng đã cài sẵn trong môi trường Python.
Thư viện PyMuPDF được cài đặt thành công, không báo lỗi.
pip install PyMuPDF --break-system-packages
Cấu hình Strategy phân mảnh (Chunking)
1. Thiết lập kích thước và độ lặp (Overlap)
Định nghĩa tham số chunk_size (số token/character mỗi mảnh) và chunk_overlap (số lượng ký tự lặp lại giữa các mảnh).
Việc đặt overlap giúp giữ nguyên ngữ cảnh, tránh cắt đứt ý nghĩa giữa các đoạn văn khi tách nhỏ.
Đối tượng TokenTextSplitter được cấu hình sẵn sàng với kích thước 512 và overlap 50.
2. Tạo cấu trúc dữ liệu Node
Chuyển đổi tài liệu văn bản thành danh sách các Document và sau đó thành Node sử dụng strategy đã định nghĩa.
LlamaIndex cần dữ liệu ở dạng Node để thực hiện tính toán vector sau này.
Được danh sách các Node, mỗi Node chứa một đoạn văn bản nhỏ đã được tách rời.
Cấu hình và chạy tạo Embeddings
1. Chọn và cấu hình Model Embedding
Chọn mô hình BgeM3 (BAAI/bge-m3) từ HuggingFace. Đây là model hỗ trợ đa ngôn ngữ (bao gồm tiếng Việt) và có độ chính xác cao mà không cần API key trả phí.
Sử dụng model local hoặc HuggingFace inference giúp giảm chi phí và bảo mật dữ liệu so với gọi API OpenAI cho dữ liệu nhạy cảm.
Model được tải về và khởi tạo thành công, sẵn sàng tính toán vector.
2. Viết script tạo Embeddings và lưu trữ tạm
Viết script Python để đọc file, tách mảnh, chạy model embedding và lưu kết quả ra file JSONL (JSON Lines) để dùng cho phần sau.
Chúng ta cần chuyển đổi văn bản sang vector số (list float) trước khi đưa vào PostgreSQL.
File /app/data/embeddings_output.jsonl được tạo ra, chứa các dòng JSON có trường text và embedding.
cat > /app/generate_embeddings.py
3. Chạy script tạo Embeddings
Thực thi script Python vừa tạo để bắt đầu quá trình chuyển đổi văn bản sang vector.
Lần đầu chạy có thể mất vài giây đến vài phút để tải model từ HuggingFace về cache.
Script chạy xong, không báo lỗi và xuất file kết quả.
cd /app && python generate_embeddings.py
Verify kết quả Embeddings
1. Kiểm tra file đầu ra
Đọc dòng đầu tiên của file JSONL để xác nhận cấu trúc dữ liệu đã đúng.
Cần đảm bảo trường embedding là một mảng số float, không phải chuỗi text.
Xuất hiện dòng JSON chứa text và embedding với độ dài vector (thường là 1024 hoặc 1024 chiều với BgeM3).
head -n 1 /app/data/embeddings_output.jsonl | python -m json.tool
2. Kiểm tra số lượng vector
Đếm số dòng trong file JSONL để so sánh với số lượng chunks mong đợi.
Đảm bảo toàn bộ dữ liệu đã được xử lý, không bị thiếu dòng.
Số lượng dòng trùng khớp với số lượng Node đã tạo trong script.
wc -l /app/data/embeddings_output.jsonl
Điều hướng series:
Mục lục: Series: Triển khai Database AI với pgvector, LlamaIndex và Ubuntu 24.04
« Phần 4: Cài đặt Python, LlamaIndex và các thư viện hỗ trợ
Phần 6: Kết nối LlamaIndex với PostgreSQL pgvector »