Báo cáo toàn bộ quá trình xây dựng, kiểm thử và coverage của Gender-Aware Fashion Rules Engine
Vi phạm Rules = 0 trong tất cả các lần test. Engine không bao giờ recommend sai loại sản phẩm (wrong product_line) so với rules đã định nghĩa trong DB.
| Trạng thái | Số SP / 100 | Ý nghĩa | Hành động cần làm |
|---|---|---|---|
| ✅ Passed | 20–28 | Rules có + Sản phẩm recommended đúng category + màu sắc phù hợp | Không cần làm gì |
| 🔵 Có rules, nhưng trống | 67–78 | DB có rules đúng, nhưng catalog không có SP nào trong target category có màu sắc khớp đủ điểm threshold → trả về rỗng | Đây là feature đúng. Nếu muốn cải thiện → bổ sung thêm SKU vào catalog hoặc giảm score threshold |
| ⚠️ Không có rules DB | 3–5 | Anchor category của SP chưa được seed rule cho gender tương ứng. Thường là sản phẩm cực hiếm (Chăn cá nhân, Khẩu trang, Khăn tắm...) | Seed thêm rules cho các category này nếu catalog có nhiều hơn. Hiện tại số lượng quá nhỏ (~1 SP/loại) |
| ❌ Vi phạm Rules | 0 | Engine recommend sản phẩm sai product_line so với quy tắc trong DB | — |
Do test dùng random sample, ~70% SP là bottom/standalone items (Quần jean, Váy liền...) mà khi Engine query catalog với màu sắc cực kỳ chặt → không tìm được item recommend phù hợp màu. Engine trả về đúng rules nhưng 0 sản phẩm. Đây là behavior đúng theo thiết kế — tránh recommend sai màu.
backend/database/migrate/migrate_001_init.py — Schema ban đầu, không có gendermigrate_002_gender_rules.py — Thêm cột gender_target, seed 114 rules cơ bản (Nu/Nam/Unisex/Bé Gái/Bé Trai × Dịp)migrate_003_full_coverage.py — Seed 177 rules cho Bottom-as-anchor & Outerwear-as-anchormigrate_004_remaining.py → migrate_008_done.py — Seed từng batch nhỏ cho các category edge case theo vòng lặp test| Script | Rules thêm | Loại category |
|---|---|---|
migrate_002 | +114 | TOP-as-anchor: Áo phông, Áo Sơ mi, Blouse, Áo Polo... cho 5 demographic |
migrate_003 | +177 | Bottom-as-anchor (Quần jean/soóc/leggings), Outerwear-as-anchor (Áo nỉ, Áo len, Áo khoác dáng ngắn...) |
migrate_004 | +36 | Kids items (Bé Trai/Bé Gái): Áo Polo, Áo len, Quần Khaki, Quần nỉ, Bộ mặc nhà... |
migrate_005 | +19 | Tất, Khẩu trang, Túi xách, Áo nỉ có mũ, Pyjama, Áo khoác gilet... |
migrate_006 | +18 | Áo Sơ mi bé trai, Áo len bé trai, Gilet, Áo khoác nỉ có mũ các giới |
migrate_007 | +11 | Áo lót, Áo Body bé trai, Quần leggings mặc nhà, Blazer bé trai, Áo khoác sợi |
migrate_008 | +9 | Áo Body nữ/unisex/nam, Bộ thể thao bé trai, Quần mặc nhà unisex |
| Inline seeds | ~36 | Edge cases: Mũ, Khăn tắm, Áo khoác dạ, Chăn cá nhân, Hoodie nữ/unisex... |
_normalize_gender(gender) — Chuyển đổi giá trị từ catalog ("women", "men", "girl", "boy") về DB key ("nu", "nam", "be_gai", "be_trai", "unisex").
_fetch_rules_with_reason(anchor_cat, gender) — Query chatbot_fashion_rules với điều kiện gender_target IN (gender_norm, 'all'). Trả về list rules theo dịp × vai trò × target_category.
Với mỗi rule, engine lọc catalog theo target_category, rồi tính score = màu (. Chỉ lấy SP có score > threshold.color_synergy +15~25) + chất liệu + vai trò
Nếu DB không có rules cho anchor → fallback sang _compute_matches() (dùng color scoring toàn catalog, không giới hạn category). Không trả về lỗi.
Output: { "di_lam": { "bottom": [...], "outerwear": [...] }, "di_choi": ... } — Mỗi item kèm score, reason, ai_reason.
| Demographic | DB Key | Nhóm màu ưu tiên | Occasions có rules |
|---|---|---|---|
| 👩 Nữ | nu |
Neutral + Light + Dark (linh hoạt nhất) | di_lam di_choi du_lich mac_nha |
| 👨 Nam | nam |
Neutral +5 boost (Be, Xám, Đen, Trắng, Nâu) | di_lam di_choi du_lich the_thao |
| 🔁 Unisex | unisex |
Neutral + Dark (Đen, Trắng, Xám, Đỏ, Xanh navy) | di_choi hang_ngay the_thao |
| 👧 Bé Gái | be_gai |
Light Pastel +5 (Hồng, Tím, Vàng nhạt, Xanh lam) | di_choi du_lich hang_ngay |
| 👦 Bé Trai | be_trai |
Dark +5 (Vàng, Cam, Xanh Jeans, Xanh navy, Đỏ) | hang_ngay du_lich the_thao |
70+ SP trong 100 test có rules đúng nhưng trả về recommend trống vì catalog không đủ màu phù hợp score. Hai hướng xử lý:
MIN_SCORE từ 40→30 để chấp nhận màu tương đối phù hợpai_outfit_set + ai_outfit_items (cấp SKU)season_tag vào chatbot_fashion_rules| File | Mục đích |
|---|---|
backend/worker/stylist_engine.py | Engine chính — _normalize_gender, _fetch_rules_with_reason, compute_dynamic_rule_matches |
backend/api/fashion_matches/router.py | API router — GET /rules/view trả HTML framework đẹp |
backend/static/fashion-matches/index.html | Admin UI — có nút "Phương pháp Phối Đồ (Demographic)" |
backend/database/migrate/migrate_002_gender_rules.py | Migration thêm gender_target column + seed rules ban đầu |
backend/tests/test_fashion_rules_batch.py | Script batch test — chạy bất kỳ lúc nào để verify |
.agent/workflows/fashion-rules-verification.md | Workflow documentation cho quá trình test |
# cd backend $env:PYTHONIOENCODING="utf-8" .venv\Scripts\python.exe tests/test_fashion_rules_batch.py --limit 100