Cách Mình Cấu Hình Algorithms

Nguyên tắc expose algorithm parameters cho user mà không làm họ choáng ngợp

Riêng HDBSCAN thôi đã có min_cluster_size, min_samples, cluster_selection_epsilon, cluster_selection_method, và còn nữa. Bày hết ra thì user hoảng. Giấu hết thì mất kiểm soát. Vấn đề là làm sao tạo được các lớp configuration để người không chuyên ML vẫn có kết quả tốt, mà chuyên gia thì vẫn fine-tune được khi cần.

Câu hỏi cốt lõi: "Người không chuyên ML có thể có kết quả tốt, trong khi chuyên gia vẫn có thể fine-tune?"

Hai lớp configuration

Expose thẳng raw algorithm parameters (min_cluster_size=15, n_neighbors=30) cho user thì họ không biết đặt gì. Ẩn hết thì lại không adjust được kết quả.

Cách mình làm: xây hai lớp. Lớp user-facing dùng khái niệm trực quan kiểu "Bạn muốn bao nhiêu clusters?" trên thang 1-10. Lớp internal thì dịch sang algorithm parameters thật. User tương tác với lớp đầu, code dùng lớp sau.

User nghĩ theo kết quả -- "ít clusters lớn" hay "nhiều clusters chi tiết" -- chứ không nghĩ theo cơ chế algorithm. Hàm translation bắc cầu khoảng cách đó, giữ algorithm tuning tập trung và testable.

Presets cho người mới bắt đầu

Chỉ có mỗi "Default" hoặc bắt user configure mọi thứ trước khi chạy thì cả hai đều không ổn.

Nên có 3-5 presets đại diện cho các use cases phổ biến, tên phải mô tả rõ ý đồ: "Quick Overview" cho broad clustering, "Deep Analysis" cho granular, "High Precision" cho strict matching. Mỗi preset là một configuration hoàn chỉnh, đã test. Hầu hết user không biết họ muốn parameters gì mà, họ biết họ muốn kết quả gì thôi. Presets cho họ điểm bắt đầu chạy được, customize sau cũng không muộn.

Mỗi bước slider phải tạo khác biệt thấy rõ

Kéo slider từ 5 sang 6 mà kết quả y chang thì user mất niềm tin vào controls luôn. "Ủa kéo chi cho mệt?"

Tune các hàm translation sao cho mỗi bước trên thang user-facing tạo ra kết quả khác nhau rõ ràng. Nếu hai settings nhìn giống nhau thì không nên là hai tùy chọn riêng biệt. Mỗi điểm parameter phải chứng minh sự tồn tại bằng impact thấy được.

Tập trung logic translation vào một chỗ

Magic numbers rải khắp code -- ai biết tại sao min_cluster_size lại bằng max(5, n // 200)? Không ai nhớ, kể cả người viết, sau vài tháng.

Tập trung parameter translation trong một function duy nhất, comments giải thích từng formula. Document mối quan hệ giữa user values và algorithm parameters, bao gồm lý do chứ không chỉ toán. Logic translation là nơi domain knowledge sống -- khi cần tune behavior hoặc debug kết quả lạ, documentation này là cứu cánh.

Validate sớm, giải thích rõ

Chấp nhận bất kỳ configuration nào rồi fail sâu trong algorithm với lỗi khó hiểu -- hoặc âm thầm clamp values mà không nói -- cả hai đều gây bực.

Validate configurations tại API boundary. Khi values bị điều chỉnh (clamped, rounded) thì báo user. Khi combinations không hợp lệ thì giải thích tại sao và gợi ý alternatives. User nên biết configuration nào đang thực sự chạy, chứ điều chỉnh âm thầm rồi kết quả không khớp kỳ vọng thì rất khó debug.

Khung quyết định

Expose parameter hay giấu?

Expose khi:

  • Parameter ảnh hưởng trực tiếp đến kết quả user thấy
  • User có lý do để muốn values khác nhau
  • Giải thích được bằng thuật ngữ không kỹ thuật
  • Thay đổi nó tạo ra kết quả khác biệt rõ

Giấu khi:

  • Parameter là chi tiết implementation (thread counts, buffer sizes)
  • Giá trị tối ưu tính được từ parameters khác
  • Giá trị sai gây crash chứ không phải kết quả khác
  • Đòi hỏi hiểu biết sâu về algorithm mới set đúng

Slider hay discrete options?

Dùng sliders khi:

  • Parameter là continuous hoặc có nhiều giá trị hợp lệ
  • User cần fine-grained control
  • Thang có ý nghĩa trực quan (ít/nhiều)

Dùng discrete options khi:

  • Chỉ 2-4 lựa chọn có ý nghĩa
  • Các options là modes riêng biệt, không phải mức độ
  • Mỗi option cần giải thích (radio buttons với descriptions)

Thêm preset mới hay mở rộng configuration?

Thêm preset khi:

  • Một use case phổ biến cần thay đổi nhiều parameters cùng lúc
  • Tổ hợp đại diện cho một chiến lược nhất quán
  • Không thì user phải tự mò tổ hợp

Mở rộng configuration khi:

  • User cần fine-grained control cho edge cases
  • Parameter độc lập với presets hiện có
  • Power users đã yêu cầu quyền kiểm soát

Mấy lỗi hay gặp

Logic translation nằm rải rác. Ba files khác nhau tính cluster sizes, thay đổi phải update nhiều nơi. Gom hết vào một function duy nhất -- nhận user config, trả về algorithm params. Tất cả algorithm calls dùng chung translated config này.

Parameters tương tác khó đoán. Set granularity=9 và coherence=9 mà kết quả tệ hơn từng cái riêng thì user bối rối thật. Test tổ hợp parameters một cách hệ thống, document interactions rõ ràng. Cân nhắc thêm constraints ngăn các tổ hợp có vấn đề.

Presets không xài được cho cases phổ biến. User chọn preset xong luôn phải customize lại -- vậy preset có cũng như không. Test presets trên data samples thật, thu thập feedback xem preset nào được chọn nhiều và bao lâu thì bị sửa đổi.

Thang đo không khớp cách user nghĩ. User tưởng "10" là "maximum clusters" nhưng thực ra nó là "highest quality" -- kiểu này bối rối lắm. Label thang đo bằng mô tả kết quả, đừng chỉ để số: "Fewer clusters" đến "More clusters" rõ hơn nhiều so với "1" đến "10".

Không có cách xem đằng sau. User configure rồi nhưng không biết translated values thực sự là gì, không reproduce được kết quả. Cho một tùy chọn "Show advanced" hiển thị actual algorithm parameters đang dùng. Log configurations để debugging.

Checklist đánh giá

Đang ổn nếu:

  • User mới có kết quả tốt với presets, không cần customize
  • Mỗi vị trí slider tạo ra outcomes khác nhau rõ ràng
  • Power users truy cập được algorithm-level parameters khi cần
  • Configuration save, share, và reproduce được
  • Invalid configurations bị bắt với messages hữu ích

Cần xem lại nếu:

  • User thường xuyên hỏi "cái slider này làm gì?"
  • Presets hiếm khi được dùng hoặc bị customize ngay
  • Một số tổ hợp parameters gây errors sâu trong processing
  • Không giải thích được tại sao translation formulas lại thế
  • Kết quả thay đổi bất ngờ với cùng configuration

Tham khảo nhanh

+---------------------------+      +---------------------------+
|    User Configuration     |      |   Algorithm Parameters    |
+---------------------------+      +---------------------------+
| granularity: 1-10         | ---> | UMAP n_neighbors: 10-50   |
| coherence: 1-10           | ---> | HDBSCAN min_samples: 2-10 |
| min_keywords: 3-30        | ---> | min_cluster_size: 5-30    |
| method: "balanced"/"fine" | ---> | selection: "eom"/"leaf"   |
+---------------------------+      +---------------------------+
            |                                   |
            v                                   v
    User hiểu được                 Algorithm thực thi đúng
LớpMục đíchĐối tượng
PresetsBắt đầu nhanh, use cases phổ biếnTất cả users
User ConfigControls trực quan, tập trung kết quảHầu hết users
Algorithm ParamsKiểm soát trực tiếp, linh hoạt tối đaPower users, debugging
Internal DefaultsFallbacks hợp lý, safety boundsHệ thống