你问 ChatGPT 昨天发布的新手机怎么样,它礼貌地回你:"我的知识截止日期是 2024 年。"你换了个问题,问它你们公司的报销流程是什么——这明明写在内部文档里——它开始极其自信地胡说八道,连流程里根本不存在的部门都给你编了出来。

这两个场景,是大模型用户最熟悉的两道伤疤。但它们是同一个病根:模型知道的一切,都是训练时固化下来的。训练结束的那一刻,它的知识就冻住了。不会更新,也来不及查证。
过去两年,业界解决这个问题的思路不是重新训练,而是给模型配一个外挂——把知识从模型脑子里搬出来,放进一个随时能查的资料库。这个方案,叫 RAG(Retrieval-Augmented Generation,检索增强生成)。
大模型是闭卷考试的高手,RAG 让它改开卷
你可能会想,为什么不能把公司文档直接塞进训练数据里,让模型背下来?
两个原因。第一,训练一次大模型的成本动辄数十万美元起步,为了更新一份文档重训一次,账算不过来。第二,模型学新东西时会忘旧东西——深度学习里管这叫灾难性遗忘,至今没有根治方案。
2020 年,Facebook AI 的 Lewis 等人在论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 里给出了第三种答案。论文摘要里有一段话是这么说的:
"Large pre-trained language models have been shown to store factual knowledge in their parameters… However, their ability to access and precisely manipulate knowledge is still limited."——大规模预训练语言模型确实把事实知识存在了参数里,但它们访问和精确操纵这些知识的能力依然有限。
说人话就是:模型不是不知道,是想不起来的时候也没法查。人类答不上来会翻书,模型没这个能力。RAG 要补的,就是这只翻书的手。
论文的具体骨架,今天看依然不过时:用 Dense Passage Retriever(DPR)从维基百科检索相关段落,再交给 BART 生成答案。只不过如今零件换了——DPR 换成了更通用的 embedding 模型加向量数据库,BART 换成了各种更强的大模型。
这篇论文还有一个影响深远的划分:模型原有的记忆叫参数记忆(parametric memory),外部文档库叫非参数记忆(non-parametric memory)。这个划分点破了 RAG 的本质——把一部分记忆从模型参数里搬到体外,让模型退回它最擅长的角色:阅读理解与推理,而不是背书。
一个查询从进来,到答案生成,中间发生了什么
普通大模型是闭卷考试:知识都背在脑子里,考到没背过的就现场编。RAG 是开卷考试:考试时给你一本参考书,翻到相关内容再作答。
但翻书不是关键词搜索,是语义匹配——把文本变成向量,再找最相似的向量。整个过程分两个阶段。
离线阶段(只做一次)
- 切块:把知识库文档切成小块,每块几百个 token。切块质量直接决定检索质量,后面细说。
- 向量化:用 embedding 模型把每块文本转成一串几百维的向量。embedding 模型经过训练,语义相近的文本在向量空间里距离也近。
- 入库:把向量存进向量数据库,常用的有 FAISS、Chroma、Milvus、Pinecone。
在线阶段(每次提问都走一遍)
- 用户提问,比如 "2025 年诺贝尔物理学奖颁给了谁?"
- 用同一个 embedding 模型,把问题也转成向量。
- 在向量数据库里做最近邻搜索,找出最接近的 top-k 个文本块,比如 top 5。
- 把这 5 个文本块和用户问题拼成一个 prompt,交给大模型。
- 大模型根据这些资料生成最终答案。
你可能会问一个问题:既然大模型的上下文窗口越来越大,为什么不把整个知识库都塞进 prompt,非要先检索?
两个原因。一是成本:上下文越长,每次调用的算力消耗越贵。二是效果:Lost in the Middle 这篇论文发现,大模型对长上下文中间位置的内容明显"视而不见"——回答质量最好的情况,是相关信息放在开头或结尾,放在中间会显著变差。把 500 页文档全塞进去,结果往往是模型只记得开头和结尾。检索把最相关的几页挑出来放到眼前,模型反而答得更准。
我踩过的坑:切块切不好,检索全白搭
我最早做 RAG 时犯过一个特别蠢的错误。我把一份 500 页的产品手册当成一个整体,没切块就直接向量化。结果检索出来的每个块都模模糊糊——好像跟问题都有点关系,但什么都答不准。
后来我才想通:文本越长,embedding 出来的向量越像一锅大杂烩。整篇文档的语义被平均掉,每个细节都被抹平,检索时自然找不到突出的那个点。
但切块也没有标准答案。切太小,语义不完整,模型看到孤零零半句话根本不知道在说什么;切太大,语义被稀释,检索精度下降。实践里一般从 300-500 token 起步,再按文档结构调整——有标题按标题切,有表格按行切,有章节按章节切。
所以你会发现,RAG 的工程难点根本不在模型,在数据处理。预处理做得越细,效果越好。
切块之外,检索质量还有两个常见提升手段:
- 换领域相关的 embedding 模型:通用 embedding 对专业术语的理解很差,用领域语料微调过的模型,检索精度会明显提升。
- 加 reranker 重排器:先粗召回 50 个块,再用专门的排序模型精挑出 5 个。多一次推理,换来明显更准的命中率。
RAG 和微调:不是竞品,是互补
我经常看到一种问题:有了 RAG,微调是不是就没用了?问这个问题的人,其实把两件事混为一谈了。
RAG 解决的是 "模型不知道",微调解决的是 "模型行为不对"。前者是知识性问题,后者是风格和习惯问题。
| 对比维度 | RAG | 微调 |
|---|---|---|
| 改动对象 | 模型的输入(prompt) | 模型的权重 |
| 知识来源 | 外部文档库,可随时增删 | 训练数据,训练后冻结 |
| 更新一条知识 | 分钟级,替换文档即可 | 小时到天级,还要重新训练 |
| 能否给出依据 | 能,直接引用检索原文 | 不能,黑盒 |
| 失败模式 | 检索不到时照样胡编 | 学到错误模式,或灾难性遗忘 |
| 适用场景 | 知识频繁更新、需要溯源 | 固定领域、固定风格、严格格式 |
实践中两者经常一起用:先微调让模型学会领域语言和输出格式,再套一层 RAG 提供实时事实。微调负责"像不像行家",RAG 负责"准不准"。
外挂不是万能的:RAG 治不好幻觉
说句泼冷水的话:RAG 不会消除幻觉,它只是提高了幻觉的起点。
一个很隐蔽的坑:如果知识库本身有错误信息,RAG 的回答会比凭空生成更笃定——因为模型"看到过"啊。开卷考试翻到了错误笔记,你写起来会比瞎蒙更自信。知识库的质量,决定了 RAG 回答的下限。
此外还有三个绕不开的短板:
- 单跳检索的局限:回答一个问题如果需要从两份文档各取一半信息再推理,简单 top-k 检索很难一次拿全证据链。
- 长尾问法失灵:文档写"甲方",用户问"付款方"。embedding 模型不熟悉业务时,这两个向量在空间里的距离可能很远。
- 链路变长:每次提问都多一次向量搜索。虽然已是毫秒级,但多一个环节就多一个故障点。
学术圈也在推着 RAG 往前走。2023 年的 Self-RAG 让模型自己判断什么时候该检索、检索结果靠不靠谱;2024 年的 Corrective RAG 先评估检索质量,不合格就触发备选方案;GraphRAG 把文档建成知识图谱再检索,试图解决多跳问题。它们的共同方向:别把检索当作一次性操作,让它变成生成过程中可反复调用的工具。
我的判断:RAG 正在从一个独立技术变成基础设施。ChatGPT 的联网搜索是它的变体,Notion AI 查工作区文件是它,几乎所有企业知识库问答机器人背后都是它。它不会消失,只会越来越隐形。
但有一件事值得你记住:RAG 解决的是"不知道",不解决"错了"。检索不到时,模型照样会编。对 RAG 给出的答案保持一分警惕,尤其是那些影响决策的高风险场景。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/318.html