1,Naive RAG(朴素RAG)
Naive RAG属于RAG系统的最基本框架,框架只有单一的向量检索,直接把检索出来的相关文档喂给大模型增强生成
局限性:检索依赖文本词汇匹配,无法感知语义关联,并且无法间接匹配,对语义的理解能力不足
缺乏对query的预处理,回答内容可能会过于宽泛。整个RAG系统依赖单一的检索技术,优化只能局限于检索技术。
2,advanced RAG(高级RAG)
从检索前,检索时,检索后三个方面引入新的技术手段
检索前:
分别进行查询重写,查询扩展,查询路由
Query Rewriting查询重写:将用户原始查询改写为语义更加准确的格式
Query Expansion查询扩展:对用户查询添加上下文,扩大检索范围,使检索结果更准确。
查询路由:将用户查询分发到不同的,最适合的知识库中
检索时:
采用向量检索 + 关键词检索(其实就是检索前做的一系列操作)进行检索。
Hybrid混合检索(BM25稀疏 + 向量稠密检索 + RRF融合) :也被叫做Hybrid RAG,但是不完全准确,Hybrid只是一种检索策略,不能和advanced RAG相并列
检索后:
Reranker重排序:对召回文档重排序,最相关结果靠前
总结:对召回文档进行摘要,提炼关键信息
融合:对信息进行融合,形成完整连贯的背景,利于模型理解
优点:
检索质量显著提升
缺点:
整个过程是写死的流水线,简单问题浪费算力,成本增加,整个RAG系统复杂度提升,无法动态选择路径。
3,Modules RAG(模块化RAG)
将整个RAG流水线插接成独立模块,检索,排序,生成模块解耦,可以更加灵活组合或者替换
优点:灵活,便于扩展和维护
缺点:设计复杂,模块间协作需要设计
外层全局调度
Routing(路由模块,也就是 Orchestrator 调度器): 接收用户提问,分析 query 的难度、类型,决定接下来该调用哪些内部 RAG 子模块、走哪一条执行路径。
简单问题:直接走 Retrieve+Read;
复杂多跳问题:选 Rewrite→Retrieve→Rerank;
知识库没有答案:切到 Search 联网搜索。
Search(外部联网搜索): 访问互联网搜索引擎,在线获取外部网页资料。当本地向量知识库检索不到内容的时候,由 Routing 调度切到 Search 做兜底。
Predict(生成预测): 大模型最终生成答案输出;拿到检索到的上下文之后,交给大模型 Predict 输出最终回答。
Fusion(结果融合):多路检索得到多份文档片段,做合并、去重、结果融合。可以把 BM25 关键词检索 + 向量检索的结果融合在一起。
Demonstrate(示例示范 / 少样例): 给大模型提供样例提示;提供一些问答示范样例,引导模型的输出格式、回答思路。
Memory(记忆模块):保存多轮对话历史、过往检索结果;实现会话记忆,记住用户之前问过的内容
内层 RAG 核心检索子模块
Retrieve(检索器):从本地向量库 / 知识库拉取相关文档片段;可以是 BM25 关键词检索、向量 embedding 检索。就是传统 RAG 最核心的召回步骤。
Rewrite(查询改写):Query 重写;对用户原始问题做改写、扩写、拆分。多跳问题可以把一个复杂问句拆成好几个子问题再分别检索。
Rerank(重排序 / 重排器): 对 Retrieve 召回出来的一堆文档做排序,过滤掉相关性低chunk,保留最相关的片段;
Read(读取解析): 读取拿到的文档 chunk,理解、提炼文档里面的信息;相当于模型阅读理解拿到检索回来的上下文内容
整个过程不再是固定流水线,根据query做不同响应,简单问题直接走向量检索,跳过重排,复杂多跳问题调度器自动做问题拆分,多次迭代检索。知识库查不到:自动调用联网搜索工具兜底
优点:动态路由,按需调用组件,适配不同复杂度的query查询
缺点:架构变复杂,增加调度大模型带来的额外延迟和成本
4,图RAG
结合知识图谱,通过实体关系结构化存储与多跳检索,补充向量检索遗漏的关联信息,适合复杂推
5,智能体RAG
1,引入 Agent 作为编排层,模型可自主判断信息充足度、动态调整检索策略、进行多轮反思
2,代价:延迟高、成本高、不确定性大,需设置迭代上限和降级策略
3,适用:复杂多跳推理、高价值任务、对延迟不敏感的场景
Agent RAG 对比 传统RAG
普通RAG流程写死,比如advanced RAG ,不管问题的难易程度,固定执行:QueryRewrite -> Hybrid检索 -> Reranker -> LLM生成;
Agent-RAG:有状态的循环工作流:
分析用户问题,判断当前上下文信息是否够用,不够用 -> 调用什么工具?-> 获取检索结果 -> 进行评估是否可以现在给出答案 -> 如果召回质量不够,就继续改写query再次检索,直到生成最终答案,或者达到最大迭代次数直接退出