基于规则
维护一套关键词映射表
出现"计算""算一下""多少钱"就路由到计算模块
出现"报销""流程""怎么办"就走知识库检索
出现"统计""平均""占比"就走数据库查询
def classify_intent_rule(query: str) -> str:<br> intent_keywords = {<br> "计算求解": ["计算", "算一下", "多少钱", "怎么算"],<br> "报销流程查询": ["报销", "流程", "怎么办", "步骤"],<br> "数据统计": ["统计", "平均", "占比", "趋势"],<br> }<br> for intent, keywords in intent_keywords.items():<br> if any(kw in query for kw in keywords):<br> return intent<br> return "通用问答" # 兜底走默认检索
优缺点
缺点
覆盖不全
用户换一种说法你就匹配不上了,需要持续人工维护关键词库
基于 ML 模型
用 BERT 等模型训练一个轻量级分类器
收集各种意图类别的样本数据
标注后做 fine-tune,模型就能根据语义而不仅仅是关键词来判断意图
用户说"这笔理赔大概能拿到手多少",虽然没出现"计算"这个词,但模型能理解这是计算求解类意图
基于 LLM Prompt
直接用大模型做 zero-shot 分类。设计一个 Prompt,让 LLM 判断 query 属于哪个意图类别
system_prompt = """你是一个意图分类助手。请判断用户问题属于以下哪个类别:<br>1. 知识问答(需要从知识库检索)<br>2. 计算求解(需要数值计算)<br>3. 数据查询(需要查数据库)<br>4. 闲聊(与业务无关)<br>只回复数字编号。"""
优缺点
缺点
代价是每次都要调一次 LLM,延迟和成本都不低
LM 偶尔会判断错,稳定性不如训练好的分类模型
实战做法
三级组合:规则优先 → ML 模型兜底 → LLM 处理疑难
明显能用关键词命中的(占大多数),直接走规则,零延迟。
规则匹配不上的,走 ML 分类器,几十毫秒解决。
ML 分类器信心度低的(比如 softmax 概率最高的类别只有 0.4),才调 LLM 做最终判断。