RAG 是什么?如何让大模型基于文档作答

RAG 是什么?

纯靠对话使用大模型时,我最常遇到的一个问题是:它表达能力很强,但不一定掌握我项目里的"事实" 。比如公司内部的接口命名、鉴权规范、最新的业务规则,它要么不知道,要么只能给出"看起来很对"的通用答案------一旦落到真实项目,就可能踩坑。

RAG(Retrieval-Augmented Generation)就是为了解决这个问题的。

RAG = 检索(Retrieval) + 生成(Generation)

  • 检索:先从外部知识(你的文档、代码、规范)里找出与问题最相关的片段(证据)。
  • 生成:把"问题 + 证据"交给 LLM,让它基于证据推理、总结并输出答案(最好带引用)。

我更愿意把它理解为:给大模型配了一个"可查询的外部知识库",让它在回答前先翻资料,再开口。

RAG 里的"检索",为什么离不开向量?

说到检索,很多人第一反应是"搜索引擎":关键词匹配、全文搜索、ES......这些当然能用,但它们更偏向"查字面",而 RAG 更常见的诉求是:

我问的是一句人话,但我希望系统能在知识库里找到"讲同一件事"的那几段内容。

这就引出了向量(更准确说:embedding 向量)------它解决的是"按意思找"的问题。

向量是什么?

作为前端开发人员,刚开始接触向量时不太好理解它的概念。后来我干脆不去纠结"高维空间"这些听起来很学术的词,而是换了个更好理解的说法:

向量可以先当成"坐标"。

生活里我们熟悉的坐标是二维、三维:平面一个点、空间一个点。坐标有个天然优势:能算距离。给两个点,在数学中就能算出它们离得远还是近,还能找"离我最近的那个点"。

关键问题来了:

既然点和点能算距离,那能不能让两段文字也像"点"一样能算距离?听上去抽象,但它背后是一个非常实用的需求:按语义去搜东西

一个例子:我真正想搜的是"意思",不是"关键词"

假设我在做一个 AI 助手,我问它:

"登录过期怎么处理?"

我的知识库里不一定刚好有一段文字就叫"登录过期怎么处理"。它可能写的是:

"token 失效后的跳转策略:清空本地登录态,跳转到 /auth/sign-in,并保留 redirect 参数......"

这两句话字面并不完全重合,但意思非常接近:都是在说"登录失效以后系统应该怎么做"。

如果我用的是纯关键词搜索,它更偏向"有没有出现'登录过期'这几个字"。而我真正想要的是:

把知识库里"讲同一件事"的那段内容搜出来。

那向量到底怎么把"语义"变成"距离"?

我的理解是这样一条链路:

  1. 先把文字变成一串数字 (这一步靠 Embedding 模型,不是手写规则)
  2. 这串数字可以看成它的语义指纹(或者说"高维坐标")
  3. 指纹之间可以计算"像不像"(相似度/距离)
  4. 越像的,就越应该被检索出来

所以所谓"向量检索",本质就是:

我把"登录过期怎么处理"也转成语义指纹,然后在一堆文档片段的指纹里,找出最像"token 失效后的跳转策略"那几段。

"距离/相似度"怎么算?不用背公式,记住结论就够

常见的计算方式有两类名词:

  • 余弦相似度:分数越大越像
  • 欧氏距离(L2) :距离越小越像

我不需要记公式,只要记住:它们都是在回答同一个问题------两段内容到底像不像。

到这里,我们就理解了 RAG 里最关键的 Retrieval :我需要先从知识库里召回"能回答这个问题的证据片段",向量检索就是目前最通用的一种实现。

先把误区讲清楚:向量库不产出答案,LLM 才产出答案

很多人第一次听 RAG,会下意识认为流程是(起初我是这么理解的😂):

用户提问 → 向量数据库匹配 → 返回答案

这不准确。更准确的是:

用户提问 → 向量数据库找资料 → LLM 读资料写答案

  • 向量数据库返回的是相关原文片段(chunks),它不负责"解释"和"组织语言"。
  • LLM 的工作是:基于检索到的证据,输出更贴近人类阅读的答案,并能给出理由/引用。

一个最小可落地的 RAG 系统:4 个组件 + 2 条链路

如果我们把 RAG 当成一套工程系统,它最小闭环可以拆成:

四个核心组件

  1. 知识库(数据源) :文档、Wiki、PRD、代码、FAQ......
  2. Embedding 模型(语义编码器) :把文本转成向量
  3. 向量数据库(语义搜索引擎) :存向量并支持相似度检索
  4. LLM(推理/生成引擎) :基于证据输出答案

常见实现里,向量库不只存"向量",也会存 chunk 原文 + 元数据(来源链接、章节、更新时间、权限等),便于引用和追溯。

同时,RAG 也可以很直观地拆成两条链路:

  • Retrieval(检索链路) :Embedding + 向量库
  • Generation(生成链路) :Prompt 组织 + LLM

RAG 的核心工作流:离线建库 + 在线问答

阶段一:离线建库(把原始资料变成"可检索索引")

我们要先把资料处理成适合检索的形态:

flowchart TD A[原始资料
文档/代码/Wiki] --> B[清洗/去噪] B --> C[切分为 chunks] C --> D[Embedding 向量化] D --> E[写入向量数据库
vector + chunk + metadata]

这里有个关键动作:切分 chunks

因为我们检索的通常不是整篇文档,而是"最相关的几段"。切分做得好,检索才会准。

阶段二:在线问答(先找证据,再让 LLM 输出)

用户提问后:

flowchart TD A[用户问题] --> B[对问题做 Embedding] B --> C[向量检索 TopK chunks] C --> D[组装 Prompt
问题 + 证据 + 规则] D --> E[LLM 生成答案
并可附引用]

注意这一步的本质变化:

LLM 不再"凭空作答",而是"阅读证据后作答"。

RAG 的价值到底是什么?

最后我让AI帮我总结了一下:

  1. 让答案可追溯:答案背后有来源(文档/链接/代码位置),便于验证与评审。
  2. 让知识可更新:文档更新 → 重新入库/增量更新 → 立刻生效,不必重训模型。
  3. 让模型更少胡编:有证据约束,幻觉显著下降(仍可能发生,但更易发现)。
  4. 让私有知识可用:把内部资料接入 AI,回答更贴近项目真实情况,而不是"通用建议"。
相关推荐
CRAB2 小时前
解锁移动端H5调试:Eruda & VConsole 实战指南
前端·debug·webview
OpenTiny社区2 小时前
Vue2/Vue3 迁移头秃?Renderless 架构让组件 “无缝穿梭”
前端·javascript·vue.js
敲代码的独角兽2 小时前
深入理解 JavaScript 异步机制:从回调到 Promise 再到 async/await
前端
清风乐鸣2 小时前
刨根问底栏目组 - 学习 Zustand 的广播哲学
前端
yxorg2 小时前
vue自动打包工程为压缩包
前端·javascript·vue.js
Bigger2 小时前
shadcn-ui 的 Radix Dialog 这两个警告到底在说什么?为什么会报?怎么修?
前端·react.js·weui
MrBread2 小时前
突破限制:vue-plugin-hiprint 富文本支持深度解析与解决方案
前端·开源
用户4099322502122 小时前
Vue3中v-if与v-for为何不能在同一元素上混用?优先级规则与改进方案是什么?
前端·vue.js·后端
与兰同馨2 小时前
【踩坑实录】一次 H5 页面在 PC 端的滚动条与轮播图修复全过程(Vue + Vant)
前端