跳至主要内容

如何创建时间加权检索器

先决条件

本指南假设您熟悉以下概念

本指南涵盖 TimeWeightedVectorStoreRetriever,它使用语义相似度和时间衰减的组合。

评分算法为

semantic_similarity + (1.0 - decay_rate) ^ hours_passed

值得注意的是,hours_passed 指的是自检索器中的对象上次被访问以来的小时数,而不是自其创建以来的小时数。这意味着频繁访问的对象将保持“新鲜”。

let score = (1.0 - this.decayRate) ** hoursPassed + vectorRelevance;

this.decayRate 是一个可配置的小数,介于 0 和 1 之间。较小的数字意味着文档将被“记住”更长时间,而较大的数字将更重视最近访问的文档。

请注意,将衰减率设置为恰好 0 或 1 将使 hoursPassed 无关紧要,并使此检索器等效于标准向量查找。

重要的是要注意,由于需要元数据,所有文档都必须使用检索器上的 addDocuments 方法添加到支持向量存储中,而不是向量存储本身。

npm install @langchain/openai
import { TimeWeightedVectorStoreRetriever } from "langchain/retrievers/time_weighted";
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "@langchain/openai";

const vectorStore = new MemoryVectorStore(new OpenAIEmbeddings());

const retriever = new TimeWeightedVectorStoreRetriever({
vectorStore,
memoryStream: [],
searchKwargs: 2,
});

const documents = [
"My name is John.",
"My name is Bob.",
"My favourite food is pizza.",
"My favourite food is pasta.",
"My favourite food is sushi.",
].map((pageContent) => ({ pageContent, metadata: {} }));

// All documents must be added using this method on the retriever (not the vector store!)
// so that the correct access history metadata is populated
await retriever.addDocuments(documents);

const results1 = await retriever.invoke("What is my favourite food?");

console.log(results1);

/*
[
Document { pageContent: 'My favourite food is pasta.', metadata: {} }
]
*/

const results2 = await retriever.invoke("What is my favourite food?");

console.log(results2);

/*
[
Document { pageContent: 'My favourite food is pasta.', metadata: {} }
]
*/

API 参考

下一步

您现在已经了解了如何在执行检索时将时间作为因素。

接下来,查看 有关 RAG 的更广泛教程,或本节以了解如何 在任何数据源上创建自己的自定义检索器


此页面对您有帮助吗?


您也可以留下详细的反馈 在 GitHub 上.