# 对话式智能导购设计（服饰鞋帽独立站）

## 1. 核心场景与用户旅程

### 1.1 典型对话流程示例

**场景 A：新用户首次咨询（需要完善档案）**
```
用户: "我想买一件适合夏天的T恤"
导购: "好的，我来帮您找。请问您平时穿什么尺码？"
用户: "M码"
导购: "好的。您比较喜欢什么颜色？我们这里有白色、黑色、蓝色、灰色等"
用户: "白色或浅色都可以"
导购: "了解。您希望是休闲款还是运动款？"
用户: "休闲的"
导购: "好的，我为您找到了几款，价格在50-150元之间，您看看..."
[展示结果]
```

**场景 B：老用户（已有档案，快速推荐）**
```
用户: "帮我找一条牛仔裤"
导购: "好的，根据您的尺码偏好（30码），我为您推荐..."
[直接展示结果，如不满意再细化]
```

**场景 C：模糊需求逐步明确**
```
用户: "我想买件外套"
导购: "好的，请问是用于什么场合？日常通勤、运动、还是正式场合？"
用户: "日常通勤"
导购: "了解。您希望是薄款还是厚款？现在这个季节..."
用户: "薄款就行"
导购: "好的，我为您推荐几款适合通勤的薄外套..."
```

### 1.2 核心价值点

- **降低搜索门槛**：用户用自然语言表达，无需熟悉筛选器
- **个性化合身推荐**：通过尺码/合身偏好，减少退货率
- **提升转化**：多轮对话收集偏好，推荐更精准
- **完善用户档案**：每次对话积累偏好，后续推荐更准

---

## 2. 技术架构

### 2.1 整体架构（LLM + 商品检索 + 推荐引擎 + 用户档案）

```
┌─────────────────────────────────────────────────────────┐
│                    前端对话界面                          │
│  (Web Chat Widget / 小程序 / H5)                        │
└────────────────────┬────────────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────────────┐
│              对话式导购服务层 (Conversational Service)  │
│  ┌──────────────────────────────────────────────────┐   │
│  │  对话状态管理 (Dialogue State Tracker, DST)      │   │
│  │  - 当前意图 (intent)                              │   │
│  │  - 已收集的偏好 (collected_preferences)          │   │
│  │  - 待确认信息 (pending_confirmation)             │   │
│  │  - 对话历史 (dialogue_history)                   │   │
│  └──────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────┐   │
│  │  LLM 对话引擎 (核心)                              │   │
│  │  - 意图理解 (NLU)                                 │   │
│  │  - 实体抽取 (NER: 类目/颜色/尺码/价格/风格...)    │   │
│  │  - 回复生成 (NLG)                                 │   │
│  │  - 策略决策 (何时问问题/何时展示结果)             │   │
│  └──────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────┐   │
│  │  商品检索与推荐引擎                               │   │
│  │  - 基于偏好生成 filters/range_filters            │   │
│  │  - 调用搜索 API (复用现有 /search/)              │   │
│  │  - 结果排序与多样性控制                           │   │
│  └──────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────┐   │
│  │  用户档案管理 (User Profile)                      │   │
│  │  - 尺码偏好 (size_preferences)                    │   │
│  │  - 风格偏好 (style_preferences)                   │   │
│  │  - 价格偏好 (price_range)                         │   │
│  │  - 历史购买/浏览                                  │   │
│  └──────────────────────────────────────────────────┘   │
└────────────────────┬────────────────────────────────────┘
                     │
        ┌────────────┼────────────┐
        ▼            ▼            ▼
┌─────────────┐ ┌──────────┐ ┌──────────────┐
│  搜索 API   │ │ 商品库    │ │ 用户行为库   │
│  (现有)     │ │ (ES/DB)   │ │ (埋点数据)   │
└─────────────┘ └──────────┘ └──────────────┘
```

### 2.2 核心组件说明

#### 2.2.1 对话状态管理 (DST)
- **存储位置**：Redis（key: `dialogue:{tenant_id}:{user_key}:{session_id}`）
- **状态结构**：
  ```json
  {
    "intent": "find_product|refine_search|ask_question|...",
    "collected_preferences": {
      "category": "T恤",
      "size": "M",
      "color": ["白色", "浅色"],
      "style": "休闲",
      "price_range": {"min": 50, "max": 150},
      "occasion": "日常",
      "season": "夏季"
    },
    "pending_confirmation": ["size", "color"],
    "dialogue_history": [
      {"role": "user", "content": "..."},
      {"role": "assistant", "content": "..."}
    ],
    "current_results": [...],  // 当前推荐结果（如有）
    "turn_count": 3
  }
  ```

#### 2.2.2 LLM 对话引擎
- **输入**：用户消息 + 对话状态 + 商品库元信息（可选：类目列表、颜色列表、尺码列表）
- **输出**：
  - **结构化输出**（必须）：`intent`、`extracted_entities`、`action`（ask_question|show_results|clarify）
  - **自然语言回复**（用于前端展示）
- **LLM 选择**：
  - **推荐**：GPT-4o / Claude 3.5 Sonnet（强推理、结构化输出）
  - **成本优化**：GPT-4o-mini / Claude Haiku（简单场景）
  - **私有化**：Qwen2.5 / GLM-4（如需要）

#### 2.2.3 商品检索与推荐引擎
- **输入**：对话状态中的 `collected_preferences`
- **处理**：
  1. 将偏好转换为搜索 API 的 `filters` / `range_filters`
  2. 调用现有 `/search/` API
  3. 结果排序（可结合用户历史、商品热度、多样性）
- **输出**：商品列表（含图片/标题/价格/链接）

#### 2.2.4 用户档案管理
- **存储位置**：MySQL/Redis（key: `user_profile:{tenant_id}:{user_key}`）
- **字段结构**：
  ```json
  {
    "size_preferences": {
      "tops": "M",
      "bottoms": "30",
      "shoes": "42"
    },
    "style_preferences": ["休闲", "简约"],
    "color_preferences": ["白色", "黑色", "灰色"],
    "price_range": {"min": 50, "max": 300},
    "brand_preferences": ["品牌A", "品牌B"],
    "last_updated": "2026-01-21T10:00:00Z"
  }
  ```

---

## 3. 主要能力清单

### 3.1 核心能力（MVP 必须）

#### A. 意图理解与实体抽取 (NLU)
- **能力**：从用户自然语言中提取：
  - **类目**：T恤、牛仔裤、运动鞋、外套...
  - **属性**：颜色、尺码、材质、风格（休闲/正式/运动）
  - **价格**：价格区间、预算
  - **场合**：日常、通勤、运动、正式
  - **季节**：春夏秋冬
  - **其他**：品牌、折扣、新品等
- **实现**：LLM 做 NER（命名实体识别）+ 规则后处理（映射到商品库的 specifications）

#### B. 偏好收集与确认
- **能力**：
  - 识别用户已表达的偏好
  - 判断哪些关键信息缺失（如尺码、颜色）
  - 生成追问问题（基于店铺商品库的可用选项）
- **实现**：
  - LLM 判断缺失项
  - 从商品库分面（facets）获取可用选项（如"我们这里有白色、黑色、蓝色..."）
  - 生成自然语言问题

#### C. 商品检索与筛选
- **能力**：
  - 将对话偏好转换为搜索 API 的 `filters` / `range_filters`
  - 调用搜索 API 获取候选
  - 结果排序（相关性 + 个性化 + 多样性）
- **实现**：
  - 偏好 → filters 映射规则（可配置）
  - 复用现有 `/search/` API
  - 排序可结合用户档案（如优先推荐用户偏好的品牌/价格带）

#### D. 结果展示与解释
- **能力**：
  - 生成推荐理由（"根据您的尺码偏好和风格，我为您推荐..."）
  - 展示商品卡片（图片/标题/价格/链接）
  - 支持继续对话（"不满意？告诉我您想要什么样的"）
- **实现**：LLM 生成回复 + 前端渲染商品卡片

#### E. 用户档案管理
- **能力**：
  - 从对话中提取并持久化偏好（尺码/风格/价格/品牌）
  - 后续对话自动使用档案（减少重复询问）
  - 档案更新（用户纠正/新偏好）
- **实现**：
  - 对话结束后更新 `user_profile`
  - 下次对话时作为上下文输入 LLM

### 3.2 进阶能力（后续迭代）

#### F. 合身推荐（Size Fit）
- **能力**：
  - 基于用户历史购买/浏览，学习"合身偏好"（如"这个品牌M码偏大，建议选S"）
  - 跨品牌尺码映射（如"您平时穿Nike 42码，这个品牌建议选41码"）
- **实现**：
  - 需要用户历史数据（购买/退货/评价）
  - 可做简单的"品牌-尺码映射表"（运营配置）
  - 或训练轻量模型（用户尺码偏好 → 商品推荐尺码）

#### G. 搭配推荐（Outfit Recommendation）
- **能力**：
  - 用户选中一件商品后，推荐搭配（如"这件T恤可以搭配这条牛仔裤"）
  - 基于商品属性相似度 + 历史共购数据
- **实现**：
  - 商品 embedding（文本/图片）
  - 共购规则（FBT）
  - LLM 生成搭配理由

#### H. 多轮对话策略优化
- **能力**：
  - 智能判断"何时该问问题" vs "何时该展示结果"
  - 避免过度询问（用户流失）
- **实现**：
  - 规则：关键信息（尺码/类目）缺失时必问；可选信息（颜色/风格）有足够候选时可不问
  - 或训练策略模型（RL/bandit）

#### I. 上下文记忆与纠错
- **能力**：
  - 记住对话中提到的商品（"刚才那件白色的"）
  - 支持用户纠正（"不对，我要的是黑色"）
- **实现**：
  - 对话状态中维护 `mentioned_items`
  - LLM 理解指代消解（coreference resolution）

---

## 4. 数据层需求

### 4.1 对话事件表（DWD 层）

- `dwd_conversation_turn`：每次对话轮次
  - `tenant_id`, `user_key`, `session_id`, `conversation_id`
  - `turn_number`, `role` (user/assistant), `content`
  - `intent`, `extracted_entities_json`
  - `action` (ask_question|show_results|clarify)
  - `created_at`

- `dwd_conversation_result`：对话产生的推荐结果
  - `tenant_id`, `conversation_id`, `turn_number`
  - `item_id`, `position`, `clicked` (是否被点击)
  - `exposed_at`

### 4.2 用户档案表（DIM 层）

- `dim_user_profile`：用户偏好档案
  - `tenant_id`, `user_key`
  - `size_preferences_json`
  - `style_preferences_json`
  - `color_preferences_json`
  - `price_range_json`
  - `brand_preferences_json`
  - `last_updated`, `created_at`

### 4.3 商品库元信息（用于 LLM 上下文）

- **类目列表**：从商品库聚合 `category1_name`, `category2_name`, `category3_name`
- **颜色列表**：从 `specifications` 聚合 `name="color"` 的所有 `value`
- **尺码列表**：从 `specifications` 聚合 `name="size"` 的所有 `value`
- **风格标签**：从 `tags` 或自定义字段聚合

> **注意**：这些元信息需要定期更新（如每天），作为 LLM 的"知识库"输入，确保推荐的商品确实存在。

---

## 5. 技术实现要点

### 5.1 LLM Prompt 设计（关键）

**系统提示词模板**：
```
你是一个专业的服饰导购助手，帮助用户在店铺中找到合适的商品。

店铺信息：
- 类目：{category_list}
- 颜色：{color_list}
- 尺码：{size_list}
- 风格：{style_list}

用户档案（如有）：
{user_profile_json}

当前对话状态：
{conversation_state_json}

任务：
1. 理解用户意图
2. 提取商品偏好（类目/颜色/尺码/价格/风格/场合等）
3. 判断缺失的关键信息
4. 生成自然语言回复

输出格式（JSON）：
{
  "intent": "find_product|refine_search|ask_question|...",
  "extracted_entities": {
    "category": "...",
    "color": [...],
    "size": "...",
    "price_range": {"min": ..., "max": ...},
    "style": "...",
    "occasion": "..."
  },
  "action": "ask_question|show_results|clarify",
  "missing_info": ["size", "color"],  // 缺失的关键信息
  "reply": "自然语言回复"
}
```

### 5.2 偏好 → 搜索 Filters 映射规则

```python
def preferences_to_filters(collected_preferences, user_profile):
    filters = {}
    range_filters = {}
    
    # 类目
    if collected_preferences.get("category"):
        filters["category_name"] = collected_preferences["category"]
    
    # 颜色（specifications）
    if collected_preferences.get("color"):
        filters["specifications"] = [
            {"name": "color", "value": c} 
            for c in collected_preferences["color"]
        ]
    
    # 尺码（specifications）
    if collected_preferences.get("size"):
        # 优先用对话中的，否则用用户档案
        size = collected_preferences.get("size") or user_profile.get("size_preferences", {}).get("tops")
        if size:
            filters.setdefault("specifications", []).append({"name": "size", "value": size})
    
    # 价格区间
    if collected_preferences.get("price_range"):
        pr = collected_preferences["price_range"]
        range_filters["min_price"] = {"gte": pr.get("min", 0), "lte": pr.get("max", 9999)}
    
    # 风格（tags 或自定义字段）
    if collected_preferences.get("style"):
        filters["tags"] = collected_preferences["style"]
    
    return filters, range_filters
```

### 5.3 对话流程控制（状态机）

```
初始状态: waiting_for_intent
  ↓ 用户输入
意图理解: extract_intent_and_entities
  ↓
判断缺失信息:
  - 关键信息缺失（如尺码）→ ask_question
  - 有足够信息 → show_results
  ↓
展示结果后:
  - 用户满意 → end_conversation
  - 用户不满意/继续提问 → refine_search (更新偏好，重新检索)
```

---

## 6. 产品形态建议

### 6.1 前端交互方式

- **Web Chat Widget**：右下角悬浮聊天框（类似客服）
- **全屏对话页**：独立页面，适合移动端
- **搜索结果页集成**：在搜索结果页提供"智能导购"入口

### 6.2 回复展示格式

- **纯文本回复**：LLM 生成的自然语言
- **商品卡片**：展示推荐结果（图片/标题/价格/加购按钮）
- **选项按钮**：快速选择（如"白色"、"黑色"、"蓝色"）
- **追问输入框**：用户继续输入

---

## 7. 评估指标

### 7.1 对话质量
- **平均对话轮次**：完成一次推荐的平均轮次（越少越好，但需平衡信息收集）
- **用户满意度**：对话结束后的反馈（如"有用"/"无用"）
- **推荐点击率**：对话推荐的商品被点击的比例

### 7.2 业务指标
- **转化率**：对话用户 → 加购/购买的转化
- **AOV 提升**：对话用户的平均订单价值 vs 非对话用户
- **档案完善率**：用户档案被更新的比例

---

## 8. 实施优先级

### Phase 1 (MVP - 2-3个月)
- ✅ 基础对话能力（LLM + 意图理解 + 实体抽取）
- ✅ 偏好收集（尺码/颜色/类目/价格）
- ✅ 商品检索（偏好 → filters → 搜索 API）
- ✅ 结果展示（商品卡片）
- ✅ 用户档案（基础字段：尺码/颜色/价格）

### Phase 2 (增强 - 3-4个月)
- ✅ 合身推荐（尺码映射）
- ✅ 搭配推荐
- ✅ 多轮对话策略优化
- ✅ 上下文记忆

### Phase 3 (优化 - 持续)
- ✅ 个性化排序（结合用户历史）
- ✅ A/B 测试（不同 prompt/策略）
- ✅ 跨租户知识共享（可选）

---

## 9. 技术栈建议

- **LLM 服务**：OpenAI API / Anthropic API / 私有化部署（Qwen/GLM）
- **对话状态存储**：Redis
- **用户档案存储**：MySQL + Redis（缓存）
- **商品检索**：复用现有搜索 API
- **后端框架**：Python FastAPI（与现有 API 保持一致）
- **前端**：React/Vue + WebSocket（实时对话）

---

## 10. 注意事项

1. **成本控制**：LLM API 调用成本（每次对话可能 3-10 轮），建议：
   - 简单场景用轻量模型（GPT-4o-mini）
   - 复杂场景用强模型（GPT-4o）
   - 缓存常见问题回复

2. **延迟**：LLM 生成回复通常 1-3 秒，需要：
   - 前端显示"正在思考..."
   - 考虑流式输出（streaming）

3. **商品库同步**：确保 LLM 的"知识库"（类目/颜色/尺码列表）与商品库实时同步

4. **多语言**：如店铺支持多语言，LLM 需要支持对应语言

5. **隐私合规**：用户档案数据需符合 GDPR/CCPA 等要求
