RAG检索增强

目录

  • [1 RAG 完整原理与优缺点](#1 RAG 完整原理与优缺点)
    • [1.1 大模型原生三大缺陷](#1.1 大模型原生三大缺陷)
    • [1.2 RAG 概念](#1.2 RAG 概念)
    • [1.3 RAG 优缺点](#1.3 RAG 优缺点)
    • [1.4 RAG 两大阶段](#1.4 RAG 两大阶段)
  • [2 文档加载器 Loader](#2 文档加载器 Loader)
    • [2.1 Markdown 加载](#2.1 Markdown 加载)
    • [2.2 Word Docx 加载](#2.2 Word Docx 加载)
    • [2.3 PDF 专业解析 MinerU](#2.3 PDF 专业解析 MinerU)
  • [3 文本切分 RecursiveCharacterTextSplitter](#3 文本切分 RecursiveCharacterTextSplitter)
    • [3.1 为什么必须切片](#3.1 为什么必须切片)
    • [3.2 切分策略对比](#3.2 切分策略对比)
    • [3.3 代码实战](#3.3 代码实战)
  • [4 Embedding 文本嵌入](#4 Embedding 文本嵌入)
    • [4.1 嵌入模型作用](#4.1 嵌入模型作用)
    • [4.2 主流开源嵌入模型](#4.2 主流开源嵌入模型)
    • [4.3 LangChain 本地嵌入调用](#4.3 LangChain 本地嵌入调用)
  • [5 本章小结](#5 本章小结)

1 RAG 完整原理与优缺点

1.1 大模型原生三大缺陷

1 知识截止,无法获取实时 / 私有资料 2 专业领域知识缺失,容易幻觉编造 3 长文本输入效果衰减,上下文利用率低

1.2 RAG 概念

检索增强生成:先检索私有文档,把相关片段塞进 Prompt 再交给 LLM 回答

1.3 RAG 优缺点

优点: 1 不用微调,低成本更新知识库 2 答案可溯源,大幅降低幻觉 3 数据不用送入模型训练,保护隐私 缺点: 1 多一步检索,接口延迟升高 2 检索质量直接决定回答准确性

1.4 RAG 两大阶段

1 索引阶段:加载文档 → 切片 → 向量化 → 存入向量库 2 问答阶段:问题向量化 → 相似检索 → 拼接上下文 → LLM 生成

2 文档加载器 Loader

所有加载器统一接口load()/lazy_load(),输出 Document 对象(page_content 文本 + metadata 元数据)

2.1 Markdown 加载

python 复制代码
pip install unstructured[md]
from langchain_community.document_loaders import UnstructuredMarkdownLoader
loader = UnstructuredMarkdown("./test.md",mode="elements")
docs = loader.load()

2.2 Word Docx 加载

python 复制代码
from langchain_community.document_loaders import UnstructuredWordDocumentLoader
loader = UnstructuredWordDocument("demo.docx",mode="elements")

2.3 PDF 专业解析 MinerU

普通加载器无法识别表格、公式、双栏 PDF,MinerU 转为标准 Markdown 1 调用官方 API 上传 PDF 2 获取解析后 MD 文本再切片

3 文本切分 RecursiveCharacterTextSplitter

3.1 为什么必须切片

1 模型有最大 token 限制,超长文本截断丢失信息 2 完整文档噪声多,检索无关内容干扰答案

3.2 切分策略对比

1 固定字符切分:容易切断句子,语义断裂 2 递归分隔符切分(推荐):优先按段落、句号分割,保证语义完整 3 语义切分:按向量距离分割,效果好但速度慢

3.3 代码实战

python 复制代码
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
    separators=["\n\n","\n","。","!","?"],
    chunk_size=400,
    chunk_overlap=50 # 块重叠,解决段落分割丢失上下文
)
chunks = splitter.split_documents(docs)

4 Embedding 文本嵌入

4.1 嵌入模型作用

文本转为多维浮点向量,语义相近向量距离近,用于相似度检索

4.2 主流开源嵌入模型

表格

模型 特点
BGE-small/base/large-zh 中文最优轻量模型
BGE-M3 支持稠密 + 稀疏双向量
text-embedding 系列 OpenAI 付费向量

4.3 LangChain 本地嵌入调用

python 复制代码
pip install langchain-huggingface sentence-transformers
from langchain_huggingface import HuggingFaceEmbeddings
embed = HuggingFaceEmbeddings(model_name="./bge-base-zh-v1.5")
vec = embed.embed_query("大模型RAG")

5 本章小结

1 RAG 分为「建索引」和「问答」两大流程 2 Loader 支持 MD/DOCX/PDF,复杂 PDF 优先 MinerU 3 RecursiveCharacterTextSplitter 是工业标准切片工具,chunk_overlap 防止语义断裂 4 Embedding 将文本转为向量,是向量检索基础

相关推荐
大衛說6 分钟前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
可乐鸡翅yeah_1 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
2601_962203512 小时前
Java进阶07集合(续)
java·开发语言
郑州光合科技余经理2 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
来了就未晚2 小时前
Python基础 学习代码存储与命名规范
开发语言·python·学习
布莱克6053 小时前
数组详解:定义、作用、应用场景及与链表的区别(C/C++ 代码讲解)
c语言·开发语言·c++·数组
hongmai6668883 小时前
MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处
c语言·开发语言·arm开发·单片机·5g
多弗朗皮卡丘3 小时前
C语言梦开始的地方19:文件操作
c语言·开发语言
Dovis(誓平步青云)3 小时前
折叠屏悬停看视频,上半屏和下半屏应该各做什么
android·java·服务器·开发语言·安全·音视频
benchmark_cc3 小时前
Python量化实战:如何检测并剔除历史数据中的“闪崩/乌龙指”异常价格点?
开发语言·人工智能·python·量化·quantdash·量化数据源