RAG 到底解决什么问题私有知识、外部资料和模型幻觉边界很多人第一次听说 RAG会以为它是在“教模型新知识”。其实不是。假设你问模型订单取消接口在什么情况下会返回 ORDER_LOCKED模型回答一般是订单正在处理、库存锁定或支付状态未确认时返回。听起来挺像那么回事。但你们内部接口文档里写的是当订单已经进入仓库拣货流程后取消接口会返回 ORDER_LOCKED。模型为什么答不准不是它不聪明。是这次调用里它根本没看到你们公司的接口文档。RAG 解决的就是这个问题回答前先把相关资料找出来给模型看。模型参数没变。只是这次回答前它多看了一份参考资料。一、RAG 到底是什么RAG 的全称是 Retrieval-Augmented Generation通常翻译成“检索增强生成”。别被名字吓住。它的流程很简单用户提问 - 检索相关资料 - 把资料放进上下文 - 模型基于资料回答所以 RAG 的重点不是“让模型变聪明”。而是让模型回答时看到该看的资料。这些资料可以来自向量库也可以来自关键词检索、数据库查询、混合检索甚至是你自己写的检索逻辑。常见实现是向量检索但 RAG 不等于“必须上向量库”。关键是先找到相关内容再交给模型。二、它主要解决三类问题第一类模型不知道你的私有知识。比如内部接口文档、项目部署手册、公司制度、团队 FAQ。这些内容不在公开训练数据里模型没见过就只能猜。第二类知识更新太快。框架升级了接口改了配置项废弃了。如果模型训练数据没有覆盖最新版本它可能还在一本正经地讲旧 API。RAG 的做法更轻文档更新了更新检索内容就行。第三类回答需要依据。大模型会尽量回答你的问题。哪怕它不确定也可能生成一个听起来合理的答案。RAG 不能从根上消灭幻觉但可以降低“无依据回答”的概率。前提是两件事要做好检索到的资料本身是对的prompt 明确要求模型基于资料回答资料里没有就说不知道。一句话总结RAG 让模型基于你提供的资料回答而不是只凭训练数据猜。三、RAG 和微调不是一回事很多人会问那我能不能直接微调模型让它学会这些知识可以但它们解决的问题不一样。微调会改变模型参数。它更适合让模型稳定学会某种行为比如固定回答格式某类任务模式某种表达风格某个领域的写作习惯。RAG 改的不是模型。它改的是这次调用时模型能看到什么资料。可以这样记维度RAG微调是否改模型不改参数改参数知识更新更新检索内容通常要重新训练或继续训练更适合私有知识、变化快的事实任务模式、格式、风格如果你想让模型基于内部接口文档回答用 RAG。如果你想让模型更稳定地按某种方式表达再考虑微调。两者不是替代关系也可以一起用。四、RAG 不是 MemoryRAG 还经常和 Memory 混在一起。Memory 解决的是这段对话前面聊了什么比如用户第一轮问订单取消接口会返回哪些错误码第二轮接着问刚才那个 ORDER_LOCKED 具体是什么意思这里的“刚才那个”需要 Memory 帮模型接上前文。RAG 解决的是外部资料里有什么用户问ORDER_LOCKED 在什么情况下返回RAG 会检索《订单接口文档》《取消订单错误码说明》再把相关片段交给模型。一个真实 Agent 里两者经常一起用Memory补历史对话 RAG补外部资料边界清楚就不容易用乱。五、RAG 的边界RAG 很有用但不是万能补丁。第一个边界是检索质量。正确答案在文档里但如果检索没召回或者排在很后面模型还是看不到。所以要关注文档怎么切embedding 模型选得合不合适topK 和相似度阈值怎么设要不要 rerank检索日志能不能查。第二个边界是文档质量。RAG 只是把文档递给模型。如果文档本身写得很虚比如订单取消可能会失败请注意异常处理。那模型还是答不出“什么情况下返回 ORDER_LOCKED”。RAG 不能把烂文档变成好答案。第三个边界是模型能力。检索到了资料模型还要能读懂、整合、判断。比如资料里分别写着订单进入拣货流程后取消接口返回 ORDER_LOCKED。 ORDER_LOCKED 表示订单已锁定无法取消。用户问订单已经拣货了还能取消吗模型需要把两段信息合起来才能答出不能取消。订单进入拣货流程后会被锁定取消接口会返回 ORDER_LOCKED。资料到了眼前不代表模型一定能用好。写在最后RAG 不复杂。它解决的是一个很具体的工程问题模型回答前先把相关资料找出来给它看。记住这几句话就够了RAG 不是训练模型RAG 不是长期记忆RAG 不是幻觉消除器RAG 适合私有知识、更新快的知识、需要依据的回答RAG 的效果取决于检索质量、文档质量和模型能力。用对了它能让系统更可靠。用错了只会多一层复杂度。后续会继续更新 RAG、Memory、Tool Calling、MCP 等 AI Agent 基础知识。