1. Thu thập và làm sạch tài liệu nguồn (Data Ingestion & Cleaning)
Bước đầu tiên là chuẩn bị kho dữ liệu thô từ các định dạng nội bộ (PDF, TXT, Markdown). Chúng ta sẽ sử dụng thư viện LangChain kết hợp với PyPDF2 để trích xuất văn bản, đồng thời lọc bỏ các phần tử không cần thiết như header, footer, hoặc ký tự đặc biệt gây nhiễu cho model.
Tạo thư mục chứa dữ liệu nguồn tại /opt/rag/data/raw và đảm bảo quyền truy cập cho user root hoặc developer.
mkdir -p /opt/rag/data/raw
chmod 755 /opt/rag/data/raw
Kết quả: Thư mục được tạo, sẵn sàng để copy các file tài liệu vào.
Viết script Python để đọc và làm sạch dữ liệu. Script này sẽ loại bỏ khoảng trắng thừa, ký tự đặc biệt, và chuẩn hóa định dạng text trước khi đưa vào bước xử lý tiếp theo.
cat > /opt/rag/scripts/ingest_and_clean.py 10: # Lọc trang trống
doc.page_content = clean_content
documents.append(doc)
print(f"[INFO] Processed PDF: {os.path.basename(pdf_file)}")
except Exception as e:
print(f"[ERROR] Failed to read {pdf_file}: {e}")
# Xử lý TXT
txt_files = glob.glob(os.path.join(RAW_DIR, "*.txt"))
for txt_file in txt_files:
try:
loader = TextLoader(txt_file)
doc = loader.load()[0]
clean_content = clean_text(doc.page_content)
doc.page_content = clean_content
documents.append(doc)
print(f"[INFO] Processed TXT: {os.path.basename(txt_file)}")
except Exception as e:
print(f"[ERROR] Failed to read {txt_file}: {e}")
# Xử lý Markdown
md_files = glob.glob(os.path.join(RAW_DIR, "*.md"))
for md_file in md_files:
try:
loader = TextLoader(md_file)
doc = loader.load()[0]
clean_content = clean_text(doc.page_content)
doc.page_content = clean_content
documents.append(doc)
print(f"[INFO] Processed MD: {os.path.basename(md_file)}")
except Exception as e:
print(f"[ERROR] Failed to read {md_file}: {e}")
# Lưu kết quả làm sạch ra file JSONL để kiểm tra
output_file = os.path.join(CLEANED_DIR, "cleaned_documents.jsonl")
with open(output_file, "w", encoding="utf-8") as f:
for doc in documents:
f.write(doc.page_content + "\n")
print(f"[SUCCESS] Total documents processed: {len(documents)}")
print(f"[SUCCESS] Output saved to: {output_file}")
if __name__ == "__main__":
process_files()
EOF
Chạy script để xử lý dữ liệu. Đảm bảo đã cài đặt langchain, langchain-community, và PyPDF2 trong môi trường Python.
cd /opt/rag/scripts && python ingest_and_clean.py
Kết quả mong đợi: Script in ra số lượng file đã xử lý và tạo file /opt/rag/data/processed/cleaned_documents.jsonl chứa nội dung văn bản đã làm sạch.
Verify kết quả bằng cách xem 10 dòng đầu của file đã xử lý.
head -n 10 /opt/rag/data/processed/cleaned_documents.jsonl
2. Cấu hình pipeline Chunking và Text Splitting
Sau khi làm sạch, văn bản dài cần được cắt nhỏ (chunking) để phù hợp với cửa sổ ngữ cảnh (context window) của LLM và tối ưu hóa việc tìm kiếm vector. Chúng ta sử dụng RecursiveCharacterTextSplitter để chia văn bản dựa trên các dấu ngắt tự nhiên như xuống dòng, dấu chấm, dấu phẩy.
Viết script phân mảnh văn bản với tham số chunk_size (độ dài mỗi chunk) và chunk_overlap (phần trùng lặp để giữ ngữ cảnh). Giá trị phổ biến cho LLM hiện đại là chunk_size=1024 và overlap=200.
cat > /opt/rag/scripts/chunking_pipeline.py
Chạy script để thực hiện việc chia nhỏ văn bản.
cd /opt/rag/scripts && python chunking_pipeline.py
Kết quả mong đợi: Tạo file /opt/rag/data/chunked/chunks.jsonl chứa các đoạn văn bản ngắn hơn, kèm theo ID và metadata.
Verify kết quả bằng cách kiểm tra số lượng chunks và nội dung của một chunk mẫu.
wc -l /opt/rag/data/chunked/chunks.jsonl
head -n 1 /opt/rag/data/chunked/chunks.jsonl | python -m json.tool
3. Sử dụng Embedding Model để chuyển đổi văn bản thành vector
Đến bước cuối cùng của pipeline dữ liệu, chúng ta cần chuyển đổi các chunk văn bản thành các vector số (embeddings) để VectorDB có thể lưu trữ và tìm kiếm. Chúng ta sẽ sử dụng model all-MiniLM-L6-v2 từ Hugging Face vì nó cân bằng tốt giữa tốc độ và độ chính xác cho tiếng Việt.
Chạy script embedding. Script này sẽ đọc file chunks, gọi model để tạo vector, và lưu kết quả dưới dạng file JSONL với trường embedding là danh sách số float.
cat > /opt/rag/scripts/generate_embeddings.py
Chạy script để tạo embeddings. Lưu ý: Lần chạy đầu tiên sẽ tải model từ Hugging Face về cache, có thể mất vài phút.
cd /opt/rag/scripts && python generate_embeddings.py
Kết quả mong đợi: Script in ra log tiến độ và tạo file /opt/rag/data/embedded_documents.jsonl chứa dữ liệu đã có trường embedding.
Verify kết quả bằng cách kiểm tra một dòng trong file output để đảm bảo trường embedding tồn tại và là mảng số.
head -n 1 /opt/rag/data/embedded_documents.jsonl | python -m json.tool
Kiểm tra kích thước file để đảm bảo quá trình hoàn tất.
ls -lh /opt/rag/data/embedded_documents.jsonl
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Private LLM với vLLM, RAG và VectorDB trên hạ tầng Kubernetes
« Phần 2: Triển khai Vector Database với Milvus hoặc ChromaDB trên Kubernetes
Phần 4: Đưa dữ liệu vào VectorDB và kiểm tra truy vấn »