当 AI Agent 接入了大量工具(Tool)和多条能力分支时,若把全部工具描述都塞给大模型,往往会带来 Token 爆炸、选择困难、延迟升高和成本浪费。用户意图识别就是在调用大模型之前,先搞清楚「用户想干什么」,从而只把相关的少量工具交给大模型,让整个 Agent 既准又省。

本文先梳理 Agent 的完整流程,再重点拆解意图识别的设计与实现。


一、AI Agent 整体流程概览

可以把 Agent 理解为三层流水线:前两层在网关/本机完成且不调用大模型,只有最后一层才把精简后的上下文交给大模型。

用户输入 → 意图识别路由 → 智能体/工具组选择与Tool过滤 → 大模型推理 → 结果返回

1.1 三阶段一览

阶段 模块 输入 输出 是否调用大模型
1 意图识别路由器 用户消息 意图 + 置信度 ❌ 否
2 智能体选择器 / Tool 过滤器 意图 + 置信度 选中的分支 + 精选 Tool 列表(约 5~12 个) ❌ 否
3 大模型推理层 System Prompt + 精选 Tools + 用户消息 回复文本 / Tool 调用 ✅ 是

核心原则:意图识别和工具筛选都在本服务内完成,只有确定「要激活哪几类能力、传哪几个 Tool」之后,才把精简参数传给大模型。

1.2 数据流简图

┌─────────────┐
│  用户输入   │
└──────┬──────┘
       ▼
┌─────────────────────────────────────┐
│ 意图识别(规则 + 向量 + 轻量分类)   │  ← 本文重点
│ 输出:意图类型、置信度、备选         │
└──────┬──────────────────────────────┘
       ▼
┌─────────────────────────────────────┐
│ 智能体/分支选择 + 动态 Tool 过滤     │
│ 输出:主分支 + 5~12 个精选 Tool     │
└──────┬──────────────────────────────┘
       ▼
┌─────────────────────────────────────┐
│ 大模型推理(唯一调用 LLM 的环节)    │
│ 输入:System + 精选 Tools + 用户消息 │
└──────┬──────────────────────────────┘
       ▼
  Tool 执行 / 回复用户

理解「意图识别」的输入输出和在整个链路中的位置后,下面专门讲意图识别怎么做。


二、为什么意图识别不交给大模型?

一个常见误区是把「用户想查订单还是查库存」也交给 GPT/Claude 等大模型判断。这样会带来:

  • 延迟:多一次大模型往返,通常增加数百毫秒以上
  • 成本:每次请求都多消耗 Token
  • 稳定性:依赖外部 API,路由层成为单点

而意图识别本质是检索/匹配:在有限个意图(或能力分支)里选一个或几个,属于分类/相似度问题,不是开放式生成。因此用本地规则、向量相似度、轻量分类模型就能解决,无需大模型参与。

方式 延迟 成本 稳定性
本地规则 + 向量 + 小分类模型 <100ms 0
调用大模型做意图分类 500~2000ms 依赖 API

结论:意图识别层追求快、稳、省,应全部在本地完成。


三、意图识别详细设计

3.1 输入与输出

  • 输入:用户当前轮次的原始消息(文本)。
  • 输出
    • 主意图:当前最可能的一个意图(对应一个能力分支/智能体);
    • 置信度:0~1 的分数;
    • 备选意图(可选):置信度次高的 1~2 个,用于多意图或兜底。

意图可以映射为「订单」「库存」「财务」「客服」等业务域,也可以映射为「大 Agent 下的分支/工具组」,二者在流程上等价。


3.2 三级识别策略(由快到慢,逐级兜底)

意图识别采用三级策略:先尝试最快、最确定的规则,未命中再用向量相似度,最后用轻量分类模型兜底。这样在保证准确率的同时,把平均延迟压到百毫秒内。

第一级:规则匹配(目标 <5ms)

用规则直接命中高频、确定性的表达,无需模型。

策略 说明 示例
关键词触发 预定义词表,命中即路由 「查库存」「库存还有多少」→ 库存分支
正则模式 匹配结构化表达 匹配「订单号[A-Z0-9]+」→ 订单分支
实体识别 识别金额、日期、单号等 出现金额+「报销」→ 财务分支

实现方式:关键词集合、正则引擎、简单实体识别(如正则或小规则)即可。可配置化,方便运营迭代。

第二级:向量相似度(目标 <50ms)

当规则没有明确命中时,用语义相似度在「用户表述」和「各意图/能力描述」之间做匹配。

思路

  1. 离线/启动时:为每个意图(或每个 Agent/分支)写一段能力描述,用 Embedding 模型(如 BGE-small、M3E-base)转成向量,存入内存或向量库(如 Qdrant)。
  2. 用户请求时:仅对当前用户输入做一次向量化,再与各意图的描述向量算余弦相似度(或点积)。
  3. 决策:取 Top-K(如 K=1 或 2),若最高相似度 > 阈值(如 0.75),则命中对应意图。

要点

  • 使用的模型是小型 Embedding 模型(几十 MB 级),不是对话大模型;只做「文本→向量」,不做生成。
  • 意图描述向量可预计算并缓存,请求时只算一次「用户输入」的向量,因此延迟可控。
  • 适合意图数量在几十以内、描述区分度较好的场景;若意图非常多,可配合向量库做 ANN 检索。

常见 Embedding 选型(中文)

模型 大小 说明
bge-small-zh-v1.5 ~25MB 中文效果好,BAAI 开源
M3E-base 约百 MB 级 中文常用,可微调
text2vec-base-chinese ~100MB 通用中文

BGE-small 与 M3E-base 在「把中文句子变成向量」这一作用上等价,可按现有技术栈二选一。

第三级:轻量分类模型(目标 <100ms)

当规则和向量都没有高置信度命中时(例如用户说法偏门、多意图混合),用轻量级文本分类模型做多标签/多分类,输出各意图的概率分布。

特点

  • 轻量:参数量小(如 DistilBERT 约 66M),可本地或边缘部署,推理快。
  • 分类:输入一句话,输出各意图的概率(如:订单 0.6、库存 0.3、客服 0.1),不生成自然语言。
  • 多标签:可支持「订单+物流」等多意图,按概率取 Top-1 或 Top-2 作为主意图和备选。

常见选型

  • DistilBERT(2019,Hugging Face):BERT 的蒸馏版,体积小、速度快,常作为意图分类的基线。
  • 其他小模型(如 BGE-small 等)也可在顶层加分类头做微调,用于意图分类;与「用同一模型做 Embedding」是两种用法(Embedding 用向量,分类用概率输出)。

与第二级的区别

  • 第二级:检索式——用户向量与「描述向量」比相似度。
  • 第三级:分类式——模型直接输出「属于哪几类」的概率,更适合复杂、多意图或表述多样的情况。

3.3 置信度计算与决策

不同识别方式对应不同的置信度,可简单约定为:

来源 建议置信度
规则明确命中 0.95
向量相似度 > 0.85 取相似度值(如 0.85)
分类模型概率 > 0.7 取概率值(如 0.75)
多信号融合 加权(如规则权重高、向量次之、分类再次)

决策逻辑

  • 置信度 ≥ 0.8:直接按主意图路由,只传递该分支的 Tool。
  • 0.6 ≤ 置信度 < 0.8:按主意图路由,同时保留 1~2 个备选意图的核心 Tool,交给大模型一起选。
  • 置信度 < 0.6:视为意图不明确,走通用对话,不携带任何专业 Tool,避免误调用。

这样既保证高置信度时路由精准,又在中低置信度时通过备选 Tool 或通用回复兜底。


3.4 为何不用大模型做意图识别?(小结)

  • 意图识别是分类/匹配问题,不是生成问题。
  • 规则 + 向量 + 轻量分类即可达到高准确率,且延迟低、零 Token 成本、不依赖外部 API。
  • 大模型更适合放在「已确定少量 Tool 之后」的推理与调用决策阶段,而不是前置的意图路由。

四、意图识别与后续环节的衔接

意图识别的输出会直接驱动下一阶段:

  1. 智能体/分支选择:根据主意图(及备选)确定激活哪几个能力分支(或哪几个 Agent)。
  2. 动态 Tool 过滤:只加载这些分支的核心 Tool,再按实体、上下文、依赖关系补全或裁剪,最终只传 5~12 个 Tool 给大模型。
  3. 大模型推理:在「System Prompt + 精选 Tools + 用户消息」上做生成与 Tool 调用,不再面对全量工具。

因此,意图识别的稳定性与准确率直接决定后续是否选对分支、是否少传无关 Tool,从而影响整体 Token 消耗、响应速度和用户体验。


五、实现选型简要建议

  • 意图数量少(<20)、表述差异大:规则 + 关键词/正则即可;若要一点语义能力,可加 TF-IDF/BM25 相似度兜底。
  • 意图数量 20~50、需要语义:规则 + Embedding 向量相似度(BGE-small / M3E-base)+ 可选轻量分类兜底。
  • 多语言或已有 Spring AI:可沿用 Spring AI Embedding 或现有向量化方案,保持「规则 → 向量 → 分类」三级结构即可。
  • 向量存储:若意图很多或需要持久化,可用 Qdrant、Milvus 等向量库存「意图描述向量」;若意图不多,内存数组 + 余弦相似度即可。

六、总结

  • Agent 流程:用户输入 → 意图识别(不调大模型)→ 智能体/分支选择与 Tool 过滤(不调大模型)→ 大模型推理(只在此步调 LLM)→ 执行 Tool/返回结果。
  • 意图识别:在本地用规则 + 向量相似度 + 轻量分类三级策略,由快到慢逐级兜底,输出主意图、置信度和备选,并据此做置信度分级决策。
  • 不调用大模型:把意图识别视为检索/分类问题,用规则、Embedding 小模型和轻量分类模型即可,达到低延迟、零 Token、高稳定的路由效果,为后续「精选 Tool + 大模型推理」打好基础。

如果你在实现中希望把「库存/订单」设计成一个大 Agent 下的两个分支,意图识别的输出只需映射到「分支 ID」或「工具组 ID」,流程与多 Agent 路由完全一致,只需在文档和配置上统一命名即可。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐