第 九 章 · 终 章

智能问答机器人

九章所学,终成一会话之器

一、问答机器人的分类

问答机器人(QA Chatbot)能以自然语言接受用户提问并返回答案。按实现路线,可分为两大流派:

检索式(FAQ / 任务型)生成式(生成模型)
答案来源预先整理的知识库模型逐词生成
优点答案准确、可控、可溯源灵活、能答开放问题、拟人
缺点答不了库外问题可能「一本正经地胡说」(幻觉)
典型技术意图识别 + 向量检索Seq2Seq、大语言模型、RAG
适用场景客服、政务、售后创作、陪伴、开放问答

按对话目的还可分为:问答型(一问一答查信息)、任务型(订机票、查快递,需多轮填槽)、闲聊型(情感陪伴)。工业系统往往是三者的混合体。

前八章的技术,在这一章第一次汇成一条完整流水线:语料 → 分词 → 向量化 → 匹配 → 应答。

二、检索式系统架构

一个典型检索式问答机器人的数据流水线:

用户提问
   │
   ▼
① 问句预处理        分词 / 清洗 / 纠错(第 2、3 章)
   │
   ▼
② 问句理解          意图识别 + 槽位抽取(第 3、6、7 章)
   │
   ▼
③ 候选召回          TF-IDF / 句向量,从 FAQ 库取 TopK(第 4、5、7 章)
   │
   ▼
④ 精排与阈值        Cross-Encoder 打分,低于阈值走兜底话术
   │
   ▼
⑤ 答案生成/调用     返回标准答案,或调用业务 API(查订单等)
   │
   ▼
⑥ 对话管理          多轮上下文、共指消解、澄清追问(第 7 章)

搭建顺序建议:先用规则与小知识库跑通闭环,再逐模块替换为机器学习模型。一个能答 80 个高频问题的规则机器人,上线第一天就能解决大部分重复咨询。

三、问句理解:意图与槽位

意图(Intent)是用户想做什么,槽位(Slot)是完成意图所缺的参数。

“帮我查一下明天北京到上海的高铁票”

意图:query_train_ticket
槽位:date = 明天
      departure = 北京
      destination = 上海

“它多少钱?”(第二轮)
意图:ask_price
槽位:需结合上文共指消解 → 上一轮提到的商品

实现手段由轻到重:

  • 规则/关键词:含「退款、退货」→ 售后意图;本章的「墨问」演示即采用关键词加权匹配;
  • 特征 + 分类器:TF-IDF + SVM / 逻辑回归做意图分类(第 4、5、8 章同款技术);
  • BERT 微调:意图分类与槽位序列标注联合建模(BERT + CRF);
  • 大模型函数调用:直接让大模型输出结构化 JSON(意图 + 参数)。

四、知识库构建与答案检索

FAQ 知识库通常是一张「标准问 + 相似问 + 答案」表:

{"id": 7,
 "question": "如何申请退款?",
 "similar": ["退款流程", "钱怎么退回来", "想退货退款怎么办"],
 "answer": "您可在订单详情页点击「申请售后」,选择退款……"}

检索的经典实现是第五章向量相似度的直接应用:

  1. 离线建库:把标准问与所有相似问分词、向量化(TF-IDF 或 Sentence-BERT),存入索引;
  2. 在线召回:用户问题同样向量化,与库中向量算余弦相似度,取 TopK;
  3. 精排与阈值:用更强的模型重排,若最高分低于阈值(如 0.6),触发兜底:「这个问题我还在学习,已为您转接人工」;
  4. 回流运营:未命中问题进待答池,运营补充新 FAQ,系统越用越聪明。

海量知识库时,精确逐条算余弦太慢,需用 倒排索引(BM25)或向量索引(FAISS、Milvus)做近似最近邻检索,毫秒内从百万条中召回候选。

五、生成式路线与 RAG

Seq2Seq(编码器–解码器 + Attention)是生成式对话的经典结构,再到 Transformer,乃至今天的大语言模型(LLM)。生成式机器人能说库中没有的话,但也会幻觉——编造不存在的退货政策,在客服场景是致命的。

业界主流解法是 RAG(Retrieval-Augmented Generation,检索增强生成):先检索、后生成,让模型「看着资料回答」:

① 用户提问 → 向量检索企业文档/FAQ,取相关片段(可信知识)
② 把片段与问题一起组装成提示词(Prompt)
③ 大模型基于片段组织语言作答,并标注来源
④ 对回答做事实验核(NLI,第 7 章),无证据则拒答
环节常用组件
文档切分与向量化分句/滑动窗口 + Embedding 模型
向量库FAISS、Milvus、Chroma、pgvector
生成模型开源 Qwen/ChatGLM 等,或商用 API
关键工程点切分粒度、混合检索、重排、提示词与防注入
RAG 是前八章知识的集大成:语料处理(2 章)、分词(3 章)、关键词与稀疏检索(4 章)、向量化与余弦(5、7 章)、句法语义(6、7 章)全都在其中。

六、完整 Python 实现:迷你检索式机器人

下面用约四十行代码实现一个可运行的 FAQ 机器人——意图识别与召回合为一步:把问题向量化后直接与 FAQ 算余弦相似度:

python · mini_qa_bot.pyimport jieba
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

FAQ = [
    {"q": "如何申请退款",
     "a": "在订单详情页点击「申请售后」,选择退款即可。"},
    {"q": "快递多久能到",
     "a": "下单后一般 1-3 个工作日送达,偏远地区稍慢。"},
    {"q": "怎么修改收货地址",
     "a": "发货前可在订单页自行修改;发货后请联系客服。"},
]
THRESHOLD = 0.2

# 离线:标准问向量化
tok_faq = [" ".join(jieba.lcut(item["q"])) for item in FAQ]
vectorizer = TfidfVectorizer()
faq_vec = vectorizer.fit_transform(tok_faq)

def answer(question):
    q_vec = vectorizer.transform([" ".join(jieba.lcut(question))])
    sims = cosine_similarity(q_vec, faq_vec)[0]     # 第 5、7 章的余弦
    idx = int(np.argmax(sims))
    if sims[idx] < THRESHOLD:                      # 低于阈值 → 兜底
        return "这个问题我还在学习,为您转接人工客服。", sims[idx]
    return FAQ[idx]["a"], sims[idx]

if __name__ == "__main__":
    while True:
        q = input("你:")
        if q in ("退出", "再见"):
            break
        reply, score = answer(q)
        print(f"墨问:{reply}(相似度 {score:.2f})")

把 TF-IDF 换成 Sentence-BERT 句向量、把线性扫描换成 FAISS、再加一层意图分类与多轮对话状态,就构成了一个工业级检索式机器人的雏形。

七、对话管理与评估

多轮对话管理(DM)

  • 对话状态:记录已填槽位(日期、目的地……),缺什么就追问什么;
  • 上下文指代:用共指消解(第 7 章)理解「那它呢」;
  • 澄清与确认:置信度不高时反问「您是要查退款进度对吗?」;
  • 人格与安全:统一语气,拒答越界问题,敏感场景平稳转人工。

如何评价一个问答机器人

层面指标
检索质量召回率、Top1/Top5 命中率、MRR、平均排名
回答质量准确率、人工评分、生成模型的 BLEU/ROUGE(仅供参考)
对话体验解决率、平均轮次、转人工率、用户满意度
线上业务客服工时节省、问题首次解决率、留存转化

优化闭环:记录全部对话 → 自动挖掘未命中问题与低分会话 → 运营补库/改库 → 灰度上线 → 再观察。机器人是「养」出来的。

八、终章演示:与「墨问」对话

下面这个浏览器里的机器人,正是上述架构的极简化身:问句 → 关键词加权的意图匹配 → 检索知识库 → 返回答案 → 未命中则兜底。它的知识覆盖了本站九章的核心概念,试着考考它:

  • 「什么是 TF-IDF?」「Word2Vec 是干什么的?」
  • 「怎么搭建 Python 环境?」「语料库怎么构建?」
  • 「情感分析怎么做?」「问答机器人的原理是什么?」
  • 也可以试试它答不上来的问题,观察兜底策略如何生效。
墨问 · 检索式问答演示意图匹配 + FAQ 知识库

九章回望

从第一章装好 Python,到此刻与机器人对话,你已经走过:环境与语料(1–2 章)→ 词法与统计(3–4 章)→ 表示与结构(5–7 章)→ 情感与会话(8–9 章)。而真正的学习,才刚刚开始——

纸上得来终觉浅,绝知此事要躬行。
愿你带着这套语料、算法与工程的地图,造出自己的问答机器人。