RAG的三次进化:从朴素检索到Agentic RAG

📅 2026/7/16 3:11:16
RAG的三次进化:从朴素检索到Agentic RAG
RAG的三次进化从朴素检索到Agentic RAG你有没有问过ChatGPT一个它不知道的问题结果它编了一个看起来很真的答案这就是幻觉。RAG检索增强生成是解决幻觉最主流的技术。这篇文章从向量检索的数学原理讲起带你走完RAG从朴素搜索到智能检索的三次进化。一、幻觉从何而来从LLM的本质说起Day1我们讲过LLM的本质是预测下一个字。问它2024年诺贝尔物理学奖得主是谁如果训练数据截至2023年它不知道答案。但它不会说我不知道——因为它的训练数据里很少有不知道对应的文本模式。它会从概率分布中挑一个听起来很合理的答案输出给你。这就是幻觉。RAG的思路很朴素别让LLM凭记忆先帮它查资料。普通LLM: 问题 → 回忆训练数据 → 回答可能编造 RAG: 问题 → 查资料 → 把资料和问题一起给LLM → 基于资料回答二、Level 1朴素RAG —— 用向量搜索替代关键词搜索2.1 为什么不直接用关键词搜索传统搜索比如CtrlF的原理是文档中有和搜索词相同的词就认为匹配。这有一个根本问题用户搜索怎么让系统更快——但文档里用的是性能优化方案。关键词完全不同但实际上在讲同一件事。这就是语义鸿沟。2.2 向量搜索的原理向量搜索的基本思路是把文字变成数字用数字之间的距离来衡量意思有多接近。准备文档把所有文档切成小块比如每块500字向量化用一个嵌入模型Embedding Model把每块文字变成一串数字向量存入数据库把向量存到支持向量搜索的数据库pgvector搜索时用户问题 → 同样用嵌入模型变成向量 → 在数据库中找最接近的向量 → 返回对应的文档块2.3 嵌入模型在做什么你可能会好奇文字怎么能变成数字而且意思相近的文字变成数字后自然就距离接近简单解释嵌入模型是一个被训练了海量文本的神经网络。训练过程中经常出现在同一上下文中的词会被拉近很少一起出现的词会被推远。训练完毕后这个模型就学会了词语的语义空间——相似的词在这个空间中距离相近。比如国王 - 男人 女人 ≈ 女王——这不是魔法是向量空间的运算性质。2.4 余弦相似度衡量两个向量的靠近程度用的是余弦相似度Cosine Similarity不是欧氏距离。为什么想象两个向量代表两篇文档。如果一篇文档很长向量数值很大一篇很短用欧氏距离会认为它们很远——但这只是因为长度不同不代表内容不同。余弦相似度只看方向不看长度。两个文档讨论相似的话题 → 向量方向接近 → 余弦相似度高。和文档长度无关。余弦相似度 cos(θ) (A·B) / (|A| × |B|) 取值范围: -1 到 11表示完全相同0表示无关2.5 朴素RAG的问题搜一次拿到什么用什么。如果搜出来的东西不相关呢LLM还是会基于这些不相关的材料编答案。这叫垃圾进垃圾出。而且LLM不知道检索结果是错的。它信任你给它的所有材料。三、Level 2Agentic RAG —— 让Agent判断检索质量3.1 核心改进加入质量评估朴素RAG: 问题 → 检索 → 直接回答 Agentic RAG: 问题 → Agent判断是否需要检索 ├─ 不需要 → 直接回答 └─ 需要 → 检索 → Agent检查结果质量 ├─ 质量好(相似度0.8) → 回答 ├─ 勉强(0.5-0.8) → 改写关键词重搜 └─ 差(0.5) → 告知用户关键改进是第二处的Agent判断。Agent不再盲目接受检索结果——它会检查相似度评分判断结果是否足够可靠。3.2 为什么这个改进如此重要举个例子。用户问“Spring AI和LangChain在MCP支持上有什么区别”第一次搜索queryMCP 支持区别 → 5条结果相似度分别是 0.45, 0.42, 0.38, 0.35, 0.31 → 平均相似度 0.38远低于阈值 0.5 Agent判断结果不可靠改关键词重搜。 第二次搜索querySpring AI MCP集成 LangChain MCP集成 对比 → 5条结果相似度 0.78, 0.75, 0.72, 0.68, 0.65 → 平均 0.72超过阈值 Agent判断结果可靠基于此回答。Agent有了质量意识它不再机械地接受第一次结果。这就是Agentic RAG和朴素RAG的本质区别。3.3 相似度阈值的经验阈值不是固定值需要根据嵌入模型调整。相似度含义行动 0.8高度相关直接回答0.5-0.8部分相关考虑重搜 0.5基本无关必须重搜或告知用户BGE系列模型在中文上的相似度分布和OpenAI embedding不同需要实测后调整阈值。四、切片策略RAG中最被低估的环节向量检索的精度是块。一个块太大检索不准太小语义不全。4.1 为什么切片这么重要想象你有一个2000字的文档切成4块每块500字 → 粗粒度搜索可能找不到具体信息40块每块50字 → 细粒度但一个完整的段落被切成10块语义被切断4.2 我们的切片算法每块500字符相邻块重叠50字符。 优先在段落边界(\n\n)处切分 → 保持语义完整。 找不到段落边界 → 按行(\n)切分。 实在找不到 → 强行截断。重叠的作用是保险——防止关键信息恰好落在两个chunk的边界上被切断。4.3 更高级的做法语义切片不是固定长度而是根据语义相似度动态决定切分点。两个相邻句子的embedding向量突然变远了 → 说明话题变了 → 应该从这里切开。但计算成本比固定切片高一个数量级。五、HNSW索引为什么搜索这么快如果数据库里有100万个向量每个搜索都要对100万个向量逐个算余弦相似度——那会很慢。pgvector用HNSWHierarchical Navigable Small World算法构建索引。简单解释5.1 通俗理解HNSW想象你要在100万个陌生人中找和你最相似的人。你会怎么做HNSW的做法是先建一个社交网络。每个人认识最相似的16个人m16。搜索时从上层稀疏连接快速定位到目标区域然后在下层密集连接精确搜索。这和跳表Skip List的原理很像高层做大方向导航底层做精确查询。5.2 我们的配置CREATEINDEXdocuments_embedding_idxONdocumentsUSINGhnsw(embedding vector_cosine_ops)WITH(m16,ef_construction200);m16每层每个节点最多16个邻居。越大越精确但索引越大。ef_construction200构建时的搜索宽度。越大越精确但构建越慢。六、三点总结语义检索不等于语义理解Embedding只是把字符变成了数字。LLM需要判断检索结果是否真的回答了问题。Agentic RAG的核心是反馈循环不是更好的检索算法而是检索→评估→修正的闭环。细节决定效果切片策略、重叠大小、相似度阈值、索引参数——每个参数都影响最终效果。项目链接项目代码day6-agent