Retrieval-Augmented Generation · 实习生入门

检索增强生成
RAG 技术指南

RAG(检索增强生成)是把外部知识库"接"到大模型上的技术。本文基于一次真实的企业内部知识库项目, 系统讲清 RAG 的概念、原理、进阶技术、实战踩过的坑,以及一套可以亲手把玩的迷你 RAG。

05
大章节
3
份演示文档
4
个检索旋钮
∞
可玩性
01
RAG 是什么?原理与完整链路
参考 Datawhale All-in-RAG 知识体系。

1.1 为什么需要 RAG?

大语言模型(LLM)有固有的局限:① 知识有时效性——只学到训练截止日期前的知识,无法知晓之后发生的事; ② 会产生幻觉——对不知道的问题,可能编造出看似合理实则错误的内容; ③ 缺乏领域知识——通用模型不了解特定企业或行业的制度与规则。

RAG(检索增强生成)的解法:在模型回答前,先从外部知识库检索相关资料,把资料作为上下文提供给模型,让它基于材料作答。 本质上就是"带着参考书答题"。

大模型的局限具体表现RAG 的解法
知识时滞不知道训练截止后的事(新政策、新产品、实时数据)知识库随时更新,新内容入库即可检索
幻觉编造看似合理实则错误的内容强制基于检索内容作答,答不上来明说不知道
领域盲区缺乏企业/行业专门知识外挂领域知识库(制度、手册、FAQ)
数据隐私可能泄露敏感数据敏感资料留在内部知识库,模型只查不记
不可溯源回答无出处,无法追责每条答案可指向原文片段,可追溯

1.2 完整流程:离线索引 + 在线检索生成

RAG 系统分两大阶段。离线阶段(提前完成,构建知识索引):收集文档 → 切分 → 向量化 → 入库。 在线阶段(用户提问时实时发生):把问题向量化 → 检索相似片段 → 连同问题一起交给模型生成答案。

离线
① 加载 Load
收集 Word/PDF/网页等多源文档
→
离线
② 切分 Chunk
长文档切成小块,保持语义完整
→
离线
③ 嵌入 Embed
每块文本用嵌入模型转成向量
→
离线
④ 入库 Store
向量存入向量数据库并建索引
→
在线
⑤ 检索 Retrieve
问题向量化 → 相似度搜索 → 召回 TopK
→
在线
⑥ 生成 Generate
问题 + 召回片段 → LLM 组织答案
📌
关于"嵌入"(Embedding):嵌入模型把文本映射为固定维度的向量(如 768/1024 维)。 核心性质是语义相近的文本向量也相近——"猫"和"猫咪"的向量接近,"猫"和"汽车"的向量距离远。 检索的本质就是在向量空间中寻找与问题最接近的片段。

1.3 直观理解"向量相似"

一句话在模型里被映射成一组向量数值。下图展示 3 个词的向量分布(示意)—— "猫"和"猫咪"的向量几乎一致(相似度 0.93),而"汽车"与它们差异明显(相似度 0.21)。

🐱 "猫"
向量分布(示意)
基准 · 相似度 = 1.00
😺 "猫咪"
与"猫"向量接近 → 语义相似
与"猫"相似度 ≈ 0.93
🚗 "汽车"
与"猫"向量差异大 → 语义不相似
与"猫"相似度 ≈ 0.21

1.4 相似度计算

向量检索通过计算"问题向量与片段向量的相似度"来排序。常见方式:

方式说明特点
向量相似度比较向量方向是否一致(余弦相似度最常用)能识别同义词与语义相近的文本
关键词匹配(BM25)统计查询词与文档的词频重合度精确匹配专有名词,但不理解语义

1.5 RAG 的演进阶段

入门 Naive RAG进阶 Advanced RAG模块化 Modular RAG
流程索引 → 检索 → 生成(直线)检索前后增加优化步骤积木式可编排
代表技术基础向量检索查询重写、结果重排 Rerank、混合检索动态路由、多路融合、自我修正
优点简单直接准确率提升明显灵活、可定制
代价效果不稳定流程固定、优化空间有限系统复杂、调试成本高

1.6 技术选型:RAG vs 微调 vs 提示词工程

优化手段按改动成本从低到高排列:提示词工程 → RAG → 微调。 核心区分:想解决"知道什么"(缺知识、知识过时、需要引用来源)→ 用 RAG; 想改变"怎么做"(输出格式、说话风格)→ 才考虑微调。

手段改动什么适合场景成本
提示词工程只改提问方式模型本身会,只是未被引导极低
RAG外挂知识库,不改模型模型缺特定/实时知识中(需建库)
微调改变模型权重改变行为/风格/格式高(算力+数据)
02
分块(Chunking):RAG 的地基
分块决定了检索的"颗粒度"。分得好,检索准;分得差,再强的模型也救不回来。

2.1 为什么要分块?

嵌入模型和 LLM 都有上下文窗口限制——一次能处理的文本量有限。整篇 10 万字的文档无法一次性向量化, 必须切成小块。同时,块的大小直接影响检索效果。

块的大小需要权衡:块过大导致内容主题混杂、检索不精准; 块过小导致语义断裂、上下文不完整。

块切太大块切太小
主题混杂——一个块含多个主题,查询难以精准命中语义断裂——一句话被切两半,上下文不完整
"大海捞针"——长上下文中关键信息被稀释、易被忽略主题分散——同一主题散落多块,检索不完整
向量稀释——长文本向量化后重点信息被淹没块数膨胀——向量库膨胀,检索变慢

2.2 三种常见分块策略

✗ 固定长度硬切
按固定字符数切分。缺点:可能在句子或语义中间切断。可在实操区切换到"固定长度"直观对比。
✓ 递归字符切分(推荐)
按优先级寻找分隔符:段落 → 句号 → 逗号 → 空格。尽量在语义完整处切分。
✓ 结构 / 语义切分(最精细)
按 Markdown 标题切分(保留章节归属),或用模型检测语义跳跃点。块内主题聚焦,检索最准。
策略原理优点缺点
固定大小按固定字符数切简单、快易切断语义
递归字符按分隔符层级切语义较完整,通用中文需配置分隔符
语义分块模型检测语义断点块内主题聚焦慢、需调参
结构分块按标题切保留章节元数据依赖文档结构

2.3 父子分段:检索和回答用不同粒度

一个实用的设计:小的子分段负责"匹配",大的父分段负责"返回"。 查询命中某个小子分段后,返回的是它所属的整个父分段——既获得精确匹配,又保有完整上下文。 这也是本项目知识库采用的机制。

🔑
关键结论(来自真实排查):父分段的边界由文档结构决定(标题/列表/加粗/空行分隔段)。 想控制父分段数量,就控制 ## 标题层级;每块超过约 1022 字符会被硬切。详见 04 节。
03
进阶技术:让 RAG 更聪明
当基础 RAG 不够用时,这些技术能显著提升召回和生成质量。

3.1 混合检索:语义 + 关键词

单一向量检索擅长"语义理解"但不擅长"精确匹配"(如产品型号、人名、缩写)。 混合检索 = 密集向量(语义检索) + 稀疏向量(BM25 关键词检索) 并行执行,再融合结果。

密集向量(语义)稀疏向量(关键词)
实现Embedding 模型(BGE、OpenAI)BM25 / TF-IDF
擅长同义词、语义相近的匹配专有名词、型号、缩写精确命中
弱点短词区分度低不理解语义("汽车"≠"轿车")
融合倒数排名融合 RRF 或加权线性组合
⚠️
真实踩坑:两个字的业务术语(如内部平台名),纯语义检索区分度低、召回混乱。 开启混合检索后,关键词检索兜底精确命中。短词/专有名词场景建议用混合检索。

3.2 重排序 Rerank:二次精选

向量检索先召回 TopK 个候选(可能含噪声),再用更强的重排序模型对这 TopK 个重新打分排序,把真正相关的排到前面。 Rerank 只负责"排序"不负责"召回"——所以召回阶段的候选数(TopK)不能太小。

3.3 查询改写与多路召回

技术解决的问题做法
查询重写用户问得含糊、有指代把问题改写成利于检索的形式(补全指代、扩展同义)
HyDE问题太短、向量区分度低先用 LLM 生成一段"假答案",再拿假答案去检索
多路召回单一检索可能漏同时跑向量 + 关键词 + 数据库查询,融合结果
Text2SQL用户想查结构化数据把自然语言转成 SQL 去查数据库

3.4 生成阶段:Prompt 与防幻觉

💡
Prompt 三原则:① 明确"只基于检索内容回答";② 内容不足时直说"不知道",禁止编造; ③ 要求附上来源引用。这三点能有效抑制幻觉。

3.5 评估 RAG 系统

维度问什么常用指标
检索相关性召回内容里有多少是真正相关的Recall@K、Precision@K、命中率
生成质量答案是否正确、忠实于原文忠实度(Faithfulness)、答案相关度
端到端整体能否解决用户问题RAGAS、TruLens 自动化评估
📏
项目验收铁律:看 retriever_resources.content 是否含原文关键句和 URL, 而非仅判断"答案像不像对"。答案流畅 ≠ 用到了知识库,必须确认模型"喂进去"的上下文正确。
04
实战中的坑:真实项目踩过的
每条都是「现象 → 原因 → 规避」,全部来自真实排查经验。
链接消失
文档里的 URL 索引后消失
现象:正文里的链接被截断,只剩一句话的前半段。
原因:分段预处理的「删除所有 URL 和电子邮件地址」被勾选,索引时直接抹掉了 URL。
规避:上传后检查分段设置,务必取消该项;验收时确认召回内容里 :// 仍在。
切分太碎
2000 字文档切出 80 多个父分段
现象:md 每行一个换行,每个换行都被当成父分段边界。
原因:父分段边界 = Markdown 块级元素(标题/列表/加粗/空行分隔段),单换行也会触发。
规避:按「一、二、三、四」大标题组织,用 ## 标题控制父分段数量;块内写成连续文字。
1022 硬切
父分段超过 1022 字符被拦腰切断
现象:文档超长,在某个主题处硬切成第二个父分段。
原因:平台锁定每块上限约 1022 字符,超过就在结构边界硬切。
规避:每块内容 ≤1022;内容多就拆成多个 ## 块,或压缩冗余连接词。
召回串题
问"某主题词"却返回大量无关文档
现象:输入短主题词,召回 8 段只有 2 段相关。
原因:混合大库 + TopK 过大,召回名额被全库文档挤占;短词语义向量区分度低。
规避:按主题拆库;调小 TopK;或开混合检索让关键词兜底短词。
正确姿势
短块不会自动合并 → 用标题精确控分段
现象:段落模式下短块各自成父分段,并非按字符数聚合。
验证:探针文档实测 + 源码确认。
做法:想要 N 个父分段就用 N 个 ## 标题;想要 1 个就写成无换行连续文本(≤1022)。
关键认知
docx 会改变换行结构 → 优先用 md
现象:同一内容 docx 和 md 切分结果完全不同。
原因:docx 转文本时段落被转为换行,分段边界改变。
做法:知识库文档统一用 .md,控制换行即控制分段。
验收方法
看召回内容,而非"答案像不像"
现象:答案流畅但可能未用到原文。
方法:调 /chat-messages 检查 retriever_resources.content 是否含原文关键句和 URL。
做法:每个文档用一个代表性问题测试,确认命中正确文档、URL 完整带出。
覆盖缺口
用户问的内容,库里不存在
现象:问一个库外问题,答案说"知识库未提供"。
原因:原始文档本身没有该信息,非清洗丢失。
规避:先确认原始材料是否真有内容;没有就补文档,而非改 Prompt 硬编。
05
动手实操:RAG 实验台
一套纯前端迷你检索器,内置 3 份公开的 LLM 基础知识文档。 你可以像做实验一样调 切分方式、切分长度、检索模式、TopK、Score 阈值, 实时观察召回变化,甚至看命中词分析和双模式对比。
mini-rag · 检索实验台
切分方式
检索模式
TopK(召回数) = 3
Score 阈值 = 0.00
预设问题试试:
* 说明:真实 RAG 用嵌入模型算语义相似度;本页为纯前端演示,用字符 bigram 特征近似模拟—— 语义模式加权关键词命中,混合模式额外叠加 BM25 关键词分。分数已归一化到 0–1 便于观察。 目的是让你直观理解切分 / TopK / 阈值 / 检索模式如何影响召回。切到「固定长度」对比「按大标题」, 看看同样的查询,召回质量差多少。