进阶应用 中级

意图识别:构建任务型对话助手

让助手听懂用户"想做什么"而不是只回答"说了什么":意图分类、槽位提取与智能体路由的工程实现。

问答助手 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 回答?