以编程方式使用文档

时间加权检索器是一种除了考虑相似性外还考虑时效性的检索器。评分算法是:

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

值得注意的是, hoursPassed 上文指的是对象在检索器中上次访问以来的时间,而非创建以来的时间。这意味着频繁访问的对象保持"新鲜",得分更高。

this.decayRate 是一个0到1之间的可配置小数。数值越低意味着文档被"记住"的时间越长,而数值越高则越强烈地权重于最近访问的文档。

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

用法

此示例展示了如何初始化 TimeWeightedVectorStoreRetriever 与向量存储一起使用。 需要注意的是,由于元数据要求,所有文档必须使用 addDocuments 上的 **方法添加到后备向量存储中,**而不是向量存储本身。

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: {} }
]
 */

相关