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

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.

Người dùng muốnVí dụCấu trúcMục
Khớp chính xác một mãE2003, sk_live_xinverted index, không phân tích, không fuzzy3.1, 3.7
Có/không chứa từ, kèm lọcstatus=active AND "mật khẩu"boolean + filter3.2
Ranking theo mức liên quan“làm sao đổi mật khẩu”BM25 trên inverted index3.4
Đúng cụm từ, đúng thứ tự"xác thực hai lớp"positional index, hoặc bigram term3.5
Gõ dở, gợi ý ngaymat kh…trie/FST prefix + xếp theo độ phổ biến3.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ảuLevenshtein automaton (k≤2) hoặc trigram3.8, 3.9
Gõ không dấumat khauchuẩn hoá bỏ dấu, không phải fuzzy3.10
Viết teencodeko doi dc mktừ điển ánh xạ phía truy vấn3.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 + ANNTầ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 retrievalTầng 9
Câu trả lời có dẫn nguồn“theo chính sách nào?”retrieval + context assemblyTầng 8
Nhu cầuPostgresElasticsearch / OpenSearchSQLite
Full-text + BM25tsvector + GINmặc địnhFTS5
Prefix / typeaheadbtree text_pattern_opsedge_ngram, search_as_you_typeFTS5 term*
Substring %x%pg_trgm + GINwildcard field— (phải tự làm)
Fuzzypg_trgm / levenshtein() (fuzzystrmatch)fuzziness (k≤2)spellfix1
Cụm từphraseto_tsquery, <->match_phrase + slopFTS5 "a b"
Bỏ dấuunaccentasciifolding filtertự chuẩn hoá trước khi ghi
Vectorpgvector (HNSW)dense_vector + kNNsqlite-vec
Hybrid lexical+vectortự trộn (Tầng 2)RRF dựng sẵntự 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ệcTác động đã đo
1Sửa tokenizer để không ăn mất định danh+20,8% (lớp A)
2Quyết định bỏ dấu dựa trên p thậttránh sập −15,5% khi truy vấn mất dấu
3Giữ nguyên stopwordtránh mất −11% (lớp B)
4Tinh 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).

Phần 3 — Nền tảng kỹ thuật