Zettelkasten

Generative Agents의 기억 검색은 recency·importance·relevance 가중합이며 relevance만 쿼리 임베딩으로 매번 재계산된다

·수정 1

요약

  • Generative Agents(Park et al. 2023)는 기억(memory stream)을 검색할 때 recency·importance·relevance 세 점수를 min-max 정규화 후 가중합한다.
  • recency·importance는 기억에 (거의) 고정된 값이고, relevance만 검색 시점의 "현재 상황(query memory)" 임베딩과의 코사인 유사도로 매번 새로 계산된다.

본문

검색 점수 공식

기억 객체를 검색할 때 세 점수를 각각 [0,1]로 min-max 스케일링한 뒤 가중합한다.

score = α_recency · recency + α_importance · importance + α_relevance · relevance

논문 구현에서 세 가중치 α를 모두 1로 두었다. 즉 단순 동일 가중합이고, 이 점수 상위 기억들 중 프롬프트 컨텍스트 윈도우에 들어갈 만큼만 LLM에 주입한다.

세 점수의 성격이 다르다

  • Recency: 마지막으로 그 기억을 retrieve한 시점부터의 *샌드박스 게임 시간(hour)*에 대한 지수 감쇠. decay factor는 0.995. → 시간 함수, 검색할 때마다 시각만 바뀜.
  • Importance: 기억 생성 시 LLM에게 "이 기억의 poignancy(중요도)를 1~10으로 매겨라"고 물어 부여한 값. 1은 순수 일상(양치질, 침대 정리), 10은 강렬한 사건(이별, 대학 합격). → 생성 시 한 번 정해져 저장되는 고정값.
  • Relevance: 각 기억의 텍스트 설명을 임베딩한 벡터와 query memory의 임베딩 벡터 사이의 코사인 유사도. → 검색하는 그 시점의 쿼리에 따라 매번 다시 계산되는 유일한 항.

"query memory"의 정체

relevance의 쿼리는 별도 자료구조가 아니라 현재 상황을 하나의 기억 객체 형태로 표현한 텍스트다. 이를 임베딩해서 저장된 기억들과 코사인 유사도를 잰다. 쿼리 텍스트는 고정이 아니라 호출하는 모듈(대화 / 계획 / reflection)마다 달라진다 — 대화 중이면 상대 발화, 계획 중이면 "지금 하려는 일", 인터뷰 평가면 그 질문이 쿼리가 된다.

왜 이 구조가 의미 있나

recency·importance는 "이 기억이 일반적으로 얼마나 떠올릴 만한가"라는 기억 자체의 속성이고, relevance는 "지금 이 맥락에 얼마나 들어맞나"라는 맥락 의존 속성이다. 세 축을 분리해 합산함으로써, 오래됐지만 중요한 기억(importance↑)과 사소하지만 지금 딱 맞는 기억(relevance↑)을 같은 척도에서 경쟁시킬 수 있다.

관련 노트

참고