意图识别:构建任务型对话助手
让助手听懂用户"想做什么"而不是只回答"说了什么":意图分类、槽位提取与智能体路由的工程实现。
问答助手 vs 任务型助手
普通聊天机器人只会"回答";任务型助手(Agent)要"办成事"。第一步就是意图识别(Intent Classification):判断用户想做什么 —— 查进度?推荐课程?还是概念提问?
两种实现方式
- 规则匹配:关键词/正则命中意图。零成本、毫秒级、100% 可复现,适合意图少且说法固定的场景;
- LLM 分类:用一次便宜的分类调用输出意图标签(配合
with_structured_output),能理解"帮我看看最近学得咋样"这类变体,适合说法自由、意图多的场景。
槽位提取
意图之外还要提取参数(槽位):"学一下 RAG" → 意图=学习课程,槽位 subject="RAG"。LLM 方式可在同一次分类调用里一并输出 JSON:
class UserRequest(BaseModel):
intent: Literal["查进度", "推荐课程", "学课程", "概念问答"]
subject: str = Field(default="", description="涉及的主题词")
router = (route_prompt | llm.with_structured_output(UserRequest))
req = router.invoke("帮我想想接下来该学点啥")
# intent=推荐课程, subject=""
智能体路由架构
用户消息 → 意图识别 → ┌ 查进度 → 直接查数据库(不调 LLM)
├ 推荐课程 → 检索课程库拼推荐
├ 学课程 → 匹配课程返回入口
└ 概念问答 → RAG 问答链
关键设计:能查数据的就不生成 —— 进度、订单、库存这类事实性查询直接走数据库,既省 token 又不会幻觉。
兜底与降级
- 规则优先、LLM 兜底(或反之),两级都失败再走通用问答;
- 意图不确定时礼貌澄清:"你是想查进度还是想让我推荐课程?";
- 把识别错误的 case 持续补充进规则与评测集 —— 这就是意图的"学习"过程。
本站的 AI 助手正是这套架构:规则式意图路由 + RAG 问答,可以直接打开「AI 助手」试试"我的学习进度"或"学习 RAG"。
📝 课后练习
quiz-1 查学习进度这类意图为什么适合规则匹配并直查数据库,而不是让 LLM 回答?