LangChain 实现知识库完整流程
创作时间:
作者:
@小白创作中心
LangChain 实现知识库完整流程
引用
CSDN
1.
https://blog.csdn.net/neweastsun/article/details/145770376
LangChain是一个强大的工具,用于构建基于文档的检索增强生成(RAG)系统。本文将详细介绍LangChain中处理文档的完整流程,包括加载文档、嵌入、文档转换、向量存储和检索器等核心步骤。通过具体的代码示例,帮助读者快速掌握LangChain的文档处理流程。
1. Load(加载文档)
定义:
Load是指从不同来源(如本地文件、网页、数据库等)加载原始文档到LangChain中。LangChain提供了多种Document Loader来支持这一过程。
示例:
使用TextLoader加载本地文本文件,或使用WebBaseLoader加载网页内容。
from langchain.document_loaders import TextLoader, WebBaseLoader
# 示例1:加载本地文本文件
local_loader = TextLoader("example.txt")
local_docs = local_loader.load()
# 示例2:加载网页内容
web_loader = WebBaseLoader(["https://example.com"])
web_docs = web_loader.load()
print("Loaded documents:", local_docs[0].page_content[:100] + "...")
2. Embed(嵌入)
定义:
Embed是将文本转换为高维向量(Embedding Vector)的过程,以便后续的语义搜索。LangChain支持多种嵌入模型(如OpenAI、Hugging Face等)。
示例:
使用OpenAI的嵌入模型将文本转换为向量。
from langchain.embeddings import OpenAIEmbeddings
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 将单条文本转换为向量
text = "Hello, world!"
embedding_vector = embeddings.embed_query(text)
print("Embedding shape:", len(embedding_vector)) # 输出向量维度(例如1536)
# 批量转换文档
doc_texts = [doc.page_content for doc in local_docs]
doc_embeddings = embeddings.embed_documents(doc_texts)
3. Document Transform(文档转换)
定义:
Document Transform是对原始文档进行预处理,例如分割长文本为短块(chunks)、过滤无关内容等。常用工具是文本分割器(Text Splitter)。
示例:
使用RecursiveCharacterTextSplitter分割文档。
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 定义文本分割器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每个块的最大长度
chunk_overlap=50 # 块之间的重叠长度
)
# 分割文档
split_docs = text_splitter.split_documents(local_docs)
print("Number of chunks:", len(split_docs))
print("First chunk:", split_docs[0].page_content[:100] + "...")
4. Vector Store(向量存储)
定义:
Vector Store是将嵌入后的向量存储到数据库中,支持高效的相似性搜索。常见的向量数据库包括FAISS、Chroma、Pinecone等。
示例:
使用FAISS存储向量并检索。
from langchain.vectorstores import FAISS
# 将分割后的文档转换为向量并存储
vector_store = FAISS.from_documents(
documents=split_docs,
embedding=embeddings
)
# 保存向量库到本地(可选)
vector_store.save_local("faiss_index")
5. Retriever(检索器)
定义:
Retriever是从向量库中检索与输入查询最相关的文档片段的核心组件。它基于语义相似性(向量距离)进行搜索。
示例:
使用检索器查找相关文档。
# 从向量库创建检索器
retriever = vector_store.as_retriever(
search_type="similarity", # 搜索类型("similarity" 或 "mmr")
search_kwargs={"k": 3} # 返回前3个结果
)
# 执行检索
query = "What is the main topic of the document?"
relevant_docs = retriever.get_relevant_documents(query)
print("Retrieved documents:")
for doc in relevant_docs:
print(doc.page_content[:100] + "...")
完整流程示例
将以上步骤整合为一个完整的RAG流程:
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
# 1. 加载文档
loader = TextLoader("example.txt")
docs = loader.load()
# 2. 文档转换(分割)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
split_docs = text_splitter.split_documents(docs)
# 3. 嵌入
embeddings = OpenAIEmbeddings()
# 4. 向量存储
vector_store = FAISS.from_documents(split_docs, embeddings)
# 5. 检索器
retriever = vector_store.as_retriever(search_kwargs={"k": 2})
# 检索测试
query = "What is the key message?"
results = retriever.invoke(query)
print("Top 2 results:", results)
最后总结
- Load:从多种来源加载原始文档。
- Embed:将文本转换为向量表示。
- Document Transform:预处理文档(如分割)。
- Vector Store:存储向量以实现高效检索。
- Retriever:根据查询检索相关文档。
这些步骤构成了LangChain中处理文档的核心流程,广泛应用于问答系统、知识库搜索等场景。
热门推荐
国企助理工程师职称的作用与价值
冯霞:麻醉是与大脑交手的“游戏”
深度解析:麻醉药物如何影响身体的?
根据不同预算选购适合你的电动车详细指南
得了荨麻疹饮食上应该注意什么
百香果病虫害防治技术与方法措施(打造健康的百香果园)
在位时间极短的七位皇帝:权力更迭的瞬息万变
揭秘古代皇帝的"短命"之谜:平均寿命仅39岁,44.5%死于非命
正财和偏财的区别是什么
魔法类小说13本,神秘咒语开启奇幻之旅,掌控元素之力的传奇
中国即位年龄最大的皇帝排行榜
考古队发现虞朝字符,中华历史再增3000年!网友:历史书要炸了!
等自己变得优秀了,再去追喜欢的人,是一种怎样的选择?
超滤设备中的清洗程序有哪些?
R5 8600G核显相当于什么显卡?能玩什么游戏?
怎么清理床垫上的尿渍?教你几招,让床垫焕然一新
让孩子们享受舒心午睡
危地马拉推出预防性暴力、剥削和人口贩运犯罪国家计划
汉殇帝刘隆:一生短暂,命运多舛
如何调节鼠标灵敏度以提升日常办公和游戏体验的方法总结
浙江首票"Tir+跨境电商"货物从义乌发运
我国每年废弃的千亿人民币,最后都怎么处理的?都是直接烧掉?
车田正美为什么除了《圣斗士星矢》以外再无任何佳作?
「超級麥片」補足一整天營養素!燕麥搭這些變身超級麥片 營養師教健康吃法
伴侣沟通不顺?改变这些基本认知,让家人有话好好说
灵魂伴侣的特质:松弛感、沟通力与边界感
如何确保家庭用水安全
异地业务员招聘必读:劳动合同VS劳务合同实操指南
如何挑选完美的结婚戒指,从预算到设计的全方位指南
中国科大在碳质颗粒物形成机理研究取得重要进展