LLM-Day3
·
✅ 理解 RAG 的完整流水线流程 ✅ 掌握 LangChain 中常用的文档加载器 ✅ 能独立实现「文档加载 → 文本分块 → 向量化 → 检索问答」的完整流程 ✅ 写出可运行的基础 RAG 代码
一、RAG 流水线核心概念
1. 什么是 RAG?
检索增强生成(Retrieval-Augmented Generation)
- 作用:让大模型基于私有文档 / 本地知识库回答问题,解决 “模型不知道的内容”
- 核心流程:
- 文档加载:从文件 / 网页 / 数据库读取数据
- 文本分块:把长文档切分成小片段(Chunk)
- 向量化:把文本片段转成向量存入向量库
- 用户提问:问题也转为向量
- 检索召回:从向量库找到和问题最相似的文档片段
- 生成答案:把问题 + 召回片段一起交给大模型,生成精准回答
二、文档加载器精讲(核心考点)
LangChain 提供了多种加载器,适配不同数据源:
表格
| 加载器 | 适用场景 | 代码示例 |
|---|---|---|
TextLoader |
纯文本文件(.txt) | from langchain.document_loaders import TextLoader |
PyPDFLoader |
PDF 文档 | from langchain.document_loaders import PyPDFLoader |
CSVLoader |
CSV 表格文件 | from langchain.document_loaders import CSVLoader |
WebBaseLoader |
网页内容爬取 | from langchain.document_loaders import WebBaseLoader |
DirectoryLoader |
批量加载文件夹内文件 | from langchain.document_loaders import DirectoryLoader |
代码示例:加载本地 PDF 文件
python
运行
from langchain.document_loaders import PyPDFLoader
# 1. 初始化加载器
loader = PyPDFLoader("./your_document.pdf")
# 2. 加载文档
documents = loader.load()
# 3. 查看加载结果
print(f"加载了 {len(documents)} 页文档")
print("第一页内容:", documents[0].page_content[:100])
代码示例:加载网页内容
python
运行
from langchain.document_loaders import WebBaseLoader
# 加载指定网页
loader = WebBaseLoader("https://example.com/article")
documents = loader.load()
print("网页内容:", documents[0].page_content[:200])
三、文本分块(Chunking)
文档加载后,需要切成小片段才能存入向量库,常用工具:
RecursiveCharacterTextSplitter:按字符递归切割,适配大多数文本
python
运行
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 初始化切割器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每个片段的最大字符数
chunk_overlap=50 # 片段之间的重叠字符数(防止上下文断裂)
)
# 切割文档
splits = text_splitter.split_documents(documents)
print(f"切割成了 {len(splits)} 个片段")
print("第一个片段:", splits[0].page_content)
四、向量化与向量库
把文本片段转成向量,存入向量库,用于后续检索:
python
运行
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
# 初始化嵌入模型(文本转向量)
embeddings = OpenAIEmbeddings()
# 存入 FAISS 向量库
vector_store = FAISS.from_documents(splits, embeddings)
# 转为检索器
retriever = vector_store.as_retriever(search_kwargs={"k": 3}) # 每次检索返回3个最相关片段
五、完整 RAG 问答链实现
python
运行
from langchain.chains import RetrievalQA
from langchain_openai import OpenAI
# 初始化模型
llm = OpenAI(temperature=0)
# 构建 RAG 问答链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 把所有召回片段直接拼接到prompt中
retriever=retriever
)
# 提问
question = "这份文档的核心结论是什么?"
result = qa_chain.run(question)
print("回答:", result)
三种 chain_type (stuff /map_reduce/refine)
1. chain_type="stuff"(最基础、默认)
- 逻辑:把所有检索到的片段全部拼在一起,做成一条长提示词,一次性发给大模型
- 优点:代码简单、只调用 1 次大模型、速度快
- 缺点:文档多的时候,提示词超长,容易超出模型上下文限制
- 适用:片段少、短文档(日常测试、小型知识库)
2. chain_type="map_reduce"(分片汇总)
- 逻辑分两步:
- Map:每条文档片段单独丢给大模型,各自生成摘要 / 答案
- Reduce:把所有片段的结果再汇总一次,生成最终答案
- 优点:支持超多文档,不怕超长上下文
- 缺点:调用多次大模型,速度慢、消耗 token 多
- 适用:海量长文档检索
3. chain_type="refine"(逐段迭代优化)
- 逻辑:先拿第一条片段生成答案,再用第二条片段修正、优化上一轮答案,逐条迭代
- 优点:答案连贯性最好、细节最丰富
- 缺点:调用次数最多、速度最慢
- 适用:对答案精度要求极高的场景
六、课后作业(必做)
- 用
PyPDFLoader加载一个本地 PDF 文件 - 用
RecursiveCharacterTextSplitter把文档切成片段 - 存入 FAISS 向量库,构建一个基础 RAG 问答链
- 简答题:简述 RAG 流水线的完整流程(从文档加载到生成答案)
-
作业 1-3:加载 PDF + 分块 + 构建 RAG 链
这三题是连贯的,写在同一个文件里,
# --- 1. 导入所有需要的库 --- from langchain.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings, OpenAI from langchain_community.vectorstores import FAISS from langchain.chains import RetrievalQA # --- 2. 配置API Key(换成你自己的)--- import os os.environ["OPENAI_API_KEY"] = "你的API Key" os.environ["OPENAI_API_BASE"] = "你的代理地址(如果需要)" # --- 3. 加载PDF文档 --- # 把下面的路径换成你自己的PDF文件路径 loader = PyPDFLoader("./your_document.pdf") documents = loader.load() print(f"✅ 加载完成,共 {len(documents)} 页") # --- 4. 文本分块 --- text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, # 每个片段最大字符数 chunk_overlap=50 # 片段之间的重叠字符数 ) splits = text_splitter.split_documents(documents) print(f"✅ 分块完成,共 {len(splits)} 个片段") # --- 5. 向量化并存入向量库 --- embeddings = OpenAIEmbeddings() vector_store = FAISS.from_documents(splits, embeddings) retriever = vector_store.as_retriever(search_kwargs={"k": 3}) print("✅ 向量库构建完成") # --- 6. 构建RAG问答链 --- llm = OpenAI(temperature=0) qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", # 把召回的片段直接拼接到prompt中 retriever=retriever ) print("✅ RAG问答链准备就绪") # --- 7. 测试提问 --- question = "这份文档的核心内容是什么?" result = qa_chain.run(question) print(f"\n问题:{question}") print(f"回答:{result}")
作业 4:简答题标准答案
题目:简述 RAG 流水线的完整流程(从文档加载到生成答案)
RAG 流水线的完整流程分为两个阶段:
-
离线构建阶段(只做一次)
- 文档加载:使用
PyPDFLoader等加载器读取 PDF、网页、TXT 等数据源。 - 文本分块:使用
RecursiveCharacterTextSplitter将长文档切割成短片段(Chunk)。 - 向量化:通过
OpenAIEmbeddings等嵌入模型,将文本片段转为向量。 - 存入向量库:将向量存入 FAISS、Chroma 等向量数据库,用于后续检索。
- 文档加载:使用
-
在线问答阶段(用户提问时执行)
- 用户提问:用户输入问题。
- 问题向量化:将用户的问题也转为向量。
- 语义检索:从向量库中找到与问题向量最相似的文档片段。
- 拼接上下文:将问题和召回的相关片段拼接成完整 Prompt。
- 生成答案:将 Prompt 交给大模型,生成基于文档内容的回答。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)