这里写自定义目录标题
- 欢迎使用Markdown编辑器
- 引言:RAG 为什么成为大模型落地的主流范式
- 一、RAG 的核心原理与设计目标
- 1.1 从"参数记忆"到"外部记忆"
- 1.2 RAG 解决的核心问题
- 二、RAG 的完整架构:从数据到服务的全链路
- 2.1 数据层:知识库的质量决定一切
- 2.2 索引层:稀疏检索与稠密检索
- 2.3 混合检索:兼顾精度与召回
- 2.4 检索层与生成层
- 三、RAG 实战:一个完整的落地流程
- 四、RAG 的核心挑战与优化手段
- 4.1 检索质量差
- 4.2 上下文窗口限制
- 4.3 知识冲突
- 新的改变
- 功能快捷键
- 合理的创建标题,有助于目录的生成
- 如何改变文本的样式
- 插入链接与图片
- 如何插入一段漂亮的代码片
- 生成一个适合你的列表
- 创建一个表格
- 设定内容居中、居左、居右
- SmartyPants
- 创建一个自定义列表
- 如何创建一个注脚
- 注释也是必不可少的
- KaTeX数学公式
- 新的甘特图功能,丰富你的文章
- UML图表
- 流程图
- FLowchart流程图
- 导出与导入
- 导出
- 导入
欢迎使用Markdown编辑器
你好! 这是你第一次使用# RAG 技术方案全解析:从基础架构到生产级优化
引言:RAG 为什么成为大模型落地的主流范式
大语言模型的知识全部固化在训练时的参数里,这带来两个根深蒂固的问题:知识时效性差,训练截止之后的世界它一概不知;幻觉频发,在知识不足或不确定的场景下会自信地编造内容。为了让模型"学会不知道的东西",业界提出了两条路线:一是微调,把新知识灌进参数里,但成本高、周期长、每次更新都要重新训练;二是检索增强生成(RAG),在生成之前先从外部知识库检索相关内容,把检索结果作为上下文注入提示词,让模型基于"证据"作答。
RAG 之所以成为当下大模型应用落地的主流范式,是因为它天然具备三个优势:知识可以随时更新,换掉知识库就换掉了模型的"记忆";答案有据可查,可以追溯到具体检索源,增强可信度;成本远低于微调,不需要昂贵的训练算力。本文将从原理、架构、实战和优化四个层面,系统拆解 RAG 技术方案。
一、RAG 的核心原理与设计目标
1.1 从"参数记忆"到"外部记忆"
RAG 的哲学很简单:让模型不依赖内部的参数记忆,而是依赖外部可检索的记忆。整个系统由两个模块协同工作:
检索模块负责从外部知识库(文档库、数据库、向量索引)中精准提取与用户查询相关的上下文;生成模块基于检索结果与用户输入,生成更准确、更具时效性的回答。模型仍然负责"组织语言",但"事实来源"从参数转移到了检索结果。
1.2 RAG 解决的核心问题
具体来说,RAG 解决了传统生成模型的三大痛点:
第一,知识过时问题。模型参数固化后无法动态吸收新知识,而 RAG 的检索模块可以连接数据库、文档库或 API,随时获取最新信息,特别适合新闻、产品参数、企业内部资料等时效性强的场景。
第二,幻觉问题。通过检索结果约束生成范围,模型只能基于给定的上下文作答,大幅降低编造不实信息的概率。当然,这要求检索结果本身是准确的,检索错了,生成的答案也会跟着错。
第三,通用模型专业化问题。通用模型的权重分散在太多领域,在垂直领域表现平平。搭配该领域的知识库后,模型相当于在作答时"临时翻开"了专业资料,垂直场景的专业性显著提升。
二、RAG 的完整架构:从数据到服务的全链路
一个完整的 RAG 系统包含数据层、索引层、检索层和生成层四个部分。
2.1 数据层:知识库的质量决定一切
知识库的质量直接决定 RAG 效果的上限,这个环节值得投入最多精力。核心工作有三项:
数据清洗是最基础也是最容易被低估的环节。去除重复内容、低质量内容、广告和噪音,统一格式(如HTML转纯文本、Markdown 规范化),修正错别字和乱码。脏数据进入索引后,检索结果会被污染,且问题会沿着链路层层放大。
分块策略决定检索的最小单元。长文档需要切成合理粒度的片段,既不能太粗导致语义混杂,也不能太细导致上下文割裂。常见的做法是按段落、语义块或固定字数切分,块与块之间保留重叠部分。不同文档类型应该采用不同的切分策略:代码按函数切,技术文档按标题层级切,合同按条款切。
元数据标注是很多团队忽略的一环。给每个文本块打上来源文档、章节、日期、作者等标签,一方面可以在检索后做过滤和展示,另一方面为后续的权限控制和引用溯源提供基础。
2.2 索引层:稀疏检索与稠密检索
知识库的检索索引主要有两类,各有适用场景:
稀疏检索基于关键词匹配,最经典的算法是 BM25。它通过词频和逆文档频率计算文档与查询的相关性,擅长处理精确匹配、专有名词、编号等场景,对结构化文本效果好,不需要 GPU,速度快。缺点是理解不了语义,换个说法就搜不到。
稠密检索基于向量语义匹配。用嵌入模型(如 BERT 系列、bge 系列)把文本映射为高维向量,查询时把问题也转成向量,通过余弦相似度或向量内积计算最相似的文本块。它擅长语义相似匹配,"如何修电脑"和"计算机故障排查"也能关联上,但需要嵌入模型的算力开销,且对专有名词的精确匹配可能不如 BM25。
构建向量索引的示例代码如下:
importfaissimportnumpyasnpfromsentence_transformersimportSentenceTransformer model=SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')docs=["RAG 通过检索增强生成...","向量索引可加速语义搜索..."]embeddings=model.encode(docs).astype('float32')index=faiss.IndexFlatL2(embeddings.shape[1])index.add(embeddings)query_emb=model.encode(["如何优化 RAG 检索效率?"])distances,indices=index.search(query_emb,k=3)2.3 混合检索:兼顾精度与召回
业界公认的最优实践是混合检索:同时跑 BM25 稀疏检索和向量稠密检索,再把两路结果融合。融合算法有多种,最简单的 RRF(Reciprocal Rank Fusion)把各路的排名倒数相加,无需训练即可获得稳健的效果;更高级的做法是用学习排序模型对融合后的候选做二次精排。
混合检索的意义在于互补:BM25 保证精确匹配不丢,向量检索保证语义相关不漏。在很多真实项目中,单纯换嵌入模型不如加一路 BM25 带来的提升明显。
2.4 检索层与生成层
检索层负责把用户的自然语言问题转换为可检索的查询,并召回相关文档。这里有两个容易被忽略的细节:一是查询改写,用户的问题往往口语化、指代不明(如"那它的部署方式呢"),需要借助模型把问题改写得更完整、更适合检索;二是重排序,向量检索召回的 Top-K 结果相关性排序未必理想,用重排序模型做二次精排后只保留最相关的几块,能显著提升生成质量。
生成层把检索结果与用户问题组装成提示词,交给 LLM 生成最终答案。提示词需要明确告知模型:只依据给定资料作答、资料不足时明确说不知道、以原始资料中的表述为准。有条件的情况下,还可以要求模型在回答中标注引用来源,便于用户核查。
三、RAG 实战:一个完整的落地流程
以一个企业知识库问答系统为例,完整流程如下:
第一步,数据准备。收集产品文档、技术手册、FAQ、历史工单等资料,清洗后统一格式,按主题或文档结构分块,标注元数据。
第二步,构建索引。使用嵌入模型将文本块向量化,写入向量数据库(如 Chroma、Milvus、FAISS);同时构建 BM25 索引,供混合检索使用。这一步通常在离线完成,定期增量更新。
第三步,实现检索。用户提问后,同时发起向量检索和关键词检索,融合两路结果,用重排序模型精排,取最相关的 Top-K 块。
第四步,生成回答。把用户问题、检索块、系统指令组装成提示词,调用 LLM 生成答案。回答中可以包含引用来源标识。
第五步,评估与迭代。建立评估集,定期统计检索命中率和答案准确率,根据失败案例调整切分策略、嵌入模型、检索参数和提示词。
四、RAG 的核心挑战与优化手段
4.1 检索质量差
症状是答非所问或找不到答案。优化手段包括:调整分块策略(块大小、重叠度);更换更强的嵌入模型;引入混合检索;加入查询改写;用重排序模型精排。排查时建议先用检索调试工具单独查看检索结果,确认问题出在检索还是生成。
4.2 上下文窗口限制
知识库文档量大,检索结果可能超过模型上下文长度。解决思路有三:一是收紧召回数量,只保留最高相关性的块;二是用map_reduce或refine模式分片处理;三是在分块阶段就控制块大小,让单块和召回总量落在上下文预算内。
4.3 知识冲突
知识库中的新旧文档可能互相矛盾,检索结果同时包含冲突信息,模型会无所适从。解决思路是:在数据清洗阶段做去重和版本管理;在提示词中要求模型以最新版本或高优先级来源为准;必要时在元数据Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown将代码片显示选择的高亮样式进行展示;
- 增加了图片拖拽功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的KaTeX数学公式语法;
- 增加了支持甘特图的mermaid语法1功能;
- 增加了多屏幕编辑Markdown文章功能;
- 增加了焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了检查列表功能。
功能快捷键
撤销:Ctrl/Command+Z
重做:Ctrl/Command+Y
加粗:Ctrl/Command+B
斜体:Ctrl/Command+I
标题:Ctrl/Command+Shift+H
无序列表:Ctrl/Command+Shift+U
有序列表:Ctrl/Command+Shift+O
检查列表:Ctrl/Command+Shift+C
插入代码:Ctrl/Command+Shift+K
插入链接:Ctrl/Command+Shift+L
插入图片:Ctrl/Command+Shift+G
查找:Ctrl/Command+F
替换:Ctrl/Command+G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。
如何改变文本的样式
强调文本强调文本
加粗文本加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的代码片.
// An highlighted blockvarfoo='bar';生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
| 项目 | Value |
|---|---|
| 电脑 | $1600 |
| 手机 | $12 |
| 导管 | $1 |
设定内容居中、居左、居右
使用:---------:居中
使用:----------居左
使用----------:居右
| 第一列 | 第二列 | 第三列 |
|---|---|---|
| 第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants 是一个文本转换工具,主要功能是将普通的 ASCII 标点符号自动转换为更美观的印刷体标点符号。例如:
| 原始符号 | 转换后 | 说明 |
|---|---|---|
"引号" | “引号” | 直引号变弯引号 |
'单引号' | ‘单引号’ | 直单引号变弯单引号 |
-- | – | 两个连字符变短破折号 |
--- | — | 三个连字符变长破折号 |
... | … | 三个点变省略号 |
创建一个自定义列表
- Markdown
- Text-to-HTMLconversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。2
注释也是必不可少的
Markdown将文本转换为HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb NΓ(n)=(n−1)!∀n∈N是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息LaTeX数学表达式here.
新的甘特图功能,丰富你的文章
- 关于甘特图语法,参考 这儿,
UML图表
可以使用UML图表进行渲染,例如下面产生的一个序列图:
- 关于UML图表语法,参考 这儿,
流程图
- 关于Mermaid语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart.js的流程图语法:
- 关于Flowchart流程图语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到文章导出,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
mermaid语法说明 ↩︎
注脚的解释 ↩︎