3.14 Bảng chọn: nhu cầu nào dùng cấu trúc nào
Mục tra cứu. Mỗi dòng là một nhu cầu thật, đọc từ phía người dùng.
Bảng chính
Phần tiêu đề “Bảng chính”| Người dùng muốn | Ví dụ | Cấu trúc | Mục |
|---|---|---|---|
| Khớp chính xác một mã | E2003, sk_live_x | inverted index, không phân tích, không fuzzy | 3.1, 3.7 |
| Có/không chứa từ, kèm lọc | status=active AND "mật khẩu" | boolean + filter | 3.2 |
| Ranking theo mức liên quan | “làm sao đổi mật khẩu” | BM25 trên inverted index | 3.4 |
| Đúng cụm từ, đúng thứ tự | "xác thực hai lớp" | positional index, hoặc bigram term | 3.5 |
| Gõ dở, gợi ý ngay | mat kh… | trie/FST prefix + xếp theo độ phổ biến | 3.6, 3.11 |
| Tìm chuỗi con bất kỳ | %at kha% | trigram index (GIN + pg_trgm) | 3.6 |
| Gõ sai một hai ký tự | mật khảu | Levenshtein automaton (k≤2) hoặc trigram | 3.8, 3.9 |
| Gõ không dấu | mat khau | chuẩn hoá bỏ dấu, không phải fuzzy | 3.10 |
| Viết teencode | ko doi dc mk | từ điển ánh xạ phía truy vấn | 3.10 |
| Diễn đạt khác hẳn từ trong tài liệu | “quên cách vào app” ↔ “khôi phục truy cập” | embedding + ANN | Tầng 1, Tầng 5 |
| Câu hỏi cần ghép nhiều tài liệu | “so sánh gói A và gói B” | multi-hop / agentic retrieval | Tầng 9 |
| Câu trả lời có dẫn nguồn | “theo chính sách nào?” | retrieval + context assembly | Tầng 8 |
Ánh xạ sang công cụ
Phần tiêu đề “Ánh xạ sang công cụ”| Nhu cầu | Postgres | Elasticsearch / OpenSearch | SQLite |
|---|---|---|---|
| Full-text + BM25 | tsvector + GIN | mặc định | FTS5 |
| Prefix / typeahead | btree text_pattern_ops | edge_ngram, search_as_you_type | FTS5 term* |
Substring %x% | pg_trgm + GIN | wildcard field | — (phải tự làm) |
| Fuzzy | pg_trgm / levenshtein() (fuzzystrmatch) | fuzziness (k≤2) | spellfix1 |
| Cụm từ | phraseto_tsquery, <-> | match_phrase + slop | FTS5 "a b" |
| Bỏ dấu | unaccent | asciifolding filter | tự chuẩn hoá trước khi ghi |
| Vector | pgvector (HNSW) | dense_vector + kNN | sqlite-vec |
| Hybrid lexical+vector | tự trộn (Tầng 2) | RRF dựng sẵn | tự trộn |
Nếu đã có Postgres và corpus dưới vài triệu chunk: tsvector + pg_trgm +
pgvector phủ được toàn bộ bảng trên, trong một transaction, không thêm hệ thống mới.
Chi phí vận hành của việc này thường thấp hơn giá trị của các tính năng nâng cao mà
Elasticsearch mang lại — hãy chắc là bạn cần chúng trước khi thêm một cluster.
Thứ tự sửa, xếp theo lợi/chi phí đo được
Phần tiêu đề “Thứ tự sửa, xếp theo lợi/chi phí đo được”Từ số đo trên golden set của cẩm nang:
| # | Việc | Tác động đã đo |
|---|---|---|
| 1 | Sửa tokenizer để không ăn mất định danh | +20,8% (lớp A) |
| 2 | Quyết định bỏ dấu dựa trên p thật | tránh sập −15,5% khi truy vấn mất dấu |
| 3 | Giữ nguyên stopword | tránh mất −11% (lớp B) |
| 4 | Tinh chỉnh k1, b | +2,4% |
| 5 | Đổi TF-IDF → BM25 | +1,2% |
Đọc bảng này theo chiều dọc: bốn việc đầu đều là quyết định về dữ liệu và tiền xử lý, không phải về thuật toán ranking. Đó là bài học đắt nhất của cả Phần 3. Chỉ khi đã xong năm dòng trên thì thêm embedding và reranking mới đáng đồng tiền (Phần 8 xếp toàn bộ theo ROI).