Commit e8e02b1e authored by Vũ Hoàng Anh's avatar Vũ Hoàng Anh

feat: hard-code underwear override at tool level - drop gender/age filters for sip/do lot

parent 93dbdfe7
...@@ -268,6 +268,63 @@ class LeadSearchInput(BaseModel): ...@@ -268,6 +268,63 @@ class LeadSearchInput(BaseModel):
reasoning: str | None = Field(default=None, description="SUY LUẬN TẠI SAO bạn chọn params này.") reasoning: str | None = Field(default=None, description="SUY LUẬN TẠI SAO bạn chọn params này.")
# ======================================================
# UNDERWEAR / ĐỒ LÓT — Hard Override (Tool-level)
# Khi detect product_line_vn chứa đồ lót → drop gender + age
# để tìm cả nam/nữ, cả người lớn/trẻ em.
# Logic này BẮT BUỘC nằm ở tool, KHÔNG phụ thuộc prompt.
# ======================================================
UNDERWEAR_PRODUCT_LINES: set[str] = {
"Quần lót", "Quần lót đùi", "Quần lót tam giác",
"Áo lót", "Áo bra active",
}
def _is_underwear_request(product_lines: list[str]) -> bool:
"""Check nếu TẤT CẢ product_line_vn đều là đồ lót."""
if not product_lines:
return False
resolved_lines: set[str] = set()
for line in product_lines:
if not line:
continue
resolved = resolve_product_line(line)
for r in resolved:
expanded = get_related_lines(r)
resolved_lines.update(expanded)
if not resolved_lines:
return False
return resolved_lines.issubset(UNDERWEAR_PRODUCT_LINES)
def _apply_underwear_override(req: LeadSearchInput) -> str | None:
"""
Hard override cho đồ lót: drop gender + age để tìm ALL.
Returns system_message nếu đã override, None nếu không.
"""
inf = req.inferred
if not _is_underwear_request(inf.product_line_vn):
return None
overrides = []
if inf.gender_by_product:
overrides.append(f"gender={inf.gender_by_product}")
inf.gender_by_product = None
if inf.age_by_product:
overrides.append(f"age={inf.age_by_product}")
inf.age_by_product = None
if overrides:
logger.info(
"🩲 UNDERWEAR OVERRIDE: Dropped filters [%s] → search ALL genders/ages",
", ".join(overrides),
)
return (
"[SYSTEM] Đây là yêu cầu tìm ĐỒ LÓT/SỊP. Tool đã tự động tìm TẤT CẢ giới tính "
"(nam + nữ) và TẤT CẢ độ tuổi (người lớn + trẻ em). "
"Hãy gợi ý sản phẩm phù hợp nhất dựa trên ngữ cảnh hội thoại."
)
# ====================================================== # ======================================================
# SQL Builder # SQL Builder
# ====================================================== # ======================================================
...@@ -1098,6 +1155,9 @@ class ProductSearchEngine: ...@@ -1098,6 +1155,9 @@ class ProductSearchEngine:
try: try:
fallback_msg = None fallback_msg = None
# ★ UNDERWEAR HARD OVERRIDE — drop gender/age trước khi search ★
underwear_msg = _apply_underwear_override(req)
if req.magento_ref_code: if req.magento_ref_code:
sql, params = _build_sku_query(req.magento_ref_code) sql, params = _build_sku_query(req.magento_ref_code)
products = await db.execute_query_async(sql, params=tuple(params)) products = await db.execute_query_async(sql, params=tuple(params))
...@@ -1155,6 +1215,8 @@ class ProductSearchEngine: ...@@ -1155,6 +1215,8 @@ class ProductSearchEngine:
if fallback_msg: if fallback_msg:
result["fallback_message"] = fallback_msg result["fallback_message"] = fallback_msg
if underwear_msg:
result["system_message"] = underwear_msg
return result return result
......
...@@ -69,7 +69,7 @@ Args cho Lane 2 (`inferred`): ...@@ -69,7 +69,7 @@ Args cho Lane 2 (`inferred`):
- "sịp/quần lót/quần nhỏ/quần xì/chip" -> product_line_vn=["Quần lót", "Quần lót đùi", "Quần lót tam giác"] - "sịp/quần lót/quần nhỏ/quần xì/chip" -> product_line_vn=["Quần lót", "Quần lót đùi", "Quần lót tam giác"]
- "áo lót/áo ngực/bra/áo lót học sinh" -> product_line_vn=["Áo lót", "Áo bra active"] - "áo lót/áo ngực/bra/áo lót học sinh" -> product_line_vn=["Áo lót", "Áo bra active"]
- "đồ lót nói chung" -> product_line_vn=["Quần lót", "Áo lót", "Bộ quần áo"] - "đồ lót nói chung" -> product_line_vn=["Quần lót", "Áo lót", "Bộ quần áo"]
- ⚠️ **LƯU Ý ĐẶC BIỆT VỀ ĐỒ LÓT:** Nếu khách nói "sịp cho con gái", "quần xì con gái", "sịp nam", "sịp nữ" -> ĐÂY LÀ ĐỒ NGƯỜI LỚN (Adult). BẮT BUỘC map `age_by_product="adult"` và `gender_by_product="women"` (hoặc "men"). TUYỆT ĐỐI KHÔNG map thành "kid" (bé gái/bé trai) trừ khi khách có CHỮ "bé" (như "sịp cho bé gái"). - ⚠️ **LƯU Ý:** Với đồ lót, Tool sẽ TỰ ĐỘNG tìm tất cả giới tính và độ tuổi. Bạn CHỈ CẦN điền đúng product_line_vn, KHÔNG cần lo gender/age.
5. **Combo / Set đồ / Mơ hồ nhưng có context:** 5. **Combo / Set đồ / Mơ hồ nhưng có context:**
- Nếu khách nói "combo đi biển", "đồ đi làm", "đồ mặc Tết", "set đồ" -> VẪN GỌI TOOL. - Nếu khách nói "combo đi biển", "đồ đi làm", "đồ mặc Tết", "set đồ" -> VẪN GỌI TOOL.
- ⚠️ **CHỐNG LÚ INSIGHT (CỰC KỲ QUAN TRỌNG)**: Nếu Insight cũ đang lưu mục tiêu là "Áo lót", "Sịp", "Áo khoác"... mà khách ĐỔI sang hỏi chung chung kiểu "tìm combo đi biển", "tìm set đồ" -> **TUYỆT ĐỐI KHÔNG** nhét loại sản phẩm cũ vào `product_line_vn`. Phải RESET và điền các loại đồ phù hợp ngữ cảnh mới (VD đi biển: `["Bộ quần áo", "Áo phông", "Quần soóc", "Váy liền", "Áo ba lỗ"]`), hoặc để trống `[]` để search theo tag. - ⚠️ **CHỐNG LÚ INSIGHT (CỰC KỲ QUAN TRỌNG)**: Nếu Insight cũ đang lưu mục tiêu là "Áo lót", "Sịp", "Áo khoác"... mà khách ĐỔI sang hỏi chung chung kiểu "tìm combo đi biển", "tìm set đồ" -> **TUYỆT ĐỐI KHÔNG** nhét loại sản phẩm cũ vào `product_line_vn`. Phải RESET và điền các loại đồ phù hợp ngữ cảnh mới (VD đi biển: `["Bộ quần áo", "Áo phông", "Quần soóc", "Váy liền", "Áo ba lỗ"]`), hoặc để trống `[]` để search theo tag.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment