# Summary **DST (Dialogue State Tracking,对话状态跟踪)** - 记录**当前对话的上下文**,知道哪些信息已经收集,哪些还缺。 - 例子: - 系统发现:缺少“出发地” - 状态:{意图=订机票,出发地=?, 目的地=上海,日期=明天} # Cues ## 📊 DST 经典数据集对比 | 数据集 | 描述 | 规模 | 领域 | 数据源 | 论文/年份 | | ------------ | -------------------- | -------------------------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------- | | **MultiWOZ** | 多领域任务型对话数据集,人-人对话 | 约 10,000 个对话,平均每个对话 14 轮 | 7 个领域:餐厅、酒店、景点、出租车、火车、医院、警察 | GitHub: `budzianowski/multiwoz`<br>HuggingFace: `pfb30/multi_woz_v22` | Budzianowski et al., EMNLP 2018 | | **WOZ 2.0** | 餐厅订位对话数据集,专注于 DST 任务 | 约 1,200 个单领域对话 | 餐厅搜索(单领域)| HuggingFace: `woz_dialogue`<br>支持英语、德语、意大利语 | Mrkšić et al., ACL 2017 | | **DSTC** | 对话状态跟踪挑战赛系列数据集 | DSTC2: 餐厅信息域<br>DSTC3: 旅游信息域<br>DSTC8: 20,000+ 对话,20 个领域 | DSTC1: 公交时刻表<br>DSTC2/3: 餐厅/旅游<br>DSTC5: 跨语言 DST<br>DSTC8: 多领域(银行、事件、媒体、日历等)| GitHub: `matthen/dstc` (DSTC2/3)<br>GitHub: `google-research-datasets/dstc8-schema-guided-dialogue` | 从 2013 年至今持续举办<br>DSTC10 在 2021 年 | --- ## 📌 版本说明 ### MultiWOZ 版本演进 - **2.0**: 原始版本(2018) - **2.1**: 修复标注错误(Eric et al., 2019) - **2.2**: 进一步修正 17.3% 的对话状态标注错误(Zang et al., 2020) - **2.3**: 添加共指消解标注(Han et al., 2020) - **2.4**: 精细修正验证集和测试集(Ye et al., SIGDIAL 2022) ### DSTC 挑战赛历史 - **DSTC1** (2013): 公交时刻表域 - **DSTC2/3** (2014): 餐厅/旅游信息域 - **DSTC4** (2015): 领域适应 - **DSTC5** (2016): 跨语言 DST - **DSTC6** (2017): 端到端目标导向对话 - **DSTC8** (2019): Schema-Guided Dialogue - **DSTC10** (2021): 5 个不同赛道 --- ## 🔗 快速访问链接 **MultiWOZ:** - GitHub: https://github.com/budzianowski/multiwoz - HuggingFace: https://huggingface.co/datasets/pfb30/multi_woz_v22 - Kaggle: https://www.kaggle.com/datasets/taejinwoo/multiwoz-22 **WOZ 2.0:** - HuggingFace: https://huggingface.co/datasets/woz_dialogue **DSTC:** - DSTC2/3: https://github.com/matthen/dstc - DSTC8 (SGD): https://github.com/google-research-datasets/dstc8-schema-guided-dialogue - 官方网站: https://www.microsoft.com/en-us/research/event/dialog-state-tracking-challenge/ # Notes 为什么[[意图识别]]和[[对话状态跟踪 DST]]两者要配合 - **意图识别**是入口:先判断用户这句话要做哪类任务。 - **DST**是记忆:在多轮对话里把之前的参数/槽位存下来,避免重复问。 是的!**每次新的用户消息都会触发 DST 更新**,但具体更新策略有些细节: ## 🔄 更新机制 ### 基本流程 ```Java 用户消息 → NLU理解 → DST更新状态 → 对话策略 → 系统回复 ↓ 每轮都执行 ``` --- ## 📝 具体更新方式 ### 1️⃣ **增量更新(最常见)** 每次只更新**有变化**的部分: ```json // 第1轮 用户: "我想订一张去北京的机票" State: { "intent": "book_flight", "destination": "北京", "origin": null, "date": null } // 第2轮 用户: "明天出发" State: { "intent": "book_flight", "destination": "北京", // 保持不变 "origin": null, // 保持不变 "date": "2025-10-15" // ✅ 新增 } // 第3轮 用户: "从上海" State: { "intent": "book_flight", "destination": "北京", "origin": "上海", // ✅ 新增 "date": "2025-10-15" } ``` --- ### 2️⃣ **覆盖更新(用户修改)** 处理用户改主意的情况: ```json 用户: "我要大杯咖啡" State: {"size": "large"} 用户: "不,改成中杯" State: {"size": "medium"} // ✅ 覆盖之前的值 ``` --- ### 3️⃣ **清空更新(重新开始)** 识别到新任务时重置: ```json // 之前在订机票 State: {"intent": "book_flight", "destination": "北京"} 用户: "算了,我想订个酒店" State: {"intent": "book_hotel"} // ✅ 清空机票信息 ``` --- ## ⚡ 优化策略 实际系统中,不是"傻傻地"每次都更新所有内容: ### **条件更新** ```python if new_message_contains_slot_info(): update_state() else: keep_current_state() # 闲聊/确认等不更新 ``` ### **置信度阈值** ```python if confidence > 0.8: update_state() else: ask_for_clarification() # 不确定时不更新,而是反问 ``` ### **冲突检测** ```python if new_value conflicts_with old_value: if is_explicit_correction(): overwrite() else: confirm_with_user() # "您是要改成...吗?" ``` --- ## 🎭 特殊情况 ### ❌ **不更新的场景** |情况|示例|处理| |---|---|---| |**闲聊**|"天气真好"|保持状态不变| |**纯确认**|"好的"|不更新槽位| |**系统主导轮**|系统问问题时|等用户回答| |**识别失败**|听不懂的话|不乱更新| ### ✅ **必须更新的场景** |情况|示例|更新内容| |---|---|---| |**提供新信息**|"明天下午3点"|添加时间槽位| |**修正信息**|"不是北京,是上海"|覆盖目的地| |**否定**|"不要辣的"|添加约束条件| |**确认**|"就这个"|标记槽位已确认| --- ## 🧠 现代方法的智能判断 深度学习模型(如 BERT-DST)会智能决定: ```python # 伪代码 for each_slot in domain: action = model.predict( dialogue_history, current_message, slot_name ) if action == "UPDATE": state[slot] = extract_value() elif action == "DELETE": state[slot] = None elif action == "KEEP": # 不变 pass ``` --- ## 💡 实际建议 如果您在实现 DST: 1. **不要盲目更新** - 加入置信度判断 2. **保留历史** - 记录状态变化轨迹,方便回溯 3. **明确区分** - 区分"更新槽位"和"确认槽位" 4. **处理歧义** - 不确定时主动询问用户 **核心原则:每条新消息都触发 DST 处理,但不是每次都改变状态!** 您是在开发对话系统吗?遇到了什么具体的更新问题? 例如在小红书的“旅行规划对话”里: - 用户:“帮我规划去西藏的路线” - 意图识别 → `行程规划` - DST 更新:`destination=西藏` - 用户:“七天时间” - 意图识别 → `补充约束` - DST 更新:`duration=7天` 没有意图识别,系统不知道用户现在是在“订票”还是“订酒店”。 没有 DST,系统就会忘记之前用户已经说了“去西藏”。 --- ## ✅ 一句话总结 在多轮对话中,**意图识别和 DST 必须同时存在**: - **意图识别**负责判断“这一句话的任务类型”; - **DST**负责把多轮对话的信息逐步拼起来,形成完整的用户目标。