시간 가중(Time-weighted) 통합

시간 가중(Time-weighted) 통합

LangChain JavaScript로 Time-weighted 검색기와 통합하는 방법을 알아봅니다.

Time-Weighted Retriever는 유사도 외에 최신성(recency)도 고려하는 검색기예요. 점수 알고리즘은 다음과 같습니다:

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

여기서 위의 hoursPassed는 검색기에서 객체가 생성된 이후가 아니라 마지막으로 접근된 이후의 시간을 나타냅니다. 즉, 자주 접근되는 객체는 "신선하게" 유지되어 더 높은 점수를 얻습니다.

this.decayRate는 0과 1 사이의 구성 가능한 십진수입니다. 더 낮은 숫자는 문서가 더 오래 "기억"된다는 뜻이고, 더 높은 숫자는 더 최근에 접근된 문서를 강하게 가중합니다.

감쇠율(decay rate)을 정확히 0이나 1로 설정하면 hoursPassed가 무관해지고 이 검색기는 표준 벡터 조회와 동등해집니다.

출처: 문서

본문

사용법(Usage)

이 예제는 벡터 스토어로 TimeWeightedVectorStoreRetriever를 초기화하는 방법을 보여줍니다. 필수 메타데이터 때문에 모든 문서는 벡터 스토어 자체가 아니라 검색기addDocuments 메서드를 사용해 백킹 벡터 스토어에 추가해야 한다는 점이 중요합니다.

import { TimeWeightedVectorStoreRetriever } from "@langchain/classic/retrievers/time_weighted";
import { MemoryVectorStore } from "@langchain/classic/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: {} }
]
 */

관련 자료(Related)

더 알아보기 (Learn more)