我最近被问得最多的一个词就是 RAG,招聘网站上挂满了 RAG 工程师、RAG 算法岗,OpenAI 的官方文档翻来覆去也在讲 RAG。很多朋友学了几天 LangChain 跑通了一个本地问答 demo,就以为自己掌握 RAG 了,结果面试官一追问“召回率怎么算”“chunk size 多少合适”“混合检索怎么做路由”,立刻就懵了。这篇博文我不讲虚的,就从一个基础但完整的角度,把 RAG 的原理、常用框架、dense vector search 的细节、embedding 和 rerank 在 RAG 中的作用、以及知识库落地时的测评方法都串一遍,争取让你看完之后既能理解本质,也能直接上手搭一个像样的项目。
这篇内容适合三类人:刚接触 RAG 想建立系统认知的新手,用 Dify 或 LangChain 做过 demo 但想搞清楚底层逻辑的开发者,以及准备 RAG 面试想梳理知识体系的人。我会把“为什么这个环节要这么做”讲透,而不只是罗列操作步骤。
1. RAG 的核心机制与工程定位
1.1 它到底解决了什么问题
RAG 全称 Retrieval-Augmented Generation,中文叫检索增强生成。它解决的问题非常朴素:大语言模型的知识是训练时固化的,你问它最近三天发生的事情,它只能胡编;你让它回答公司内部制度文件里的问题,它说不知道。RAG 的思路就是,在模型回答之前,先从外部知识库中检索出和问题相关的资料片段,把这些片段拼接到 prompt 里,让模型根据这些资料来作答。
这个思路听起来简单,但它绕开了两个长期困扰大模型应用的难题:一是模型无法低成本持续更新知识,二是模型幻觉问题无法从模型本身根除。RAG 把知识存储从模型参数里剥离出来,放到外部向量数据库中,需要时再实时检索。这相当于给模型配了一个可以随时翻阅的资料库,知识更新只需要重新索引文档,不需要重新训练模型。
从工程视角看,RAG 实际上是把自然语言问答问题拆解成三个子问题:如何把文档变成可检索的形式,如何从海量片段中找回最相关内容,如何让模型基于检索结果生成可靠答案。这三个子问题对应了 RAG 的三大核心模块:索引构建、检索召回、生成增强。后面所有框架、所有调优工作,本质上都围绕这三个模块展开。
1.2 RAG 的三个关键环节拆解
- 索引阶段(Indexing):对原始文档进行解析、清洗、切分(chunking)、向量化(embedding),最后写入向量数据库。这个阶段决定了知识库的“底子”好不好。切分粒度太粗,检索时引入噪音;粒度太细,语义不完整。我一般建议先按文档结构(标题、段落)切分,再结合 token 上限做二次截断。
- 检索阶段(Retrieval):对用户 query 进行向量化,去向量库中做相似度检索,找回 top-k 个相关片段。这里涉及两种检索路线:dense vector search 和稀疏检索(BM25)。密集向量检索擅长语义匹配,能解决“同义不同词”的问题;稀疏检索擅长精确关键词匹配。生产环境中二者通常做混合检索(hybrid search),再用 RRF(Reciprocal Rank Fusion)融合排序。
- 生成阶段(Generation):把检索到的片段按相关性排序后拼接成上下文,连同用户的原始问题一起交给大模型。这个阶段要注意 prompt 指令的设计——是让模型严格只依据资料回答,还是在资料不足以回答时明说不知道。这两个选择对应“强约束”和“弱约束”两种模式,实际项目中我建议优先选强约束,降低幻觉风险。
回想一下:很多 RAG 项目效果不好,80% 的问题出在索引和检索环节,而不是生成环节。模型本身是很聪明的,喂进去的资料不对,它怎么写都是错。
2. 为什么必须用 RAG 而不是纯调模型
2.1 对比 Fine-tuning 的核心差异
不少刚接触 RAG 的人都会问一个问题:为什么不用微调(Fine-tuning)让模型学会这些知识?答案在于成本与效率的根本不对等。微调把知识编码进模型权重里,每次知识更新都要重新训练,成本高、周期长,且新知识有可能和原有知识发生灾难性遗忘。RAG 则完全不同,知识在外部存储,更新一份文档只需要重跑索引管道,分钟级就能上线。
从使用场景来看,两者也不是替代关系,而是互补关系:需要模型掌握特定写作风格、复杂推理技能时,微调是更好的选择;需要高频更新事实型知识、处理企业私有文档时,RAG 明显更合适。我见过的成熟系统通常是“RAG 为主、微调为辅”,用 RAG 解决知识获取,用微调适配输出风格和领域术语。
2.2 RAG 的核心价值与适用边界
RAG 的核心价值可以总结为三点:知识实时性、回答可溯源性、部署轻量性。回答可溯源这一点在实际业务中常常被忽视——很多客户并不在乎模型说得对不对,但一定要知道这个答案是从哪份文件里来的。RAG 天然提供引用定位能力,这一点是纯 LLM 和微调都难以做到的。
但它也有明确的适用边界。RAG 不适合所有场景:如果你要做情感分析或通用闲聊,RAG 帮不上忙;如果你的文档是大量扫描件且 OCR 质量很差,喂给 RAG 反而引入噪音;如果你的业务需要多轮对话中的长期记忆和复杂推理,仅仅做单轮检索是不够的。
在选型决策上,我的经验是:先估算数据量级和更新频率。数据量小且不常更新,用一个轻量级向量库加开源 embedding 模型就够了;数据量大且分散,就要考虑成熟的 RAG 框架和分布式向量数据库;数据更新极其频繁,还要设计增量更新的索引管道。
3. RAG 实战落地:从框架选型到完整实现
3.1 RAG 框架选型解析
RAG 框架现在非常多,市面上热度最高的两个是 LangChain 和 LlamaIndex,国内团队则更常用 Dify、FastGPT 这类可视化平台。我不评判哪个最好,因为每个框架的定位完全不同。
LangChain 最大的优势是组件化程度高,从 loader、splitter、embedding、vectorstore 到 chain 全都有,灵活性强,适合有一定研发能力的团队深度定制。缺点同样明显:抽象层次多,学习曲线陡峭,框架升级经常破坏 API 兼容性。LlamaIndex 则更聚焦“文档处理与检索”,它的文档解析、索引结构设计比 LangChain 做得更精细,适合做知识密集型应用。
如果你不想写太多代码,Dify 这类平台是能快速见效的选择。它们内置了文档解析、分段、embedding、检索配置的可视化流程,我在政务知识库项目中见过只用 Dify 就完成从上传文档到上线问答的完整链路。这类平台的短板是定制空间有限,复杂检索策略难以实现。
选型唯一标准是团队能力和项目需求匹配。如果团队没有专职算法工程师,别硬上 LangChain 去造轮子;如果有算法基础并对检索效果有极致追求,则不要被低代码平台锁住手脚。
3.2 从文档到答案:一个最小闭环的完整实现
理论说得再多,不如亲手跑通一个最小闭环。这个闭环包含:加载文档、切分、向量化、写入向量库、用户提问、检索、生成回答。下面我给出一个基于常见 Python 技术栈(LangChain + OpenAI Embedding + Chroma + GPT-4o-mini)的实现思路,实际工作中也可以把模型替换成任何主流通用模型。
from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI # 1. 加载文档 loader = PyPDFLoader("员工手册.pdf") documents = loader.load() # 2. 切分文档 text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=80, separators=["\n\n", "\n", "。", "!", "?", ".", " ", ""], ) chunks = text_splitter.split_documents(documents) # 3. 向量化并写入向量库 embeddings = OpenAIEmbeddings(model="text-embedding-3-small") vectorstore = Chroma.from_documents( documents=chunks, embedding=embeddings, persist_directory="./chroma_db" ) # 4. 构建检索问答链路 retriever = vectorstore.as_retriever(search_kwargs={"k": 5}) qa_chain = RetrievalQA.from_chain_type( llm=ChatOpenAI(model="gpt-4o-mini", temperature=0), chain_type="stuff", retriever=retriever, return_source_documents=True, ) # 5. 提问 result = qa_chain.invoke({"query": "公司年假制度是怎么规定的?"}) print(result["result"]) print([doc.metadata.get("source") for doc in result["source_documents"]])这段代码就是 RAG 的最小骨架。整个过程里最影响最终效果的三个细节是:切分参数、检索数量、prompt 模板。切分参数我在后面单独讲;检索数量(k 值)太小会漏信息,太大会把无关内容塞进上下文,实践中 5 到 8 是一个起点;prompt 模板上,我会在 system prompt 里写清楚“仅基于提供的上下文回答问题,如果找不到对应信息,请明确回答不知道,不要编造”。
3.3 构建企业知识库:以 Dify 政务 RAG 为参考
企业级 RAG 与个人 demo 最大的区别在于对规范性、权限管控和准确率的要求完全不同。以政务领域为例,知识库内容往往涉及政策文件、办事指南等,对答案准确性要求极高,且必须能定位原始文件来源。这种情况下搭建 RAG 知识库时,有几个环节和通用流程很不一样。
首先,文档解析环节必须做格式归一化。政务文档经常是 PDF、Word、扫描件混合存放,需要先做 OCR 识别、目录抽取、页眉页脚去除,再接入切分流程。其次,切分策略必须结合公文结构,优先按章、条、款层级切分,保证语义完整,而不是机械地按固定字数切分。最后,上线前必须做严格的测评,把高频问题整理成测试集,逐条检验答案准确性和引用正确性。
Dify 在政务项目中确实能派上大用场,它自带的“知识库”模块支持文档分段、召回模式配置、引用归属展示,操作界面直观,非技术业务人员也能完成日常知识库维护。但关键还是底层逻辑:无论用哪个平台,你要清楚它背后的召回方式是向量召回还是全文召回,top-k 设置是多少,重排序是否启用。只有把这些参数理解透了,遇到效果不好才知道该调什么。
3.4 embedding 与 rerank 的作用机制与选择
整个 RAG 管线中,embedding 模型是地基。它的职责是文本向量化——将高维语义压缩成稠密向量,使语义相近的文本在向量空间中距离更近。embedding 模型的质量直接决定了检索的上限。业界常用的 embedding 模型有 OpenAI 的 text-embedding-3-small/large、开源社区的 bge-m3、gte 系列等。选型时重点看 MTEB 榜单表现、上下文长度上限和许可证限制。
dense vector search 的原理就是拿 query 的向量去和库里所有 chunk 的向量做相似度计算,常见的度量方式是余弦相似度。它擅长找出“含义相近但字面表达完全不同”的内容,这是传统关键词搜索做不到的。但纯 dense 检索也有弱点:对于一些精确数字、产品型号、人名地名,它不一定比得上关键词匹配。
rerank(重排序)是在第一次粗召回之后加的一个精排环节。向量检索先快速召回 top-50,再用 rerank 模型逐条计算 query 与候选片段的语义相关分数,重新排序后取 top-5。这个机制的性价比极高——虽然多了一次模型推理耗时,但准确率提升非常明显。原因是初筛阶段的向量相似度计算效率高但精度有限,而 rerank 模型虽然慢但精度高,采用“粗召回 + 精排”两级方案,平衡了效率和效果。生产中我几乎必开 rerank,除非对响应延迟极其敏感。
4. 检索效果的测评与常见问题排查
4.1 RAG 测评的指标与落地方法
RAG 测评是很多团队忽视的环节,不测评就不知道自己优化方向对不对。测评基本分为两个层面:检索效果评测和生成效果评测。
检索效果评测关注的指标是命中率、准确率、召回率和 MRR(Mean Reciprocal Rank)。实操时构建一个评测集,包含 50 到 100 条典型问题和对应标准答案所在文档,通过程序自动调用检索接口,检查正确答案是否出现在召回结果中、排在第几位。这个过程可以通过 llama-index 或 LangChain 的评估模块半自动化。
生成效果评测更看重答案的正确性、完整性和忠实度。忠实度指生成答案是否严格基于检索到的上下文,有没有模型自己发挥的内容。做生成效果评测可以借助大模型辅助打分(LLM-as-a-judge),用评审模型对“答案与标准答案的语义相似度”“答案是否忠实于上下文”等维度打分。注意,用大模型做裁判时,温度和 prompt 设计要规范,否则评估本身的稳定性会出问题。
下面是简化版的 RAG 效果评测维度表,可供实际项目参考:
| 评测维度 | 说明 | 常用指标 |
|---|---|---|
| 检索准确率 | 召回结果中相关片段的比例 | Precision@k |
| 检索召回率 | 相关片段被召回的比例 | Recall@k、MRR |
| 答案相关性 | 回答是否吻合问题意图 | 人工打分 / LLM 打分 |
| 答案忠实度 | 回答是否严格基于给定上下文 | Faithfulness |
| 引用正确性 | 引用文档是否能支持答案内容 | 人工核对 / 规则核对 |
4.2 常见问题与调优技巧实录
在多个 RAG 项目实战中,我把遇到的高频问题整理成了一个速查表,这里分享几个最典型的。
- 问题一:检索结果完全不对。通常不是生成的问题,而是 embedding 和切分的问题。排查思路:先打印检索到的原始文本,看 Top-K 结果和问题是否语义相关。如果不相关,换更强的 embedding 模型或调整切分大小。
- 问题二:知识能检索到但回答不准确。多半是 prompt 约束不足或者上下文太杂。先精简 prompt 明确指令,再检查 K 值和 rerank 策略,去除不相关内容。
- 问题三:相似问题效果差异大。这是 query 复杂度导致的。短问题缺乏上下文,可以增加查询改写环节,比如先将“今年春节是几号”改写为更完整的检索条件;长问题则可能需要拆分成多个子查询。
- 问题四:文档更新后答案仍旧。通常是因为索引没有增量更新,或者缓存机制未失效。设计知识库时要想清楚更新策略,是重建索引还是增量写入。
避坑技巧里有几条是我反复踩过之后才明白的:一,切分时一定要保留适当的重叠,否则句子会被拦腰截断;二,不要把整个知识库一股脑塞进向量库,分类建库或加 metadata 过滤,检索时可以配合业务属性做条件过滤;三,上线后记录真实用户问题,定期补充到评测集,做好持续迭代。
5. 进阶路线:从基础 RAG 到 Agentic RAG
5.1 从 Naive RAG 到高级 RAG
基础 RAG 也叫 Naive RAG,结构是“索引、检索、生成”的直线流程,适合简单问答场景,但面对复杂问题时效率有限。高级 RAG 的核心变化是在基础流程上增加了“预检索优化”和“后检索优化”环节,比如查询改写(query rewriting)、多路召回(multi-recall)、混合检索(hybrid search)、重排序(rerank)等。
本地上做高级 RAG 时,有一种性能提升手段效果立竿见影——多路召回加 RRF 融合。同时用 dense 向量召回和 BM25 关键词召回,分别得到两个 top-N 列表,再通过 RRF 公式对两份结果进行融合重排。在大多数知识库场景下,混合检索都比单路向量检索稳定,尤其在处理专有名词和精确 ID 时优势明显。
RRF(d) = Σ (1 / (k + rank_i(d))) 其中 d 是文档,rank_i(d) 是该文档在第 i 路召回中的排名。 k 通常取 60。5.2 GraphRAG 与 Ontology RAG:另一种知识组织范式
RAG 的另一种进阶方向是引入知识图谱结构,即 GraphRAG。传统 RAG 把每份文档切碎后独立向量化,片段之间没有任何联系,这导致回答涉及多文档联合推理的问题时效果不佳。GraphRAG 的做法是先从文档中抽取实体和关系,构建知识图谱,再把图谱信息融合到检索和生成中,让模型能够跨文档进行推理。
Ontology RAG 则是更进一步,在知识图谱上增加本体层定义——实体类型、关系类型、属性约束等。它适合领域术语复杂、概念层级分明的行业场景,比如医疗、金融、法律。在这些场景中,一个“公司”和“子公司”之间的关系如果只靠向量相似度是学不会的,必须从本体定义层面提供约束。
这类方案的工程复杂度明显高于普通 RAG。不是所有项目都需要上 GraphRAG,如果知识库中绝大多数问题在单文档内就能解决,上图谱纯属增加维护成本。判断标准是:如果经常出现需要多文档交叉验证的复杂问题,才考虑向 GraphRAG 方向演进。
5.3 Agentic RAG:把检索交还给智能体
Agentic RAG 是当前热度很高的演进方向,它的核心思想是让智能体(Agent)动态决策如何检索和使用工具,而不是走固定的“检索后生成”管道。传统 RAG 是“一个查询进,一批资料出,一段答案回”;Agentic RAG 则允许模型先判断问题是否需要查知识库,然后自主决定查询几次、查哪个库、检索结果不够时是否换个问法重查。
这个路线对场景适应力的提升是显著的。一个政务问答机器人可能同时挂载了政策库、办事指南库和常见问题库,传统 RAG 只会对所有库统一检索,而 Agentic RAG 能够根据用户意图先选择对应库再回答。另一大优势是支持多轮对话中反问澄清:用户说“我社保断缴了怎么办”,Agent 会先向用户确认是医保还是养老,再进行检索。这种体验已经不是传统 RAG 能达到的了。
但 Agentic RAG 也有明显代价:模型决策带来的额外延迟、工具调用失败后的异常处理、更复杂的成本控制。我的建议是,先跑通基础 RAG,把检索质量做扎实,再逐步把路由、改写、工具调用这些决策环节交给 Agent,步步为营,不要一上来就上全链路 Agent 化。
6. 写在最后的一点经验
我把基础 RAG、embedding、rerank、dense vector search 的原理和实战串了一遍,最后想分享一个个人观点:RAG 的学习曲线并不陡峭,真正的难点在于工程化能力。一个能跑通的 demo 和一套能稳定上线的系统之间,隔着的正是检索质量的精细调优、知识库更新的运维体系、效果测评的持续迭代。学 RAG 不要沉迷于堆技术名词,先去把一个文档库的问答做好,再去研究 GraphRAG 和 Agentic RAG 这些进阶方向。如果你正要准备 RAG 相关面试,可以从本文提到的原理、流程、选型和测评维度去梳理自己的知识体系,重点说出各个环节的取舍逻辑,这比背多少概念都更有说服力。