RAG 能否被长上下文窗口取代?深入解析检索增强生成的原理、实践与局限性
什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种将信息检索与大语言模型深度融合的技术。系统会首先从知识库中查找与当前问题紧密相关的片段——知识库可以是数据库、文档集或是企业内部系统——然后将这些片段连同原始问题一起送入大语言模型,让模型依据检索到的内容生成回答,而不仅仅是依赖训练时记忆的知识。

RAG 示意图
为什么需要 RAG?

RAG(检索增强生成)如何解决 LLM 的核心挑战
大语言模型即便训练数据再庞大,也无法回避几个关键瓶颈。RAG 恰好能在这些方面提供补充。
首先是知识的时效性问题。
预训练模型的知识会固定在训练数据截止的时间点。训练之后发生的新事件、新政策或新版产品文档,模型在默认状态下并不知晓,除非通过联网、工具调用或外部知识注入来弥补。RAG 的做法是动态检索外部知识源,把最新的相关内容直接交给大模型,从而让它不必仅仅依赖参数中的旧知识。
其次是私有数据的访问难题。
企业内部的产品文档、知识库、客户资料等,不可能直接暴露给公开的大语言模型。RAG 在用户提问时仅抽取与问题相关的片段提供给模型,无需暴露全部数据,便能让模型基于企业自身的知识作出回答。
再次是幻觉问题。
大语言模型凭空编造事实的情形并不少见。RAG 通过提供明确的参考文本,使得模型尽量基于证据生成答案,这确实能够降低幻觉出现的概率。但不要寄希望于彻底消除幻觉。检索出错、上下文噪声、引用匹配错位、模型不遵循指令等,依然可能导致错误答案。在生产环境中,RAG 通常还需要配套引用校验、答案评估、拒答机制和人工反馈闭环。
RAG 的主要应用场景有哪些?
RAG 最适合的情形是:答案必须依赖外部资料,而这些资料又时常变动或篇幅很长。系统先从知识库中检索相关内容,再由大模型基于检索结果生成回答,既能减少胡编乱造,又能提高可追溯性。
常见场景包括:
- 客服机器人:基于产品知识库进行问答、故障排查和流程引导,如“如何退换货”“某个型号设备的报错码怎样处理”。
- 研发/运维 Copilot:检索代码库、接口文档、告警手册,辅助问题定位和修复建议生成。
- 医疗助手:在检索临床指南、药品说明书、院内规范后生成辅助建议,但不做最终诊断,例如“某药的禁忌是什么”“依据指南解释检查指标的含义”。
- 法律咨询:基于法规条文、案例、合同模板的检索,生成条款解释和风险提示。
- 教育辅导:从教材、讲义、题库中检索知识点,生成讲解和例题步骤。
- 企业内部助手:连接制度、SOP、会议纪要、技术文档,进行检索、总结与对比。
- 投研、合规、审计、销售方案支持:处理报告、披露、内控、产品手册、标书模板等资料。
为什么一些企业仍然倾向于传统搜索而非 RAG?
并非所有问题都值得动用 RAG。很多企业继续保留传统搜索,并不是不知道 RAG 好用,而是用户需求原本就没有达到“生成答案”这一步。
如果用户只想查找一份制度原文、某个接口文档或者一个合同模板,搜索框反而更直接。输入关键词,返回文档列表,用户自行点开确认,链路短、成本低、结果也更可控。RAG 则要先检索,再组织上下文,最后交给大模型生成答案。只要经过生成环节,就必然带来额外的延迟、Token 开销和总结偏差的风险。
因此,选择传统搜索还是 RAG,关键要看用户究竟需要什么:是“帮我找到材料”,还是“帮我读完材料并给出结论”。
| 维度 | 传统搜索(搜索框) | RAG(检索 + 生成) |
|---|---|---|
| 用户目标 | 获取文档、页面或附件 | 直接得到可读答案、总结或对比结论 |
| 延迟与成本 | 极低,容易扩展 | 更高,需要检索和大模型推理 |
| 可控性/可审计 | 强,直接提供原文链接 | 较弱,可能出现误解或总结偏差,需要引用与评测 |
| 风险 | 低,主要是召回排序问题 | 更高,包括幻觉、引用错误、越权泄露 |
| 数据治理 | 相对成熟,ACL、字段过滤容易实现 | 更复杂,需要检索过滤、上下文脱敏、日志治理 |
| 适用场景 | 编号、标题、关键词检索,找模板、制度原文等 | 客服解答、技术排障、制度解读、跨文档总结对比 |
| 最佳实践 | ES/BM25 + 权限过滤 | 混合检索 + 重排 + 引用溯源 + 权限过滤 + 评测闭环 |
在实际落地过程中,很多企业会同时保留两套入口:简单查找走传统搜索,复杂问答走 RAG。这种组合通常比“所有问题都交给 RAG”更稳健,也更经济。
RAG 的工作流程是怎样的?
RAG 的工程链路一般分为两个阶段:离线索引和在线检索生成。索引阶段将原始文档处理为可检索的数据结构;在线阶段则在用户提问时完成查询理解、检索召回、上下文构建和答案生成。
索引和检索阶段的简化流程如下图所示:

索引和检索阶段的简化流程图
索引阶段主要包含:
- 输入文档:文本文件、PDF、网页、数据库记录等,只要有内容即可。
- 清洗文档:去除 HTML 标签、特殊字符等噪声。
- 增强文档:补充元数据,如时间戳、分类标签,为后续检索提供过滤维度。
- 文档拆分(Chunking):利用文本分割器将文档切成较小的片段。这一步需要兼顾语义完整性、Embedding 模型的输入长度、生成模型的上下文窗口以及召回粒度。Chunk 太大容易引入噪声,太小则可能丢失上下文。拆分策略直接关系到召回质量,详细内容可参看 RAG 文档处理篇[1]。
- 向量化表示(Embedding Generation):通过嵌入模型将文本片段映射为语义向量,也就是高维稠密向量。常见的嵌入模型包括 OpenAI 的
text-embedding-3-small/text-embedding-3-large,以及 Hugging Face 上的开源模型。 - 存储到向量存储或索引系统:将嵌入向量、原始内容和对应的元数据存入向量存储或向量索引系统,如 Milvus、pgvector、Elasticsearch/OpenSearch 向量检索,或基于 Faiss 构建本地向量索引。向量数据库选型、索引算法和 pgvector 实践可以查看 RAG 向量库篇[2]。
索引过程通常离线完成。比如团队每周运行一次定时任务,重新索引新增和变更的文档。如果是用户上传文档等动态场景,索引也可以在线完成,直接集成到主应用中。
检索则是在线进行的。用户提问后,系统通常会经历以下步骤:
- 接收请求:获取用户的自然语言查询。部分系统会先做查询改写或扩充,让后续检索更容易命中。
- 查询向量化:用嵌入模型将查询也转换为向量,这样才能与文档向量在同一个空间中进行比较。
- 信息检索(R):在向量库中执行相似性搜索,找出与查询向量最相关的文档片段。
- 上下文增强(A):将检索到的片段、原始问题、系统指令和引用要求组织成 Prompt,提交给大语言模型。
- 输出生成(G):大模型输出自然语言回复,并附上参考资料链接。
- 可选的结果反馈:用户不满意时可以反馈,系统据此调整 Prompt 或检索策略。一些实现也支持多轮对话,逐步完善答案。
当检索效果不稳定时,问题往往出在查询改写、召回策略、排序或上下文质量上。优化方向可进一步阅读 RAG 优化篇[3]。
Embedding 是什么?
Embedding 本质上就是将文本转化为一串数字。更准确地说,它把文本映射到一个高维稠密向量空间中,使得语义相近的文本在向量空间中的距离更近。
例如以下三句话:
- “如何申请退款?”
- “退款流程是什么?”
- “订单怎么取消并退钱?”
它们的字面表达不同,但语义相近。优秀的 Embedding 模型会将它们映射到接近的位置,这样向量检索才能找出相关的 Chunk。

Embedding:把文本映射到语义空间
Embedding 的维度通常为 768、1024、1536、3072 等。维度越高,能够表达的信息越丰富,但存储、索引和相似度计算的成本也越高。以 OpenAI Embedding 为例,text-embedding-3-small 默认输出 1536 维,text-embedding-3-large 默认输出 3072 维,并支持通过 dimensions 参数降低输出维度。
常见的 Embedding 模型可分为两类:
| 类型 | 代表模型 | 适合场景 |
|---|---|---|
| 闭源 API | OpenAI text-embedding-3-small / text-embedding-3-large、Cohere Embed、Jina Embeddings API | 追求开箱即用、多语言效果、少运维 |
| 开源模型 | BGE 系列、GTE 系列、E5 系列、Jina Embeddings 开源模型 | 数据不能出内网、需要私有化部署、希望控制成本 |
选择 Embedding 模型时,不要只看榜单排名。MTEB(Massive Text Embedding Benchmark)可作为参考,但最终还是要用自身的业务问题来评测召回率、相关性和延迟。
此外,Embedding 模型并非“实时理解世界”的工具,其主要负责将文本映射到向量空间,能力重点在于语义匹配。如果遇到非常新的术语、梗、产品名或领域缩写,仍需通过业务语料评测来确认召回效果。
向量相似度如何计算?
文本转化为向量后,检索系统还要判断哪个向量与查询最接近。常见的相似度或距离度量方式有三种。
| 度量方式 | 含义 | 特点 |
|---|---|---|
| 余弦相似度(Cosine Similarity) | 衡量两个向量方向是否一致 | 对向量长度不敏感,RAG 场景中最常用 |
| 内积(Inner Product / Dot Product) | 计算两个向量对应维度乘积之和 | 如果向量已经 L2 归一化,内积与余弦相似度在排序结果上通常等价 |
| 欧氏距离(L2 Distance) | 衡量两个点在空间中的绝对距离 | 对向量幅度更敏感,适合模型或索引明确按 L2 训练/优化的场景 |
面试中如果被问到“为什么用余弦相似度”,可以这样回答:RAG 关注的是语义方向是否接近,而不是向量长度本身;余弦相似度对长度不敏感,因此更适合文本语义检索。在实际项目中,还要与 Embedding 模型推荐的距离度量、向量库索引类型保持一致,否则可能造成索引命中失败或召回效果下降。
RAG 与传统搜索引擎有什么区别?

RAG 与传统搜索引擎的区别
RAG 和传统搜索都是在“找信息”,但找到信息之后的操作完全不同。
传统搜索获取候选文档后,按相关性排序,直接把结果列表呈现给用户。每个结果彼此独立,用户需要自己点开、自己判断。它更像一个排序器。
RAG 则会将检索到的多个知识片段一起放入大语言模型的上下文,让模型进行跨文档的归纳与信息整合,最终生成一个直接可读的答案。它更像一个信息综合器。
几个关键差异值得留意:
- 检索机制:传统搜索主要依靠倒排索引和关键词匹配,BM25 是经典算法,现代搜索系统也会加入语义召回和重排序。RAG 的检索方式更加灵活,向量检索、BM25、混合检索、图检索、数据库查询均可使用,关键在于检索结果要进入模型上下文参与答案生成。
- 结果形态:搜索提供文档列表,用户还需要二次阅读;RAG 提供的是答案,并尽量标注引用来源。
- 数据范围:传统搜索擅长全网爬虫和大规模索引;RAG 更常用于企业内部知识库和垂直领域,使模型能够低成本地获得特定领域的知识补充。
- 成本与延迟:搜索响应迅速,成本可控;RAG 因多了大模型推理环节,延迟和成本都会相应上升。
RAG 与微调如何选择?
“为什么不直接微调?”是 RAG 面试中的高频问题。
可以这样区分:RAG 解决的是模型不知道新知识或私有知识的问题;微调更适合解决模型不会按照你的方式说话或行事的问题。
打个比方,你有一本很厚的员工手册,需要经常查阅其中的规定。RAG 的思路是随查随用,把手册放在外面,每次回答前先翻一下。微调的思路则是让模型把手册背下来,将这些知识内化进参数中。当手册频繁修订时,RAG 只需更换索引;微调则需要重新准备数据、训练和评测,成本差异很大。
| 维度 | RAG | 微调(Fine-tuning) |
|---|---|---|
| 知识更新 | 更新知识库或向量索引即可 | 通常需要重新准备数据并训练 |
| 数据安全 | 知识保留在外部库,按需检索 | 训练样本中的模式和部分知识会固化到微调模型参数中,敏感数据进入训练流程前需要额外评估合规要求 |
| 幻觉控制 | 可引用原文,便于溯源和校验 | 模型仍可能编造,且引用来源不天然可见 |
| 成本结构 | 检索成本 + 输入 Token 成本 + 向量库成本 | 数据标注、训练 GPU、评测和版本管理成本 |
| 适合场景 | 知识密集型问答、企业知识库、法规制度、产品文档、实时信息 | 风格适配、格式控制、领域术语对齐、固定任务行为优化 |
| 主要风险 | 检索不到、召回噪声、权限过滤复杂 | 数据过拟合、知识过期、训练和回滚成本高 |
二者也可以融合使用:先通过微调让模型更懂领域术语、输出格式和任务边界,再用 RAG 提供实时知识和可追溯证据。这类组合在客服、法律、医疗、金融投研等场景中很常见。
面试时可以用这样的话收尾:知识变动频繁、需要引用来源,优先考虑 RAG;输出风格和任务行为不稳定,考虑微调;既要懂领域表达又要查实时知识,可以两者结合。不过,两者结合意味着需要同时维护两套系统,成本不低。团队资源有限时,先把 RAG 做稳,再考虑是否引入微调,通常更为务实。
长上下文窗口能取代 RAG 吗?
不能。
长上下文窗口确实让很多任务变得简单了,比如将一整份报告丢进去,让模型从头读到尾,这类单文档深度分析很适合使用长上下文。但这并不意味着可以将全部知识库都塞给模型。上下文越长,输入 Token 成本、首字延迟以及推理噪声都会随之上升,效果未必更好。
长上下文适合的场景十分明确:单篇长文档深度分析,一个代码仓库或项目目录的集中理解,长对话历史总结,或者一次性材料不多但需要完整阅读的任务。
一旦知识库规模变大,长上下文就不够用了。企业知识库、客服工单、日志、合同库动辄包含百万到亿级的文档片段,不可能每次都全塞进去。即使技术上能塞得进去,成本和延迟也扛不住。更麻烦的是,上下文里塞入过多无关片段,模型反而更容易被噪声干扰,生成看似完整但事实不牢靠的答案。“Lost in the Middle”问题指的就是,关键信息若放在长上下文的中间位置,更容易被忽略。
企业知识库还绕不开权限隔离。哪些内容用户能看、哪些不能看,不能靠“全塞进去”的方式解决。RAG 可以在检索阶段做权限过滤,只把用户有权访问的内容放进上下文,长上下文则无法做到这一点。
还有一点经常被忽视:可追溯性。RAG 可以明确返回引用片段,审计时便于溯源。长上下文将大量内容混合在一起交给模型,用户很难判断回答到底基于哪段材料。
RAG 经历了哪些演进阶段?
RAG 近两年一直在迭代,大致可划分为三个阶段。

RAG 演进阶段
| 阶段 | 典型链路 | 特点 |
|---|---|---|
| Naive RAG | 文档切块 → Embedding → Top-K 检索 → LLM 生成 | 最基础、最容易实现,适用于 Demo 和简单知识库 |
| Advanced RAG | Query Rewrite / HyDE → 混合检索 → Rerank → 上下文压缩 → LLM 生成 | 重点解决召回不准、上下文噪声和排序不稳 |
| Modular RAG | 检索器、重排器、压缩器、路由器、生成器等模块可插拔组合 | 按业务场景动态路由,适合生产系统和复杂 Agent |
Naive RAG 是起点,能跑通 Demo,但距离生产环境通常还有距离。Advanced RAG 开始处理召回质量、噪声过滤和排序问题。Modular RAG 把各环节拆解为可替换的模块,更适合复杂场景。具体优化策略可以继续阅读 RAG 优化篇[3]。
RAG 的核心优势与局限性
先说优势。
RAG 最大的好处是知识更新成本低。 微调需要重新准备数据、训练模型并评测效果,RAG 通常只需更新知识库和索引。新闻、法规、产品文档这类经常变化的数据,用 RAG 维护起来会轻便很多。
它还能减少幻觉,并便于追溯来源。 RAG 让模型从“凭记忆回答”转变为“基于检索证据回答”。每个答案都可以对应到具体的文档片段,这在金融合规、医疗辅助、法律检索等对准确性要求高的场景中非常重要。当然,这不代表 RAG 就不会出错,检索错误、引用错误同样会导致答案翻车。
数据隔离也更容易实现。 可以在检索层实现多租户隔离和访问控制(ACL),确保用户只能看到自己权限范围内的数据。相比把敏感数据放进微调训练集,RAG 这套架构更适合权限与合规治理。
切换领域的成本也低。 不需要为每个领域重新训练模型,只需建好领域知识库并运行索引,就能先开始使用。
再看局限性。RAG 并非银弹,问题也不少。
检索质量决定上限。 垃圾进垃圾出的原则在这里非常明显:如果 Embedding 表达不准,或者分块策略把关键信息切丢了,召回的内容与问题无关,下游模型再强大也救不回来。
上下文也不是越长越好。 尽管某些模型的 Context Window 已扩展到百万级,但塞入太多无关片段会稀释模型的注意力,干扰逻辑推理,Token 开销也随之上升。
延迟是另一个硬问题。 完整链路要经过查询改写、向量化、相似度检索、重排序、上下文构建和模型生成,每一步都会增加耗时。对响应时间敏感的场景,不能只看答案质量,也要认真计算延迟账。
工程复杂度也不低。 要维护向量数据库,处理文档增量索引,持续优化检索策略,还要做权限过滤、引用溯源和评测闭环。相比直接调用大模型 API,RAG 的运维负担明显更重。
Token 成本同样需要算清。 RAG 省去了训练成本,但每次请求都要携带上下文,输入 Token 往往比普通对话高出不少。文档片段塞得越多,账单和延迟都会一起上涨。
总结
简单来说,RAG 就是先从知识库中找出相关内容,再让大语言模型基于找到的内容进行回答。它的价值不是让模型“更神”,而是将回答拉回到可检索、可引用、可审计的证据之上。
几个关键点值得格外留意:
- RAG 主要解决的是大语言模型知识过时、无法访问私有数据、容易产生幻觉等问题。传统搜索给出的是文档列表,RAG 给出的则是直接可读的答案;一个更像排序器,一个更像信息综合器。
- 知识变动频繁、需要引用来源时,优先考虑 RAG;如果目标是让模型按固定风格和格式输出,再考虑微调。
- 长上下文适合少量材料的深度分析,但面对企业级海量知识库、权限隔离和成本控制,仍然需要依靠 RAG 这样的检索链路来兜底。
同时也要清楚它的局限:检索质量决定上限,上下文噪声会干扰生成,延迟、工程复杂度和 Token 成本都是真实存在的挑战。
Demo 能跑通并不代表生产可用,RAG 最难的部分往往不是“接入一个向量库”,而是持续评估和优化召回质量。
面试中常会问到这些问题:
- 什么是 RAG?为什么需要 RAG?
- RAG 和传统搜索引擎的区别是什么?
- 如何选择 RAG 与微调?什么时候用 RAG,什么时候微调,什么时候两者结合?
- RAG 系统中如何选择 Embedding 模型?为什么?
- 余弦相似度、内积和欧氏距离的区别是什么?
- RAG 的幻觉问题如何解决?RAG 一定不会产生幻觉吗?
- 什么是 Lost in the Middle 问题?如何应对?
- 长上下文窗口是否会取代 RAG?
- RAG 系统的评估指标有哪些?
- RAG 的优势和局限性是什么?
- 什么场景适合使用 RAG?什么场景不适合?