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

7.21 Bảng quyết định

Mục tra cứu. Đọc sau khi đã đi qua Phần 7 ít nhất một lần — các dòng dưới đây là kết luận, và lý do của chúng nằm ở các mục được dẫn link.

A. Thứ tự chẩn đoán khi hệ chậm hoặc kém

Phần tiêu đề “A. Thứ tự chẩn đoán khi hệ chậm hoặc kém”

Làm theo thứ tự. Mỗi bước rẻ hơn bước sau, và mỗi bước loại trừ một lớp nguyên nhân. Nhảy cóc là cách tốt nhất để tối ưu sai chỗ.

#Câu hỏiCách kiểmNếu “có” thì đọc
1Chất lượng có tệ cả khi không dùng ANN không?Chạy lại với exact: true5.4 — bệnh nằm ở embedding/chunking, không nằm ở Qdrant
2Chất lượng chỉ tệ khi có filter?Đo bộ bốn số (a)(b)(c)(d)7.8 — filterable HNSW
3Có payload index cho mọi trường lọc không, và tạo trước khi nạp dữ liệu?GET /collections/{name}7.9
4Có nhiều điểm chưa được index không?points_countindexed_vectors_count7.6 — optimizer không đuổi kịp
5Collection có xanh không?Trạng thái collection7.2, 7.6
6Dữ liệu nóng có vừa RAM không?So với công thức n × dim × 4 × 1,57.18, 7.10
7Quantization có đang ăn mất recall không?So với quantization: {ignore: true}7.10
8Kết quả có “nhấp nháy” giữa các lần gọi không?Gọi lại nhiều lần cùng truy vấn7.16 — read affinity
9Fusion có nằm trong prefetch trên cụm nhiều shard không?Đọc lại request7.12 — fusion theo từng shard

Bước 1 và bước 2 giải quyết phần lớn các trường hợp, và cả hai đều làm được trong một buổi.

Tình huống của bạnCấu hình xuất phát
Dưới ~1 triệu vector, một node, RAM dưMặc định hết. Chỉ tạo payload index cho trường lọc. Đừng tối ưu sớm
RAM chật, chất lượng phải giữdatatype: float16 trước. Nếu chưa đủ: vector gốc cold + bản nén pinned + inline storage (7.10)
Dữ liệu lớn hơn RAM nhiều lầnmemory: cold cho vector và HNSW, m: 64 / ef_construct: 512, bật inline storage, đo IOPS đĩa bằng fio trước
Ghi liên tục, truy vấn phải ổn địnhprevent_unoptimized + wait=false (7.6)
Cần latency thấp cho từng truy vấndefault_segment_number = số nhân CPU (7.6)
Cần throughput cao, nhiều truy vấn song songÍt segment lớn (default_segment_number: 2, max_segment_size lớn)
Nhiều khách hàng nhỏMột collection + payload partitioning + is_tenant: true (7.17)
Như trên, và mọi truy vấn đều lọc theo tenantThêm m: 0 + payload_m: 16 — tiết kiệm RAM rất nhiều
Nhiều khách nhỏ + vài khách rất lớnTiered multitenancy (v1.16+)
Dữ liệu có vòng đời, xoá theo thángsharding_method: "custom", mỗi tháng một shard key (7.15)
Hệ quan trọng, không được mất dữ liệureplication_factor ≥ 2, snapshot mọi node lên S3, đã diễn tập phục hồi
Xây index quá lâuGPU indexing (v1.13+), hoặc giảm max_segment_size
Bạn cóChọn
Golden set, tách được train/valRRF có trọng số, chỉnh trên train
Không có golden set, tin vào điểm số của hai nhánhDBSF
Không có gì cảRRF thuần — mặc định an toàn
Điểm số hay có ngoại laiRRF (DBSF nhạy với ngoại lai)
Cụm nhiều shardĐảm bảo fusiontruy vấn chính, không nằm trong prefetch

Chi tiết: 7.12.

D. Núm nào đổi được lúc chạy, núm nào không

Phần tiêu đề “D. Núm nào đổi được lúc chạy, núm nào không”

Bảng này tiết kiệm cho bạn nhiều lần nạp lại dữ liệu:

Đổi lúc chạy đượcPhải dựng lại indexPhải tạo collection mới
hnsw_ef (ef khi truy vấn)mSố chiều vector
oversampling, rescoreef_constructKhoảng cách (Cosine/Dot/…)
consistency, ordering, waitpayload_mshard_number (bản tự host)
optimizers_config, memory tierPayload index tạo sau khi nạp dữ liệusharding_method
quantization_config
replication_factor
Thêm/xoá named vector (v1.18+)

Cột giữa có một lối tắt: tăng ef_construct lên 1 để buộc Qdrant dựng lại HNSW (7.7).

Xếp theo tần suất, không theo mức nghiêm trọng:

  1. Tạo payload index sau khi nạp dữ liệu. Cạnh phụ trong HNSW không tồn tại và cả cơ chế filterable HNSW im lặng không hoạt động → 7.8
  2. Đo recall khi không filter, rồi chạy production luôn có filter.7.8
  3. Bật quantization mà vẫn giữ vector gốc trong RAM, rồi ngạc nhiên vì RAM tăng. → 7.10
  4. Hiểu indexing_threshold là số điểm thay vì kilobyte (1 KB ≈ 1 vector 256 chiều). → 7.4
  5. Mỗi khách hàng một collection.7.17
  6. replication_factor: 1 trên production, tưởng đã có HA. → 7.15
  7. Phục hồi snapshot mà quên priority: "snapshot", nhận về collection rỗng và tưởng snapshot hỏng. → 7.19
  8. Lọc trên mảng object mà không dùng nested. Kết quả lỏng hơn bạn nghĩ, và không có lỗi nào. → 7.13
  9. fusion nằm trong prefetch trên cụm nhiều shard. Chạy đúng lúc dev một shard, đổi hành vi khi lên production. → 7.12
  10. Không đặt api_key.7.20

Thứ tự làm, để có một hệ Qdrant lành mạnh trong một ngày:

Sáng
1. Liệt kê mọi trường sẽ xuất hiện trong filter → tạo payload index cho tất cả
2. Tạo collection: chốt số chiều, khoảng cách, shard_number (nghĩ kỹ, không sửa được)
3. Nạp 10% dữ liệu thật. Đo RAM và đĩa. Ngoại suy.
Chiều
4. Đo bộ bốn số (a)(b)(c)(d) của 7.8 trên golden set của bạn
5. Nếu (c) ≫ (d): sửa theo 7.8 trước khi làm bất cứ thứ gì khác
6. Đặt api_key + read_only_api_key. Bind vào network riêng.
Cuối ngày
7. Bật replication_factor ≥ 2
8. Dựng cảnh báo trên (points_count − indexed_vectors_count)
9. Tạo snapshot, thử phục hồi vào một cụm trống với priority: "snapshot"

Bước 4 và 5 là hai bước mà bỏ qua sẽ khiến mọi việc còn lại thành vô nghĩa: bạn sẽ có một hệ thống vận hành tốt, được giám sát cẩn thận, và trả về kết quả sai.

Phần 7 — Qdrant