当前位置: 首页 > news >正文

RAG从入门到精通:检索增强生成的完整技术栈

RAG 从入门到精通:检索增强生成的完整技术栈

一、引言:LLM 的「知识断档」困境

2025 年,大语言模型(LLM)已经深入渗透到日常开发的方方面面。但任何一个在一线落地的工程师都会碰到同一个尴尬场景:

你问 GPT-4:「我们公司 Q3 的营收增长是多少?」

它回答:「抱歉,我没有关于贵公司财务数据的实时信息。我的训练数据截止到 2024 年……」

这不是模型「笨」,而是 LLM 的知识截止效应(Knowledge Cutoff)——模型训练完成后,它对训练数据之外的一切一无所知。对于企业内部知识库、实时数据、专业领域文档,LLM 天然存在三个致命缺陷:

  1. 知识滞后:不知道训练截止时间之后发生的事情
  2. 幻觉风险:面对不知道的问题,模型会「编造」看起来合理的答案
  3. 私有数据盲区:无法访问企业内部文档、数据库和 API

检索增强生成(Retrieval-Augmented Generation, RAG)正是为解决这些痛点而生的技术范式。它的核心思想极其朴素:

在 LLM 生成回答之前,先从一个外部的知识库中检索出相关文档,把这些文档作为「参考资料」塞进 prompt,再让 LLM 基于这些资料回答。

这相当于给 LLM 配了一个随时可查的「百科全书助手」。自 Meta AI 在 2020 年提出 RAG 概念以来,这套技术栈已经经历了从学术原型到工业级系统的跨越式演进。本文将带你从零搭建一个完整的 RAG 系统,并深入剖析每个环节的工程细节和调优经验。

二、RAG 核心架构:三步走

一个标准 RAG 系统由三个核心阶段组成,我把它类比为「图书管理员工作法」:

┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 1. 建索引 │ ──▶ │ 2. 检索 │ ──▶ │ 3. 生成 │ │ (离线) │ │ (在线) │ │ (在线) │ │ 文档分块 │ │ 查询向量化 │ │ 拼接 prompt │ │ → Embedding │ │ → 相似搜索 │ │ → LLM 回答 │ │ → 向量存储 │ │ → Top-K 文档 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘

阶段一:索引构建(Indexing)— 离线

这是 RAG 系统的「准备工作」。把知识库中的所有文档:

  1. 分块(Chunking):将长文档切割成适合检索的语义块
  2. 向量化(Embedding):用嵌入模型将每个文本块转成高维向量
  3. 存储(Storage):将向量存入向量数据库,建立索引

阶段二:检索(Retrieval)— 在线

当用户提问时:

  1. 将问题同样做 embedding,得到一个查询向量
  2. 在向量数据库中做近似最近邻搜索(ANN),找到与查询最相似的 Top-K 个文档块
  3. 返回这些块的原始文本

阶段三:增强生成(Augmented Generation)

将检索到的文档块与用户问题拼接成一个增强 prompt:

请根据以下参考资料回答用户问题。如果资料中没有相关信息,请如实说明。 参考资料: {检索到的文档块} 用户问题:{用户原始问题} 回答:

然后交给 LLM 生成最终答案。

这个架构看起来简单,但每个环节都有大量工程陷阱。下面我们用代码一步步实现,同时拆解那些「文档不会告诉你」的坑。

三、实战:从零搭建 RAG 问答系统

3.1 环境准备

# 安装依赖# pip install langchain langchain-community chromadb sentence-transformers openai pypdf tiktokenimportosfromtypingimportList,Dict,OptionalfrompathlibimportPathfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain_community.document_loadersimportPyPDFLoader,TextLoaderfromlangchain_community.vectorstoresimportChromafromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchain_community.chat_modelsimportChatOpenAIfromlangchain.schemaimportDocumentfromlangchain.chainsimportRetrievalQAfromlangchain.promptsimportPromptTemplate

3.2 文档加载与分块(决定 RAG 质量的关键一步)

分块策略是 RAG 系统最重要的超参数之一。块太大会引入噪声、丢失精度;块太小则语义不完整、检索召回率下降。

classDocumentIndexer:"""文档索引构建器"""def__init__(self,chunk_size:int=500,# 每个文本块的最大字符数chunk_overlap:int=80,# 相邻块之间的重叠字符数embedding_model:str="BAAI/bge-large-zh-v1.5"# 中文 Embedding 模型):self.chunk_size=chunk_size self.chunk_overlap=chunk_overlap# 文本分割器:按段落优先、句子次之的分割策略self.text_splitter=RecursiveCharacterTextSplitter(chunk_size=chunk_size,chunk_overlap=chunk_overlap,separators=["\n\n","\n","。","!","?",";",".","!","?",";"," "],length_function=len,)# Embedding 模型:bge-large-zh 在 C-MTEB 中文排行榜常年 TOP 3self.embeddings=HuggingFaceEmbeddings(model_name=embedding_model,model_kwargs={"device":"cuda"},# 有 GPU 就用 CUDAencode_kwargs={"normalize_embeddings":True}# 归一化,余弦相似度更稳定)self.vectorstore=Nonedefload_documents(self,source_path:str)->List[Document]:"""加载单个文件或目录下所有支持格式的文档"""source=Path(source_path)documents=[]ifsource.is_file():documents=self._load_file(source)elifsource.is_dir():forfile_pathinsource.rglob("*"):iffile_path.suffix.lower()in[".pdf",".txt",".md",".py"]:documents.extend(self._load_file(file_path,silent=True))else:raiseValueError(f"无效路径:{source_path}")print(f"📄 加载了{len(documents)}个文档")returndocumentsdef_load_file(self,file_path:Path,silent:bool=False)->List[Document]:"""根据文件类型选择合适的加载器"""ext=file_path.suffix.lower()try:ifext==".pdf":loader=PyPDFLoader(str(file_path))docs=loader.load()# PyPDFLoader 可能将一页作为一个 doc,元数据中补上文件名fordocindocs:doc.metadata["source"]=file_path.namereturndocselse:loader=TextLoader(str(file_path),encoding="utf-8")returnloader
http://www.jsqmd.com/news/909332/

相关文章:

  • FGA自动化神器:重新定义FGO安卓玩家的战斗体验
  • BERT uncased L-12 H-256 A-4模型架构详解:12层256隐藏层的设计奥秘
  • 让聊天记录成为数字资产:WeChatMsg打造你的专属记忆银行
  • 2026 东莞翡翠回收精选商户:专业团队鉴定,本地交易安全稳妥 - 薛定谔的梨花猫
  • 如何永久保存你的微信聊天记录:开源解决方案完全指南
  • 安全审计实战指南:Python 日志实现与 GDPR 合规深度解析
  • BERT uncased L-12 H-256 A-4在不同NLP任务上的表现评估:轻量级模型的终极指南
  • 5分钟学会SillyTavern:打造属于你的AI角色对话神器
  • Dart Simple Live:多平台直播聚合应用架构设计与实现方案
  • 2026年精密测头十大品牌/厂家推荐榜:常规/多截面/多几何测头、圆柱度/锥度/垂直度测头等非标定制公司深度解析 - 企业推荐官【官方】
  • Keil C251中ECODE段与混合编程实践
  • imFile:一款全能下载管理器如何彻底解决你的下载难题
  • 如何免费解锁WeMod Pro功能:终极Wand增强工具配置指南
  • 智慧树自动刷课插件:告别手动操作,开启高效学习新时代
  • 量子退火解决集合分割问题的QUBO建模与实践
  • 别再只盯着串联机械臂了!5自由度并联机械臂的搬运应用实战,精度与刚性实测
  • 数智透明·安全兜底|黎阳之光透明矿山,AI+数字孪生守护矿山生命线
  • TSDF三维重建实战:CPU vs GPU性能对比与PyCUDA加速配置详解
  • AI时代人类情商危机:低情商社会如何成为AI的有毒训练集
  • WPS-Zotero插件:Linux科研工作者的文献管理救星
  • 临沂外贸独立站哪家经验足?WaiMaoYa 外贸鸭贸易企业定制站点,深耕全球经销商渠道 - 外贸独立站运营
  • 学术文本优化利器合集:九大工具搞定查重与 AIGC 合规优化
  • 毕业必备!2026AI写作辅助网站榜单(覆盖 99% 毕业论文需求)
  • 小红书无水印内容采集完整指南:XHS-Downloader 开源工具深度解析
  • 如何快速上手Qwen3.6-35B-A3B-Claude-4.7-Opus-Reasoning-Distilled:5分钟安装与推理测试指南
  • DeepSeek-R1-Distill-Llama-70B-w8a8推理性能测试:内存占用与速度对比
  • 济南外贸网站开发哪家靠谱?WaiMaoYa 外贸鸭摒弃廉价模板网站,打造差异化外贸官网 - 外贸独立站运营
  • 如何永久保存微信聊天记录?三步实现你的数字记忆守护计划
  • Unity URP管线实战:移植UE风格的三方向映射Shader(2021.3 LTS版避坑指南)
  • Janus-7B常见问题解答:10个开发者最关心的技术难题解决方案