探索时间加权向量存储检索器:结合语义相似度与时间衰减的高效检索

96 阅读2分钟
# 探索时间加权向量存储检索器:结合语义相似度与时间衰减的高效检索

## 引言

在现代信息检索系统中,如何有效地结合语义相似度和文档的访问频率是一个重要的课题。本文将探讨一种称为时间加权向量存储检索器的方法,它利用语义相似度和时间衰减来提升检索效果。适合需要保持热点内容"新鲜"的应用场景。

## 主要内容

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

时间加权向量存储检索器结合了语义相似度和时间衰减,其评分算法为:

```text
semantic_similarity + (1.0 - decay_rate) ^ hours_passed

其中,hours_passed是指自文档上次被访问以来经过的小时数,而非其创建时间。

2. 低衰减率与高衰减率的影响

  • 低衰减率:设置衰减率接近零,意味着文档会被记住更久。衰减率为0时,等同于纯粹的向量查找。
  • 高衰减率:衰减率设置为接近1时,文档的新鲜度快速降低,接近纯粹的向量查找。

代码示例

以下示例展示了如何使用时间加权向量存储检索器:

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

# 使用API代理服务提高访问稳定性

常见问题和解决方案

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

选择衰减率需要考虑应用场景。若需记住文档更久,应选择较低衰减率;若信息更新频繁,应选择较高衰减率。

2. 地区网络限制问题

由于某些地区网络限制,开发者可能需要使用API代理服务来提高访问稳定性。

总结和进一步学习资源

时间加权向量存储检索器为提升检索效率提供了一种新思路。其结合语义相似度和时间因素,适合需要平衡历史数据重要性与新鲜度的场景。

进一步学习资源

参考资料

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

---END---