关于常见问答Bot的设计框架:
原文出处:https://mp.weixin.qq.com/s/QBV5FFg7wIHBwYKDcz5VTQ
本文旨在阐明作者的个人见解,只用于学习参考;本文大部分聚焦于"自然语言理解(NLU部分)"...
常见的Bot设计架构:

一、NLU 是什么?
在任务型对话系统中,自然语言理解(NLU)模块的核心目标是:
将用户输入的自然语言(文本/语音)转化为结构化的语义表示,供下游对话管理(DM)和动作执行使用。
可以从图中得出其中很重要的两部分:"意图识别"和"槽位填充",具体又是什么呢?后续会再次提及,让我们先看向所示结构化例子:
{
"intent": "book_movie_ticket",
"slots": {
"movie": "战狼2",
"time": "今天下午",
"cinema": null
}
}
这个结构化表示 = 意图(Intent) + 槽位(Slots)
-
意图:用户想做什么?(分类问题)
-
槽位:完成这件事需要哪些具体参数?(序列标注 + 预测问题)
二者必须协同设计:槽位定义依赖意图,意图边界也受槽位语义影响。
二、意图识别:三层混合架构(L1 / L2 / L3)
| 层级 | 方法 | 技术实现 | 适用输入 | 占比 | 部署方式 |
|---|---|---|---|---|---|
| L1:规则兜底 | 关键词、正则、有限状态机(FSM) | .*?(密码|账号).*?(忘|重置) | 高频、高确定性、高风险指令(如“密码忘了”“我要投诉”) | ~20–30% | 本地硬编码,零依赖 |
| L2:小模型主力 | Embedding(BGE/E5) + 轻量分类器(LR/SVM/MLP) | BGE-base → 768维向量 → Logistic Regression → 概率分布 | 语义清晰但表达多样的常规任务(如“Outlook收不到邮件”) | ~50–60% | 本地部署(CPU/GPU服务) |
| L3:LLM兜底 | LLM 做 zero-shot / few-shot 分类 | Prompt + GPT-4/Qwen-Max → 返回意图 | 模糊、错字、多意图、新奇表达(如“那个系统打不开”) | ~10–20% | 调用云 API(按需降级) |
在意图识别系统中,OOD 流转是指当 L2 层判定用户输入为 分布外意图(OOD)后,将请求从 L2 轻量识别模块转移至 L3 深度处理模块的完整链路,其核心目标是解决 L2 预定义意图覆盖不足的问题,确保所有用户咨询都能得到有效响应,而非直接丢弃或误判。
OOD 兜底:L2 无法识别的意图,必须携带 L2 的置信度数据同步至 L3,辅助 L3 快速判定。
L2 中的 Embedding 模型:
-
作用:将句子转为语义向量,作为分类器的输入特征(不是用于相似度检索!)
-
主流选择:BGE、E5、text2vec(中文场景)、OpenAI Embeddings(仅API场景)
-
部署:企业级系统几乎全部本地部署(合规+低延迟+成本可控)
L2 中的轻量分类器:
-
本质:一个极小的监督模型(如 Logistic Regression),输出维度 = 预定义意图数
-
是否预定义意图? → 是! 模型无法处理未见过的意图(OOD)
-
置信度过滤:仅当
max(概率分布) > 阈值(如0.7)才采纳结果,否则转 L3 -
部署:模型文件(.pkl/.onnx)直接集成到服务中,无需独立API
高保真例子(暂时跳过L1阶段进入到L2阶段):
我们以电商智能客服的意图识别场景为例,构建 L2 意图识别的高保真业务流程,完整还原从用户输入到意图判定的全链路,同时体现 Embedding 模型、轻量分类器、置信度阈值、OOD 流转的核心逻辑:
一、场景基础配置
业务域:电商售后客服(处理订单相关咨询)
L2 组件选型
Embedding 模型:本地部署的BGE-large-zh(中文场景适配,输出 768 维语义向量)
轻量分类器:训练好的Logistic Regression 模型(.onnx 格式集成在客服服务中)
预定义意图集合(共 4 类)
I1:查询订单物流
I2:申请订单退款
I3:修改收货地址
I4:咨询商品售后保修
置信度阈值:0.7(低于则转 L3 人工 / 大模型深度识别)二、场景 1:置信度达标,直接判定意图
用户输入:“我的快递怎么还没到?都下单 3 天了”
L2 第一步:Embedding 向量转换
本地 BGE 模型将这句话转为 768 维语义向量(如 [0.023, -0.156, 0.089,..., 0.112],仅示意),作为分类器输入特征。
L2 第二步:轻量分类器打分
Logistic Regression 模型基于向量,为 4 个预定义意图输出置信度(概率分布):
I1(查物流):0.92
I2(退订单):0.03
I3(改地址):0.02
I4(问保修):0.03
L2 第三步:置信度过滤
最大值 0.92 > 阈值 0.7,判定为意图有效,直接采纳I1(查询订单物流),并触发下游物流查询接口,自动回复用户 “已为你查询到订单物流,当前状态为 XX,预计明日送达”。三、场景 2:置信度不达标,转 L3 流程
用户输入:“你们家有没有新品充电宝上架?”
L2 第一步:Embedding 向量转换
BGE 模型将该语句转为语义向量,因这句话和售后订单无关,向量特征与 4 个预定义意图的匹配度均较低。
L2 第二步:轻量分类器打分
分类器输出置信度分布:
I1(查物流):0.21
I2(退订单):0.15
I3(改地址):0.12
I4(问保修):0.25
L2 第三步:置信度过滤
最大值 0.25 < 阈值 0.7,判定为OOD(未定义意图),触发 L3 流转逻辑:将用户问句和 L2 的打分结果同步至 L3 的大模型模块,由大模型识别 “咨询新品上架” 的意图,并转接商品导购客服回复。四、场景 3:边缘阈值案例(接近阈值但达标)
用户输入:“我想把收货的小区改成隔壁的 XX 小区”
L2 分类器打分:I3(改地址)置信度 0.71,其余意图置信度均 < 0.1
判定结果:0.71 略高于 0.7 阈值,采纳 I3 意图,触发地址修改的风控校验流程(如验证用户手机号),完成地址修改。
三、槽位填充:与意图强绑定的结构化抽取
槽位填充不是命名实体识别(NER)! NER 是通用任务(标“地名”),槽位填充是任务特定角色标注(标“出发地” vs “目的地”)。
1. 槽位设计原则
-
每个意图有专属槽位 schema,例如:
intent: book_movie_ticket slots: - name: movie # 类型:电影实体,必填 - name: time # 类型:datetime,必填 - name: cinema # 类型:影院实体,可选(可预测)
2. 槽位填充的实现方式(按 L1/L2/L3 分层)
| 层级 | 槽位填充方法 |
|---|---|
| L1(规则) | - 正则捕获组(如 订(.*?)电影票 → movie) - 关键词+位置规则(“今天”→ time) - 硬编码映射(“战狼” → 默认“战狼2”) |
| L2(小模型) | - 解耦方案:先判 intent,再调用该 intent 对应的 BERT-CRF / BiLSTM-CRF 序列标注模型 - 联合方案:用 Joint BERT 同时输出 intent + slots(效果更好,但复杂) |
| L3(LLM) | - Prompt 要求 LLM 输出 JSON: {"intent": "...", "slots": {"movie": "战狼2"}} - 可结合上下文/知识图谱做智能填充 |
3. 槽位预测(Slot Prediction)——不只是抽取!
当用户未提供某些槽位时,不能盲目追问,应先尝试预测:
-
基于上下文:上一轮提到的城市
-
基于用户画像:常去影院、常用时间段
-
基于实时数据:当前上映影片、附近影院排片
-
基于知识图谱:实体链接(“战狼” → 《战狼2》)
产品体验关键:预测能减少交互轮次,体现“智能感”。
高保真流程示例(mermaid代码):
graph TD
A[用户输入:“帮我订战狼的票”] --> B{L1: 规则匹配?}
B -- 匹配正则“订.*?票” --> C[意图 = book_movie_ticket]
C --> D[L1 槽位:正则捕获“战狼” → movie]
D --> E{cinema/time 为空?}
E -- 是 --> F[调用用户位置+排片数据预测 cinema/time]
F --> G[生成追问:“您想看XX影城今天下午场吗?”]
B -- 未匹配 --> H[L2: BGE + LR 分类]
H -- 置信度 >0.7 --> I[意图 = book_movie_ticket]
I --> J[L2 槽位:BERT-CRF 识别 movie=战狼]
J --> K[同上预测+追问]
H -- 置信度 <0.7 --> L[L3: 调 LLM]
L --> M[LLM 返回结构化 intent+slots]
M --> N[进入对话管理]
其他部分:
对话管理(DM)是整个系统的 “决策中枢”,核心作用是衔接前后模块、把控对话逻辑,具体包含这两部分 + 交互关系:
1. 对话管理的子模块
-
状态跟踪(DST):负责记录对话的上下文状态(比如用户之前说过的内容、已确认的信息等),保证对话的连贯性(比如不会重复询问用户已说过的信息)。
-
策略优化(DPO):决定对话的下一步策略(比如是否需要追问用户补充信息、该调用哪个知识库的内容、如何推进对话目标)。
2. 对话管理的交互逻辑
-
输入:接收 自然语言理解(NLU)传递来的 “用户意图 + 槽位信息”;
-
资源调用:从知识管理模块(行业知识库 + 对话知识库)获取所需的专业 / 历史对话内容;
-
输出:将处理后的对话决策传递给自然语言生成(NLG),用于生成回复内容。
更多推荐



所有评论(0)