探索时间加权向量存储检索器:提高文档检索的精准度

# 探索时间加权向量存储检索器:提高文档检索的精准度

在信息检索领域,如何高效地从大量数据中找到相关信息一直是一个挑战。本文将介绍一种创新的解决方案:“时间加权向量存储检索器”(TimeWeightedVectorStoreRetriever)。这种检索器结合了语义相似性和时间衰减的机制,以确保最近和频繁访问的文档在检索过程中能被优先返回。我们将深入探讨其工作原理,并提供代码示例来帮助你在项目中实现这一功能。

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

时间加权向量存储检索器的评分算法如下:

评分 = 语义相似性 + (1.0 - 衰减率) ^ 已过去的小时数


这里的“已过去的小时数”指的是自文档上次访问以来经过的时间,而不是自文档创建以来。这意味着经常访问的文档将保持“新鲜”。通过调整衰减率,我们可以控制文档记忆的持久性。

### 低衰减率

低衰减率意味着文档会被“记住”更长时间。极端情况下,设置衰减率接近于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
)  # 使用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" 被优先返回,因为其依然较为新鲜
retriever.get_relevant_documents("hello world")

高衰减率

高衰减率会使得文档的“新鲜度”迅速减退。将衰减率设为接近1,所有对象的“新鲜度”都将趋近于0,再次使得检索器等同于简单的向量查找。

retriever = TimeWeightedVectorStoreRetriever(
    vectorstore=vectorstore, decay_rate=0.999, k=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" 几乎被遗忘
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代理服务来提高访问的稳定性。
  • 衰减率的选择:选择合适的衰减率对检索结果的影响很大,建议根据具体的应用场景进行调整和测试。

总结与进一步学习资源

时间加权向量存储检索器为信息检索提供了一种动态优先级的机制,通过结合语义相似性和时间因素,提升了用户体验。对于有兴趣深入了解的读者,可以参考以下资源:

  1. LangChain Documentation
  2. FAISS Tutorial

参考资料

  1. LangChain官方文档
  2. FAISS文档
  3. OpenAI Embeddings文档

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

---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值