Bỏ qua để đến nội dung
Search & RAG

Search & RAG — Cẩm nang

Tài liệu học tập về retrieval, viết cho việc tối ưu sản phẩm AI Agent thật. Mọi con số trong tài liệu này là số đo thật trên corpus 50 tài liệu tiếng Việt (data/corpus.jsonl) và golden set 24 truy vấn 4 lớp (data/goldenset.jsonl) — không phải số dẫn từ bài báo. Code sinh ra chúng đã được gỡ khỏi repo để repo này thuần tài liệu học; bảng số baseline ở Phụ lục — Lộ trình & baseline.

Toàn bộ là Markdown, không có bước build: file bạn đọc chính là file nguồn. Mỗi mục là một file riêng, có điều hướng ⬅ trước · ⬆ mục lục · sau ➡ ở cuối trang. Chuỗi điều hướng đó đi thẳng từ mục đầu của Phần 1 tới trang cuối của Phụ lục — đọc theo nó là đọc đúng thứ tự.

Mỗi trang có mục Đọc thêm ở cuối, dẫn tới blog/paper/tài liệu gốc cho đúng chủ đề trang đó — ưu tiên nguồn tiếng Việt, kèm nguồn tiếng Anh khi cần bản gốc hoặc bản chặt chẽ hơn. Danh sách nguồn cho phần metrics gom ở Phần 2 — 10. Nguồn tham khảo.

  1. Không đo thì không tối ưu. Mọi thay đổi report trên cùng một golden set.
  2. Mỗi kỹ thuật phải trả giá. Ghi nhận đồng thời: chất lượng, latency, chi phí.
  3. Điểm mù đối xứng. Mỗi phương pháp đều có lớp truy vấn nó thua. Học là học nhận ra lớp đó, không phải học “cái nào tốt nhất”.
  4. Thứ tự ưu tiên đã được đo: dữ liệu & tokenization ≫ kiến trúc ≫ siêu tham số.

Nguyên tắc 1 quyết định thứ tự của cẩm nang: metrics đứng ngay sau nhập môn, trước mọi kỹ thuật. Phần nào cũng giả định bạn đã có thước đo trong tay.

Phần 4 nêu tầng và tóm tắt; phần riêng đào sâu cơ chế. Tầng 3 → Phần 5. Tầng 5 → Phần 6 → Phần 7 (bản hiện thực cụ thể trong một database thật).

Vì vậy bạn sẽ gặp cùng một chủ đề hai lần, ở hai độ sâu khác nhau — đó là chủ ý, không phải trùng lặp. Tầng 3 và Tầng 5 ở lại Phần 4: rút chúng ra thì chuỗi tầng thủng.

PhầnNội dungSố mục
1 — Nhập mônKhông giả định biết gì trước đó. Inverted index và BM25 tính bằng tay trên giấy10
2 — Metricsrecall, nDCG, ý nghĩa thống kê, bảy lỗi phương pháp — thước đo trước, tối ưu sau12
3 — Nền tảng kỹ thuậtBên trong một search engine: postings, fuzzy search, prefix/wildcard, top-k16
4 — Lý thuyết11 tầng của retrieval hiện đại, xếp theo thứ tự phụ thuộc. Tầng 0 và 1 là 80% giá trị12
5 — RerankerĐào sâu Tầng 3: cross-encoder, ColBERT, LLM reranker, chi phí và latency15
6 — Vector index & ANNĐào sâu Tầng 5: quantization vector và ANN đồ thị (HNSW, IVF)2
7 — QdrantMột vector database thật: mô hình dữ liệu, segment, filterable HNSW, vận hành21
8 — Áp vào sản phẩm AI Agent10 việc xếp theo ROI1
Phụ lụcLộ trình & baseline · Sổ tay công thức · Sai số của tài liệu3

Mỗi README của phần liệt kê từng trang trong phần đó. Trang này chỉ nói về phần.

Thứ tự tuyến tính ở trên là mặc định. Bốn trường hợp đáng rẽ ngang:

  • Đang định cắm reranker vào sản phẩm → đọc 5.4 — Trần recall@k trước cả Phần 5. Mục đó trả lời bạn có nên tiêu tiền hay không, trước khi bạn tiêu.
  • Đang vận hành vector database và nghi ngờ mất recall → đọc 7.8 — Filterable HNSW. Đây là chỗ nhiều hệ RAG mất recall âm thầm mà không có lỗi nào báo ra.
  • Cần ra quyết định gấp cho sản phẩm → đọc Phần 8 trước, rồi quay lại tầng tương ứng khi cần.
  • Đã làm RAG nhưng chưa hiểu sâu → đọc 1.3 Ba nhân vật rất dễ lẫn1.9 “Tốt” nghĩa là gì trước khi đi tiếp: rất nhiều người làm RAG lẫn ba loại model, và đo bằng sai metric.

Lý thuyết không thay được việc tự vấp. Làm bài trước khi đọc tầng lý thuyết của nó.

  • data/corpus.jsonl — 50 tài liệu tiếng Việt, 12 chủ đề. Cố tình chứa mã định danh (E2003, POST /v1/transactions, sk_live, AES-256, 99,9%) để lỗi tokenizer lộ ra thay vì im lặng.
  • data/goldenset.jsonl — 24 truy vấn, 4 lớp × 6, relevance có mức (2/1/0). Lớp A lexical/exact · B paraphrase · C multi-hop · D phủ định-abstention.

Đây là golden set mà mọi con số trong cẩm nang được đo trên.

Repo từng có labs/ — code sinh ra các số trong cẩm nang. Đã gỡ để repo thuần tài liệu học. Xem lại khi cần:

git show ada36f4:labs/lab01_lexical/lexical.py
git show ada36f4:labs/common/metrics.py

Nhật ký quá trình và số liệu chi tiết nằm trong dev/ — thư mục làm việc, không được commit vào repo (xem .gitignore). Các con số đã chốt đều được dẫn lại trong docs/, nên bạn không cần dev/ để đọc cẩm nang.