# 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**负责把多轮对话的信息逐步拼起来,形成完整的用户目标。