AI 用户意图识别与 Agent 流程详解
当 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)
当规则没有明确命中时,用语义相似度在「用户表述」和「各意图/能力描述」之间做匹配。
思路:
- 离线/启动时:为每个意图(或每个 Agent/分支)写一段能力描述,用 Embedding 模型(如 BGE-small、M3E-base)转成向量,存入内存或向量库(如 Qdrant)。
- 用户请求时:仅对当前用户输入做一次向量化,再与各意图的描述向量算余弦相似度(或点积)。
- 决策:取 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 之后」的推理与调用决策阶段,而不是前置的意图路由。
四、意图识别与后续环节的衔接
意图识别的输出会直接驱动下一阶段:
- 智能体/分支选择:根据主意图(及备选)确定激活哪几个能力分支(或哪几个 Agent)。
- 动态 Tool 过滤:只加载这些分支的核心 Tool,再按实体、上下文、依赖关系补全或裁剪,最终只传 5~12 个 Tool 给大模型。
- 大模型推理:在「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 路由完全一致,只需在文档和配置上统一命名即可。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)