在当今信息快速变化的时代,如何在海量数据中快速找到相关信息是一个重要的问题。时间加权向量存储检索器(TimeWeightedVectorStoreRetriever)通过结合语义相似性和时间衰减来提升检索效率。本文将详细介绍其原理、代码实现,并结合实际场景进行分析。
技术背景介绍
时间加权向量存储检索器的核心思想是通过结合语义相似性和时间权重,提升信息检索的准确性。此检索器考虑了对象上次被访问的时间,而不是创建时间,这样频繁访问的对象会被认为是“新鲜”的。
核心原理解析
算法评分机制为:
[ \text{semantic_similarity} + (1.0 - \text{decay_rate}) ^ \text{hours_passed} ]
semantic_similarity
:语义相似度。decay_rate
:衰减率,决定了时间因素的影响程度。hours_passed
:自上次访问以来的小时数。
代码实现演示
以下是实现时间加权向量存储检索器的完整示例代码:
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)
使用高衰减率
# 定义嵌入模型
embeddings_model = OpenAIEmbeddings()
# 初始化空的向量存储
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(embeddings_model, index, InMemoryDocstore({}), {})
# 创建时间加权检索器,使用高衰减率
retriever = TimeWeightedVectorStoreRetriever(
vectorstore=vectorstore, decay_rate=0.999, k=1
)
# 添加文档
retriever.add_documents(
[Document(page_content="hello world", metadata={"last_accessed_at": yesterday})]
)
retriever.add_documents([Document(page_content="hello foo")])
# 检索文档,"Hello Foo"因高衰减率成为优先返回项
relevant_docs = retriever.get_relevant_documents("hello world")
print(relevant_docs)
虚拟时间模拟
import datetime
from langchain_core.utils import mock_now
# 使用虚拟时间
with mock_now(datetime.datetime(2024, 2, 3, 10, 11)):
relevant_docs = retriever.get_relevant_documents("hello world")
print(relevant_docs)
应用场景分析
此检索器在新闻推荐、社交媒体信息流、知识管理系统等需要考虑信息时间因素的场景中具有极高的应用价值。例如在新闻推荐中,用户可能更关注新近热点而不是旧闻。
实践建议
- 调整衰减率:根据具体应用场景灵活设置衰减率,可以在新鲜度和历史性之间取得平衡。
- 优化文档存储:确保文档存储结构支持高效的更新和查询操作。
- 结合业务逻辑:在实际应用中,可以结合业务逻辑优化检索策略,例如在节假日或特定事件期间调整权重因子。
结束语:如果遇到问题欢迎在评论区交流。
—END—