LongCut logo

RAG 工作机制详解——一个高质量知识库背后的技术全流程

By 马克的技术工作坊

Summary

Topics Covered

  • 直接喂文档超上下文窗口必失败
  • 向量相似度捕捉语义亲缘
  • 召回粗筛重排精选双保险
  • RAG两大阶段闭环全解析

Full Transcript

你是否想 做一个靠 谱的知识 客服或者 是搭建一 个能回答 问题的知 识库那你 就一定绕 不开一个 技术RE G它的全 称是Re trie val Augm

ented Gene rati on翻译 过来就是 检索增强 生成听起 来挺高大 上但说白 了也就这 么两件事 先从资料 库里检索 相关的内 容再基于 这些内容

来生成答 案也就是 说它先检 索再生成 所以叫做 检索增强生成 RAG是 目前最常 用的AI 问答方案 之一很多 企业内的 知识助手 智能客服 用的都是 这项技术

在本视频 里我将会 为你介绍 RAG的 实现原理 主要包裹 以下三个 部分首先 我们将总 体看一下 RAG的 使用场景 和大致链 路让你对 这门技术 有个感性

的了解然 后我们会 逐步拆解 这个链路 里面的每 一个环节 深入理解 它的原理 最后我们 会从提问 前和提问 后两个角 度出发 复习一下 整个链路 的运行过

程加深你 的理解在 这个过程 里面我还 会解释一 下REG 用到的各 种专业名 词比如说 是向量e mbed ding 模型向量 数据库向 量相似度 等等相信

在看完这 个视频之 后你就会 明白一个 高质量的 智能客服 或者是知 识库是如 何构建的 好话不多 说让我们 赶快开始 吧假设你 想做一个 智能客服 这个智能

客服可以 回答各种 关于你们 公司产品 的问题那 应该怎么 实现它呢 首先这个 客服的内 部一定要 有个模型 比如说是 GPT4O Deep Seek 这种的不

过光有个 模型可不 够因为模 型可不知 道你们公 司的产品 信息你想 这个问题 好办在给 模型发送 问题的时 候我把产 品手册一 起发个模 型不就好 了没错这

确实是一 个解决方 案不过如 果产品手 册的字数 特别多 比如有个 上百页乃 至上千页 的话这就 会带来很 多问题首 先模型可 能无法读 取所有的 内容因为

每个模型 都只能存 储一定量 的信息我 们通常称 这个量为 上下文窗 口大小如 果你的产 品手册字 数过多超 过了这个 上下文窗 口大小的 话模型就 会读了后

面忘了前 面回答的 准确率也 就无法得 到保障除 此之外模 型的推理 成本也会 很高输入 越多成本 越高每次 回答问题 的时候都 要带上一 本厚厚的手册 那成本可

想而知不 可能少了 最后模型 的推理速 度也会受 到影响注 入越多模 型需要消 化的内容 就越多模 型的输出 就会越慢 一本上百 页的手册 扔进来那 大概率会

对模型的 推理速度 产生严重 的影响看 来直接把 文档丢给 模型是行 不通的那 我们是不 是可以考 虑只把文 档中相关 的内容发 给模型呢 可以的这 就需要R

AG登场 了我们一 起来看看 RAG是 如何解决 这个问题的 首先,R EG会把 文档切分 为多个片 段当用户 提出问题 后我们就 用这个问 题在所有 的片段中

寻找相关 内容比如 ,在一份 上百页的 产品手册 中可能只 有三个片 段真正与 用户的问 题相关我 们就把这 三个片段 单独挑出 来把他们 和用户的 问题一起

发给大模 型这样模 型就只会 感知三个 相关的片 段而不是 整个文档 之前的问 题也就会 迎刃而解 了对,R EG就是 这样的了 是不是很 简单?

不过话说 回来这只 是一个过 度简化的 链路我隐 藏了很多 实现细节 比如说是 如何分片 如何选择 相关的片 段这里面 的学问都 不少所以 下面我把 整个RE

G的流程 具体来拆 分下通常 来说RE G的整体 流程包含 两个部分 一个是数 据准备部 分这个发 生在用户 提问前我 们要在这 一部分里 把相关的 文档都给

准备好并 完成相样 的预处理 它一共是 包含分片 和索引两 个环节 另外一个 是回答部 分这一部 分当然是 发生在用 户提问之 后了在用 户问问题 之后我们

便会触发 回答问题 的各个环 节分别是 召回重排 和生成接 下来我们 就逐步拆 解分片索 引召回重 排和生成 这五个环 节看看他 们分别是 如何工作 的分片顾

名思义就 是把文档 切分成多 个片段 我们之前 在基本运 行流程环 节里面也 演示过这 个分片的 动画分片 的方式有 很多种我 们可以按 照字数来 分比如说

1000 个字一个 片段按照 段落来分 比如说是 一个段落 一个片段 或者是按 照章节分 按照页码 分除此之 外还有很 多的千分 方式但不 管怎么做 我们最后

都需要把 一片文档 切分为多 份切好后 这个环节 就结束了 然后我们 就要进入 到下一个 环节所以 索引就是 通过em bedd ing将 每一个片 段文本转

换为向量 然后再将 片段文本 和对应向 量都存储 在向量数 据库的一 个过程没 错它一共 就只有这 两步但这 两个步骤 所包含的 信息量其 实是巨大 的比如什

么是em bedd ing什 么是向量 数据库可 能什么是 向量你也 记不清楚 了别急我 们先把这 三个概念 解释清楚 然后再回 来看看索 引这个流 程相信你

就会清楚 很多首先 我们来讲 讲这其中 最基础的向量 向量是数 学里面的 个概念相 信大家多 多少少都 学过从概 念上来讲 它代表一 个有大小 有方向的 量在通常

情况下我 们可以用 一个数组 来表示它 每个向量 都有维度 维度的大 小就等于 数组中数 字的个数 比如这些 都是一维 向量这些 都是二维 向量而这 些都是三

维向量等 等等等对 于低维度 的向量我 们可以直 接把它们 在坐标轴 里面画出 来比如最 简单的一 维向量 我们可以 把它放置 在一个一 维坐标轴 上1这个

向量可以 这么画它 的大小是 1方向朝 右-3这 个向量可 以这么画 它的大小 是3方向 朝左要表 示二维向 量的话我 们就必须 使用一个 二维坐标 轴比如说

22可以 放在这个 地方-1 2可以放 在这里同 理三维向 量需要放 在一个三 维的坐标 轴里当然 维度再大 一点的话 我就没法 给你演示 它在坐标 轴里面的

位置了 毕竟我们 生活在一 个三维世 界里但无 法可视化 并不代表 就不存在 实际上我 们在RA G里面用 到的向量 维度通常 情况下都 会比较大 比如是几

百甚至几 千一般来 说维度越 大每个向 量所包含 的信息也 就会越丰 富用这些 向量做各 种工作的 可靠性也 就越强讲 完了向量 再来看看 embe ddin

gemb eddi ng就是 把文本转 换为向量 的一个过 程比如我 们以二维 向量为例 假设马克 喜欢吃水 果对应的 向量是1 ,2,马 克爱吃水 果对应的

向量是1 ,1,天 气真好对 应的向量 是-3, 1。你会

1。你会 发现前两 个句子的 向量非常 接近,而 天气真好 则距离比 较远,这 说明前两 个句子的 语意是相 近的,而 后者则完 全不相关 。这正是

。这正是 embe ddin g的目的 ,含义相 近的文本 在经历了 embe ddin g之后, 它们对应 的向量也 是相近的。

因为这样 的话当用 户询问马 克喜欢吃 什么的时 候我们就 可以先把 这个问题 做给em bedd ing将 其转换为 向量然后 再根据向 量相似度 把与这个

问题相关 的文本也 找出来最 后我们就 可以把这 两个相关 文本以及 用户的问 题一起认 给大模型 大模型就 可以告诉 我们马克 喜欢吃水 果了em bedd

ing这 个操作是 模型来完 成的不过 这个模型 可不是我 们通常所 使用的G PT4O Deep Seek 这样的模 型而是专 门的em bedd ing模型

如果你想 知道哪些 embe ddin g模型最 好用的话 可以看一 下这个M TAP排 行榜它会 对各种e mbed ding 模型做评 测并且把 结果做个

排行方便 我们挑选 和使用聊 完了em bedd ing的 概念我们 再来看看 向量数据 库向量数 据库就是 用来存储 和查询向 量的数据 库它为存 储向量做

了很多优 化并且还 提供了计 算向量相 似度等相 关的函数 方便我们 使用向量 embe ddin g后的向 量就可以 放在向量 数据库里 面方便后 续查询

比如我们 还是以马 克喜欢吃 水果这句 话为例在 我们给这 句话做了 embe ddin g之后就 得到了一 个向量然 后我们需 要把这个 向量存入 到向量数

据库中不 过注意我 们要存的 不仅有向 量还有原 始的文本 所以原始 文本也要 发给向量 数据库因 为只有这 样我们才 能够在通 过向量相 似度查询 出相似的

向量之后 把对应的 原始文本 也抽取出 来发给它 模型让它 处理我们 最终需要 的还是原 始的文本 向量只是 一个中间结果 所以一般 的向量数 据库表格 里面至少

都会有原 始文本和 向量两列 内容就像 这样讲完 了向量E mbed ding 和向量数 据库我们 再回头看 看我们之 前提到过 的索引这 个概念索 引就是通

过Emb eddi ng将每 个片段文 本转换为 向量并且 把片段文 本和对应 的向量都 存储在向 量数据库 的过程这 句话的意 思想必大 家都有个 概念了其

实就是我 们刚才聊 的这个过程 只不过我 们要把一 开始的这 个文本换 成每个片 段的内容 比如说我 们一开始 要处理的 是片段一 片段一处 理完了之 后我们要

处理片段 二依此类 推直到所 有的片段 都处理完 毕这整个 所有的流 程就都结 束了不管 是分片还 是所以它 们都发生 在用户提 问之前属 于要提前 准备的步

骤下面我 们就来看 看用户提 问之后发 生了什么 首先是召回 召回就是 搜索与用 户问题相 关片段的 过程这个 环节从用 户问题开 始首先用 户的问题 会发给e

mbed ding 模型em bedd ing模 型会将它 转换为向 量然后我 们把它发 送给向量 数据库让 它查询与 用户问题 最为相关 的10个 片段内容

没错召回 的结果就 是10个 与用户问 题相关的 片段当然 10这个 数字并不 是固定的 你也可以 选择15 20等等 具体是多 少不是很 重要只要 数量不是

很多都可以 那不管是 多少,向 量数据库 都要返回 与用户问 题最相似 的一批片 段那向量 数据库是 怎么知道 哪些片段 与用户问 题最相关 的呢?这

的呢?这 就要计算 向量相似 度了我来 给大家模 拟下整个 过程这个 是向量数 据库里面 的数据为 了方便演 示,我这 里只写了 三条然后 我们把用 户的问题

和对应的 向量也放 在这里我 们最后要 计算下每 个片段与 用户问题 的向量相似度 因此我们 先把向量 相似度的 表头写在 这里然后 我们剩下 的任务就 是把片段

向量和用 户问题向 量分别代 入到一个 相似度计 算公式中 得出向量 相似度这 个计算公 式的第一 个参数永 远是用户 问题所对 应的向量 因此我们 先把第一

个参数放 进来这个 公式的第 二个参数 则是每个 片段的向 量了首先 我们把第 一个片段 向量带进 来算出一 个数字 我们把这 个数字放 入到向量 相似度这

一栏中然 后我们再 把第二个 片段的向 量带入进 来算出第 二个片段 与用户问 题的相似 度然后同 样的我们 也把计算 结果放入 到向量相 似度这一 栏中以此

类推我们 再算出第 三个片段 与用户问 题的相似 度我们需 要按照这 个方法把 所有的片 段都计算 完毕在都 计算完毕 了之后我 们就把这 个向量相 似度排个

序取前1 0个最大 的就好了 那下一个 问题就是 这个公式 是怎么算 出来的呢 答案是有 很多种目 前比较流 行的方案 是包括余 弦相似度 欧式距离 和点击我

这里大致 说一下余 弦相似度 是主要在 算两个向 量之间夹 角的co s值然后 根据这个 cos值 来判断夹 角的大小 夹角越小 相似度就 越高欧式 距离主要

是在计算 两个向量 之间的距 离也就是 这段白线 的距离距 离越小相 似度越高 点击是一 种通过代 数方式衡 量两个向 量相似度 的方法它 不仅要考 虑两个向

量之间的 方向关系 也要考虑 它们的长 度比如我 们要计算 这张图里 面A和B 的点击我 们首先从 A向B引 入一条垂 线然后A 和B的点 击就是这 段距离和

这段距离 的乘积乘 积越大就 代表相似 度越高如 果两个向 量方向一 致的话 那么这两 个向量越 长点击值 就越大如 果方向相 反那么点 击就是负 的如果垂

直点击就 为0所以 我们可以 通过点击 的值来判 断两个向 量是否在 同一个方 向上努力 以及他们 努力的程 度有多大 向量相似 度就讲到 这里我们 再回到前

面的这张 图稍微回 顾一下在 这一阶段 我们查询 出了与用 户问题最 为匹配的 10个片 段记住这 个结论 因为这1 0个片段 会发送到 重排阶段 继续处理

重排全称 是重新排 序它做的 事情其实 跟照回是 一样的前 面我们说 过照回是 从所有的 片段里面 挑10份 与用户问 题最相似 的而重排 则是从照 回的这1

0份里面 再挑3份 与用户问 题最相似 的作为重 排的结果 你可能会 想那直接 在照回阶 段挑3个 不就好了 这样就不 用重排了 同样的事 情搞两遍 干什么呢

一次挑出 三个呢当 然是可以 的不过这 样做的效 果没有召 回加重排 的方案好 为什么呢 因为召回 与重排阶 段使用的 文本相似 度计算逻 辑不一样 下面我们

来比较一 下首先看 一下召回 召回阶段 使用的是 相量相似 度我们还 列举了三 个常见的 相量相似 度计算方 法但无论 是使用哪 一种方法 它们的特 点都是成

本低耗时 短准确率低 所以适合 做初步的 筛选也就 是在短时 间内把上 千条片段 的相似度 数值都计 算出来从 中挑出1 0个最高 的而重排 就不是了 重排阶段

一般是使 用一种叫 做Cross Enco der的 模型计算 每个片段 与用户问 题的相似 度相比之 下Cross Enco der的 成本会比 较高耗时 也会比较

长那为什 么用它呢 因为Cr oss Code r的准确 率会高很 多所以它 很适合做 精挑细选 你可以把 它类比成 公司筛选 人才众所 周知公司 面试一共

是分为两 个环节简 历筛选加 面试召回 就跟简历 筛选有点 像候选人 太多公司 只能用一 些粗略的 方法从成 千上万份 简历里面 挑出十个 看起来最 优秀的准

确率可能 会大打折 扣但这也 是没有办 法的事情 那重牌就 跟面试很 像了公司 对这十个 人进行面 试仔细挑 选尽可能 的保证判 断正确 从中挑出 最优秀的

三个人入 职好重排 就讲到这 里下面我 们进入到 生成阶段 生成什么 呢那当然 是生成答 案了现在 我们有了 用户问题 也有与用 户问题相 关的三个 片段我们

就可以把 这两部分 一起发给 大模型让 它根据片 段内容来 回答用户 问题到此 整个流程 就结束了 这个流程 里面的所 有环节我 们都讲完 了下面我 们把所有

的流程给 串联一下 整体讲一 遍整个流 程分为两 个部分一 个是准备 部分它发 生在提问 前包括分 片和索引 两个环节 一个是回 答部分发 生在提问 后包括召

回重排和 生成三个 环节由于 整个流程 分为两个 部分所以 我们的整 体流程也 会有两个 首先看提 问前的准 备部分首 先我们把 相关的资 料做个分片 然后把所

有的片段 都扔给e mbed ding 模型让它 给每个片 段都产出 一个对应 的向量最 后我们把 向量传入 到向量数 据库中到 这里提问 前的准备 流程就结

束了这就 相当于我 们的知识 库构建已 经完毕了 就等用户 来用了再 来看看用 户提问之 后发生了 什么首先 用户的问 题会给到 embe ddin g模型e

mbed ding 模型会把 用户的问 题转换为 一个向量 然后我们 会把这个 向量传给 向量数据库 让它给我 们找到1 0个与用 户问题最 相近的片 段找到之

后我们再 把这10 个片段送 给Cross Enco der模 型让它做 个重排从 10个里 面再筛选 出3个相 关程度最 高的然后 我们把这 3个与用 户问题相

关程度最 高的片段 外加用户 的问题一 起发给大 模型大模 型就可以 给我们产 出最终答 案了到这 里所有的 流程就算 是结束了 今天的视 频就到此 结束了

别忘了点 赞关注我 们下次再 见拜拜

Loading...

Loading video analysis...