基于Python的自然语言处理系列(60):使用 LangChain 构建 Multi-Vector Retriever 进行文档检索

在 NLP 和 AI 领域,基于嵌入(Embeddings)进行文档检索已成为一种高效的解决方案。本文介绍如何使用 LangChain 构建 Multi-Vector Retriever,实现对长文档的分块索引和高效检索。

1. 环境准备

首先,我们需要安装相关依赖库。

复制代码
pip install langchain chromadb torch transformers

2. 加载文档并进行预处理

我们先使用 TextLoader 读取多个文档,并进行分块处理,以便后续向量化索引。

复制代码
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

loaders = [
    TextLoader("../docs/txt/paul_graham_essay.txt"),
    TextLoader("../docs/txt/state_of_the_union.txt"),
]
docs = []
for loader in loaders:
    docs.extend(loader.load())

# 设定 chunk size 以确保文档分块合理
text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000)
docs = text_splitter.split_documents(docs)

3. 选择嵌入模型

这里我们使用 HuggingFaceInstructEmbeddings 进行向量化,支持 GPU 加速。

复制代码
from langchain.embeddings import HuggingFaceInstructEmbeddings
import torch

embedding_model = HuggingFaceInstructEmbeddings(
    model_name='hkunlp/instructor-base',
    model_kwargs={'device': torch.device('cuda' if torch.cuda.is_available() else 'cpu')}
)

4. 构建向量存储与检索器

使用 Chroma 作为向量数据库,并配置 MultiVectorRetriever

复制代码
from langchain.vectorstores import Chroma
from langchain.retrievers.multi_vector import MultiVectorRetriever
from langchain.storage import InMemoryStore
import uuid

# 创建向量存储
vectorstore = Chroma(collection_name="full_documents", embedding_function=embedding_model)

# 使用 InMemoryStore 作为存储层
store = InMemoryStore()
id_key = "doc_id"
retriever = MultiVectorRetriever(vectorstore=vectorstore, docstore=store, id_key=id_key)

# 生成唯一文档 ID
doc_ids = [str(uuid.uuid4()) for _ in docs]

5. 进一步拆分文档并存储

使用 RecursiveCharacterTextSplitter 进一步拆分子文档,并添加到向量存储中。

复制代码
child_text_splitter = RecursiveCharacterTextSplitter(chunk_size=400)

sub_docs = []
for i, doc in enumerate(docs):
    _id = doc_ids[i]
    _sub_docs = child_text_splitter.split_documents([doc])
    for _doc in _sub_docs:
        _doc.metadata[id_key] = _id
    sub_docs.extend(_sub_docs)

retriever.vectorstore.add_documents(sub_docs)
retriever.docstore.mset(list(zip(doc_ids, docs)))

6. 进行相似度搜索

我们可以使用 similarity_search 进行相似内容检索。

复制代码
retriever.vectorstore.similarity_search("justice breyer")

或者使用 get_relevant_documents 查找相关文档:

复制代码
retriever.get_relevant_documents("retriever")

7. 结论

通过 LangChain 的 Multi-Vector Retriever,我们能够高效地处理长文档并实现精准检索。结合 HuggingFace 的嵌入模型和 Chroma 向量数据库,可以实现快速的文本相似度匹配,非常适用于 法律文档、技术文档 等长文本搜索任务。

如果你对 LangChain 的更多应用感兴趣,欢迎在评论区交流!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

相关推荐
余俊晖2 分钟前
多页文档理解强化学习设计思路:DocR1奖励函数设计与数据构建思路
人工智能·语言模型·自然语言处理
Yeats_Liao5 分钟前
MindSpore开发之路(二十六):系列总结与学习路径展望
人工智能·深度学习·学习·机器学习
sinat_286945197 分钟前
opencode
人工智能·算法·chatgpt
gorgeous(๑>؂<๑)11 分钟前
【中科院-张启超组-AAAI26】WorldRFT: 用于自动驾驶的带强化微调的潜在世界模型规划
人工智能·机器学习·自动驾驶
min18112345616 分钟前
PC端零基础跨职能流程图制作教程
大数据·人工智能·信息可视化·架构·流程图
愚公搬代码30 分钟前
【愚公系列】《AI+直播营销》015-直播的选品策略(设计直播产品矩阵)
人工智能·线性代数·矩阵
静听松涛13334 分钟前
中文PC端多人协作泳道图制作平台
大数据·论文阅读·人工智能·搜索引擎·架构·流程图·软件工程
学历真的很重要1 小时前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
IT=>小脑虎1 小时前
Python零基础衔接进阶知识点【详解版】
开发语言·人工智能·python
UnderTurrets1 小时前
A_Survey_on_3D_object_Affordance
pytorch·深度学习·计算机视觉·3d