# Nghiệp vụ phối đồ — Tại sao AI phối đồ như vậy?

> **Tóm tắt:** Tài liệu giải thích tư duy nghiệp vụ đằng sau hệ thống phối đồ AI của Canifa. Tại sao không dùng LLM thuần để gợi ý outfit? Tại sao lại cần bảng luật phối 59 sản phẩm? Và thuật toán chấm điểm 100 điểm hoạt động ra sao trong thực tế.

---

## 1. Vấn đề: Tại sao không để LLM tự phối đồ?

Hình dung bro thuê một "chuyên gia thời trang" AI. Bro hỏi: *"Phối đồ cho áo sơ mi trắng nam"*. LLM trả lời nghe rất hay:

> *"Áo sơ mi trắng phối cùng quần tây đen và giày Oxford da sẽ rất lịch lãm..."*

**Nghe thì đúng. Nhưng vấn đề thực tế:**
- **Hallucination:** LLM gợi ý sản phẩm không tồn tại trong kho Canifa
- **Sai demographic:** Gợi ý đồ người lớn cho bé trai (vì LLM không biết age_group)
- **Sai mùa:** Gợi ý áo phao mùa đông khi khách đang tìm đồ hè
- **Trùng lặp:** Gợi 3 cái quần khaki đen y hệt nhau
- **Không reproducible:** Hỏi lại lần sau, kết quả khác hoàn toàn

> **Insight nghiên cứu:** Theo dữ liệu ngành Conversational Commerce *(Envive.ai, 2025)*, chatbot AI có thể tăng **tỉ lệ upsell lên 20-30%**, nhưng chỉ khi gợi ý dựa trên **dữ liệu thật** (kho hàng, lịch sử mua, demographic) — không phải dựa trên "cảm hứng" của LLM.

---

## 2. Giải pháp: Hybrid Engine (Luật cứng + Chấm điểm)

Thay vì tin tưởng LLM 100%, Canifa xây dựng một **Hybrid Engine** kết hợp 2 nguồn:

| Nguồn | Vai trò |
|-------|---------|
| **DB Rules (Luật cứng)** | Bảng phối 59 sản phẩm — được define bởi đội Merchandising. VD: Áo Sơ Mi Nam → Quần Âu Nam, Quần Jeans Nam |
| **Scoring Algorithm (100đ)** | Thuật toán chấm điểm tự động dựa trên 4 tiêu chí: Màu sắc, Dịp mặc, Vai trò (Top/Bottom), Chất liệu/Mùa |

Khi hai nguồn kết hợp: Sản phẩm vừa có luật cứng từ DB, vừa có điểm scoring cao → **ưu tiên hiển thị đầu tiên** (cộng thêm 25 điểm bonus).

---

## 3. Pipeline phối đồ — 3 tầng lọc

![Fashion Matching Pipeline](data/36-fashion-matching-logic/fashion_pipeline.svg)

### Tầng 1: Hard Filters (Loại trực tiếp)

Trước khi chấm điểm bất cứ thứ gì, hệ thống **loại bỏ ngay** các sản phẩm vi phạm quy tắc an toàn:

| Quy tắc | Lý do nghiệp vụ | Ví dụ |
|---------|-----------------|-------|
| **Khác tệp khách hàng** | Người lớn ≠ Trẻ em | Áo Sơ Mi Nam → ❌ Quần Short Bé Trai |
| **Lệch giới tính** | Nam ≠ Nữ (trừ Unisex) | Áo Polo Nam → ❌ Váy Nữ |
| **Blacklist** | Nội y, đồ bơi không phối | Áo Thun → ❌ Quần Lót |

**Tại sao cần Hard Filter?**
Nếu không có tầng này, thuật toán scoring có thể cho điểm cao một cái quần trẻ em (vì cùng màu, cùng mùa) rồi gợi ý cho khách nam trưởng thành. Kết quả: **mất uy tín thương hiệu** và tạo trải nghiệm kỳ quặc.

---

### Tầng 2: Scoring Algorithm (Chấm điểm 100đ)

Sau khi lọc xong, tất cả sản phẩm còn lại được chấm điểm trên 4 tiêu chí:

#### a. 🎨 Color Synergy (Tối đa 30đ)

Đây là tiêu chí **quan trọng nhất** vì màu sắc quyết định ấn tượng thị giác đầu tiên.

| Công thức | Điểm | Giải thích |
|-----------|------|-----------|
| Neutral + Neutral | 25đ | An toàn nhất: Đen + Trắng, Xám + Beige |
| Neutral + Light | 28đ | Điểm nhấn nhẹ: Trắng + Xanh Pastel |
| Neutral + Dark | 22đ | Cá tính: Đen + Navy |
| Light + Light | 15đ | Phụ thuộc demo: Tốt cho Bé Gái |
| Dark + Dark | 10đ | Rủi ro: quá nặng nề, bị trừ điểm |

**Điều chỉnh theo Demographic:**
- **Bé gái:** Boost +5đ cho nhóm Light Pastel (Hồng nhạt, Tím nhạt)
- **Nam trưởng thành:** Boost +3đ cho Neutral + Dark (Xanh đậm + Đen)
- **Unisex:** Ưu tiên Neutral (an toàn cho mọi đối tượng)

> **Tại sao điều chỉnh theo demographic?** Vì hành vi mua sắm khác nhau: Khách mua cho trẻ em ưu tiên màu tươi sáng. Khách nam trưởng thành ưu tiên gam màu tối/trung tính. Nếu cùng 1 bảng điểm cho tất cả → gợi ý sẽ "xanh xao" (thiếu cá tính cho từng nhóm).

#### b. 🍷 Occasion Overlap (Tối đa 20đ)

So sánh **dịp mặc** (`occasion_tags`) giữa sản phẩm gốc (Anchor) và sản phẩm phối (Target):

| Tình huống | Điểm | Ví dụ |
|-----------|------|-------|
| Cả hai cùng dịp | 20đ | Anchor = "Đi làm" + Target = "Đi làm" |
| Ít nhất 1 tag khớp | 12đ | Anchor = "Đi làm, Dự tiệc" + Target = "Dự tiệc" |
| Không khớp tag nào | 6đ | Anchor = "Đi chơi" + Target = "Thể thao" |

**Tại sao cho 6đ thay vì 0đ khi không khớp?** Vì trong thời trang, một số item mặc được mọi dịp (quần jeans, áo thun basic). Cho 0đ sẽ triệt hạ luôn những item versatile này.

#### c. 👗 Role Priority (Tối đa 15đ)

Tạo **logic mặc đồ tự nhiên** — nếu khách chọn Áo (Top), hệ thống ưu tiên gợi Quần/Váy (Bottom) trước, rồi mới tới Khoác (Outerwear), cuối cùng là Phụ kiện (Accessory).

| Anchor Role | Ưu tiên cao nhất | Ưu tiên thấp |
|------------|-------------------|---------------|
| Top (Áo) | Bottom (Quần/Váy) → 15đ | Accessory → 5đ |
| Bottom | Top → 15đ | Accessory → 5đ |
| Outerwear (Khoác) | Top (Áo trong) → 15đ | Accessory → 5đ |

**Tại sao?** Vì khi phối đồ, người ta nghĩ theo bộ: Áo → Quần → Giày. Nếu AI gợi ý 5 chiếc khăn quàng cho 1 cái áo sơ mi → trải nghiệm sẽ kỳ cục. Phải tạo bộ cơ bản trước, phụ kiện sau.

#### d. 🌡️ Material & Season (Tối đa 10đ)

Đảm bảo chất liệu và mùa tương thích:

| Tổ hợp | Điểm | Logic |
|--------|------|-------|
| Cotton + Linen (cùng mùa Hè) | 10đ | Tuyệt hợp |
| Phao + Nỉ (cùng mùa Đông) | 10đ | Tuyệt hợp |
| Cotton + Phao (lệch mùa) | 3đ | Không hợp lý |

---

### Tầng 3: Hậu xử lý

#### Deduplication (Loại trùng)
Engine **không lấy 3 chiếc quần khaki đen y hệt**. Trong mỗi Role (Top/Bottom/Outerwear/Accessory), kết quả được lọc theo:
- Đa dạng **màu sắc** (không 2 item cùng màu)
- Đa dạng **product line** (không 2 item cùng dòng)

#### DB Rules Bonus (+25đ)
Nếu sản phẩm Target nằm trong bảng luật phối 59 sản phẩm (do đội Merchandising define) → **cộng thêm 25 điểm**. Đây là cách kết hợp chuyên môn con người với AI scoring.

---

## 4. Bảng luật phối 59 sản phẩm

Đội Merchandising của Canifa đã xây dựng bảng luật phối cho **59 loại sản phẩm**, chia theo giới tính:

| Nhóm | Số lượng | Ví dụ luật phối |
|------|----------|----------------|
| **Nam (men)** | ~20 | Áo Sơ Mi → Quần Âu, Quần Jeans |
| **Nữ (women)** | ~20 | Váy → Áo Khoác Blazer, Phụ Kiện |
| **Bé trai (boy)** | ~8 | Áo Thun Bé Trai → Quần Short, Giày Thể Thao |
| **Bé gái (girl)** | ~8 | Đầm Bé Gái → Áo Khoác Nhẹ, Phụ Kiện |
| **Unisex** | ~3 | Áo Khoác Gió → Quần Jogger |

> **Xem chi tiết:** [Bảng phối đồ tương tác](http://localhost:5000/static/main.html?page=outfit_match_rules/canifa_product_pairing_logic.html) — Có thể lọc theo giới tính, tìm kiếm sản phẩm.

**Tại sao cần bảng luật thủ công khi đã có AI scoring?**
- AI scoring **không biết xu hướng thời trang hiện tại** — nó chỉ tính toán dựa trên metadata.
- Đội Merchandising biết rằng BST mùa này *"áo blazer oversize phối với quần culottes đang hot"* → thêm vào DB Rules → AI tự động ưu tiên gợi ý combo đó.
- Kết hợp **chuyên môn con người + AI** = kết quả chính xác nhất.

---

## 5. Hiệu suất: Pre-compute & Cache

Hệ thống **không tính toán phối đồ real-time** cho mỗi request. Thay vào đó:

1. **Batch Job** chạy định kỳ → tính toán phối đồ cho **toàn bộ catalog**
2. Kết quả lưu vào cột `ai_matches` (JSONB) trong PostgreSQL
3. Khi khách hỏi → API query trực tiếp từ `ai_matches` → **phản hồi tức thì** (~5ms)

**Tại sao pre-compute?**
- Catalog Canifa có ~2000+ SKU → nếu tính real-time cho mỗi request sẽ mất 2-5 giây
- Pre-compute 1 lần → phục vụ hàng ngàn request → tiết kiệm chi phí compute

---

## 6. Tổng kết

| Quyết định thiết kế | Lý do nghiệp vụ |
|---------------------|-----------------|
| Hybrid (Rule + AI) thay vì LLM thuần | Chống hallucination, đảm bảo gợi ý sản phẩm thật |
| Hard Filter trước Scoring | Bảo vệ uy tín thương hiệu (không gợi đồ trẻ em cho người lớn) |
| Color Synergy nặng nhất (30đ) | Màu sắc = ấn tượng đầu tiên khi mua sắm online |
| Điều chỉnh theo Demographic | Mỗi nhóm khách có gu khác nhau |
| DB Rules Bonus +25đ | Kết hợp chuyên môn Merchandising + AI tự động |
| Pre-compute Batch | Phản hồi tức thì, tiết kiệm chi phí |
| Deduplication | Đa dạng kết quả, tránh trùng lặp nhàm chán |

---

## References

1. Envive.ai (2025). *"AI Upselling & Cross-selling Statistics"* — 20-30% higher upsell rates.
2. Medallia (2025). *"Personalization Impact on Brand Choice"* — 82% consumers influenced.
3. Canifa Merchandising Team. *"Bảng luật phối đồ 59 sản phẩm"* — Internal product pairing database.
4. Canifa Engineering. *"Fashion Matching Engine: Scoring Algorithm v2"* — `chatbot_fashion_rules` schema.
