前言

在人机对话系统(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 EngineeringFunction 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\": \"北京\"}"}。这既完成了意图识别,也完成了槽位提取。


五、 难点与未来挑战

尽管技术在进步,但意图识别在落地时仍面临挑战:

  1. 意图模糊与多意图:用户说“这一单不要辣,还有帮我看看上一单退款没”。这一句话包含了“备注修改”和“查询退款”两个意图。

  2. OOD (Out-of-Distribution) 问题:用户问了系统不支持的问题(如在订餐系统问天气)。模型需要有“拒识”的能力,而不是强行分类。

  3. 小样本 (Few-Shot):在垂直领域,我们往往没有几千条标注数据,如何利用 LLM 的泛化能力做小样本分类是关键。


总结

从正则匹配到 BERT,再到如今的 LLM Agent,意图识别的准确率和灵活性都在飞速提升。

  • 对于高并发、意图固定的场景,BERT 微调依然是首选。

  • 对于复杂交互、长尾需求的场景,利用 LLM 的 Function CallingReAct 模式则是未来的方向。

希望这篇文章能帮你梳理清楚意图识别的技术脉络!如果你觉得有用,欢迎点赞、收藏、关注

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐