RAG理解 RAG理解目录什么是 RAG?为什么要用 RAG?RAG 的基本工作流程是什么样的?RAG 和微调(Fine-tuning)有什么区别?什么场景用哪个?文档切分(Chunking)怎么做?有哪些策略?Embedding 模型怎么选?向量数据库有哪些?检索阶段怎么提升召回率?混合检索是什么?RAG 中怎么处理多轮对话?什么是 Rerank?为什么检索完还要重排序?RAG 有哪些常见的失败场景?怎么优化?什么是 Graph RAG?和普通 RAG 有什么区别?如何在 RAG 中做权限控制?如何评估一个 RAG 系统的好坏?实际项目中遇到过哪些坑?怎么解决的?RAG 的完整技术架构图 + 各环节的优化方向1. 什么是 RAG?为什么要用 RAG?答:RAG,全称 Retrieval-Augmented Generation,中文叫“检索增强生成”。一句话定义:让 LLM(大语言模型)在回答问题之前,先到外部知识库里去“翻书”,找到相关资料,然后结合这些资料来生成答案。举个例子:你开了一家电商公司,技术团队训练了一个内部客服机器人。现在有个用户问:“我 3 月份买的那台洗衣机还在保修期内吗?”不用 RAG(纯靠 GPT 自己):GPT 根本没有你公司的任何内部数据,它只能瞎编一个回答,或者老实说“我不知道”。用了 RAG:先去你公司的数据库/文档里搜这个用户 3 月份的订单,找到洗衣机型号、购买日期、保修政策发给 GPT,GPT 基于这些真实数据来回答:“您 3 月 15 日购买的 X 型号洗衣机,保修期 2 年,目前仍在保修范围内。”为什么需要 RAG?(三个核心原因)痛点不用 RAG用了 RAG知识过时LLM 训练数据有截止日期,不知道最近的事知识库可以随时更新,最新的都给 LLM幻觉问题LLM 会凭空编造不存在的数据、公司、人员基于真实文档回答,大幅减少幻觉私有知识LLM 没有你公司的内部数据你的文件、数据库、Wiki 都是 LLM 的知识源数据安全如果微调,敏感数据进了模型权重数据留在你自己的向量库,模型不接触原始数据成本微调大模型成本高(GPU、数据标注)RAG 成本低,只改写 Prompt,不需要改模型一个形象的比喻:不用 RAG 的 LLM= 一个闭卷考试的考生,只能靠记忆回答,记不住的就瞎蒙。用了 RAG 的 LLM= 一个开卷考试的考生,回答问题之前可以先翻书查资料,回答自然更准。口语总结:RAG = 检索 + 生成。先用一个问题去查资料,再把查到的资料和问题一起喂给 LLM,让 LLM 基于真实资料回答。三个字——“先搜后答”。2. RAG 的基本工作流程是什么样的?答:RAG 分为两个阶段:离线阶段(准备知识库)和在线阶段(回答用户问题)。离线阶段——建知识库(Indexing):文档库(PDF、Word、网页、数据库...) ↓ (1) 加载文档 把各种格式的文档都读进来 ↓ (2) 文本切分(Chunking) 把长文档切成一小块一小块 每个 block 大概 300-500 个字 ↓ (3) 向量化(Embedding) 把每个小块转成向量(一串数字) 语义相近的文本,向量也相近 ↓ (4) 存入向量数据库 把向量 + 原始文本一起存起来 就建好了一个“可搜的知识库”在线阶段——回答用户问题(Query):用户输入问题:"3 月份买的洗衣机在保修期吗?" ↓ (1) 问题也做向量化 把用户问题也转成向量 ↓ (2) 向量检索(Retrieve) 在向量库里找和问题向量最相似的 top-K 条文本 比如 K=5,就找 5 段最相关的文档 ↓ (3) 拼装 Prompt(Augment) 把查到的 5 段文本 + 用户问题 + 系统提示拼在一起: System: 基于以下资料回答,如果资料里没有就说不知道。 Context: 1. [订单记录] 用户3月15日购买X洗衣机,保修2年... 2. [保修政策] X洗衣机享受整机2年保修... Question: 3月份买的洗衣机在保修期吗? ↓ (4) 调用 LLM 生成答案(Generate) LLM 基于拼好的 Prompt 来生成回答 ↓ 返回给用户:"您3月15日购买的X洗衣机,保修期至2026年3月14日,仍在保修范围内。"一张时序图帮你记牢:离线:文档 → 切分 → 向量化 → 存库 在线:问题 → 向量化 → 搜索 → 拼接 → LLM → 答案口语总结:RAG 工作流程就六个字——存、切、向、搜、拼、答。存文档、切小块、转向量、搜相关、拼提示词、生成答案。面试时按这个顺序讲就特别顺。3. RAG 和微调(Fine-tuning)有什么区别?什么场景用哪个?答:这是面试高频对比题,核心区别在于:一个是给 LLM“开卷考试”(RAG),一个是让 LLM“反复背书直到记住”(微调)。对比维度RAG微调(Fine-tuning)原理不改模型,只在 Prompt 里塞外部知识用标注数据重新训练模型的参数知识更新实时更新,文档改了答案就跟着变需要重新训练才能更新知识幻觉控制好,基于真实文档生成一般,微调后也可能编造数据溯源性强,可以精确知道答案来自哪段文档弱,说不清模型从哪儿“记住”的需要的资源CPU 就够了,主要是向量库和存储需要 GPU,成本高需要的标注数据不需要需要几百到几千条高质量标注数据适用场景知识问答、文档检索、客服机器人风格迁移、特定格式输出、学一个"套路"响应延迟多了一步检索,比直接调 LLM 慢几十到几百毫秒和直接调 LLM 一样快什么场景用 RAG:你的知识是动态更新的(政策法规、公司文档、新闻资讯)你需要回答能追溯到来源(金融、医疗的合规要求)你不想花钱训练模型典型的场景:企业知识库问答、客服机器人、合同审查什么场景用微调:你需要 LLM 学会一种特定的风格或套路(比如写成鲁迅的风格、写成公文格式)HTML 转 Markdown、代码解释等格式转化类任务特定领域的术语理解(法律、医学)做指令遵循优化两者结合——最强的方案:先微调(让模型学会这个领域的"说话方式") 再加 RAG(让模型能获取最新的领域知识) = 效果最好的企业级 LLM 应用很多大厂的做法就是“微调 + RAG”双保险。口语总结:RAG 不改模型,只改 Prompt,知识实时更新,适合知识问答;微调改模型参数,适合学风格、学套路。最简单的判断方式——如果是“知识类”问题用 RAG,如果是“风格类”问题用微调。终极方案是两者结合。4. 文档切分(Chunking)怎么做?有哪些策略?答:文档切分(Chunking)就是把一篇长文档切成一小块一小块。这个环节直接影响检索质量——切得太大,检索精度差、上下文太杂;切得太小,语义不完整、搜不到。常见切分策略:策略怎么做优点缺点举例固定长度切分按字符数/Token 数切,比如每 500 字一块最简单,成本低可能把一句话切成两半《三国演义》纯按 500 字一刀切,一句话跨边界就不完整按分隔符切分按段落(\n\n)、句子(。、!)来切语义比较完整不同文档格式不一样,适配麻烦每个自然段一块按语义切分用一个小模型判断语义边界,在语义转折的地方切效果最好慢,成本高讲“保质期”的内容放一起,讲到“安装方法”就切一刀重叠切分每块和前后块有部分重叠(比如重叠 50 个字)减少边界处信息丢失存储量变大块 1:1~500 字,块 2:450~950 字父子文档大块(父)存下来给 LLM 看,小块(子)用来做检索检索准,上下文也完整实现复杂一个小段落做检索,但返回时附带上它所在的整个章节实际项目中,一般都是组合策略:fromlangchain.text_splitterimportRecursiveCharacterTextSplitter splitter=RecursiveCharacterTextSplitter(chunk_size=500,# 每块 500 字chunk_overlap=50,# 重叠 50 字separators=["\n\n","\n","。","!","?",","," ",""]# 按优先级尝试切割# 优先在段落处分,不行就在句号分,再不行就在逗号分...)chunks=splitter.split_documents(documents