Retrieval-Augmented Generation 检索增强生成
用途 :
- 解决模型幻觉问题
- 避免频繁训练模型更新信息,直接通过外部方式引入参考
- 使模型专注于文本生成流程,不用考量信息量
应用场景
代码知识库:
- 代码生成
- 检索公开 git 仓库
- 使用自己的仓库作为知识库
公司聊天机器人:
- 企业内部文档知识库:风格指南、产品准则、政策
- 客服聊天机器人:了解产品信息、产品库存情况、故障排查
- 公司政策分析:了解公司政策信息
专业领域:
- 医疗领域
- 私有领域专业知识信息
AI 网络辅助搜索:
- 基于整个互联网的 RAG 数据库
- 在搜索时提供信息摘要
个人知识库:
- 基于个人邮箱、联系人、信息、日历构建知识库
- 提供自动化和检索功能
基础知识
LLM 也被称为 “自动化文本补全工具”:
其工作原理就是预测下个词进行补全,这个词称为 token ,有的词占用一个 token(简单词,符号) ,有的词会被拆分成多个 token 表示(复合词,片段)

自回归 :
- 新生成的 token 会基于旧上下文生成的 token 进行构建
- 相同的提示词可能会有不同的补全结果,根据旧 token 生成形式补全
LLM 学习方式:
- 通过从互联网等地方获取大量参数数据
- 获取数据输出结果,如果结果符合预期那么就会更新自身的参数,使下次输出更符合预期
幻觉产生:
- LLM 只根据训练数据得到数据模式进行回复,不是 LLM 自身的问题,而是训练数据
为什么不把所有东西放到模型里:通过 RAG 提取有用信息,避免算力和上下文开销
- 算力成本:prompt 过长会消耗过多算力,模型会对所有 prompt 进行检索生成
- 上下文窗口限制:对于小模型而言,会导致超过上下文 token 限制
检索器(retriver)
检索器困境:
- 如何返回相关文档
- 返回所有文档:会产生大量无关噪音,浪费上下文空间
- 只返回最相关的一个:信息不完整
- 平衡取舍:检索器无法完美排序,没有绝对最优解
当前 RAG 检索器实现:
- 基于现代搜索引擎和数据早期的技术基建构建
- 从传统数据库中提取有用信息或者基于 vector database 向量数据库提取数据
信息提取方案
元数据提取(Metadata Filtring)
传统检索中,会使用元数据来检索文档,例如作者、标题、创建日期、权限信息、标签
可以采用类似 SQL 的方式查询数据。
在 RAG 中,元数据用来缩小检索的文档范围(类似于 filter 功能),而不是用来提取数据,通常配合其他检索技术一起实现。
元数据单独使用缺陷:
- 无法对文档进行排序
- 忽视文档内容,不是想要的结果
关键词搜索算法(BM 25算法)
TF-IDF 模型
信息检索和文本挖掘的加权技术,用于评估词语在文档中的重要性。
- TF:词频,词语在文档中出现的次数
- IDF:逆文档频率,"逆" 字可以理解为分母分子反过来
( t - 词语,d - 文件,上面是 t 在 d 中出现的次数,下面是文件 d 中所有词语出现的次数总和)
( | D | - 语料库文件总数,下面是 包含(t)的文件数目)
将两者相乘,得到 TF-IDF 的值:
- 单个文档中关键词出现次数越多,关键词重要性越高
- 但在语料库中存在关键词的文档的频率越高,关键词重要性越低
BM25 算法(Best Matching 25)
BM 25 中的 25指的是由第 25 个研发团队提出的评分函数变体
BM25 特性:
- 词频饱和:一个关键词出现频次过多时,会降低关键词本身的重要性
- 文档长度归一化:适当降低长文档的权重(解决 TF-IDF 激进策略,对长文档权重降低过多的问题),采样递减权重机制,避免长文档检测权重变低(前提是关键词出现频率够高)
BM25 引入了 k1 和 b 参数:
- k1:控制词频饱和度,控制词频对评分的影响程度,取值通常在 1.2 - 2.0 之间,值越高,词频影响越大
- b:长度归一化,控制文档归一化程度,取值 0(不归一化)- 1(完全归一化)之间,平衡短文档和长文档偏好
b= 0 ,k1 = 1 时 还原为 TF-IDF 的公式逻辑
比较:
- TF-IDF:基于词汇重要性、词汇出现频率和文档长度
- BM 25:基于词频饱和,对文档长度归一化进行优化