# 3. Lane 2: Inferred Search (Suy luận có cấu trúc)

Lane 2 dùng AI suy luận từ câu gốc, chuyển đổi ngôn ngữ tự nhiên thành **bộ filter chuẩn hóa**.

## Input

```json
{
  "product_line_vn": ["Áo khoác"],
  "gender_by_product": "men",
  "tags": ["wthr:mua_dong", "fit:oversize", "occ:du_lich"],
  "price_max": 5000000
}
```

## Bảng mapping từ lóng → Tags

| Ngôn ngữ khách | Tag chuẩn | Giải thích |
|---|---|---|
| "mùa đông", "lạnh", "rét" | `wthr:mua_dong` | Weather = mùa đông |
| "form rộng", "oversize" | `fit:oversize` | Fit = oversize |
| "đi du lịch", "đi chơi" | `occ:du_lich` | Occasion = du lịch |
| "đi làm", "công sở" | `occ:cong_so` | Occasion = công sở |
| "đi tiệc", "dự tiệc" | `occ:di_tiec` | Occasion = đi tiệc |
| "màu đen", "black" | `color:den` | Master color = đen |
| "budget 500k", "dưới 500" | `price_max: 500000` | Filter giá |

## SQL mẫu

```sql
SELECT sku, product_name, price
FROM products
WHERE product_line IN ('Áo khoác')
  AND gender = 'men'
  AND BITMAP_CONTAINS(tags, 'wthr:mua_dong')
  AND BITMAP_CONTAINS(tags, 'fit:oversize')
  AND price <= 5000000
ORDER BY popularity DESC
LIMIT 10
```

## Kết quả 2 Lane được gộp như thế nào?

```python
# Dedup theo SKU: Lane 1 + Lane 2
all_results = literal_results + inferred_results
unique_results = {r.sku: r for r in all_results}.values()
# Sắp xếp theo relevance score
final_results = sorted(unique_results, key=lambda r: r.score, reverse=True)
```

**Ưu điểm Lane 2:** Chính xác cao, filter chuẩn, không nhiễu.
**Nhược điểm:** Phụ thuộc vào chất lượng suy luận AI (nếu AI map sai tag → kết quả sai).

File tham chiếu: `product_search_engine.py` — Lane 2 logic, `graph.py` — `InferredSearchArgs`
