# 对话式智能导购设计(服饰鞋帽独立站) ## 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 等要求