本文深入探讨了RAG(检索增强生成)技术在大模型落地中的重要作用,详细梳理了RAG从诞生到进化的完整历史,并结合LangChain核心实现与可运行伪代码,阐述了RAG从0到1、从1到N的完整逻辑。文章还介绍了RAG的四大演进阶段,分析了纯生成式LLM的三大痛点,并提供了LangChain中的RAG标准化组件与实战伪代码,帮助读者全面掌握RAG技术。


在大模型落地的浪潮里,RAG(Retrieval-Augmented Generation,检索增强生成)早已不是小众技术,而是解决大模型幻觉、知识滞后、领域适配的工业级标配方案。从 2020 年概念诞生到如今的自适应 RAG、GraphRAG,它完成了从“简单外挂”到“智能记忆中枢”的蜕变。本文带你由浅入深,梳理 RAG 完整演进史,结合 LangChain 核心实现与可运行伪代码,彻底搞懂 RAG 从 0 到 1、从 1 到 N 的全部逻辑。


01

RAG 前传:大模型为什么需要“检索外挂”?

1.1 纯生成式 LLM 的三大致命痛点

  • 知识静态化:模型训练截止后,无法获取新信息(如 2025 年后政策、新版产品文档),回答永远停留在过去。
  • 严重幻觉:遇到不确定的问题,模型会编造看似合理但错误的答案,金融、法律、医疗场景完全不可用。
  • 领域适配差:通用大模型对企业内部制度、专业术语、私有数据一无所知,无法做垂直场景落地。

1.2 史前探索:检索与生成的早期结合(2010–2019)

  • 开放域 QA:先检索相关文档,再用阅读理解模型抽取答案。
  • 对话系统:用搜索引擎兜底,避免胡说八道。
  • 缺点:流程割裂、无统一框架、语义匹配弱、工程化极难。

02

RAG 诞生:2020 年的范式革命

2.1 核心理念:从“闭卷”到“开卷”

  • 参数记忆(Parametric Memory):模型权重里的固有知识。
  • 非参数记忆(Non-parametric Memory):外部可随时更新的知识库。
  • RAG = 检索器 Retriever + 生成器 Generator。
  • 流程:提问 → 检索相关知识 → 把知识塞进上下文 → LLM 基于事实生成答案

2.2 初代 RAG(Naive RAG):最朴素的流水线

  • 文档加载 → 文本分块 → 向量化 → 向量库存储。
  • 用户 Query 向量化 → 向量检索 top-k 相似块 → 拼接上下文 → LLM 生成回答。
  • 优点:实现简单、快速验证、成本低。缺点:噪声多、语义匹配弱、无精排。

03

RAG 进化史:从 1.0 到 4.0,一路打怪升级

3.1 RAG 1.0:朴素检索时代(2020–2022)

  • 架构:固定分块 + 单一向量检索 + 直接拼接生成。
  • 问题:chunk 割裂、语义失配、无排序、幻觉仍存在。

3.2 RAG 2.0:高级优化时代(2022–2023)

  • 智能分块:语义分块、父子分块、按结构分块。
  • 混合检索:向量检索 + BM25 互补。
  • Query 改写:Multi-Query、HyDE、Step-Back。
  • Rerank 精排、元数据过滤。

3.3 RAG 3.0:知识图谱与多模态(2023–2024)

  • GraphRAG:知识图谱建模实体关系,推理式检索。
  • 多模态 RAG:文本、图片、表格、PDF 混合检索。

3.4 RAG 4.0:自适应与 Agentic RAG(2024–至今)

  • 自我反思:生成后校验事实,不一致则重新检索。
  • 多跳检索:复杂问题自动拆解,多轮检索。
  • Agent 融合:RAG 作为智能体记忆模块,动态规划检索策略。

04

RAG 核心原理:一句话讲透本质

RAG = 外部知识检索 + 上下文增强生成

把私有/最新知识存在外部库,用户提问时先查库,再让 LLM 只依据检索到的事实回答,从根源抑制幻觉、保证知识新鲜。

标准流程(四步走)

  1. 离线构建索引:文档加载 → 清洗 → 分块 → Embedding → 向量库存储。
  2. 在线查询理解:Query 预处理、改写、扩展。
  3. 多路召回:向量检索 + 关键词检索 + 元数据过滤。
  4. 精排 + 生成:Rerank 排序 → 构造 Prompt → LLM 生成可信答案。

05

LangChain 中的 RAG:标准化组件与实战伪代码

5.1 LangChain RAG 六大核心组件(必懂,精准解析)

组件名称 核心作用 常用选型(工业界落地) 关键说明(避免踩坑)
Document Loader 将各类数据源加载为 Document 格式 TextLoader, PyPDFLoader, WebBaseLoader 复杂 PDF 需用 PyPDFium2 或 MinerU,避免文本丢失
Text Splitter 将长文档拆分为合适大小的文本块 RecursiveCharacterTextSplitter, 语义分块, 父子分块 chunk_size 匹配 Embedding 模型上下文长度,overlap 10%-20%
Embeddings 将文本转换为向量 BGE-M3, text-embedding-3-small, Qwen-Embedding-V2 避免用通用 LLM 做 Embedding,成本高效果差
VectorStore 存储向量并提供检索 FAISS, Milvus, Qdrant, Pgvector 生产环境开启索引优化,元数据绑定支持过滤
Retriever 封装检索逻辑,统一入口 VectorStore.as_retriever, EnsembleRetriever, ParentDocumentRetriever search_kwargs={“k”:5},k 值 3-8 最合适
LLM + Prompt + OutputParser 生成最终答案并格式化输出 GPT-4o-mini, Qwen-7B, ChatPromptTemplate, StrOutputParser Prompt 必须加入“只依据上下文回答”约束,从源头抑制幻觉

5.2 极简版 Naive RAG(LangChain 实现)

# 1. 导入依赖from langchain_community.document_loaders import TextLoaderfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_community.embeddings import BGEEmbeddingsfrom langchain_community.vectorstores import FAISSfrom langchain_openai import ChatOpenAIfrom langchain.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnablePassthrough# 2. 加载文档loader = TextLoader("company_policy.txt")docs = loader.load()# 3. 递归分块splitter = RecursiveCharacterTextSplitter(    chunk_size=512,    chunk_overlap=50,    separators=["\n\n", "\n", "。", " "])chunks = splitter.split_documents(docs)# 4. 向量库构建embedding = BGEEmbeddings(model_name="BAAI/bge-m3")vector_store = FAISS.from_documents(chunks, embedding)retriever = vector_store.as_retriever(search_kwargs={"k": 5})# 5. 构造 Prompt 模板prompt = ChatPromptTemplate.from_template("""你是严谨的企业问答助手,严格遵守以下规则:1. 只根据提供的上下文内容回答问题,不使用任何外部知识,不编造任何信息;2. 如果上下文没有相关信息,直接回复“抱歉,未找到相关答案”,不要猜测;3. 回答准确、简洁,贴合上下文,不添加无关内容。上下文:{context}问题:{question}请给出准确回答:""")# 6. 定义 LLMllm = ChatOpenAI(model="gpt-4o-mini", temperature=0)# 7. 组装 RAG 链rag_chain = (    {"context": retriever, "question": RunnablePassthrough()}    | prompt    | llm    | StrOutputParser())# 8. 调用answer = rag_chain.invoke("员工差旅报销需要哪些材料?")print(answer)

5.3 进阶版 RAG 2.0(企业级落地,含 Query 改写 + Rerank + 去重)

from sentence_transformers import CrossEncoderfrom langchain_community.retrievers import BM25Retrieverfrom langchain.retrievers import EnsembleRetriever# 复用之前的基础组件 splitter, embedding, chunks, vector_store, llm, prompt# 1. Query 改写(Multi-Query)def multi_query_rewrite(original_query: str, llm) -> list:    rewrite_prompt = ChatPromptTemplate.from_template("""    请将用户的原始问题,改写为 3 个不同角度、语义相同的查询语句,用于扩大检索范围。    要求:每个查询简洁明了,表述角度不同,输出每行一个查询。    原始问题:{original_query}    """)    rewrite_chain = rewrite_prompt | llm | StrOutputParser()    queries_str = rewrite_chain.invoke({"original_query": original_query})    queries = [q.strip() for q in queries_str.split("\n") if q.strip()]    return queries if queries else [original_query]# 2. 混合检索(向量 + BM25)bm25_retriever = BM25Retriever.from_documents(chunks)bm25_retriever.k = 5ensemble_retriever = EnsembleRetriever(    retrievers=[retriever, bm25_retriever],    weights=[0.7, 0.3])# 3. Rerank 精排def rerank_documents(query: str, docs: list, top_n=3) -> list:    reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")    pairs = [(query, doc.page_content) for doc in docs]    scores = reranker.predict(pairs)    scored_docs = sorted(zip(docs, scores), key=lambda x: x[1], reverse=True)    return [doc for doc, score in scored_docs[:top_n]]# 4. Chunk 去重def deduplicate_docs(docs: list) -> list:    doc_dict = {doc.page_content: doc for doc in docs}    return list(doc_dict.values())# 5. 企业级 RAG 链def advanced_rag(query: str, llm, retriever) -> str:    queries = multi_query_rewrite(query, llm)    all_docs = []    for q in queries:        all_docs.extend(retriever.get_relevant_documents(q))    unique_docs = deduplicate_docs(all_docs)    final_docs = rerank_documents(query, unique_docs, top_n=3)    context = "\n\n".join([doc.page_content for doc in final_docs])    answer = llm.invoke(prompt.format(context=context, question=query)).content    return answerfinal_answer = advanced_rag("员工差旅报销需要哪些材料?", llm, ensemble_retriever)print(final_answer)

06

从理论到落地:RAG 关键优化点

6.1 文档解析与分块(效果根基)

  • PDF 复杂版面用版面分析 + OCR(PP-StructureV3、MinerU)。
  • 分块策略:递归分块 > 固定分块 > 语义分块。
  • 企业制度/FAQ:chunk 256–512 token,overlap 50;技术手册:512–1024 token,overlap 100–200。
  • 父子分块:小 chunk 检索,大 chunk 生成,兼顾精准与上下文。

6.2 Embedding 与检索(匹配精度)

  • 中文首选:BGE-M3(开源、强语义、长上下文)。
  • 混合检索 = 向量检索(语义) + BM25(关键词)。
  • 元数据前置过滤(时间、部门、文档状态)大幅提升效率。

6.3 Rerank 精排(效果跃升关键)

  • 向量检索是 Bi-Encoder,Rerank 是 Cross-Encoder。
  • 先召回 20–50 条,再 Rerank 到 3–5 条,效果提升最明显。
  • 轻量首选:BGE-Reranker-v2-m3、Qwen3-Reranker-0.6B。

6.4 Query 理解(召回率核心)

  • 多轮对话:必须做上下文压缩,补全指代。
  • 专业场景:用 HyDE 生成假设答案再检索。
  • 复杂问题:用 Step-Back 先抽象再检索。

07

RAG 评估:如何量化你的系统好不好?

7.1 检索质量指标

  • MRR:第一个正确结果的排名倒数均值,适合单答案问答。
  • NDCG@k:整体排序质量,支持多级相关性。
  • Precision@k:Top-k 中相关文档占比。

7.2 生成质量指标

  • Faithfulness 忠实度:是否完全基于上下文,无幻觉。
  • Answer Relevance 相关性:是否真正回答问题。
  • Context Recall/Precision:上下文信息覆盖率与有用率。

08

RAG 未来:走向自适应与智能体

  • 自我校验 RAG:生成后自动事实核查,错误则重检索。
  • GraphRAG 普及:知识图谱 + 向量库双驱动,支持推理问答。
  • 多模态大一统:文本、图片、音频、视频统一检索。
  • Agentic RAG:RAG 成为智能体记忆核心,自主规划检索路径。

09

总结

RAG 的前世今生,本质是**让大模型从“死记硬背”走向“实事求是”**的进化史:

  • 史前:检索与生成割裂,无标准化方案。
  • 2020:RAG 诞生,定义检索+生成范式。
  • 2022–2023:高级 RAG 工程化,成为企业标配。
  • 2024+:自适应、图谱、多模态、Agent 融合。

对开发者而言:先跑通朴素 RAG → 叠加分块/改写/Rerank → 上线评估迭代,是最高效的落地路径。

最近两年大模型发展很迅速,在理论研究方面得到很大的拓展,基础模型的能力也取得重大突破,大模型现在正在积极探索落地的方向,如果与各行各业结合起来是未来落地的一个重大研究方向

大模型应用工程师年包50w+属于中等水平,如果想要入门大模型,那现在正是最佳时机

2025年Agent的元年,2026年将会百花齐放,相应的应用将覆盖文本,视频,语音,图像等全模态

如果你对AI大模型入门感兴趣,那么你需要的话可以点击这里大模型重磅福利:入门进阶全套104G学习资源包免费分享!

扫描下方csdn官方合作二维码获取哦!

在这里插入图片描述

给大家推荐一个大模型应用学习路线

这个学习路线的具体内容如下:

第一节:提示词工程

提示词是用于与AI模型沟通交流的,这一部分主要介绍基本概念和相应的实践,高级的提示词工程来实现模型最佳效果,以现实案例为基础进行案例讲解,在企业中除了微调之外,最喜欢的就是用提示词工程技术来实现模型性能的提升

img

第二节:检索增强生成(RAG)

可能大家经常会看见RAG这个名词,这个就是将向量数据库与大模型结合的技术,通过外部知识来增强改进提升大模型的回答结果,这一部分主要介绍RAG架构与组件,从零开始搭建RAG系统,生成部署RAG,性能优化等

img

第三节:微调

预训练之后的模型想要在具体任务上进行适配,那就需要通过微调来提升模型的性能,能满足定制化的需求,这一部分主要介绍微调的基础,模型适配技术,最佳实践的案例,以及资源优化等内容

img

第四节:模型部署

想要把预训练或者微调之后的模型应用于生产实践,那就需要部署,模型部署分为云端部署和本地部署,部署的过程中需要考虑硬件支持,服务器性能,以及对性能进行优化,使用过程中的监控维护等

img

第五节:人工智能系统和项目

这一部分主要介绍自主人工智能系统,包括代理框架,决策框架,多智能体系统,以及实际应用,然后通过实践项目应用前面学习到的知识,包括端到端的实现,行业相关情景等

img

学完上面的大模型应用技术,就可以去做一些开源的项目,大模型领域现在非常注重项目的落地,后续可以学习一些Agent框架等内容

上面的资料做了一些整理,有需要的同学可以下方添加二维码获取(仅供学习使用)

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐