이 글은 LightMem: Lightweight and Efficient Memory-Augmented Generation을 정리한 글입니다.

LLM 에이전트에게 대화 이력을 기억시키는 가장 손쉬운 방법은 과거 대화를 통째로 프롬프트에 다시 넣는 것입니다. 문제는 대화가 길어질수록 이 방식이 그대로 무너진다는 점입니다. 컨텍스트가 길어지면 중간에 있는 정보를 놓치는 “Lost in the Middle” 현상이 나타나고, 매번 쌓인 이력을 다시 읽어들이는 기존 메모리 시스템들은 연산량이 커지면서 응답 속도까지 떨어집니다. LightMem은 이 두 문제를 동시에 겨냥한 경량 메모리 생성 시스템으로, 토큰 사용량을 기존 시스템 대비 수십 분의 일 수준으로 줄이면서도 더 나은 성능을 냅니다.

사람의 기억을 본뜬 3단계 구조

LightMem의 구조는 1968년에 제안된 Atkinson–Shiffrin 기억 모델에서 영감을 받았습니다. 사람의 기억이 감각 기억, 단기 기억, 장기 기억으로 나뉘어 작동하듯, LightMem도 대화 이력을 감각 기억(sensory memory), 주제 단위 단기 기억(topic-aware short-term memory), 장기 기억(long-term memory)이라는 세 계층으로 나누어 처리합니다. 각 계층은 정보를 걸러내고, 묶고, 정제하는 서로 다른 역할을 맡습니다.

감각 기억: 불필요한 토큰을 먼저 걷어내기

가장 먼저 거치는 단계는 사전 압축(pre-compression)입니다. 목표는 단순합니다. 문서나 대화에서 중요하지 않은 정보를 최대한 미리 제거해, 뒤로 넘어가는 데이터의 양 자체를 줄이는 것입니다.

압축은 LLMLingua-2 모델로 입력 문장을 토큰 단위로 분석하면서 시작됩니다. 각 토큰이 얼마나 보존할 가치가 있는지를 나타내는 보존 확률(retain probability)을 계산하고, 이 값이 임계치($\tau$)보다 낮은 토큰은 가차없이 제거합니다. 이때 기준은 정보량입니다. 엔트로피가 높은, 즉 예측하기 어렵고 정보가 풍부한 토큰을 우선적으로 살려둡니다.

이 필터링 과정을 거치면 전체 토큰의 50~70%가 사라지지만, 놀랍게도 의미적 일관성은 그대로 유지됩니다. 중요한 것은 토큰 개수가 아니라 그 토큰이 담고 있는 정보량이라는 점을 잘 보여주는 결과입니다.

주제 분할: 대화를 의미 단위로 쪼개기

압축된 감각 기억을 일정 길이(turn)만큼 모아 배치 단위로 넘기면, 그다음은 주제 분할(topic segmentation) 차례입니다. 하나의 대화나 문서 안에서 주제가 바뀌는 지점을 감지해 데이터를 나누는 작업인데, LightMem은 여기서 어텐션과 임베딩 유사도를 함께 쓰는 하이브리드 방식을 택합니다.

첫 번째 신호는 어텐션 기반 경계 후보($B_1$)입니다. LLM 모델이 각 대화 차례(turn)에 대해 계산한 어텐션 점수를 살펴보고, 이 점수가 지역 최댓값(local maxima)에 도달하는 지점을 주제 전환 지점으로 판단합니다.

두 번째 신호는 임베딩 유사도 기반 경계 후보($B_2$)입니다. 인접한 대화 사이의 임베딩 유사도가 임계치($\tau$) 아래로 떨어지면, 그 지점 역시 주제가 바뀌었다고 판단합니다.

최종적인 주제 경계($B$)는 이 두 후보의 교집합으로 결정됩니다.

$$ B = B_1 \cap B_2 $$

한쪽 신호만으로는 놓치기 쉬운 지점을 서로 보완하는 구조입니다. 고정된 길이로 잘라내는 기존 방식과 달리, 이렇게 결정된 경계는 각 문서나 대화가 가진 고유한 맥락을 훨씬 잘 살려냅니다.

주제 단위 단기 기억

주제 분할을 거치고 나면 주제(topic) 단위로 쪼개진 기억 조각들이 만들어집니다. 이 조각들은 $\{topic, \{user_i, model_i\}\}$ 형태로 STM 버퍼에 쌓입니다. 여기서 $user_i$는 사용자 입력이고, $model_i$는 모델의 응답입니다.

버퍼 크기가 임계치에 도달하면 LLM을 호출해 그 안의 내용을 요약합니다. 이렇게 만들어진 요약은 원본 대화와 함께 $\{topic, \{sum_i, user_i, model_i\}\}$ 형태로 장기 기억(LTM)에 저장됩니다.

장기 기억: 즉시 쌓고, 한가할 때 정리하기

장기 기억은 두 가지 서로 다른 리듬으로 관리됩니다.

Soft Update는 사용자와 실시간으로 상호작용하는 동안(test-time) 일어나는 업데이트입니다. 새로운 정보가 들어오면 기존 메모리를 덮어쓰거나 지우지 않고 곧바로 추가합니다. 일시적으로 중복을 허용하는 셈인데, 대신 응답 지연이 생기지 않습니다. 기존 시스템들이 흔히 쓰는 교체(replace) 방식은 매번 추가 연산이 필요해 지연을 유발한다는 점과 대비됩니다.

Sleep-time Offline Update는 모델이 추론하지 않는 시간, 즉 여유가 있을 때 실행되는 정리 작업입니다. 이때 LTM에 쌓인 전체 메모리를 대상으로 병렬 정제(Parallel Consolidation)를 수행합니다. 먼저 전체 메모리를 시간 순서로 정렬하고, 유사도 검색으로 의미적으로 중복되거나 서로 모순되는 항목을 찾아 병합합니다. 이때 새 항목이 기존 항목보다 최신 타임스탬프를 가질 때만 데이터를 갱신하도록 해, 오래된 정보가 최신 정보를 덮어쓰는 사고를 막습니다.

즉시 추가해서 지연을 없애고, 정리는 여유 시간에 몰아서 하는 두 리듬의 조합이 LightMem이 응답 속도와 메모리 품질을 동시에 잡는 핵심입니다.

실험 결과

LightMem은 실제 대화처럼 턴이 순차적으로 들어오는 점진적 대화 턴 피딩(Incremental Dialogue Turn Feeding) 환경에서 평가됐습니다. 사전 압축기로는 경량 BERT 아키텍처인 LLMLingua-2를 사용했고, 감각 기억 버퍼 크기는 512로 설정했습니다. 평가 데이터셋은 LongMemEval과 LoCoMo이고, 비교 대상은 Full Text, Naive RAG, LangMem, A-MEM, MemoryOS, Mem0였습니다.

같은 모델 환경에서 LightMem은 비교 대상 메모리 시스템들보다 우수한 성능을 냈고, 토큰 사용량은 최대 수십 분의 일 수준으로 줄었습니다. 지연 시간 역시 다른 시스템들을 압도적인 차이로 앞섰습니다.

토큰 보존 비율이 성능에 미치는 영향

사전 압축 단계에서 토큰을 얼마나 남길지 결정하는 보존 비율($r$)도 함께 실험했습니다. $r$ 값이 클수록 임계치($\tau$)는 낮아지고, 그만큼 더 많은 토큰이 살아남습니다. 실험 결과 일반적으로는 $r=0.6$이 가장 좋은 성능을 보였는데, 이 최적값은 STM 버퍼 크기와도 맞물려 있었습니다. 버퍼가 작을 때는 0.6이 더 나은 성능을 보였고, 버퍼가 커지면 0.7이 더 나은 성능을 보이는 경향이 나타났습니다.

References