智能对话系统(如聊天机器人、智能语音助手)、搜索引擎和垂直领域问答系统的核心。 不是闲聊助手,理解查询意图,并将其转化为计算机可以精确处理和执行的结构化数据。
原始输入(text): “查询许昌到中山的高铁票”
语义解析输出(Structured Data): intent: 意图 (用户提问的类型) QUERY(查询)、BOOK(预订)、CANCEL(取消)、COMPARE(对比) domain: 领域 slots:槽位(实体) { “Dest”: “中山”, “Src”: “许昌” }
组织为自然语言 -》 输出
智能对话助手(智能体)接收用户的自然语言输入,并输出结构化的、机器可读的数据,以便后续系统执行精确的查询。
-
技术方案 BERT(微调):意图识别 + 实体识别, 3天
-
技术方案 GPT(提示词、后序可以考虑微调):大模型识别意图 + 实体, 3个小时 方法1: 提示词
方法2: tools 信息解析 优点:比较可控,底层,单独一个程序 不受其他影响; 缺点:需要单独部署,比如fastapi
方法3: coze / dify 低代码实现 (快速实现) 优点:入门很简单,ai agent 开发平台,大公司都会部署一个类型的平台 缺点:做复杂的很难,性能受限于 dify 平台,不同的agent 可能会相互影响
方法4: lora微调大模型 前面的1-3不满足要求的时候(提示词写不出来) 或 速度 / 可控性要求比较高的时间 优点:可控,可定制化,微调之后不需要写很复杂的提示词 缺点:比较复杂,需要额外gpu微调、部署
在 Joint-BERT 模型中,文本分类(Intent Classification)和实体识别(Slot Filling)可以共享同一个 BERT 编码器。
BERT 提取的语义特征同时支撑两个任务。意图识别利用 [CLS] 向量或全局池化向量来理解整句大意;实体识别则利用每个 Token 的输出向量来判断标签。意图和槽位具有强相关性。例如,当意图被识别为“订票”时,序列中出现“城市名”作为实体的概率会大大增加。
- Loss 函数:
- 文本分类 (Intent):通常使用
CrossEntropyLoss(交叉熵损失)。 - 实体识别 (Slot):同样使用
CrossEntropyLoss。
- 文本分类 (Intent):通常使用
直接使用 loss = seq_loss + token_loss 最方便,但如果某个任务可能很快就达到了瓶颈,而另一个任务还在剧烈波动,简单的相加会导致模型在梯度下降时被“带偏”。
-
静态权重分配:引入超参数
$\alpha$ 和$\beta$ ,例如$Loss = \alpha \cdot seq_loss + \beta \cdot token_loss$ 。通过实验手动调优比例。 - 动态权重微调 (Uncertainty Weighting):利用同方差不确定性(Homoscedastic Uncertainty)来自动学习任务权重,让模型在训练过程中自行调节哪个任务更重要。
Role: 你是一个高效的 NLU(自然语言理解)解析专家。你的任务是从用户的输入中提取“意图”和“槽位(实体)”。
Task:
- 识别用户的意图(如:查询天气、播放音乐、设置闹钟、其他)。
- 识别并提取槽位实体(如:时间、地点、歌手名、歌曲名)。
Output Format (JSON ONLY):
{
"intent": "意图名称",
"slots": {
"实体类型": "实体值"
}
}Example:⽤户输⼊: "帮我播放周杰伦的⻘花瓷" 输出: {"intent": "play_music", "slots": {"singer": "周杰伦", "song": "⻘花瓷"}}
意图识别:
accuracy:0.9573643410852714
precision:0.9573643410852714
recall:0.9573643410852714
f1:0.9573643410852714
precision recall f1-score support
0 1.00 0.94 0.97 16
2 0.00 0.00 0.00 1
3 1.00 1.00 1.00 4
4 1.00 1.00 1.00 16
5 0.00 0.00 0.00 1
6 1.00 1.00 1.00 22
7 0.81 0.94 0.87 18
8 0.89 0.95 0.92 57
9 1.00 0.50 0.67 2
10 0.00 0.00 0.00 0
11 0.00 0.00 0.00 1
12 0.98 0.98 0.98 327
13 0.00 0.00 0.00 1
14 0.75 1.00 0.86 3
15 1.00 1.00 1.00 1
17 1.00 1.00 1.00 4
18 1.00 0.60 0.75 5
19 1.00 1.00 1.00 14
21 0.00 0.00 0.00 1
22 0.93 1.00 0.96 13
23 1.00 0.89 0.94 9
accuracy 0.96 516
macro avg 0.68 0.66 0.66 516
weighted avg 0.95 0.96 0.95 516
槽位填充:
accuracy:0.9164364640883977
precision:0.711864406779661
recall:0.7753846153846153
f1:0.7422680412371133
precision recall f1-score support
Dest 0.67 0.29 0.40 7
Src 0.25 0.14 0.18 7
area 0.00 0.00 0.00 4
artist 0.75 0.75 0.75 8
artistRole 0.00 0.00 0.00 2
author 0.79 0.85 0.81 13
category 0.55 0.76 0.64 42
code 0.83 0.83 0.83 6
content 0.83 0.88 0.86 17
datetime_date 0.75 0.95 0.84 19
datetime_time 0.54 0.64 0.58 11
dishName 0.77 0.88 0.82 74
dishNamet 0.00 0.00 0.00 1
dynasty 1.00 1.00 1.00 11
endLoc_area 0.00 0.00 0.00 2
endLoc_city 0.81 0.98 0.88 43
endLoc_poi 0.41 0.64 0.50 11
endLoc_province 0.00 0.00 0.00 1
episode 0.00 0.00 0.00 1
film 0.00 0.00 0.00 1
ingredient 0.53 0.56 0.55 16
keyword 0.88 0.84 0.86 25
location_area 0.00 0.00 0.00 2
location_city 0.44 1.00 0.62 4
location_poi 0.12 0.14 0.13 7
location_province 0.00 0.00 0.00 3
name 0.73 0.87 0.79 182
popularity 0.00 0.00 0.00 5
queryField 1.00 1.00 1.00 2
questionWord 0.00 0.00 0.00 1
receiver 0.25 0.25 0.25 4
relIssue 0.00 0.00 0.00 1
scoreDescr 0.00 0.00 0.00 1
song 0.53 0.53 0.53 15
startDate_date 0.88 1.00 0.94 15
startDate_time 0.00 0.00 0.00 1
startLoc_area 0.00 0.00 0.00 1
startLoc_city 0.80 0.92 0.85 38
startLoc_poi 0.00 0.00 0.00 1
subfocus 0.00 0.00 0.00 1
tag 0.00 0.00 0.00 5
target 1.00 1.00 1.00 12
teleOperator 0.00 0.00 0.00 1
theatre 0.00 0.00 0.00 2
timeDescr 0.00 0.00 0.00 2
tvchannel 0.70 0.76 0.73 21
yesterday 0.00 0.00 0.00 1
micro avg 0.71 0.78 0.74 650
macro avg 0.36 0.39 0.37 650
weighted avg 0.68 0.78 0.72 650
=================================
打开相机这
意图: LAUNCH
槽位: [('name', '相', 2, 2)]
=================================
=================================
国际象棋开局
意图: QUERY
槽位: [('name', '国际象棋', 0, 3)]
=================================
=================================
打开淘宝购物
意图: LAUNCH
槽位: [('name', '淘宝', 2, 3)]
=================================
=================================
搜狗
意图: LAUNCH
槽位: []
=================================
=================================
打开uc浏览器
意图: LAUNCH
槽位: [('name', 'uc浏', 2, 4)]
=================================
=================================
帮我打开人人
意图: LAUNCH
槽位: []
=================================
=================================
打开酷狗并随机播放
意图: LAUNCH
槽位: [('name', '酷狗', 2, 3)]
=================================
=================================
赶集
意图: LAUNCH
槽位: []
=================================
=================================
从合肥到上海可以到哪坐车?
意图: QUERY
槽位: [('startLoc_city', '合肥', 1, 2), ('endLoc_city', '上海', 4, 5)]
=================================
=================================
从台州到金华的汽车。
意图: QUERY
槽位: [('startLoc_city', '台', 1, 1), ('Src', '州', 2, 2), ('Dest', '金华', 4, 5)]
=================================
=================================
从西安到石嘴山的汽车票。
意图: QUERY
槽位: [('startLoc_city', '西安', 1, 2), ('endLoc_city', '石嘴', 4, 5), ('Dest', '山', 6, 6)]
=================================