Chuẩn bị dữ liệu nguồn và cấu trúc thư mục
Bước đầu tiên là chuẩn bị dữ liệu thô để LlamaIndex có thể đọc. Chúng ta sẽ tạo thư mục chứa file PDF và CSV mẫu ngay trong project directory.
Tại sao: LlamaIndex cần đường dẫn vật lý để đọc file. Việc đặt file trong cấu trúc rõ ràng giúp script dễ quản lý và tái sử dụng.
Kết quả mong đợi: Thư mục data được tạo với các file mẫu bên trong.
mkdir -p /var/www/ai-rag/data
cd /var/www/ai-rag/data
# Tạo file PDF mẫu (nội dung giả lập về AI)
echo "LlamaIndex là một framework để xây dựng các ứng dụng AI. Nó hỗ trợ RAG (Retrieval-Augmented Generation). PostgreSQL với pgvector là giải pháp lưu trữ vector hiệu quả." > temp.txt
# Lưu ý: Trong thực tế, bạn cần file PDF thật. Ở đây chúng ta giả định đã có file "ai_basics.pdf" và "products.csv"
# Để chạy script, tôi sẽ tạo file CSV thật để test
echo "ID,Product,Description
1,Laptop,High performance laptop for AI development
2,Monitor,4K monitor for data visualization" > products.csv
ls -la
Kiểm tra: Thư mục data chứa file products.csv và các file dữ liệu khác.
Xử lý và phân mảnh văn bản (Chunking) với NodeParser
Chúng ta sẽ viết script Python để đọc dữ liệu và phân mảnh văn bản thành các đoạn nhỏ (chunks) phù hợp cho mô hình embedding.
Tại sao: Các mô hình ngôn ngữ lớn (LLM) có giới hạn về độ dài ngữ cảnh (context window). Việc chia nhỏ văn bản (chunking) giúp giảm chi phí token và tăng độ chính xác khi truy vấn.
Kết quả mong đợi: Script chạy thành công, không lỗi, và in ra số lượng nodes (chunks) được tạo ra.
cat > /var/www/ai-rag/process_data.py
Kiểm tra: Chạy script python /var/www/ai-rag/process_data.py và xem log in ra số lượng nodes và nội dung các chunk.
Cấu hình model Embedding và lưu Vector vào PostgreSQL
Bước này là cốt lõi: chuyển đổi văn bản (nodes) thành vector số học và lưu vào PostgreSQL thông qua LlamaIndex.
Tại sao: LLM không hiểu trực tiếp văn bản dưới dạng chuỗi để so sánh ý nghĩa. Chúng ta cần chuyển đổi văn bản thành vector (dãy số) để thực hiện tìm kiếm tương tự (similarity search) trong cơ sở dữ liệu.
Kết quả mong đợi: Vector được lưu thành công vào bảng vector_embeddings của PostgreSQL.
cat > /var/www/ai-rag/create_index.py
Kiểm tra: Chạy python /var/www/ai-rag/create_index.py. Nếu thành công, script sẽ in "Index created..." và trả về kết quả cho câu hỏi "High performance laptop".
Verify kết quả trong PostgreSQL
Cuối cùng, chúng ta cần xác minh trực tiếp trong cơ sở dữ liệu để đảm bảo vector đã được lưu đúng định dạng và dữ liệu văn bản đi kèm.
Tại sao: Kiểm tra trực tiếp SQL giúp đảm bảo pipeline hoạt động ổn định, không chỉ ở mức ứng dụng Python mà còn ở mức cơ sở dữ liệu.
Kết quả mong đợi: Bảng vector_embeddings chứa dữ liệu với trường embedding là mảng vector và trường doc_id hoặc text_chunk.
psql -U postgres -d ai_rag_db -c "
SELECT
id,
doc_id,
embedding::text as vector_preview,
metadata::jsonb as meta
FROM vector_embeddings
LIMIT 3;
"
Kiểm tra: Command trên sẽ trả về 3 dòng dữ liệu đầu tiên trong bảng. Trường embedding::text sẽ hiển thị dạng [0.12, -0.45, ...] (mảng số). Nếu thấy dữ liệu này, quá trình tạo index đã thành công.
Điều hướng series:
Mục lục: Series: Triển khai Database AI với LlamaIndex và PostgreSQL trên Ubuntu 24.04
« Phần 3: Thiết lập môi trường Python và cài đặt LlamaIndex
Phần 5: Triển khai hệ thống truy vấn RAG với PostgreSQL »