RAG 入门:在模型回答之前,先检索资料
这篇是我学 RAG 时的白板笔记整理。RAG(Retrieval-Augmented Generation,检索增强生成)是现在几乎所有"让 AI 读自己资料"产品的底层套路,比如企业知识库问答、文档助手、客服机器人。 一句话总结它的本质: 在模型回答之前,先检索资料,再基于资料生成回答。 下面按"为什么需要它 → 它怎么工作"的顺序展开。 一、为什么需要 RAG 1. 直接把所有资料喂给模型,为什么不可行? 最朴素的想法是:把全部文档塞进 prompt,让模型自己看。这条路有三个问题: 上下文窗口有限。模型一次能读的 token 数是有上限的,几百页的文档根本塞不下。 成本。就算塞得下,每次提问都把全部资料发一遍,token 费用会爆炸。 响应速度。输入越长,模型处理越慢,用户体验直线下降。 2. 模型本身也有短板 就算不考虑塞资料的问题,纯靠模型自己回答也有硬伤: 知识过时。模型的知识停留在训练截止日期,问它昨天发生的事它不知道。 私有数据。公司内部文档、个人笔记,模型训练时根本没见过。 幻觉。不知道的事情它可能一本正经地编。 RAG 的思路就是绕开这些限制:资料放在模型外面,每次只把和问题相关的一小段喂进去。 二、核心流程 整个 RAG 分两个阶段:数据准备(离线,只做一次)和用户提问(在线,每次提问都执行)。 flowchart LR subgraph prep["① 数据准备(离线,只做一次)"] direction LR A["📄 原始文档"] --> B["切分 Chunking按章节 / 段落 / 字数……"] B --> C["🧩 Chunks每一块语义相对完整"] C --> D["Embedding(向量化)"] D --> E[("向量数据库")] end flowchart LR subgraph query["② 用户提问(在线,每次提问都执行)"] direction LR Q["❓ 用户问题"] --> QE["问题也做Embedding"] QE --> S["相似度检索找距离最近的 top-k 块"] V[("向量数据库")] --> S S --> P["相关资料 + 问题拼成 Prompt"] P --> L["🤖 LLM 生成回答"] end 第一步:数据准备 切分(Chunking) 文档不能整篇存,要先切成一块块的 chunk。切分的依据可以是章节、段落、字数……没有标准答案,但有一条核心原则: ...