[DE Blog #16] Data Engineering Cho Kỷ Nguyên GenAI: Xây Dựng RAG Pipeline Quy Mô Lớn & Giải Mã Vector Databases (HNSW vs. IVFFlat)
![[DE Blog #16] Data Engineering Cho Kỷ Nguyên GenAI: Xây Dựng RAG Pipeline Quy Mô Lớn & Giải Mã Vector Databases (HNSW vs. IVFFlat)](/uploads/ai-images/cover-data-engineering-genai-rag.png)
1. Bối cảnh thực tế (Context & Problem Statement)
Trong làn sóng Generative AI và Large Language Models (LLMs), hiện tượng "Ảo giác" (Hallucination) và việc thiếu hụt dữ liệu nội bộ doanh nghiệp là rào cản lớn nhất. Kiến trúc RAG (Retrieval-Augmented Generation) ra đời để giải quyết vấn đề này: Khi người dùng đặt câu hỏi, hệ thống sẽ truy xuất các đoạn văn bản liên quan nhất từ kho dữ liệu nội bộ và nạp vào làm ngữ cảnh (Context) cho LLM trả lời.
Nhiều người lầm tưởng RAG là công việc của AI/ML Engineer. Tuy nhiên, 80% sự thành bại của một hệ thống RAG quy mô lớn nằm ở tầng Data Engineering:
- Làm thế nào để tự động hóa pipeline ingest hàng triệu tài liệu phi cấu trúc (PDF, Word, Confluence, Web) từ Data Lake?
- Làm thế nào để chia đoạn (Chunking), sinh Vector Embeddings, lưu trữ và tìm kiếm vector tương đồng với độ trễ trên hàng trăm triệu vectors?
- Làm thế nào để đồng bộ hóa tức thì khi tài liệu gốc bị sửa đổi hoặc xóa bỏ?
2. Các Khái Niệm & Cơ Chế Cốt Lõi
2.1. Vòng Đời Của Một RAG Data Pipeline (End-to-End Flow)
[Unstructured Sources: S3 / Lakehouse / Drive]
|
v
[1. Parsing & Document Extraction] (OCR, Unstructured.io)
|
v
[2. Smart Chunking Strategies] (Semantic / Recursive)
|
v
[3. Embedding Generation Pipeline] (Spark + GPU / Batch API)
|
v
+-------------------------------------------------------------+
| 4. VECTOR DATABASE & HYBRID STORAGE ENGINE |
| - Vector Index: HNSW / IVFFlat |
| - Metadata Storage & Inverted Index: BM25 / Sparse Tokens |
| (Milvus / Qdrant / Pinecone / pgvector) |
+------------------------------+------------------------------+
|
v
[5. Hybrid Retrieval + RRF Re-ranking] ---> [Context to LLM]
2.2. Các Chiến Lược Phân Đoạn Văn Bản (Chunking Strategies)
- Fixed-size Chunking with Overlap: Cắt cố định ký tự/tokens kèm khoảng gối đầu (ví dụ: Chunk size tokens, Overlap tokens để tránh đứt gãy ngữ cảnh giữa các câu).
- Structure-aware / Recursive Chunking: Cắt nhỏ dựa trên cấu trúc tự nhiên của tài liệu (theo tiêu đề H1/H2/H3, đoạn văn
\n\n, dấu chấm câu). - Semantic Chunking: Đo khoảng cách ngữ nghĩa giữa các câu liên tiếp bằng Embedding model; chỉ tách sang chunk mới khi sự chuyển đổi ngữ nghĩa vượt qua một ngưỡng (Threshold) xác định.
2.3. Bản Chất Toán Học Của Vector Distance Metrics
Vector Embedding là một mảng số thực nhiều chiều (ví dụ 1536 chiều với OpenAI text-embedding-3-small). Ba độ đo khoảng cách phổ biến:
- Cosine Similarity: Đo góc giữa 2 vector (), không phụ thuộc vào độ dài vector. Rất tối ưu cho so sánh ngữ nghĩa văn bản.
- Euclidean Distance ( Distance): Đo khoảng cách hình học thẳng ().
- Dot Product (Inner Product): . Nếu các vector đã được chuẩn hóa độ dài (-normalized), Dot Product tương đương với Cosine Similarity nhưng tính toán nhanh hơn nhiều.
2.4. Các Thuật Toán Lập Chỉ Mục Vector (ANN - Approximate Nearest Neighbor)
Tìm kiếm chính xác (-Nearest Neighbors) đòi hỏi phải so sánh vector truy vấn với toàn bộ hàng triệu vector trong cơ sở dữ liệu ( - rất chậm). Vì vậy, các Vector DB sử dụng thuật toán tìm kiếm xấp xỉ (ANN):
- IVFFlat (Inverted File Flat): Sử dụng thuật toán -Means để chia không gian vector thành cụm (Voronoi Cells). Khi tìm kiếm, chỉ cần quét các vector nằm trong các cụm gần nhất.
- Đặc điểm: Tốc độ build index nhanh, tốn ít RAM, nhưng độ chính xác (Recall) trung bình.
- HNSW (Hierarchical Navigable Small World): Xây dựng một đồ thị phân lớp đa tầng (tương tự cấu trúc Skip-List).
- Tầng trên cùng: Các cạnh dài để nhảy xa nhanh chóng qua các vùng không gian lớn.
- Tầng dưới cùng: Đồ thị dày đặc các cạnh ngắn để tìm kiếm cục bộ chính xác.
- Đặc điểm: Tốc độ truy vấn siêu nhanh và độ chính xác (Recall) cao nhất hiện nay, nhưng tốn nhiều bộ nhớ RAM hơn để duy trì đồ thị.
- Product Quantization (PQ): Kỹ thuật nén vector bằng cách chia vector thành các vector con và lượng tử hóa, giúp giảm 80%–95% dung lượng RAM cần thiết để lưu trữ hàng tỷ vector.
2.5. Hybrid Search (Dense Vector + Sparse BM25) & Reciprocal Rank Fusion (RRF)
- Vấn đề của Dense Vector Search: Rất giỏi hiểu ngữ nghĩa trừu tượng, nhưng rất kém khi tìm kiếm chính xác các từ khóa đặc thù (Mã lỗi kỹ thuật
ERR_502_TIMEOUT, Tên mã sản phẩmSKU-8899, Tên riêng). - Giải pháp Hybrid Search:
- Luồng 1: Chạy Dense Retrieval (Vector HNSW) để lấy ngữ nghĩa.
- Luồng 2: Chạy Sparse Retrieval (BM25 / Keyword Search) để lấy từ khóa chính xác.
- Kết hợp điểm số bằng thuật toán Reciprocal Rank Fusion (RRF):
3. Các Bảng Markdown So Sánh Chi Tiết
📊 Bảng 1: So Sánh Các Thuật Toán Lập Chỉ Mục Vector (ANN)
| Thuật toán Index | Cơ chế cốt lõi | Tốc độ Query (QPS) | Độ chính xác (Recall) | Bộ nhớ RAM yêu cầu | Thời gian Build Index |
|---|---|---|---|---|---|
| Flat (Exact KNN) | Quét tuần tự toàn bộ () | Rất chậm | Tuyệt đối (100%) | Thấp (chỉ lưu vector thô) | Bằng 0 (Không cần build) |
| IVFFlat | Phân cụm -Means Voronoi | Trung bình | Khá () | Thấp / Vừa phải | Nhanh |
| HNSW | Đồ thị phân tầng đa lớp (Skip-Graph) | Cực nhanh () | Xuất sắc () | Cao (Lưu thêm cấu trúc đồ thị) | Lâu hơn |
| IVF-PQ (Quantized) | Nén vector thành mã đại diện | Nhanh | Trung bình () | Siêu tiết kiệm (giảm 80%) | Lâu (cần train quantizer) |
📊 Bảng 2: So Sánh Dedicated Vector DB vs. PostgreSQL pgvector
| Tiêu chí | Dedicated Vector DB (Milvus, Qdrant, Pinecone) | Relational Extension (PostgreSQL + pgvector) |
|---|---|---|
| Quy mô Vector tối đa | Hàng chục triệu đến hàng tỷ vectors phân tán | Thích hợp cho quy mô vectors |
| Hỗ trợ Indexing | HNSW, IVF-PQ, DiskANN, SCaNN được tối ưu hóa C++/Rust | HNSW, IVFFlat (chạy trên engine của Postgres) |
| Metadata Filtering | Lọc metadata kết hợp vector cực nhanh trong 1 chu kỳ | Tận dụng toàn bộ sức mạnh SQL JOIN/Filter của Postgres |
| Độ phức tạp vận hành | Cần duy trì một cụm cluster riêng biệt | Rất đơn giản (Tận dụng ngay Postgres DB có sẵn) |
| Chi phí hạ tầng | Cao hơn (Cần node RAM/SSD lớn) | Thấp (Dùng chung DB của ứng dụng) |
| Khuyến nghị sử dụng | Doanh nghiệp lớn, RAG chuyên sâu, khối lượng dữ liệu khổng lồ | Giai đoạn MVP / Startup, hệ thống có documents |
📊 Bảng 3: So Sánh Các Độ Đo Khoảng Cách Vector (Distance Metrics)
| Độ đo (Metric) | Công thức | Dải giá trị | Ứng dụng tối ưu |
|---|---|---|---|
| Cosine Similarity | (1: trùng khớp, 0: trực giao, -1: đối lập) | So sánh ngữ nghĩa văn bản, tài liệu dài ngắn khác nhau | |
| Dot Product | Tìm kiếm khi các vector đã được -normalized | ||
| Euclidean () | (0: trùng khớp tuyệt đối) | Xử lý ảnh (Computer Vision), Dữ liệu định lượng vị trí |
4. Best Practices & Tối Ưu Hóa RAG Data Pipeline (Pro-Tips)
💡 Xử lý Embedding Batching trên Apache Spark
- Vấn đề: Gửi từng câu đơn lẻ lên API ngoài (OpenAI/Cohere) để lấy embedding sẽ bị nghẽn mạng và vượt giới hạn Rate Limit (
429 Too Many Requests). - Giải pháp: Sử dụng Spark để gom batch chunks, sử dụng thư viện
asynciohoặc chạy mô hình Embedding mã nguồn mở (như BGE-large, E5) trực tiếp trên các worker nodes có gắn GPU thông qua Pandas UDF (Vectorized UDF):
from pyspark.sql.functions import pandas_udf
import pandas as pd
@pandas_udf("array<float>")
def generate_embeddings_udf(texts: pd.Series) -> pd.Series:
# Tận dụng mô hình nạp sẵn trên GPU của Worker để encode cả Series:
embeddings = local_model.encode(texts.tolist(), batch_size=64)
return pd.Series(embeddings.tolist())
💡 Chiến lược Đồng Bộ Hóa (CDC Sync) từ Lakehouse sang Vector DB
- Khi một văn bản trong Data Lakehouse bị sửa đổi hoặc xóa (GDPR):
- Gán cho mỗi Chunk một ID có tính xác định:
chunk_id = MD5(doc_id + "_" + chunk_index). - Lưu metadata
doc_id,updated_at,chunk_idcùng với Vector trong Vector DB. - Khi có sự kiện CDC
DELETEtài liệu từ nguồn, thực hiện lệnhdelete_by_metadata(filter={"doc_id": "X"})trên Vector DB mà không cần quét lại toàn bộ kho dữ liệu.
- Gán cho mỗi Chunk một ID có tính xác định:
5. Góc Ôn Luyện Phỏng Vấn (Interview Corner)
❓ Câu hỏi 1: Giải thích cơ chế hoạt động của thuật toán HNSW (Hierarchical Navigable Small World). Tại sao nó lại là thuật toán lập chỉ mục vector được ưa chuộng nhất hiện nay?
- Gợi ý trả lời:
- Cấu trúc phân lớp (Multi-layer Graph):
- HNSW lấy cảm hứng từ cấu trúc dữ liệu Skip-List áp dụng lên đồ thị.
- Đồ thị được chia thành nhiều tầng (từ Tầng lên Tầng ). Tầng trên cùng có rất ít node với các liên kết dài; càng xuống các tầng dưới, số lượng node càng dày đặc với các liên kết ngắn cục bộ.
- Quy trình tìm kiếm (Greedy Search):
- Bắt đầu từ một Entry Point ở tầng cao nhất, thuật toán duyệt qua các node lân cận để tìm node gần vector truy vấn nhất.
- Khi không tìm được node nào gần hơn ở tầng hiện tại, thuật toán "nhảy xuống" tầng tiếp theo bên dưới tại vị trí node đó.
- Quá trình lặp lại cho đến Tầng – nơi tập trung toàn bộ các node – để thực hiện tìm kiếm cục bộ chính xác các điểm -Nearest Neighbors.
- Lý do vượt trội:
- Giảm độ phức tạp tìm kiếm từ xuống .
- Đạt độ chính xác (Recall) cực cao () với độ trễ tính bằng mili-giây, vượt trội hoàn toàn so với IVFFlat.
- Cấu trúc phân lớp (Multi-layer Graph):
❓ Câu hỏi 2: Hybrid Search là gì? Tại sao chỉ sử dụng Dense Vector Search thôi là chưa đủ trong các hệ thống RAG doanh nghiệp?
- Gợi ý trả lời:
- Hạn chế của Dense Vector Search:
- Vector Embeddings nén toàn bộ ngữ nghĩa của câu vào một không gian vector liên tục. Điều này khiến nó làm rất tốt việc tìm các từ đồng nghĩa hoặc ý nghĩa tương tự, nhưng bị "mù" trước các từ khóa chính xác, thuật ngữ viết tắt, mã lỗi, tên biến hoặc các con số cụ thể.
- Bản chất của Hybrid Search:
- Kết hợp cả hai phương pháp tìm kiếm bổ trợ cho nhau:
- Dense Retrieval (Semantic Search): Bắt trọn ý định trừu tượng và ngữ cảnh người dùng.
- Sparse Retrieval (Lexical / BM25 Search): Khớp chính xác các từ khóa đặc thù (Exact Keywords).
- Kết hợp cả hai phương pháp tìm kiếm bổ trợ cho nhau:
- Hợp nhất kết quả bằng RRF (Reciprocal Rank Fusion):
- Không cộng điểm trực tiếp (vì dải điểm của Vector distance và BM25 khác nhau), RRF sử dụng thứ hạng (Ranks) của tài liệu trong từng danh sách kết quả để tính điểm tổng hợp, đưa các tài liệu xuất hiện ở thứ hạng cao trên cả hai luồng lên vị trí đầu tiên.
- Hạn chế của Dense Vector Search:
❓ Câu hỏi 3: Khi triển khai Vector Search trên tập dữ liệu hàng chục triệu bản ghi có kèm điều kiện lọc Metadata (ví dụ: category = 'finance' AND year = 2026), Single-Stage Filtering (Filtered HNSW) tối ưu hơn Pre-Filtering và Post-Filtering như thế nào?
- Gợi ý trả lời:
- Pre-Filtering (Lọc trước): Lọc theo metadata trước Tập kết quả còn lại quá nhỏ hoặc bị phân tán, khiến cấu trúc đồ thị HNSW bị đứt gãy, không thể duyệt đồ thị hiệu quả.
- Post-Filtering (Lọc sau): Chạy HNSW tìm ra Top vectors gần nhất Sau đó mới áp dụng bộ lọc metadata. Nếu bộ lọc quá chặt (ví dụ chỉ có tài liệu khớp
category='finance'), Top tìm được có thể không chứa tài liệu nào khớp metadata Trả về kết quả rỗng! - Single-Stage / Iterative Filtering (Filtered HNSW):
- Tích hợp bộ lọc metadata trực tiếp vào quá trình duyệt đồ thị HNSW. Khi thuật toán nhảy qua các node lân cận, nó kiểm tra điều kiện metadata song song và chỉ thêm các node thỏa mãn vào danh sách ứng viên (Candidate Pool) cho đến khi gom đủ Top kết quả mong muốn.
6. Tóm Tắt Ghi Nhớ Nhanh (Key Takeaways)
- RAG Data Pipeline đòi hỏi kỹ năng Data Engineering vững chắc: Document Parsing Smart Chunking Batch Embedding Vector Indexing.
- HNSW là thuật toán Vector Indexing tiêu chuẩn vàng (Tốc độ , Recall ).
- Hybrid Search (Dense Vector + Sparse BM25) kết hợp RRF là bắt buộc cho hệ thống RAG doanh nghiệp để vừa hiểu ngữ nghĩa vừa bắt chính xác từ khóa.
- Quản lý vòng đời Vector bằng Deterministic Chunk IDs kết hợp CDC Sync để cập nhật và xóa dữ liệu kịp thời.