AI 产品 PoC和 MVP 落地
子页面
AI对话意图澄清设计
所属实践:AI Workflow 设计及开发
设计AI对话中的意图澄清机制,通过词槽定义和多轮对话策略,将用户的自然语言表达转化为结构化数据,提升任务完成的准确性和用户体验。
AI对话意图澄清设计
目录
What - 实践定义
意图澄清设计是将用户的自然语言表达转化为结构化数据的设计方法,通过词槽(Slot)定义和多轮对话策略,补全缺失信息。
核心概念:
- 词槽(Slot): 完成任务所需的结构化字段
- 填槽(Slot Filling): 通过对话收集所有必要信息
- 澄清轮次: 建议 ≤3轮
When - 何时进行
适用场景:
- ✅ 任务型Chatbot(订票、查询、预订)
- ✅ 需要收集多个必要参数
- ✅ 结合企业知识库的智能推断
设计时机: 在业务流程梳理完成后,技术实现前
不适用: 纯闲聊、单轮问答、开放式创意生成
Why - 为什么需要
核心价值
- 提升准确性 - 识别准确率提升 20-40%
- 改善体验 - 用户满意度提升 30-50%
- 确保完整性 - 任务成功率提升 35-60%
- 降低成本 - 人工转接率下降 40-60%
最终产出示例
1. 词槽定义 JSON Schema
代码{
"intent": "book_flight",
"slots": {
"time": {
"type": "DATETIME",
"required": true,
"priority": 0,
"prompt": "您希望什么时候出发?",
"validation": {"min_date": "today", "max_date": "+90days"},
"extraction": {"confidence_threshold": 0.8}
},
"from_geo": {
"type": "GEO-INFO",
"required": true,
"priority": 0,
"default_strategy": "use_user_current_location",
"confirmation_required": true,
"confirmation_prompt": "您是从{value}出发吗?"
},
"to_geo": {
"type": "GEO-INFO",
"required": true,
"priority": 0,
"prompt": "您要去哪里?"
},
"cost_center": {
"type": "STRING",
"required": true,
"priority": 0,
"retrieval_strategy": "rag_search",
"rag_context": {
"search_fields": ["user_recent_projects"],
"max_candidates": 3,
"similarity_threshold": 0.75
},
"fallback": "ask_user_directly"
}
},
"extraction_order": {
"strategy": "dynamic_priority",
"base_order": ["to_geo", "time", "from_geo", "cost_center"]
}
}
2. 参数化定义表(关键部分)
模糊表达 | 标准定义 | 示例 |
---|---|---|
早上 | 06:00-08:00 | "订早上的票" → "6-8点" |
明天 | current_date + 1 | 9月30日说"明天" → 10月1日 |
这里 | user_current_location | "从这里出发" → 推断后需确认 |
便宜 | price < avg * 0.8 | "便宜的票" → 低价筛选 |
几个 | 3-5 | "推荐几个" → 默认显示3个 |
3. 对话策略示例
场景A: 信息不完整 - 渐进式收集
用户: "要出差深圳"
Bot: "您是从成都出发去深圳吗?什么时候出发?" (推断+询问,1轮)
用户: "对,明天早上"
Bot: "根据您的XX项目,推荐成本中心:
1. CC-2024-001
2. CC-2024-005
请选择" (RAG推荐,2轮)
用户: "1"
Bot: "确认:明早6-8点,成都→深圳,CC-2024-001" (确认,3轮完成)
✅ 3轮内完成,使用推断和RAG降低询问次数
场景B: 语义模糊 - 逐级澄清
用户: "金融集团营收?"
Bot: "您是想查财务、战发还是投资方面的数据?" (澄清领域)
用户: "财务"
Bot: "请选择公司:
1. 招商局金融集团(合并)
2. 招商银行
3. 招商金融租赁" (提供选项)
用户: "1"
Bot: "正在查询招商局金融集团的营业收入..." (执行)
✅ 从大范围到小范围逐级澄清
场景C: 达到3轮未澄清 - 兜底策略
用户: "订票"
Bot: "好的,请问您要去哪里?什么时候出发?" (第1轮)
用户: "嗯..."
Bot: "目的地比如北京、上海、广州、深圳?" (第2轮,提供示例)
用户: "那个地方"
Bot: "我列出一些热门城市供您选择:
1. 北京 2. 上海 3. 广州 4. 深圳 5. 成都
6. 其他(请直接输入城市名)" (第3轮,提供选项)
用户: "都不是"
触发兜底策略:
Bot: "看起来需要更详细的沟通。我可以:
1. 📞 为您转接人工客服
2. 📋 查看您的历史订单,帮您重复上次的行程
3. 💾 保存当前进度,稍后继续
4. 📱 您也可以直接拨打 400-XXX-XXXX
请选择"
✅ 3轮后提供多种退出通道,保存进度
4. 置信度阈值表
词槽类型 | 高(≥0.90) | 中(0.75-0.89) | 低(<0.75) |
---|---|---|---|
必填-关键 | 直接使用+批量确认 | 立即确认 | 重新询问 |
必填-一般 | 直接使用 | 确认后使用 | 重新询问 |
可选字段 | 直接使用 | 用默认值 | 用默认值 |
How - 实施步骤
步骤1: 识别核心意图 (2-3天)
做什么: 收集真实对话,提取高频任务
产出: 意图优先级列表
P0 (必须): book_flight (45%), query_order (25%)
P1 (重要): policy_inquiry (20%)
P2 (可选): greeting (10%)
步骤2: 梳理业务要素 (1-2天)
做什么: 列出每个意图所需的所有字段
产出: 业务要素表
字段 | 类型 | 必填 | 优先级 | 获取策略 |
---|---|---|---|---|
time | DATETIME | 是 | P0 | 直接提取 |
from_geo | GEO-INFO | 是 | P0 | 推断+确认 |
to_geo | GEO-INFO | 是 | P0 | 直接提取 |
cost_center | STRING | 是 | P0 | RAG检索 |
步骤3: 设计词槽结构 (2-3天)
做什么: 将字段转为 JSON 配置
关键点:
- 设置置信度阈值
- 定义缺失时的提示语
- 配置默认值和推断策略
- 设计验证规则
产出: 词槽 JSON Schema(见前文示例)
步骤4: 设计参数化规范 (1天)
做什么: 标准化模糊概念
关键参数化:
- 时间: 早上→06:00-08:00
- 地点: 这里→user_location(需确认)
- 数量: 几个→3-5个
- 程度: 便宜→price<avg*0.8
产出: 参数化映射表(见前文示例)
步骤5: 设计对话策略 (2-3天)
做什么: 定义各场景的对话流程
核心策略:
信息收集顺序:
1. 目的地(to_geo)- 最关键
2. 时间(time)- 次关键
3. 出发地(from_geo)- 可推断
4. 其他必填字段
多轮对话规则:
- 最多3轮澄清
- 每轮最多问2个字段
- 能推断的先推断再确认
- 第3轮提供选项列表
产出: 对话策略文档(见前文场景示例)
步骤6: RAG增强设计 (1-2天)
做什么: 配置知识库检索策略
配置要点:
代码{
"cost_center": {
"rag_search": {
"search_fields": ["user_recent_projects", "user_department"],
"top_k": 3,
"similarity_threshold": 0.75,
"fallback": "ask_user_directly"
}
}
}
关键决策:
- 相似度阈值: 0.75(平衡准确性和召回率)
- 候选数量: 3个(避免选择困难)
- 失败兜底: 直接询问用户
步骤7: 错误处理设计 (1天)
做什么: 定义异常场景处理
关键场景:
场景 | 触发条件 | 处理策略 |
---|---|---|
低置信度 | <0.75 | 重新询问或提供选项 |
验证失败 | 格式/规则错误 | 说明错误+重新输入 |
RAG失败 | 检索超时/无结果 | 直接询问用户 |
3轮未澄清 | 连续3轮失败 | 转人工/保存进度 |
权限不足 | 越权访问 | 礼貌拒绝+说明 |
步骤8: 测试优化 (持续)
测试维度:
- 意图识别准确率 >90%
- 平均澄清轮次 ≤2轮
- 任务完成率 >85%
- 用户满意度 >4/5分
常见陷阱与Tips
⚠️ 陷阱1: 词槽设计过于复杂
问题: 一开始设计过多字段
解决:
- ✅ 先聚焦P0必填字段
- ✅ 遵循80/20原则
- ✅ 可选字段真正可选
⚠️ 陷阱2: 澄清轮次过多
问题: 一个字段一个字段地问
解决:
- ✅ 严格限制≤3轮
- ✅ 一次询问尝试收集多个字段
- ✅ 充分利用推断和默认值
对比示例:
❌ 不好:
Bot: "去哪里?"
Bot: "什么时候?"
Bot: "几点?"
Bot: "成本中心?"
(4轮,用户崩溃)
✅ 好:
Bot: "您是从成都去上海吗?什么时候出发?"
用户: "对,明天早上"
Bot: "推荐成本中心:1.XX 2.YY"
(2轮完成)
⚠️ 陷阱3: 忽略上下文
问题: 每次从零开始询问
解决:
- ✅ 设计上下文词槽(用户位置、历史偏好)
- ✅ 推断后请求确认
- ✅ 同一会话继承已确认信息
第一次: 完整流程
第二次:
用户: "再订一张后天的"
Bot: "成都→上海,后天,张三,CC-2024-001,对吗?"
(大部分继承,仅1轮)
⚠️ 陷阱4: 参数化定义不明确
问题: "早上"、"便宜"等没有标准
解决:
- ✅ 建立完整参数化表
- ✅ 对话中明确显示理解
- 例: "为您查询早上6-8点的航班"
⚠️ 陷阱5: 缺乏兜底策略
问题: RAG失败或3轮仍未澄清时卡住
解决:
代码{
"fallback_strategies": {
"rag_failure": "ask_user_directly",
"3_rounds_failed": "transfer_to_human_or_save_progress",
"permission_denied": "show_alternatives"
}
}
💡 Tip 1: 渐进式收集
不要一次问所有信息,根据上一步结果决定下一步。
💡 Tip 2: 用确认代替询问
❌ "从哪里出发?"
✅ "您是从成都出发吗?"(用户只需说是/否)
💡 Tip 3: 提供结构化选项
对于有限选项,提供列表而非开放式提问。
💡 Tip 4: 显式显示理解
执行前总结系统理解:
Bot: "确认信息:
📍 成都→上海
📅 明天早上6-8点
👤 张三
确认请回复'确认'"
💡 Tip 5: 批量确认默认值
Bot: "我根据您的资料填写了:
✓ 乘客:张三
✓ 手机:138****8000
✓ 成本中心:CC-2024-001
全部正确请回复'确认',需修改请告诉我"
💡 Tip 6: 监控关键指标
持续跟踪:
- 意图识别准确率
- 平均澄清轮次
- 任务完成率
- 用户放弃率(在哪一步)
- 转人工率
总结检查清单
设计完成后验证:
基础完整性:
- 每个P0意图都有完整词槽定义
- 所有必填字段有缺失提示语
- 模糊概念有参数化定义
对话策略:
- 澄清策略不超过3轮
- 每轮最多问2个字段
- 设计了上下文推断策略
- 有RAG失败的兜底方案
用户体验:
- 有完整的确认机制
- 批量确认多个默认值
- 明确显示系统理解
- 3轮后提供退出选项
技术实现:
- 定义了置信度阈值
- 准备了测试用例集
- 定义了监控指标
- 文档化了所有设计决策
快速参考卡
核心原则
- ≤3轮澄清 - 超过转人工
- 能推断的不询问 - 推断后需确认
- 优先级驱动 - 先收集关键字段
- 批量确认 - 多个默认值一次确认
关键指标
- 意图识别: >90%
- 澄清轮次: ≤2轮
- 完成率: >85%
- 满意度: >4/5
词槽设计要素
必备: type, required, priority, prompt
推断: default_strategy, confirmation_required
验证: validation, confidence_threshold
兜底: fallback_strategy
RAG配置要点
检索字段: user_recent_projects, user_department
候选数量: 3个
相似度阈值: 0.75
失败兜底: ask_user_directly
附录:实用模板
词槽定义模板
代码{
"slot_name": {
"type": "数据类型",
"required": true/false,
"priority": 0-2,
"prompt": "缺失时询问话术",
"default_strategy": "获取默认值策略",
"confirmation_required": true/false,
"validation": {"规则": "值"},
"extraction": {"confidence_threshold": 0.8},
"fallback": "失败处理策略"
}
}
对话策略模板
场景: [描述场景]
用户输入: "[用户表达]"
系统分析:
- 意图: [intent_name] (置信度: X)
- 已提取: [slot1: value1], [slot2: value2]
- 缺失: [missing_slots]
- 策略: [处理策略]
Bot: "[机器人回复]"
处理轮次: X轮
成功标准: [标准]
参数化定义模板
模糊概念: "用户表达"
标准定义: 具体值/范围
应用场景: 何时使用
示例: 输入→输出
确认策略: 是否需要/如何确认