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

9-检索增强生成RAG详解

文章目录

  • 简介
  • RAG文本处理核心知识
    • LangChain组件
    • 标准流程
      • 数据准备
      • 用户检索
      • 生成回答
    • 优化技巧
  • 案例代码
    • 案例一
    • 案例二
    • 案例三

简介

**RAG (Retrieval-Augmented Generation,检索增强生成) **是目前大模型应用的核心技术。

简单来说,它的作用是为大模型挂载一个“外部知识库”。如果把大模型比作一名正在参加闭卷考试的学霸,那么 RAG 就是允许这位学霸在遇到不懂的问题时,可以翻阅一本指定的参考书再回答。

**大模型(如 GPT-4, Gemini)**虽然博学,但存在三个致命弱点:

  • 幻觉问题: 面对不知道的知识,模型会“一本正经地胡说八道”。
  • 时效性滞后: 模型的知识停留在训练数据截止的那一刻,无法了解最新的新闻或私有文档。
  • 数据安全: 企业不希望将敏感的内部文档发送给大模型进行训练。

**解决方案1:**每次问答都把所有文档(资料)+问题都输入给模型,保证模型获取最大知识量。

**分析:**很显然这种方案是不可行的,原因在于:(1) 上下文窗口限制;(2) 成本昂贵;(3) 响应速度变慢。

解决方案2:在模型回答之前,先检索资料,再基于检索到的资料生成答案。也就是RAG

设计理念:RAG技术就像给AI大模型装上了「实时百科大脑」,为了让大模型获取足够的上下文,以便获得更加广泛的信息源,通过先查资料后回答的机制,让AI摆脱传统模型的"知识遗忘和幻觉回复"的困境

RAG文本处理核心知识

LangChain组件

LangChain组件作用常用组件类
文档加载器对各种格式的文档信息进行加载转为Document对象,如下:
page_content: 文档内容
metadata:元数据
+ Document(文档组件)
+ CSVLoader(csv)
+ JSONLoader(json)
+ BHTML(html)
+ UnstructuredPDFLoader(PDF)
+ UnstructuredFileLoader(文件文档)
+ UnstructuredMarkdownLoader(markdown文档)
文档分割器将加载的文档分割成文档片段+RecursiveCharacterTextSplitter(递归字符文本分割器)
+ CharacterTextSplitter(按指定字符分割文本)
+ MarkdownTextSplitter(按md标题分割文本)
+ PythonCodeTextSplitter(专门分割Python代码)
+TokenTextSplitter(按Token数量分割)
文本嵌入模型将文本信息向量化+ OpenAIEmbeddings
+ HuggingFaceEmbeddings
向量数据库将向量和元数据信息保存到向量数据库+ VectorStore(向量数据库)
文本检索器根据用户提问在向量数据库中进行检索+ VectorStoreRetriever(向量数据库检索器)

文档加载器:

核心方法:

load():Load data into Document objects

lazy_load():A lazy loader for Document

文档分割器:

核心方法:

split_text():将文本字符串分割成字符串列表

split_documents():将Document对象列表分割成更小文本片段的Document对象列表

create_documents():通过字符串列表创建Document对象

RecursiveCharacterTextSplitter核心参数

参数名核心含义详细说明
chunk_size文本块最大长度单文本块最大字符数,可通过 length_function 自定义计数,适配模型上下文窗口(如 GPT-3.5 设 3000 )。
chunk_overlap文本块重叠长度相邻块重叠字符数,保留上下文,需小于 chunk_size,建议为其 10%-20%。
separators递归拆分分隔符按优先级拆分,超尺寸则用下一个分隔符,最后强制拆分,可自定义领域分隔符。
length_function长度计算函数默认按字符计数,可自定义(如 tiktoken 按 token 计数,适配大模型)。
keep_separator是否保留分隔符默认 False 丢弃;True 保留于块末尾,助力保留原格式。

标准流程

数据准备

将长文档切成小块(Chunks),通过 Embedding 模型转换成高维向量,存储在向量数据库中。RAG效果好不好,80% 取决于数据准备阶段

  1. 文档加载与清洗 (Load & Clean)

核心:处理原始垃圾,从 PDF、网页或数据库等企业内部文档中提取文本。

关键任务是去除噪声(删除页眉页脚、广告条、乱码以及不相关的格式字符),涉及数据清洗、OCR文档识别等技术。

  1. 文档切分 (Chunking)

核心:确定颗粒度,将长文章按章节、段落、固定字符等粗略切成小块(Chunks)。

难点在于chunk若太大会包含太多噪声,太小会丢失上下文。通常采用“固定长度 + 重叠(Overlap)”的策略,确保相邻块之间保留语义连续性。

  1. 文档向量化 (Embedding)

核心:文字转数字

通过 Embedding 模型将文本块转换为一串数字(高维向量)。相似意思的文本在数学空间里的距离会更近。

  1. 构建索引(Indexing)

核心:建立搜索目录

选择适合的算法(如 HNSW 或 IVF)来组织这些向量,确保在数百万条数据中能以毫秒级速度找到最相关的项。

  1. 入库(storage)

核心:存入向量数据库。

将向量与其原始文本、元数据(如文件名、页码、日期)一起存入向量数据库(如 Milvus 或 Pinecone)。

用户检索

当用户提问时,系统将问题也转化为向量,在数据库中搜索最相似的 top-k 个文档块。

  1. 用户提问:用户输入问题(例如:“张三是谁?”)。
  2. 问题改写 (Query Rewrite):将模糊的问题转化为更具体的描述(如:“详细介绍张三的性格与年龄”)。
  3. 向量化:将问题转化为向量。
  4. 相似度检索 (Similarity Search)
    • 计算问题向量与数据库中各块向量的距离(如余弦相似度、欧氏距离)。
    • 混合检索 (Hybrid Search):结合“关键词检索”与“向量相似度检索”以提高准确率。
  5. 召回 (Recall):取出 Top-K 个最相关的文本块。
  6. 重排 (Rerank):对召回的文本块进行二次排序,精选出最相关的部分。

生成回答

  1. 构建 Prompt:将[用户问题] + [检索到的参考文档] + [提示词]组合在一起。
  2. LLM 生成:模型参考背景资料,输出最终答案(Response),有效缓解幻觉问题,提高逻辑性与准确性。

优化技巧

在实际落地中,需要关注以下优化方向:

  • 数据清洗与 OCR:提高源文件质量。
  • Chunk 策略:块太大会引入噪音,太小会导致语义丢失。
  • 多路召回与重排:优化检索的相关度。
  • 开源部署:针对私有化部署场景的优化。

案例代码

案例一

# 加载TXT文件from langchain_community.document_loadersimportTextLoader file_path="assets/sample.txt"txt=TextLoader(file_path=file_path,encoding="utf-8",).load()print(txt)# [Document(metadata={'source': 'assets/sample.txt'}, page_content='Hello world!追加内容.')]# 加载PDF文件from langchain_community.document_loadersimportPyPDFLoader file_path="assets/sample.pdf"pdf=PyPDFLoader(file_path=file_path,# plain 提取文本# layout 按布局提取extraction_mode="plain").load()print(pdf)

案例二

from langchain_text_splittersimportRecursiveCharacterTextSplitter# 1.分割文本内容content=""" 单文本块最大字符数,可通过 length_function 自定义计数,适配模型上下文窗口(如 GPT-3.5 设3000左右),相邻块重叠字符数,保留上下文,需小于 chunk_size,建议为其10%-20%。, 按优先级拆分,超尺寸则用下一个分隔符,最后强制拆分,可自定义领域分隔符,默认按字符计数,可自定义(如 tiktoken 按 token 计数,适配大模型)。"""# 2.定义递归按字符文本分割器# 遵循“重叠后向前取有效内容,且不生成小碎片”的核心分割逻辑,不会让最后一个片段的有效内容只剩扣除重叠后的少量字符text_splitter=RecursiveCharacterTextSplitter(chunk_size=100,# 文本块最大长度,是「最大限制」,不是精确值,当文本结构不符合分隔符时,会出现不均匀分割chunk_overlap=10,# 文本块重叠长度length_function=len,# 长度计算函数)# 3.分割文本,将原始大文本分割成多个文本块splitter_texts=text_splitter.split_text(content)# 4.转换为文档对象splitter_documents=text_splitter.create_documents(splitter_texts)print(f'原始文本大小: {len(content)}')print(f'分割文本数量: {len(splitter_texts)}')print(f'分割文档数量: {len(splitter_documents)}')forsplitter_documentinsplitter_documents: print(f'文档片段大小: {len(splitter_document.page_content)}, 文档内容: {splitter_document.page_content}')

案例三

from langchain_community.document_loadersimportTextLoader from langchain_text_splittersimportRecursiveCharacterTextSplitter# 1.TXT文档加载器txt_loader=TextLoader(file_path="assets/sample.txt",encoding="utf-8",).load()# 2.定义递归文本分割器text_splitter=RecursiveCharacterTextSplitter(chunk_size=100,chunk_overlap=10,length_function=len)# 3.分割文本splitter_documents=text_splitter.split_documents(documents=txt_loader)print(f"分割文本数量: {len(splitter_documents)}")fordocumentinsplitter_documents: print(f'文档片段: {document.page_content}')print(f'文档片段大小: {len(document.page_content)}')
http://www.jsqmd.com/news/845421/

相关文章:

  • 3分钟掌握Winhance:Windows系统优化与个性化工具全攻略
  • 钢厂的为什么标签都用“套打”标签?
  • 3步掌握Windows 11任务栏自定义神器:Taskbar11完全指南
  • 书成紫微动,律定凤凰驯:大道破圈层垄断,凰标给草根创作尊严
  • 从实验室到生产线:Chinese-CLIP推理优化的三大实战策略
  • 完全掌握Path of Building:从装备制作小白到大师的终极指南
  • 别再为CISP-PTE靶机网络发愁了!手把手教你配置CentOS 6静态IP,一步到位
  • 告别手动操作!用Matlab脚本批量控制STK Astrogator,实现轨道数据自动化处理
  • Whisky完整指南:在macOS上无缝运行Windows程序的免费开源方案
  • 终极指南:3步解锁B站缓存视频播放自由
  • 为你的智能体项目快速接入多模型能力,使用Taotoken聚合端点
  • 2026年3月中学推荐,实验学校/实验中学/高中/学校/民办高中/中学/高中复读学校,中学企业推荐 - 品牌推荐师
  • 5步快速上手OCAT:黑苹果OpenCore配置管理终极指南
  • Flowframes终极指南:AI视频插帧与流畅度优化的完整教程
  • VM CPU Ready值高怎么办?一文读懂健康阈值与排查方法
  • 避坑指南:STM32CubeMX生成SSD1306 DMA驱动代码,SysTick中断记得手动加!
  • Fast-GitHub终极指南:3步实现国内高速访问GitHub,告别龟速下载
  • 软件测试从思维到实战:测试设计黄金法则与黑盒/灰盒/白盒全解析
  • 2026年本科毕业设计报告降AI攻略:毕业设计报告AIGC超标4.8元一次过知网完整处理指南
  • OpenPLC Editor工业自动化编程深度解析:开源PLC开发环境实战指南
  • 如何打造高效macOS工作区:Ice菜单栏管理工具完全指南
  • 「NOI2025」序列变换
  • 从数据盲点到风味大师:Artisan如何重新定义咖啡烘焙的科学化进程
  • 2026年呼和浩特履带起重机租赁公司TOP榜:权威对比,主流选择全解析 - 深度智识库
  • 探索Depth Anything V2:单目深度估计技术的新纪元
  • 25年5月第2批高项综合知识真题及答案解析
  • 拆解新客裂变与裂变率:诺云用户可直接套用的获客增长指南
  • 5个简单步骤掌握Upscayl:免费AI图像放大工具的终极指南
  • 除了MIT 6.S081,用xv6和QEMU还能玩什么?一个RISC-V学习环境的N种用法
  • 2026青岛海志啤酒瞬时杀菌机深度选型:如何匹配酿造生产最佳方案? - 速递信息