注:本文是Langchain框架的学习笔记;不是教程!不是教程!内容可能有所疏漏,欢迎交流指正。后续将持续更新学习笔记,分享我的学习心得和实践经验。
一. RAG系统的基本原理与架构
检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了检索系统和生成式AI的混合架构,旨在解决大语言模型(LLM)的知识时效性和幻觉问题。RAG通过从外部知识库检索相关信息,然后将这些信息作为上下文提供给LLM,从而生成更准确、更可靠的回答。
1. RAG的核心优势
-
知识时效性:LLM的知识在预训练后就固定了,而RAG可以访问最新信息
-
减少幻觉:通过提供事实依据,降低模型编造信息的可能性
-
知识专业性:可以接入专业领域文档,增强模型在特定领域的表现
-
透明可解释:回答可以追溯到具体的信息来源
-
降低成本:相比模型微调,RAG实现更为经济高效
2. RAG的基本架构

RAG系统通常由以下几个核心组件构成:
-
文档处理系统:负责加载、处理和分块文档
-
向量化模块:将文本转换为向量表示
-
向量数据库:存储和索引文本向量
-
检索器:根据查询检索相关文档
-
生成模块:结合检索结果和用户查询生成回答
3. RAG的工作流程
索引阶段:
-
加载文档并分割成适当大小的块
-
使用嵌入模型将每个文本块转换为向量
-
将向量和原文本存储在向量数据库中
查询阶段:
-
将用户问题转换为向量表示
-
在向量数据库中检索与问题最相似的文本块
-
将检索到的文本块与原始问题一起构建提示
-
将完整提示发送给LLM生成最终回答
二. 文档处理流程(加载、分块、向量化)
1. 文档加载
文档加载是RAG系统的第一步,Langchain提供了丰富的文档加载器(Document Loaders)来处理各种格式的文档。
from langchain_community.document_loaders import PyPDFLoader, CSVLoader, TextLoader
# 加载PDF文档
pdf_loader = PyPDFLoader("knowledge_base/document.pdf")
pdf_docs = pdf_loader.load()
# 加载CSV文件
csv_loader = CSVLoader("knowledge_base/data.csv")
csv_docs = csv_loader.load()
# 加载纯文本文件
text_loader = TextLoader("knowledge_base/article.txt")
text_docs = text_loader.load()
# 合并所有文档
all_docs = pdf_docs + csv_docs + text_docs
2. 文档分块
文档分块是将长文档切分成较小的文本片段,以便于向量化和检索。合理的分块策略对RAG系统的性能至关重要。
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 创建文本分割器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 每个块的目标大小(字符数)
chunk_overlap=200, # 相邻块之间的重叠部分,有助于保持上下文连贯性
length_function=len, # 计算文本长度的函数
separators=["\n\n", "\n", " ", ""] # 分割文本的分隔符优先级
)
# 分割文档
chunks = text_splitter.split_documents(all_docs)
print(f"文档被分割成 {
len(chunks)} 个块")
分块策略的关键考量
-
块大小:太大会导致检索精度下降,太小会丢失上下文
-
块重叠:适当重叠可以保持上下文连贯性
-
分隔符选择:基于文档结构选择合适的分隔符
-
保留元数据:确保每个块都保留来源信息
3. 向量化处理
向量化是将文本转换为数值向量的过程,这些向量捕捉了文本的语义信息
from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
# 初始化嵌入模型
embeddings = OllamaEmbeddings()
# 创建向量数据库
vectorstore = FAISS.from_documents(
documents=chunks,
embedding=embeddings
)
# 持久化存储
vectorstore.save_local("./faiss_index")
三. 嵌入模型(Embedding Models)的选择与影响
嵌入模型是RAG系统的关键组件,它决定了文本如何被转换为向量表示,进而影响检索的准确性。
常见嵌入模型对比
| 模型 | 维度 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| text-embedding-3-small | 1536 | 高质量、多语言支持 | 收费、API依赖 | 通用场景、多语言 |
| bge-large-zh | 1024 | 中文表现优秀、开源 | 计算资源需求大 | 中文内容为主的应用 |
| ollama/nomic-embed-text | 768 | 本地部署、无需联网 | 精度略低于商业模型 | 本地应用、隐私敏感场景 |
2. 在Langchain中使用不同嵌入模型
# OpenAI嵌入
from langchain_community.embeddings

最低0.47元/天 解锁文章
5486

被折叠的 条评论
为什么被折叠?



