使用时间加权向量存储检索器的指南

引言

在现代信息检索中,如何有效管理和检索随时间变化的动态信息是一个重要课题。本文介绍了一种结合语义相似性和时间衰减的检索器——时间加权向量存储检索器(Time-Weighted Vector Store Retriever)。该检索器在处理频繁访问的数据时表现优异,帮助开发者在保持信息“新鲜”的同时,提高检索效率。

主要内容

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

时间加权检索器通过以下公式为对象评分:
[ \text{score} = \text{semantic_similarity} + (1.0 - \text{decay_rate}) ^ \text{hours_passed} ]

  • semantic_similarity:对象与查询的语义相似度。
  • decay_rate:衰减率,控制对象随时间的“遗忘”速度。
  • 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

# 使用API代理服务提高访问稳定性
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")])

# "Hello World" 优先返回,因为其依然“新鲜”
results = retriever.get_relevant_documents("hello world")
print(results)

高衰减率

高衰减率(接近1)使信息快速被“遗忘”。如果设置为1,所有对象的最近性得分为0,这等同于不考虑时间因素的向量查找。

# 使用API代理服务提高访问稳定性
retriever = TimeWeightedVectorStoreRetriever(
    vectorstore=vectorstore, decay_rate=0.999, 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 Foo" 优先返回,因为 "hello world" 被遗忘
results = retriever.get_relevant_documents("hello world")
print(results)

虚拟时间

通过LangChain工具,可以模拟时间,以测试不同时间点的检索效果。

import datetime
from langchain_core.utils import mock_now

# 使用API代理服务提高访问稳定性
with mock_now(datetime.datetime(2024, 2, 3, 10, 11)):
    results = retriever.get_relevant_documents("hello world")
    print(results)

常见问题和解决方案

  1. 如何选择合适的衰减率?

    • 需根据应用场景决定。如果历史信息重要且更频繁被访问,则选择较低的衰减率。
  2. 访问API时遇到网络问题怎么办?

总结和进一步学习资源

时间加权向量存储检索器是一种强大的工具,适合处理需要考虑时间因素的动态信息检索。通过合理设置衰减率,开发者可以更好地权衡信息的“新鲜度”和检索效率。

进一步学习资源

参考资料

  • LangChain官方文档
  • OpenAI Embeddings API指南
  • FAISS向量库使用手册

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值