Langchain学习笔记(五):检索增强生成(RAG)基础原理

:本文是Langchain框架的学习笔记;不是教程!不是教程!内容可能有所疏漏,欢迎交流指正。后续将持续更新学习笔记,分享我的学习心得和实践经验。

一. RAG系统的基本原理与架构

检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了检索系统和生成式AI的混合架构,旨在解决大语言模型(LLM)的知识时效性和幻觉问题。RAG通过从外部知识库检索相关信息,然后将这些信息作为上下文提供给LLM,从而生成更准确、更可靠的回答。

1. RAG的核心优势

  • 知识时效性:LLM的知识在预训练后就固定了,而RAG可以访问最新信息

  • 减少幻觉:通过提供事实依据,降低模型编造信息的可能性

  • 知识专业性:可以接入专业领域文档,增强模型在特定领域的表现

  • 透明可解释:回答可以追溯到具体的信息来源

  • 降低成本:相比模型微调,RAG实现更为经济高效


2. RAG的基本架构

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值