意图识别:从BERT到LLM的进化之路
本文系统梳理了意图识别技术的发展脉络,从早期的规则匹配、机器学习方法到深度学习和LLM时代的变革。意图识别作为对话系统的核心环节,其技术演进经历了三个阶段:基于规则的简单匹配、基于统计的机器学习分类,以及利用BERT等预训练模型的深度学习。文章通过PyTorch代码示例展示了BERT模型的实践应用,并重点分析了LLM时代Prompt Engineering和Function Calling带来的范
前言
在人机对话系统(Chatbot)、智能客服、以及现在的 AI Agent 中,意图识别(Intent Recognition) 往往是系统接收到用户 Query 后的第一步处理逻辑。
简单来说,意图识别就是把用户的自然语言“翻译”成机器能听懂的指令。如果意图识别错了,后续的槽位填充(Slot Filling)、逻辑推理、API 调用全都会错。因此,它被称为对话系统的“方向盘”。
本文将带你深入浅出地理解意图识别的本质,回顾从机器学习到深度学习的技术演进,并重点探讨在 LLM(大模型)时代,意图识别发生了哪些颠覆性的变化。
一、 什么是意图识别?
从数学角度看,意图识别本质上是一个**文本分类(Text Classification)**问题。
假设我们有一个预定义的意图集合 $C = \{c_1, c_2, ..., c_n\}$(例如:查天气、订机票、取消订单),给定用户输入的文本序列 $x$,我们的目标是找到一个映射函数 $f$,使得:
$$\hat{y} = \operatorname*{argmax}_{c \in C} P(c|x)$$
其中 $\hat{y}$ 就是我们要预测的最优意图类别。
举个例子:
用户输入:“我想订一张明天去北京的机票。”
识别结果:
Book_Flight_Intent
二、 技术演进路线
1. 规则与关键词时代 (Rule-based)
早期的系统主要依赖正则表达式(Regex)和关键词匹配。
-
优点:实现简单,响应极快,冷启动成本低。
-
缺点:泛化能力极差。用户说“我要去北京”和“我想飞北京”可能需要写两条规则,维护成本随系统复杂度呈指数级上升。
2. 传统机器学习时代 (ML)
使用 TF-IDF 或 N-gram 提取特征,配合 SVM(支持向量机)或 Naive Bayes(朴素贝叶斯)进行分类。
-
突破:开始具备一定的统计规律学习能力。
-
局限:无法理解词序和语义上下文(例如“我不喜欢苹果”和“像苹果一样红”,机器很难区分语义差异)。
3. 深度学习与预训练模型 (Deep Learning & BERT)
这是 NLP 的黄金时代。利用 CNN/RNN/LSTM 捕捉序列特征,或者直接使用 Google 推出的 BERT 模型。
BERT 通过其强大的 Self-Attention(自注意力机制),能够完美捕捉双向语义上下文。通常的做法是在 BERT 的 [CLS] token 输出后接一个全连接层(Softmax)进行分类。
三、 实战:使用 BERT 进行意图识别 (PyTorch Demo)
虽然现在 LLM 很火,但在高并发、低延迟的工业场景下(如淘宝客服、美团外卖),小模型(BERT/DistilBERT)仍然是性价比之王。
下面是一个基于 Hugging Face transformers 的核心代码片段:
Python
import torch
import torch.nn as nn
from transformers import BertModel, BertTokenizer
class IntentClassifier(nn.Module):
def __init__(self, num_labels):
super(IntentClassifier, self).__init__()
# 加载预训练的 BERT
self.bert = BertModel.from_pretrained('bert-base-chinese')
self.dropout = nn.Dropout(0.1)
# 分类层
self.classifier = nn.Linear(768, num_labels)
def forward(self, input_ids, attention_mask):
# BERT 的输出
outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)
# 取 [CLS] 标记的输出向量 (Batch_Size, 768)
pooled_output = outputs.pooler_output
x = self.dropout(pooled_output)
# 映射到意图类别
logits = self.classifier(x)
return logits
# 使用示例
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = IntentClassifier(num_labels=5) # 假设有5个意图
text = "我的快递到哪了?"
inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
outputs = model(inputs['input_ids'], inputs['attention_mask'])
predicted_class = torch.argmax(outputs, dim=1)
print(f"预测意图ID: {predicted_class.item()}")
四、 大模型 (LLM) 时代的意图识别
随着 GPT-3.5/4 的出现,意图识别的范式发生了彻底的改变。我们不再需要训练大量的分类数据,而是转向了 Prompt Engineering 和 Function Calling。
1. 语义路由 (Semantic Router)
在 RAG(检索增强生成)或 Agent 架构中,我们不需要训练模型,而是通过计算 Embedding 的相似度来做路由。
-
原理:将用户的 Query 向量化,与预设的 Prompt 库或意图描述向量进行余弦相似度计算。
-
优势:无需训练,几行代码即可实现,且支持 Zero-shot(零样本)。
2. Function Calling (工具调用)
这是目前 Agent 最主流的意图识别方式。
我们不再让模型输出一个 0 或 1 的分类标签,而是给 LLM 描述一系列工具(Tools),让 LLM 自己决定调用哪个函数。
OpenAI 格式示例:
JSON
{
"messages": [{"role": "user", "content": "帮我查一下北京明天的天气"}],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "城市,如北京"}
},
"required": ["location"]
}
}
}
]
}
LLM 会自动判断意图,并返回:{"name": "get_weather", "arguments": "{\"location\": \"北京\"}"}。这既完成了意图识别,也完成了槽位提取。
五、 难点与未来挑战
尽管技术在进步,但意图识别在落地时仍面临挑战:
-
意图模糊与多意图:用户说“这一单不要辣,还有帮我看看上一单退款没”。这一句话包含了“备注修改”和“查询退款”两个意图。
-
OOD (Out-of-Distribution) 问题:用户问了系统不支持的问题(如在订餐系统问天气)。模型需要有“拒识”的能力,而不是强行分类。
-
小样本 (Few-Shot):在垂直领域,我们往往没有几千条标注数据,如何利用 LLM 的泛化能力做小样本分类是关键。
总结
从正则匹配到 BERT,再到如今的 LLM Agent,意图识别的准确率和灵活性都在飞速提升。
-
对于高并发、意图固定的场景,BERT 微调依然是首选。
-
对于复杂交互、长尾需求的场景,利用 LLM 的 Function Calling 或 ReAct 模式则是未来的方向。
希望这篇文章能帮你梳理清楚意图识别的技术脉络!如果你觉得有用,欢迎点赞、收藏、关注!
更多推荐
所有评论(0)