查看全课大纲(第 65 / 69 节)
  1. 1.NLP 的研究领域、应用与学习路径
  2. 2.自然语言的基本术语
  3. 3.信息论基础:信息熵与交叉熵
  4. 4.语言的进化与语义变迁
  5. 5.主观概率、客观概率与条件概率
  6. 6.贝叶斯原理与推理
  7. 7.随机变量:二项式、期望方差与联合概率
  8. 8.常见概率分布
  9. 9.辛普森悖论与贝叶斯解题实例
  10. 10.语言模型:语言概率与词袋模型
  11. 11.n-gram 语言模型(二元 / 三元 / N-Gram)
  12. 12.语言模型评价:交叉熵、困惑度与插值
  13. 13.朴素贝叶斯文本分类:垃圾邮件
  14. 14.拼写检查
  15. 15.中文分词:构词法、最大匹配、最优路径与 Jieba
  16. 16.词表示问题与语义相似度
  17. 17.TF-IDF 权重处理
  18. 18.One-Hot 表达与词表示的局限
  19. 19.Word2Vec 核心思想
  20. 20.Word2Vec 训练过程
  21. 21.Skip-gram 模型详解
  22. 22.词性标注任务与标注方法(规则 + N-Gram)
  23. 23.EM 算法与混合模型
  24. 24.高斯混合模型 GMM
  25. 25.从混合模型到隐马尔可夫模型
  26. 26.隐马尔可夫模型(HMM)推导与维特比解码
  27. 27.线性链条件随机场 CRF
  28. 28.贝叶斯网络与图模型
  29. 29.隐马尔可夫链与 HMM 推导
  30. 30.PLSA 主题模型
  31. 31.LSI 与 SVD 向量表达
  32. 32.LDA 与狄利克雷分布
  33. 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
  34. 34.上下文无关文法(CFG)与句法分析
  35. 35.概率上下文无关文法 PCFG
  36. 36.统计机器翻译:词对齐与翻译模型
  37. 37.统计机器翻译中的对齐模型与参数估计
  38. 38.从统计机器翻译到神经机器翻译
  39. 39.神经元与反向传播速览(指向深度学习课)
  40. 40.CNN 原理及其在 NLP 中的应用
  41. 41.循环神经网络的基本原理与 Elman / Jordan 网络
  42. 42.LSTM:长短期记忆网络的核心思想与分步实现
  43. 43.Encoder-Decoder 框架
  44. 44.Seq2Seq 与早期注意力机制
  45. 45.注意力机制的背景与动机
  46. 46.注意力模型实现原理与匹配函数
  47. 47.记忆网络:组成与计算
  48. 48.注意力机制的应用与历史延展
  49. 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
  50. 50.Multi-Head Attention、FFNN 与位置编码
  51. 51.层归一化、损失函数与 Universal Transformer 延展
  52. 52.预训练范式:从 ELMo 到 BERT
  53. 53.BERT 与掩码语言模型
  54. 54.BERT 下游任务微调与 GLUE 口径
  55. 55.GPT 与自回归语言建模
  56. 56.GPT-1 到 GPT-4 的演进
  57. 57.指令微调与 RLHF
  58. 58.分词器:BPE、WordPiece 与中文词表
  59. 59.上下文窗口与长文本处理
  60. 60.能力边界、成本与适用场景
  61. 61.文本分类实战:从朴素贝叶斯到逻辑回归
  62. 62.命名实体识别实战
  63. 63.文本生成与摘要实战
  64. 64.语义检索与向量库实战
  65. 65.RAG 知识库问答
  66. 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
  67. 67.幻觉与事实性问题
  68. 68.文本与知识结合(知识图谱压缩)
  69. 69.跨媒体信息检索与未来展望

RAG 知识库问答

小象实战讲义 · 自然语言处理

前面的章节已经讲过词向量、相似度检索、注意力机制与预训练模型。在企业与个人场景里,大量知识其实存放在文档、FAQ、工单与制度文件中,并不在模型参数里。纯靠模型记忆这些知识,既记不全、更新慢,也难以给出处。检索增强生成(Retrieval-Augmented Generation,RAG)的思路是:先从外部知识库检索出相关材料,再让生成模型依据这些材料作答。本节作为实战样章,先回顾大模型之前问答系统的两条路线,再讲现代 RAG 的基本流水线、检索与生成部件,并用一个确定性小演示走通「检索—拼上下文—作答」的骨架。

💡 核心导读

  • 早期 FAQ 问答:问答对清洗入库后,用 TF-IDF、词向量或关键词特征计算相似度,命中最相近的问题并返回对应答案。
  • 早期图谱问答:先做分词与词性标注,再分类问题意图、抽取实体槽位,最后按意图查询图数据库取答案;规则与浅层模型为主。
  • 两类记忆:RAG 把模型权重里的参数化记忆,与外部可增删改的非参数化记忆(向量索引)结合起来。
  • 流水线:文档切块并嵌入建库 → 查询嵌入后取 top-k 相关块 → 把上下文拼进提示再生成 → 答案可回指来源。
  • 价值与代价:知识更新不必重训模型、答案可溯源、受上下文约束有助于缓解幻觉;最终效果仍然受检索质量约束。

早期问答系统的两条路线

FAQ 检索问答

在大模型普及之前,面向固定业务范围的问答多以 FAQ(常见问题)形式落地:把整理好的「问题—答案」对清洗、格式转换后存入数据库,用户提问时在已有问题里找最相似的一条,再返回其对应答案。

匹配时使用的特征大致有几类:

  • TF-IDF 向量:对问题分词后,用每个词的词频与逆文档频率加权得到向量,再计算与库内问题向量的余弦相似度。
  • 段落向量:在词向量基础上加入段落级向量表达整句主旨,再计算余弦相似度。
  • 关键词特征:包括相同关键词的重合比例、两个问题的长度差异、关键词的先后顺序等,作为相似度的补充信号。
  • 全文检索:基于倒排索引做词项匹配,评分借鉴 TF-IDF 与向量空间模型的思路。

这类方案的局限也很明显:专业领域分词效果有限;所用模型往往较简单,在大规模问答库上时间与空间复杂度偏高;知识更新通常要重建索引,且答案只能在已录入的问答对中选择。

图谱问答

另一类早期问答面向结构化知识:先把领域知识组织成知识图谱,再让问题落到图上查询。典型流程分四步:

  1. 分词与词性标注:把问题切分成词,并标注词性,识别电影名、演员名、类型、评分等成分。
  2. 意图分类:用词袋等浅层表示训练分类器,判断问题属于哪一类询问,例如问评分、问上映时间、问主演、问合作演员等。
  3. 槽位抽取:按词性标签取出对应实体,并映射到规范名词典里的标准实体。
  4. 图库查询:根据意图与实体拼装图数据库查询语句取答案;没有命中时返回「暂未找到答案」。

这类方法把问答限制在预定义的意图类别与实体关系范围内,覆盖范围受限于图谱与规则设计。需要说明,上述两条路线都是大模型之前(2019–2020 年前后)的做法,在限定领域的 FAQ 与结构化图谱问答中发挥过作用;面对开放知识与非结构化文档,今天的主流思路是检索增强生成。

RAG 要解决的问题

大模型把大量事实知识存储在参数中,但它访问和精确操纵这些知识的能力有限:知识更新往往要重新训练,决策过程也难以给出可核查的来源。RAG 的做法是把两类记忆结合起来(Lewis et al., 2020,Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks,arXiv:2005.11401,摘要):

  • 参数化记忆:预训练的 seq2seq 模型或大模型,参数中携带通用语言能力。
  • 非参数化记忆:一个显式的稠密向量索引,存放外部文档块,可按需增删改,并能把答案回指到具体材料。

检索器负责从这个外部索引里取出相关段落,生成模型再结合段落组织回答。与只依赖参数的模型相比,知识更新只需改动索引,不必重训模型;答案可以挂到具体文档块上,便于核查;回答受检索到的上下文约束,有助于减少脱离依据的表述。

RAG 的基本流水线

离线建库

先把外部文档切成合适大小的块,用检索编码模型把每个块编码成向量,连同原文一起存入向量索引。切块粒度、重叠比例与嵌入模型的选择,会直接影响后续能不能检索到有用材料。

在线检索

用户问题经同一个编码模型得到向量,在索引中按相似度取出排名靠前的若干文档块(top-k)。检索是 RAG 的入口环节:检索不到或检错了,后面的生成很难补救。

生成与回指

把检索到的文档块作为上下文拼进提示,生成模型据此作答;答案对应的来源块可以一并返回,形成可追溯的引用。论文给出过两种形式:一种在整段生成序列上使用同一组检索段落(RAG-Sequence),另一种允许不同位置使用不同段落(RAG-Token)(Lewis et al., 2020,arXiv:2005.11401,摘要)。

检索器与生成器

检索器:双编码器稠密检索

早期开放域问答多用 TF-IDF、BM25 这类稀疏向量方法。稠密段落检索(Dense Passage Retrieval,DPR)采用双编码器(dual-encoder)框架:分别用两个编码器把问题和段落映射成向量,以向量点积作为相似度;在少量问题—段落样本上即可训练。论文报告,其 top-20 段落检索准确率比强 BM25 基线绝对高出 9%–19%,并带动端到端问答在多个开放域基准上取得当时领先结果(Karpukhin et al., 2020,Dense Passage Retrieval for Open-Domain Question Answering,arXiv:2004.04906,摘要)。

生成器:从 seq2seq 到 decoder 大模型

原始 RAG 的生成器是预训练 seq2seq 模型 BART:一个降噪自编码器,基于 Transformer 编码器—解码器结构,编码器双向、解码器从左到右生成(Lewis et al., 2019,BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension,arXiv:1910.13461)。现代工程实践中,生成器常换成 decoder 类大模型,读取检索上下文后作答。本节只讲清「检索—拼接上下文—生成—回指来源」的骨架,不绑定具体商业模型。

确定性小演示:固定向量表上的 top-k 检索

下面用一份硬编码的小 FAQ 语料和固定的三维向量,演示问题向量与文档向量的余弦相似度排序。真实系统中的向量由编码模型产出,这里用固定值保证结果可手算复核。

# 固定小知识库的余弦相似度 top-k 检索演示(向量为手工给定的固定值)
import numpy as np

docs = [
    "如何重置登录密码",
    "发票如何申请与开具",
    "物流配送需要几天",
    "会员如何取消续费",
]
doc_vecs = np.array([
    [0.80, 0.10, 0.20],
    [0.10, 0.85, 0.15],
    [0.20, 0.15, 0.80],
    [0.15, 0.60, 0.25],
])
query_vec = np.array([0.78, 0.12, 0.18])

def cosine(a, b):
    return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))

scores = sorted(
    ((cosine(query_vec, v), i) for i, v in enumerate(doc_vecs)),
    reverse=True,
)
for rank, (score, i) in enumerate(scores[:2], start=1):
    print(f"top-{rank} 相似度 {round(score, 4)}|{docs[i]}")
top-1 相似度 0.9994|如何重置登录密码
top-2 相似度 0.4687|物流配送需要几天

检索到候选块之后,下一步是把它们组织成生成模型可读的上下文。下面演示如何把 top-k 文档拼成上下文字符串,并给出作答约束。

# 用检索到的文档块拼接待阅读上下文(固定演示;真实系统把上下文填入提示模板)
retrieved = ["如何重置登录密码", "物流配送需要几天"]
context = "\n".join(f"[资料 {i + 1}] {doc}" for i, doc in enumerate(retrieved))
answer_hint = "根据以上资料作答;资料未覆盖时明确说明暂无相关信息。"

print("拼入提示的上下文:")
print(context)
print("作答约束:", answer_hint)
拼入提示的上下文:
[资料 1] 如何重置登录密码
[资料 2] 物流配送需要几天
作答约束: 根据以上资料作答;资料未覆盖时明确说明暂无相关信息。

价值、代价与工程要点

RAG 相对纯参数模型的价值集中在三点:一是知识可更新,补充或修改知识只需改动索引,不必重训模型;二是答案可溯源,回答可以挂到具体文档块;三是受上下文约束,生成内容有材料依据,有助于缓解幻觉。

它的代价同样明确:整体效果依赖检索质量,切块不合理、嵌入不匹配、排序偏差都会传导到最终答案;检索不到相关材料时,系统应当明确拒答,而不是强行编造。工程上常见的配套组件包括切块策略、稠密与稀疏混合检索、检索结果重排序、向量数据库、上下文窗口管理以及引用与拒答策略,本节只做概念梳理,不展开具体工具选型。

延伸阅读

  1. Lewis, P. et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. arXiv:2005.11401(NeurIPS 2020)。参数化与非参数化记忆结合、RAG-Sequence / RAG-Token 两种形式见摘要与正文 §2。
  2. Karpukhin, V. et al. (2020). Dense Passage Retrieval for Open-Domain Question Answering. arXiv:2004.04906(EMNLP 2020)。双编码器稠密检索与 BM25 对照结果见摘要。
  3. Lewis, M. et al. (2019). BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension. arXiv:1910.13461(ACL 2020)。原始 RAG 生成器所基于的 seq2seq 降噪预训练模型。

📝 动手练一练

  1. 概念辨析:与把知识全部训练进模型参数相比,RAG 为什么更容易更新知识、也更容易核查答案来源?
👉 点击查看参考答案

模型参数里的知识固化在权重中,新增或修改知识通常要收集数据并重新训练,过程成本高,也难以说清某条结论来自哪里。RAG 把知识放在外部可增删改的向量索引里,更新资料只需调整索引内容;生成时答案基于检索到的文档块组织,可以把来源块一并返回,因此便于核查。代价是检索质量会直接影响最终回答。

  1. 对照理解:早期图谱问答先分类意图、再抽取实体槽位去查图数据库;RAG 则是先检索文档块、再由生成模型组织答案。两者在「答案从哪里来」上有什么本质区别?
👉 点击查看参考答案

早期图谱问答的答案来自结构化图库中的确定记录:意图与实体决定查询语句,命中的三元组或节点就是答案,范围受预定义意图与图谱覆盖限制。RAG 的答案来自非结构化文档块,由生成模型在阅读上下文后组织成自然语言表述,覆盖范围取决于外部知识库与检索质量,表述更灵活,但也需要回指来源并处理检索不到的情况。

本章小结

本节从早期问答系统讲起:FAQ 检索问答用 TF-IDF、段落向量与关键词特征匹配相似问题,图谱问答走意图分类、实体抽取、图库查询的流程,二者都是大模型之前的限定领域方案。现代 RAG 把模型的参数化记忆与外部向量索引的非参数化记忆结合,按「切块嵌入建库 → top-k 检索 → 拼上下文生成 → 回指来源」的流水线工作;检索器多用双编码器稠密检索,生成器在原始论文中为 seq2seq 模型,现代实践常换成 decoder 大模型。RAG 的优势是知识可更新、答案可溯源、受上下文约束,局限是效果受检索质量约束,资料未覆盖时应明确拒答。

📋 行动清单

  • 说清早期 FAQ 问答与图谱问答各自的流程,以及它们在大模型之前的定位与局限。
  • 复述 RAG 离线建库、在线检索、生成与回指的完整流水线。
  • 理解参数化记忆与非参数化记忆的分工,以及检索质量对最终答案的约束。

—— 小象教研组