使用时间加权向量存储检索器:如何保持数据的“新鲜”与相关

76 阅读3分钟
# 使用时间加权向量存储检索器:如何保持数据的“新鲜”与相关

## 引言

在搜索和信息检索的领域,如何保持数据的“新鲜”与相关性一直是一个重要的挑战。时间加权向量存储检索器(Time Weighted Vector Store Retriever)是一种结合了语义相似度和时间衰减的技术,用来解决这一问题。本文将详细介绍这种检索器的工作原理、如何使用它,以及在实际应用中可能遇到的挑战,并提供解决方案。

## 主要内容

### 什么是时间加权向量存储检索器?

时间加权向量存储检索器通过将语义相似度与时间衰减相结合,给予数据一个综合得分。这种得分由以下公式计算:

```plaintext
semantic_similarity + (1.0 - decay_rate) ^ hours_passed

其中,hours_passed指的是自对象上次被访问以来经过的小时数,而不是自对象被创建以来的时间。这意味着频繁访问的对象可以保持“新鲜”。

低衰减率的使用

低衰减率使得记忆会被“记住”更长时间。例如,将衰减率设置接近于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

# 定义你的嵌入模型
embeddings_model = OpenAIEmbeddings()
# 初始化空的向量存储
embedding_size = 1536
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(embeddings_model, index, InMemoryDocstore({}), {})
retriever = TimeWeightedVectorStoreRetriever(
    vectorstore=vectorstore, decay_rate=0.0000000000000000000000001, k=1
)  # 使用API代理服务提高访问稳定性

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"因为最重要且衰减率接近0而被首先返回
relevant_docs = retriever.get_relevant_documents("hello world")
print(relevant_docs)

高衰减率的使用

高衰减率会使得新近度评分迅速降低至0。如果衰减率设置为1,则所有对象的新近度都为0,再次变为传统的向量查询。

retriever = TimeWeightedVectorStoreRetriever(
    vectorstore=vectorstore, decay_rate=0.999, k=1
)  # 使用API代理服务提高访问稳定性

relevant_docs = retriever.get_relevant_documents("hello world")
print(relevant_docs)

虚拟时间的使用

利用LangChain中的一些工具,我们可以模拟出时间组件的效果。

import datetime
from langchain_core.utils import mock_now

with mock_now(datetime.datetime(2024, 2, 3, 10, 11)):
    print(retriever.get_relevant_documents("hello world"))

常见问题和解决方案

  • 问题:网络访问不稳定
    • 解决方案:考虑使用API代理服务来提高访问的稳定性。
  • 问题:高衰减率导致数据频繁“过期”
    • 解决方案:根据实际应用场景,调整衰减率参数,以平衡数据的新鲜度与持久性。

总结和进一步学习资源

时间加权向量存储检索器在保持数据的新鲜度方面提供了一个具有创新性的解决方案。通过合理调整衰减率参数,可以实现对数据的灵活管理。想要深入了解这一技术的读者,可以参考以下资源:

参考资料

  1. LangChain 官方文档
  2. FAISS 官方文档
  3. OpenAI Embeddings 使用说明

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

---END---