共计 2025 个字符,预计需要花费 6 分钟才能阅读完成。
业务场景与模型选型
为什么需要意图识别?
- 客服对话分类 :当用户输入 ” 如何重置密码 ” 时,系统需快速识别其属于 ” 账户管理 ” 类意图,而非 ” 产品咨询 ”。某电商平台上线意图识别后,客服转人工率下降 37%
- 智能家居控制 :语音指令 ” 打开客厅空调 ” 需要准确触发设备控制意图,传统规则方法需维护大量关键词列表
模型对比实验(准确率 %)
| 模型 | 电商 FAQ 数据集 | 银行工单数据集 |
|---|---|---|
| SVM | 78.2 | 72.5 |
| LSTM | 85.6 | 81.3 |
| BERT-base | 92.1 | 89.7 |
关键差异:
– BERT 能理解 ” 没法登录 ” 和 ” 账户无法认证 ” 的语义等价性
– 传统方法依赖人工设计特征(如 n -gram),而 BERT 自动学习上下文表征

数据预处理实战
语料清洗四步法
- 噪声过滤 :
python
# 移除特殊字符和乱码
import re
def clean_text(text):
text = re.sub(r'[\uff00-\uffef]', '', text) # 去全角符号
return text.strip() - 不平衡处理 :对低频意图采用 SMOTE 过采样,对高频意图随机欠采样
- 停用词策略 :保留否定词(” 不 ”、” 没 ”)等影响意图的关键词
- 标准化 :统一转换繁体字、全角数字为简体半角
中文 Tokenization 陷阱
- BERT 原生 Tokenizer 会将中文逐字分割,丢失分词信息
- 解决方案:使用 LAC 等工具先分词再输入 BERT
“`python
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(‘bert-base-chinese’)
建议:在训练前统计语料的 OOV(Out-Of-Vocabulary) 率
“`
预训练任务实现
Masked Language Model(MLM) 配置
from transformers import BertForMaskedLM
model = BertForMaskedLM.from_pretrained('bert-base-chinese')
# 自定义 15% 的 mask 比例(原论文推荐值)trainer = Trainer(
model=model,
args=training_args,
data_collator=data_collator # 需实现随机 mask 逻辑
)
Next Sentence Prediction(NSP) 调整
- 意图识别任务中,超 80% 的样本是单句输入
- 建议禁用 NSP 或降低其 loss 权重
微调阶段核心技巧
学习率调度策略
- Warmup:前 10% 的 step 线性增大学习率
python
from transformers import get_linear_schedule_with_warmup
scheduler = get_linear_schedule_with_warmup(
optimizer,
num_warmup_steps=500,
num_training_steps=total_steps
) - 分层学习率 :
- 底层参数:1e-5(保留预训练知识)
- 顶层分类层:1e-4(快速适应新任务)
类别不平衡解决方案
class WeightedCELoss(nn.Module):
def __init__(self, class_weights):
super().__init__()
self.weights = torch.FloatTensor(class_weights)
def forward(self, inputs, targets):
ce_loss = F.cross_entropy(inputs, targets, reduction='none')
return (ce_loss * self.weights[targets]).mean()
# 计算每个意图类别的样本数倒数作为权重
生产环境优化
混合精度训练
# 启动训练时添加参数
python run.py --fp16 --amp_level O2
显存不足三板斧
- 梯度累积 :每 4 个 batch 更新一次参数
- 动态 padding:同 batch 内统一到最大长度
python
from transformers import DataCollatorWithPadding
collator = DataCollatorWithPadding(tokenizer, padding='longest') - 梯度检查点 :用时间换空间
model.gradient_checkpointing_enable()
常见问题排查
过拟合诊断
- 训练集准确率 > 验证集准确率 15% 以上
- 解决方案:
- 增加 Dropout 概率(0.3→0.5)
- 早停机制(patience=3)
标签泄露预防
- 现象:测试集准确率异常高(如 99%)
- 检查点:
- 确保验证 / 测试集没有参与过任何预处理
- 排查数据中是否混入意图标签关键词
开放思考题
- 当意图类别动态增加时(如新增 ” 疫情咨询 ” 类),如何实现不重新训练全模型?
- 在 200ms 响应时间的限制下,如何优化 BERT 的推理速度?
- 如何处理 ” 我想订机票但还没确定日期 ” 这类复合意图?
正文完
