RAG 是什么?为什么需要 RAG?

RAG(Retrieval-Augmented Generation,检索增强生成)的本质就一句话:在 LLM 生成回答之前,先从外部知识库检索相关信息,把检索结果塞进 Prompt,让 LLM 基于事实回答。
为什么需要 RAG?
引入 RAG 主要为了解决大模型在落地应用时的几个核心痛点:
缓解幻觉问题:纯大模型容易编造不存在的规则或事实,RAG 强制模型基于检索到的真实文档回答,大幅提升准确性。
解决知识时效性:大模型的训练数据有截止日期,RAG 可以随时接入最新的业务文档或数据库,无需重新训练模型即可获取最新知识。
接入私有数据:企业内部的私有数据无法用于训练公开的大模型,RAG 能让通用模型安全地处理私有领域知识。
回答可溯源:RAG 的每条结论都能找到对应的文档来源,满足企业合规审计与风控解释的需求。
降低推理成本:相比将海量文档全部塞入长上下文窗口,RAG 只检索最相关的信息,大幅减少了 Token 消耗和计算资源浪费。

RAG 的完整链路是怎样的?

Query → 文档处理 → Chunking → Embedding → 检索 → Rerank → 生成

步骤 做什么 关键决策
文档处理 解析 PDF/Word/Markdown,提取文本 PDF 表格怎么处理?OCR 要不要?
Chunking 把长文档切成小块 切多大?overlap 多少?按语义切还是固定长度?
Embedding 把文本块转成向量 用什么模型?维度多少?中文还是英文?
检索 根据用户问题检索最相关的文本块 纯向量还是混合检索?Top-K 设多少?
Rerank 对检索结果重排序 用什么 Rerank 模型?重排后再取 Top-N
生成 把检索结果 + 问题喂给 LLM 生成回答 Prompt 怎么写?幻觉怎么约束?

向量检索的原理是什么?

向量检索的核心是将“语义相似性”转化为“向量空间中的距离相似性”。
向量化:通过 Embedding 模型将文本映射为高维稠密向量。语义相近的文本(如“苹果手机”与“iPhone”),其向量在空间中的夹角很小(余弦相似度趋近于 1)。
相似度计算:在检索时,计算用户查询向量与库中文档向量的距离(通常使用余弦相似度或欧氏距离)。
近似最近邻(ANN):为了在海量数据中快速找到最相似的向量,通常采用 ANN 算法(如 HNSW 多层图结构、IVF 聚簇等),在极短时间内召回 Top-K 个最相关的文档片段。

算法 原理 特点
HNSW 多层跳表图,从上层粗搜到下层精搜 查询快,内存占用大,Milvus 默认
IVF 先聚类,只搜最近的几个簇 可控精度,适合超大规模
PQ(乘积量化) 压缩向量维度,降低内存 内存省,精度有损

向量数据库怎么选?Milvus、FAISS、Qdrant 各自适合什么场景?

FAISS Milvus Qdrant
类型 库(Library) 数据库(Database) 数据库(Database)
部署方式 嵌入应用进程 独立服务,支持分布式 独立服务,轻量级
持久化 需自己实现 原生支持 原生支持
适合规模 百万级以下 亿级 千万级
运维成本 低(无额外服务) 中(需部署集群) 低(单节点起步)
生产环境 适合原型验证 适合大规模生产 适合中小规模生产

Milvus:适合企业级大规模生产环境,数据量达到千万甚至十亿级别,需要分布式扩展和多租户隔离的场景。
FAISS:适合对检索速度要求极高、数据不需要频繁更新、且不需要复杂过滤条件的离线或内存检索场景。
Qdrant:适合追求极致单机性能、需要复杂的 Payload(元数据)过滤、以及希望快速落地生产级 RAG 的中小型到大规模场景。

纯向量检索有什么问题?为什么需要混合检索?

纯向量检索的三个致命问题
① 精确匹配不行——用户搜"RFC 7231",向量检索可能返回"HTTP 协议规范"这种语义相关但没提到 RFC 7231 的文档。因为它靠语义相似度,不是精确匹配。
② 专业术语召回差——“K8s 的 HPA 怎么配置”,向量检索可能找的是"Kubernetes 自动扩缩容",而真正包含 HPA 配置细节的文档反而排不上。专业术语的向量表示和口语描述的向量表示距离可能很远。
③ 专有名词遗漏——产品名、人名、缩写这些,向量检索容易丢失。
在这里插入图片描述

Rerank 是什么?为什么检索之后还要重排序?

检索是粗筛快捞,Rerank 是精排提准。检索用 Bi-Encoder 快但粗,Rerank 用 Cross-Encoder 慢但准。先用检索从百万级捞 Top-20,再用 Rerank 精排取 Top-5,这是生产环境的标配流程。
常用 Rerank 模型

模型 特点
BGE-Reranker (bge-reranker-v2-m3) 中文效果好,开源免费
Cohere Rerank API 调用,效果好,英文为主
bce-reranker-base_v1 中文场景,轻量级

Chunk 怎么切?切大了切小了各有什么问题?

切分策略:常见的有递归切分(按段落、句子优先级)、结构化切分(按 Markdown 标题或 HTML 标签)、语义切分(在语义断裂点切分)以及固定大小+重叠(Overlap)。
切分大小影响:
切太大:包含的噪声信息多,容易稀释核心语义,导致向量表征不精准,且会占用大模型宝贵的上下文窗口。
切太小:语义可能不完整,导致检索时无法匹配到用户的宏观问题,丢失必要的上下文背景。
建议:通常 Chunk 大小在 256-1024 tokens 之间,并保留 10%-20% 的重叠(Overlap)以保持上下文连贯。

Embedding 模型怎么选?中文场景选什么?

模型 维度 特点
bge-large-zh-v1.5 1024 中文效果最好,开源,本地部署
bge-m3 1024 多语言,支持稠密+稀疏+多向量三种检索
text-embedding-3-large (OpenAI) 3072 效果好,但 API 调用有成本,中文不如 bge
text-embedding-3-small (OpenAI) 1536 便宜,效果够用,英文场景首选

选型原则:必须使用同一个模型生成查询和文档的向量;模型升级时需全量重新向量化。通常选择在该语言评测榜单(如 MTEB)上排名靠前的模型。
中文场景:强烈推荐 BGE-M3 系列。它原生支持中文,最大支持 8192 tokens 的长文本,并且能同时产出 Dense(稠密)、Sparse(稀疏)、ColBERT 三种向量,天然非常适合混合检索。

RAG 的幻觉怎么处理?

六种幻觉处理策略
1、Prompt 约束——在 Prompt 里明确要求"只能基于检索结果回答,检索结果没有的信息不要编造"。
2、输出自校验——LLM 生成回答后,再用一次 LLM 检查:回答的每一条是否都能在检索结果中找到依据?找不到的标注为"未验证"。
3、引用标注——要求 LLM 在回答时标注每条信息的来源 chunk,方便人工核查。
4、温度调低——temperature 设 0.1-0.3,降低 LLM 的随机性,减少"编造"的倾向。
5、检索结果和生成结果的对齐——生成回答后,把回答和检索结果做相似度对比,如果回答中有大段内容和所有检索结果都不相关,大概率是幻觉。
6、兜底回答——当检索结果的相似度都低于阈值时,直接回答"未找到相关信息",而不是让 LLM 硬编。

RAG 检索效果不好怎么优化?

优化思路:从链路的每一步找问题
文档处理阶段——PDF 表格提取准确率够不够?图片里的文字有没有 OCR?不同格式(PDF/Word/Markdown)分别做了什么适配?
Chunk 阶段——chunk_size 合不合理?有没有针对不同文档类型调参?
overlap 设的多少?
检索阶段——纯向量还是混合检索?Top-K 设多少?有没有加 Rerank?
生成阶段——Prompt 怎么写的?幻觉怎么处理的?

四种高级优化策略
① Query 改写——用户的问题可能表述不清或太短,先用 LLM 改写成更适合检索的 query。
② 多路召回——同一问题用多种方式检索:原问题检索、改写问题检索、提取关键词检索、拆分子问题检索,最后合并结果。
③ Parent-Child 检索——检索时用小 chunk(精确匹配),返回时用大 chunk(保留上下文)。具体做法:小 chunk 存向量索引用于检索,每个小 chunk 关联一个父 chunk,检索命中后返回父 chunk 的完整内容。
④ 上下文窗口扩展——检索到一个 chunk 后,把它前后的 chunk 也带上,保证上下文完整。

Agentic RAG 是什么?和普通 RAG 有什么区别?

普通 RAG 是固定流程:用户问 → 检索一次 → 生成回答。如果第一次检索结果不好,它不会自己纠正,直接硬生成。就像一个不会反思的人,说错就错到底。
Agentic RAG:让 RAG 自己决定怎么检索Agentic RAG 把 Agent 的规划能力引入 RAG——LLM 自己判断:需要检索哪些数据源?检索结果够不够?不够就换个角度再检索。

设计一个面向 10 万用户的 RAG 知识库系统,你会怎么设计?

从五个维度展开:
数据层(文档解析→Chunk→Embedding→向量库 + ES 双写)、
检索层(混合检索 + Rerank,Top-20 检索 + Top-5 精排)、
生成层(vLLM 部署 + Prompt 模板 + 幻觉约束)、
工程层(Redis 缓存热点查询、异步处理文档更新、监控检索准确率和幻觉率)、
安全层(文档权限隔离、Prompt Injection 防御、敏感信息过滤)。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐