游乐游手机版
首页/AI热点日报/热点详情

AGI基于Joint BERT模型的意图识别技术实践

类型:热点整理2026-06-18
意图识别技术在智能语音助手等场景中早已广泛应用。随着多模态模型能力的迅速发展,用户与大型语言模型(LLM)的交互方式变得更加灵活多样。在这样的背景下,输入给LLM的上下文信息是否有价值、是否精准,直接决定了用户体验的优劣。引入意图识别机制,可以精准过滤掉那些虽然必须加载但在多数场景下用不到的模块工具

意图识别技术在智能语音助手等场景中早已广泛应用。随着多模态模型能力的迅速发展,用户与大型语言模型(LLM)的交互方式变得更加灵活多样。在这样的背景下,输入给LLM的上下文信息是否有价值、是否精准,直接决定了用户体验的优劣。引入意图识别机制,可以精准过滤掉那些虽然必须加载但在多数场景下用不到的模块工具,同时显著压缩整个管线的响应时间——简单来说,就是让交互过程更流畅、更智能。

AGI|基于Joint BERT模型的意图识别技术实践

从本质上看,意图识别属于分类任务。常见的方法包括卷积神经网络(CNN)、长短期记忆网络(LSTM)、基于注意力机制的CNN、分层注意力网络、对抗性多任务学习等。在技术调研过程中,我们重点研究了Joint BERT论文所提出的思路。

Part1 介绍

从技术角度理解,意图识别可以看作是给用户的话语打上标签。例如,当用户对智能音箱说“今天天气怎么样”,系统需要判断其意图是查询天气,而非播放音乐或拨打电话。传统的分类方法各有优劣,而Joint BERT的出现使得意图分类与槽位填充这两个任务可以在同一个框架中同步完成,并且取得了不错的效果。

Part2 模型架构

CLS([CLS])

这是BERT模型中的一个特殊标记,被放置在输入序列的最前面。它的作用是代表整个输入序列的类别信息。在训练过程中,BERT会将[CLS]对应的最后一个隐藏层状态传递给分类层,输出一个向量,用于判断序列所属的类别。简单来说,[CLS]就是整个句子的“代表”,承担着分类决策的重任。

SEP([SEP])

另一个特殊标记,位于输入序列的末尾。其主要功能是分隔不同的输入序列,使BERT能够同时处理多个句子。例如在问答任务中,问题和答案通过[SEP]隔开,模型便能清晰地理解各自的关系。

Joint BERT模型

Joint BERT基于BERT架构,充分利用了其双向上下文表示能力。通过简单的微调,即可同时处理意图分类和槽位填充两项任务。具体实现方式是:利用[CLS]的第一个隐藏状态预测意图,而其他位置的隐藏状态则通过softmax层来分类对应的槽位标签。优化目标是最大化条件概率 p(yi, ys|x),即在给定输入x时,意图yi和槽位序列ys的联合概率,通过最小化交叉熵损失实现端到端微调。论文还探讨了在Joint BERT之上增加条件随机场(CRF)层的效果——CRF能够帮助模型学习槽位标签之间的依赖关系,从而进一步提升准确率。

Part3 最佳实践

基础环境

  • Python 3.10
  • GPU显存大于4GB
  • 得益于BERT模型的特性,即使在CPU上也能完成推理
conda create -n intent-cls python=3.10
conda activate intent-cls
git clone https://devops.digitalchina.com/dcg/wuhan/tai/ai-team-demo-subgroup/intent-cls 
cd intent-cls
pip install -r requirements.txt

数据准备

项目中已包含SMP2019数据集,其结构格式如下:

{
    "text": "我们下次什么时候再来一起看电影",
    "domain": "cinemas",
    "intent": "DATE_QUERY",
    "slots": {}
}

参考上述格式,我们又构建了20条新的数据,围绕与LLM交互最常见的两种意图:聊天(CHAT)和图片生成(IMAGE_GENERATE)。

{
    "text": "我们能在病毒睡觉时杀死它们吗?",
    "domain": "ai",
    "intent": "CHAT",
    "slots": {}
}
{
    "text": "呈现一座巍峨的火山正喷发的壮观景象,熔岩流淌在周围的村庄中,天空被火光染红。",
    "domain": "ai",
    "intent": "IMAGE_GENERATE",
    "slots": {}
}

超参数设置

lr: 5e-4
epoch: 10
batch_size: 64
adam_epsilon: 1e-8
warmup_steps: 60

训练日志

当batch_size=64时,显存占用约4052MB。训练过程记录如下:

[1/20] train loss: 2.8581509590148926  dev acc: 0.3480392156862745  dev intent_a vg: 0.25 def slot_a vg: 0.09803921568627451 sa ve best model: *
[2/20] train loss: 2.828829526901245  dev acc: 1.0  dev intent_a vg: 0.5 def slot_a vg: 0.5 sa ve best model: *
[3/20] train loss: 2.2913732528686523  dev acc: 1.0882352941176472  dev intent_a vg: 0.5 def slot_a vg: 0.5882352941176471 sa ve best model: *
...
[20/20] train loss: 0.009846788831055164  dev acc: 1.9803921568627452  dev intent_a vg: 1.0 def slot_a vg: 0.9803921568627451 sa ve best model:
last model dev intent_a vg: 1.0 def slot_a vg: 0.9803921568627451

模型评估

由于数据量较小,我们将训练集和测试集按8:2的比例划分。尽管测试集准确率达到了100%,但由于样本过少,这个结果仅供参考,不能代表最终实际效果。

项目中已提供FastAPI部署脚本,可以快速启动异步推理服务,具体用法详见README文档。

请求示例如下:

curl --location 'http://127.0.0.1:8000/detect' \
--header 'Content-Type: application/json' \
--data '{
    "text": "xxxx"
}'

测试结果如下:

{
    "text": "火箭迟早要上天,为什么不在天上发射?"
},
{
    "text": "火箭迟早要上天,为什么不在天上发射?",
    "intent": "CHAT",
    "slots": {}
}

{
    "text": "导盲犬禁止入内,是给盲人看的,还是给导盲犬看的?"
},
{
    "text": "导盲犬禁止入内,是给盲人看的,还是给导盲犬看的?",
    "intent": "CHAT",
    "slots": {}
}

{
    "text": "森林,女孩,短发,战靴,光晕"
},
{
    "text": "森林,女孩,短发,战靴,光晕",
    "intent": "IMAGE_GENERATE",
    "slots": {}
}

{
    "text": "帮我画一个昏暗的房间,里面有很多魔法阵,魔法阵泛着各种光芒,一位智者正在看书"
},
{
    "text": "帮我画一个昏暗的房间,里面有很多魔法阵,魔法阵泛着各种光芒,一位智者正在看书",
    "intent": "IMAGE_GENERATE",
    "slots": {}
}

补充说明

在当前应用场景中,我们并未使用槽位填充功能,因为只需判断用户意图即可完成后续处理,无需进行信息抽取。若后续需要抽取实体,可参照SMP2019数据集格式补充slot字段。

  • 意图标签:以txt格式提供,每行一个意图。未识别到的意图用[UNK]表示。可参考SMP2019格式进行定义。
  • 槽位标签:同样以txt格式提供。包含三个特殊标签:[PAD]用于padding token,[UNK]用于未识别序列标签,[O]表示没有槽位的token标签。有实际语义的槽位标签则分为B_开头(表示槽位开始)和I_开头(表示槽位内部其他标记)两种。

另外需要强调的是:意图识别数据需要持续收集和维护。初始数据集不需要过大,但必须在项目中做好数据采集和清洗工作,定期重新训练并更新模型。遇到bad case时,应人工判断缺陷所在,并针对性地补充或修正数据集中的类似样本,如此准确率才能逐步提升。

来源:https://www.53ai.com/news/MultimodalLargeModel/2024072180317.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。