Thu thập và làm sạch dữ liệu văn bản cho RAG
Tạo thư mục dự án và tải dữ liệu mẫu
Chúng ta cần một nơi chứa dữ liệu thô (raw data) để xử lý. Hãy tạo thư mục data trong dự án và chuẩn bị các file PDF, TXT mẫu.
Tại sao: LangChain cần đường dẫn đến file vật lý để đọc nội dung. Việc tổ chức thư mục rõ ràng giúp quy trình ETL (Extract, Transform, Load) dễ bảo trì.
Kết quả mong đợi: Thư mục /opt/rag-app/data được tạo và chứa các file văn bản mẫu.
mkdir -p /opt/rag-app/data
cd /opt/rag-app/data
echo "Đây là tài liệu hướng dẫn về PostgreSQL và Vector Embeddings. PostgreSQL hỗ trợ tìm kiếm vector thông qua tiện ích pgvector." > sample.txt
echo "LangChain là framework giúp xây dựng ứng dụng AI. Nó hỗ trợ nhiều LLM và Embedding models." > sample2.txt
Bạn có thể tải thêm file PDF thật vào thư mục này nếu có. Ở đây tôi tạo file TXT giả lập để đảm bảo script chạy ngay lập tức.
Cài đặt thư viện xử lý file PDF
Để đọc file PDF, Python cần thư viện PyPDF2 hoặc pdfplumber. LangChain đã tích hợp sẵn loader cho PDF, nhưng cần cài đặt driver nền tảng.
Tại sao: Nếu không cài đặt thư viện xử lý PDF, bước tải dữ liệu sẽ báo lỗi ImportError.
Kết quả mong đợi: Thư viện PyPDF2 được cài đặt thành công trong môi trường ảo Python.
cd /opt/rag-app
source venv/bin/activate
pip install PyPDF2 pdfplumber --upgrade
Cấu hình LLM và Embedding Model
Thiết lập biến môi trường cho API Key
Chúng ta cần cấu hình .env để lưu trữ API Key của OpenAI hoặc HuggingFace. Bài này sẽ dùng OpenAI cho Embedding (vì phổ biến và ổn định) và HuggingFace cho LLM (nếu cần local inference), nhưng ở bước chuẩn bị dữ liệu, ta chỉ cần Embedding.
Tại sao: Không bao giờ hardcode API Key vào script. Biến môi trường giúp bảo mật và dễ chuyển đổi giữa môi trường Dev/Prod.
Kết quả mong đợi: File .env được tạo với key OPENAI_API_KEY.
cat > /opt/rag-app/.env
Thay thế your-openai-api-key-here bằng key thật của bạn. Lưu ý: File này đã được thêm vào .gitignore ở phần trước.
Tải Embedding Model từ HuggingFace (Local hoặc Remote)
Để không phụ thuộc vào API trả phí, ta sẽ sử dụng model bge-m3 hoặc All-mpnet-base-v2 từ HuggingFace chạy local trên server này. Đây là model nhẹ, nhanh và hỗ trợ vector 768 chiều.
Tại sao: Chạy local giúp giảm chi phí vận hành và tăng tốc độ khi xử lý lượng lớn dữ liệu so với gọi API bên thứ 3.
Kết quả mong đợi: Model được tải về và cache trong thư mục ~/.cache/huggingface.
cd /opt/rag-app
source venv/bin/activate
pip install sentence-transformers torch --upgrade
Tách nhỏ văn bản (Chunking) và tạo Vector Embeddings
Viết script xử lý dữ liệu (ETL Script)
Chúng ta sẽ viết một script Python process_data.py thực hiện 3 bước: Đọc file -> Tách nhỏ (Chunking) -> Tạo Embedding -> Lưu vào PostgreSQL.
Tại sao: Dữ liệu văn bản dài không thể nhét trực tiếp vào vector DB. Chunking giúp chia nhỏ thành các đoạn có ngữ nghĩa để tìm kiếm chính xác hơn.
Kết quả mong đợi: Script chạy không lỗi, xuất hiện log "Embedding created" và dữ liệu được đẩy vào DB.
Trước khi viết code, hãy đảm bảo bạn đã cài đặt langchain, langchain-community, langchain-openai và psycopg2.
cd /opt/rag-app
source venv/bin/activate
pip install langchain langchain-community langchain-openai psycopg2-binary
Script xử lý hoàn chỉnh: process_data.py
File script này sẽ kết nối PostgreSQL đã cấu hình ở Phần 2, tải dữ liệu từ thư mục data, chia nhỏ với kích thước 512 tokens và độ lặp lại 50, sau đó chuyển đổi thành vector và lưu vào bảng documents.
cat > /opt/rag-app/process_data.py
Chạy script để xử lý dữ liệu. Đảm bảo PostgreSQL đang chạy và user có quyền truy cập.
cd /opt/rag-app
source venv/bin/activate
python process_data.py
Kết quả mong đợi: Terminal hiển thị log "Created X chunks" và "Data processing completed successfully". Không có lỗi ConnectionError hay ImportError.
Verify kết quả
Kiểm tra số lượng bản ghi trong PostgreSQL
Chúng ta sẽ truy xuất trực tiếp vào bảng documents của PGVector để xác nhận dữ liệu đã được lưu dưới dạng vector.
Tại sao: PGVector lưu dữ liệu văn bản trong cột page_content và vector trong cột embedding (kiểu vector). Kiểm tra này xác nhận pipeline hoạt động.
Kết quả mong đợi: Trả về số lượng dòng > 0.
psql -h localhost -U ai_user -d ai_rag_db -c "SELECT COUNT(*) FROM documents;"
Khi được yêu cầu nhập password, hãy gõ password của user ai_user.
Kiểm tra nội dung vector
Để chắc chắn vector đã được tạo, hãy chọn một dòng mẫu và kiểm tra chiều dài của vector (nên là 384 cho model all-MiniLM-L6-v2).
Tại sao: Đảm bảo không chỉ lưu text mà cả vector đã được tính toán đúng chuẩn.
Kết quả mong đợi: Trả về một bản ghi với page_content là đoạn văn bản và embedding là mảng số.
psql -h localhost -U ai_user -d ai_rag_db -c "SELECT id, page_content, vector_dims(embedding) as dim FROM documents LIMIT 1;"
Bạn sẽ thấy giá trị dim là 384 (hoặc 768 tùy model), chứng tỏ bước tạo embedding thành công.
Điều hướng series:
Mục lục: Series: Triển khai Database AI với LangChain, PostgreSQL và Ubuntu 24.04
« Phần 3: Xây dựng môi trường phát triển LangChain với Python
Phần 5: Triển khai ứng dụng RAG với LangChain và PostgreSQL »