RAG 进化之路:传统 RAG 到工具与强化学习双轮驱动的 Agentic RAG
本文系统梳理了 RAG 从传统流水线到 Agentic RAG,再到强化学习驱动策略优化的演化路径,并用可落地代码展示了“检索-推理-取证”如何从一次性流程变成多轮自主决策流程。概念澄清与演化主线文章将 Agentic RAG 定义为“在 RAG 中引入模型自主决策能力”,而非单纯更换更大模型。通过对比说明:传统 RA…
转载提示:本文转载自 bbruceyuan 原文。原作者:bbruceyuan。原文发布日期:2025-10-03。本文已按站点规范移除原文中的推广/导流内容,仅保留技术分析与示例。1. 阅读收获 (takeaway) 本文旨在祛魅【Agentic RAG】的概念,因此本文的阅读收获包括:了解什么是传统 RAG(Native/Naive/Vanila RAG)了解什么是 Agentic RAG了解企业级项目 chatbox 的 Agentic RAG 架构和原理了解如何使用强化学习训练 Agentic RAG (Search-R1)2. 前言 如果说 2024 年,LLM(Large Language Model) 落地最广泛且最有实用价值的一项技术,那么我提名 RAG(Retrieval Augmented Generation) 应该不会有太多的反对。但 2025 年最火的概念变成 Agent,而 RAG 似乎变成了一个基础组件,提的不多却是融合到了 Agent 的日常使用中了,尤其是 OpenAI DeepResearch 的出现,让 Agentic RAG 成了 2025 年最成功的 RAG 应用之一。 但网络上有很多文章,把 Agentic RAG 说得玄乎,故意制造难懂的概念从而达到抬高自身的目的。但实际上我们只需要理清楚两个概念,就可以知道什么是 Agentic RAG。传统 RAG 是什么?预先通过检索排序将知识放到 Prompt 中,然后利用 LLM 生成回复Agent 是什么?使用具有自主决策能力的 Agent 实现的 RAG 系统就可以称为 Agentic RAG。 因此 Agentic RAG 实际上就是指在传统 RAG 基础上,加入了 Agent 组件的 RAG 系统,任何实现了 Agentic Search 能力的 RAG 系统都可以称为 Agentic RAG。3. 传统 RAG (Native RAG) 传统的 RAG(Native RAG)并不是一个复杂的概念,核心概念就两个:检索(Retrieval)和生成(生成)。因此要做好 RAG 就是两件事情:怎么检索到更有用的知识?怎么让模型更好的利用知识生成回复? 因此 RAG 系统架构可以如下图所示: image.png NATIVE RAG一般来说可以分成两个不同的链路:离线和在线requires-python = ">=3.12" dependencies = [ "langchain>=0.3.27", "langchain-chroma>=0.2.6", "langchain-community>=0.3.30", "langchain-deepseek>=0.1.4", "langchain-openai>=0.3.34", "langgraph>=0.6.8", ] 3.1 RAG 离线入库 离线入库是指将文档处理成向量并存储到向量数据库中,以便后续检索使用。这个过程主要包括:文档加载、文本切分、向量化、存储。from langchain_community.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_chroma import Chroma # 1. 加载文档 loader = TextLoader("knowledge_base.txt") documents = loader.load() # 2. 文本切分 text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, # 每个文本块的大小 chunk_overlap=50, # 文本块之间的重叠部分 ) splits = text_splitter.split_documents(documents) # 3. 向量化并存储 embeddings = OpenAIEmbeddings( base_url="https://api.siliconflow.cn/v1", model="Qwen/Qwen3-Embedding-0.6B", ) vectorstore = Chroma.from_documents( documents=splits, embedding=embeddings, persist_directory="./chroma_db", # 持久化存储路径 ) print(f"成功将 {len(splits)} 个…
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行