20 분 소요

0. Introduction

Paper link

Mem0는 “agent에 memory를 붙였다” 정도로 읽으면 핵심을 놓치기 쉬운 논문이다. 이 논문이 진짜로 다루는 문제는 LLM agent가 긴 상호작용을 어떻게 기억하고, 무엇을 버리고, 어떤 기억을 다시 꺼내야 하는가이다. 단순히 context window를 늘리거나 conversation history를 RAG chunk로 검색하는 방식은 long-term personalization에는 곧 한계가 온다. 모든 대화를 다시 넣으면 비싸고 느리며, chunk retrieval은 중요한 사실과 불필요한 발화를 함께 가져오기 쉽다.

Mem0의 관점은 더 실무적이다. long-term memory를 하나의 “저장소”가 아니라, extraction -> consolidation/update -> retrieval로 이어지는 memory lifecycle로 본다. 새 대화가 들어오면 LLM이 salient fact를 뽑고, 기존 memory와 비교한 뒤 ADD / UPDATE / DELETE / NOOP 중 하나를 선택한다. 그리고 답변 시점에는 전체 conversation이 아니라 현재 질문에 필요한 memory만 가져온다. 이 논문이 production-ready라는 표현을 쓰는 이유도 여기 있다. 메모리 품질뿐 아니라 token cost, search latency, total latency까지 같이 측정한다.

또 하나 중요한 축은 Mem0g다. Mem0는 natural-language memory를 vector DB에 저장하는 base pipeline이고, Mem0g는 여기에 entity-relation graph를 붙인 변형이다. 즉 memory를 “문장으로 저장할 것인가”, “관계 그래프로 저장할 것인가”라는 표현 방식의 trade-off를 실험한다. 결과는 꽤 흥미롭다. graph memory가 항상 이기는 것이 아니라, temporal reasoning처럼 관계와 시간 순서가 중요한 문제에서는 도움이 되지만, single-hop이나 multi-hop 일부에서는 natural-language memory가 더 효율적이다.

한 줄 요약: Mem0는 LLM agent의 multi-session long-term memory를 위해 conversation에서 중요한 사실을 추출하고, 기존 memory와 충돌/중복을 관리하며, query-time에 필요한 memory만 검색하는 production-oriented memory architecture이고, Mem0g는 이를 graph memory로 확장한 변형이다.

이 논문을 지금 볼 가치가 있는 이유는 다음과 같음.

  • agent/RAG 시스템에서 long-context만으로 해결하기 어려운 persistent personalization 문제를 정면으로 다룬다.
  • memory를 단순 vector retrieval이 아니라 추출, 갱신, 삭제, 검색의 lifecycle로 설계한다.
  • full-context baseline, RAG baseline, 기존 memory system, commercial memory provider와 함께 accuracy / latency / token cost를 비교한다.
  • Mem0와 Mem0g의 결과 차이를 통해 “graph memory가 항상 좋은가”라는 질문에 꽤 실용적인 답을 준다.
  • 실제 서비스 관점에서 중요한 p50 / p95 latency, token consumption, memory construction overhead를 같이 본다.

내가 보기엔 이 논문의 핵심 메시지는 단순하다. AI agent memory는 더 큰 context window가 아니라, 무엇을 장기 상태로 승격할지 결정하는 state management 문제다. Context를 많이 넣는 것은 쉬운 upper bound에 가깝다. 어려운 문제는 적은 token으로, 낮은 latency로, 오래된 사실과 새 사실의 충돌을 관리하면서, 답변에 필요한 정보만 안정적으로 꺼내는 것이다.

1. Problem Setting

1-1. Problem definition

이 논문이 겨냥하는 문제는 multi-session conversational AI에서 long-term coherence를 유지하는 것이다. 사용자는 여러 날, 여러 주, 혹은 여러 달에 걸쳐 agent와 상호작용할 수 있다. 이때 agent가 이전 대화에서 나온 선호, 제약, 목표, 사건, 일정, 관계를 잊으면 사용자 경험은 급격히 나빠진다.

예를 들어 사용자가 예전에 “나는 vegetarian이고 dairy-free다”라고 말했는데, 다음 세션에서 agent가 치즈가 들어간 식당을 추천하면 memory failure다. 이 문제는 단순한 retrieval miss가 아니다. 세션 간 상태가 유지되지 않았고, 중요한 정보가 장기 memory로 승격되지 않았으며, 답변 시점에 관련 memory가 prompt에 들어오지 않은 것이다.

Mem0가 보는 memory problem은 다음 세 단계로 나뉜다.

  1. Extraction: 새 대화에서 무엇이 장기적으로 저장할 만한 정보인가?
  2. Update / Consolidation: 새 정보가 기존 memory와 중복, 보완, 충돌, 무관 중 어디에 해당하는가?
  3. Retrieval: 현재 query에 답하기 위해 어떤 memory만 context로 가져와야 하는가?

즉 memory는 “대화 로그를 저장하는 것”이 아니다. conversation stream을 지속적으로 읽으면서, agent가 나중에 재사용할 수 있는 compact state로 바꾸는 과정이다.

1-2. Why previous approaches are insufficient

기존 접근은 크게 세 방향으로 볼 수 있다.

첫째, full-context processing이다. 가장 단순한 방식은 모든 conversation history를 context window에 넣는 것이다. 정확도 측면에서는 강한 baseline이 될 수 있다. 실제로 이 논문의 전체 J score에서도 full-context는 가장 높은 점수를 기록한다. 하지만 평균 conversation이 26k tokens 수준으로 커지면 매 query마다 전체 대화를 읽어야 하므로 token cost와 tail latency가 빠르게 커진다. production chatbot이나 assistant에서는 이 방식이 계속 유지되기 어렵다.

둘째, standard RAG over conversation chunks다. 대화 전체를 고정 길이 chunk로 나누고, query와 유사한 chunk를 top-k로 가져오는 방식이다. 구현은 쉽지만 memory의 단위가 너무 거칠다. 사용자의 선호 한 줄을 찾기 위해 주변 대화 전체가 같이 들어올 수 있고, 반대로 중요한 사실이 chunk boundary나 embedding similarity 문제로 빠질 수 있다. 또한 chunk size와 k를 키울수록 latency와 noise가 같이 증가한다.

셋째, 기존 memory-augmented systems다. MemGPT, MemoryBank, ReadAgent, A-Mem, LangMem, Zep 같은 시스템은 각각 memory abstraction, summarization, graph, retrieval mechanism을 갖고 있다. 하지만 논문 기준으로는 accuracy, latency, token cost, update freshness 사이의 균형이 충분하지 않다. 특히 memory가 늘어날수록 retrieval latency가 커지거나, graph construction이 비동기적으로 오래 걸리거나, OpenAI memory처럼 benchmark를 위해 selective retrieval이 아닌 전체 추출 memory를 넣어야 하는 제약이 생긴다.

Mem0의 문제의식은 여기서 나온다. long-term memory는 단순히 “더 많이 저장”하거나 “더 길게 넣기”가 아니라, 대화에서 fact를 뽑고, 기존 fact와 비교하고, 불필요한 context를 제거한 뒤, query-time에 필요한 state만 주입하는 memory management 문제다.

2. Core Idea

2-1. Main contribution

Mem0의 핵심 기여는 세 가지로 정리할 수 있다.

첫째, incremental memory extraction and update pipeline이다. Mem0는 새 message pair가 들어올 때마다 candidate memory를 추출하고, 기존 memory와 비교해 ADD / UPDATE / DELETE / NOOP 중 하나를 수행한다. 이때 별도 classifier를 두기보다 LLM의 function calling / tool call 능력을 사용한다.

둘째, natural-language memory와 graph memory의 분리된 설계다. base Mem0는 자연어 fact 형태의 memory를 dense embedding 기반으로 저장하고 검색한다. Mem0g는 entity와 relation triplet을 추출해 directed labeled graph로 저장한다. 이 둘을 분리해 비교했다는 점이 중요하다. graph memory가 더 구조적이라고 해서 항상 더 좋은 것은 아니며, task type에 따라 cost-benefit이 달라진다.

셋째, deployment metric을 함께 평가한다. 이 논문은 LOCOMO benchmark에서 F1, BLEU-1, LLM-as-a-Judge score만 보는 것이 아니라, memory token consumption, search latency, total response latency를 함께 측정한다. AI agent memory는 논문 점수만 높아서는 부족하고, 실제 interactive setting에서 빠르게 retrieval되어야 한다는 점을 반영한다.

2-2. Design intuition

Mem0의 설계 직관은 인간 기억에 대한 단순한 비유에서 출발하지만, 실제 구현은 꽤 engineering-oriented다. 사람은 모든 대화를 verbatim으로 기억하지 않는다. 중요한 사실, 선호, 사건, 관계만 압축해서 기억하고, 나중에 필요한 시점에 다시 떠올린다. Mem0는 이 과정을 LLM agent system으로 옮긴다.

가장 중요한 선택은 memory unit을 raw chunk가 아니라 salient fact로 둔다는 점이다. 예를 들어 전체 대화 chunk를 저장하는 대신, “Alice prefers vegetarian restaurants” 같은 atomic memory를 저장한다. 그러면 answer-time prompt는 훨씬 짧아진다. 하지만 이 방식에는 새로운 문제가 생긴다. fact extraction이 틀릴 수 있고, 기존 memory와 충돌할 수 있으며, 시간이 지나며 더 최신 정보가 들어올 수 있다. 그래서 Mem0는 extraction만이 아니라 update operation을 architecture의 핵심에 둔다.

Mem0의 extraction phase는 다음처럼 볼 수 있다.

\[P = (S, \{m_{t-m}, ..., m_{t-2}\}, m_{t-1}, m_t), \quad \Omega = \phi(P)\]

여기서 $S$는 conversation summary, $m_{t-1}$과 $m_t$는 새로 들어온 message pair, ${m_{t-m}, …, m_{t-2}}$는 최근 대화 window, $\phi$는 LLM 기반 extraction function, $\Omega$는 추출된 candidate memories다.

이 식이 중요한 이유는 Mem0가 새 message만 보고 memory를 뽑지 않는다는 점이다. summary는 전체 conversation의 global context를 주고, recent messages는 아직 summary에 잘 압축되지 않은 temporal/local context를 준다. 즉 extraction 단계부터 “현재 발화가 장기 memory로 저장될 만한 의미를 갖는가”를 주변 맥락 속에서 판단한다.

내가 보기엔 Mem0의 가장 중요한 설계 감각은 memory를 retrieval problem으로만 보지 않고 write path와 read path를 모두 설계했다는 점이다. RAG는 대개 read path가 중심이다. 어떤 chunk를 가져올 것인가. 반면 long-term agent memory에서는 write path가 더 중요할 수 있다. 무엇을 저장할지 잘못 결정하면, 이후 retrieval이 아무리 좋아도 잘못된 state를 꺼내게 된다.

3. Architecture / Method

3-1. Overview

Item Description
Goal multi-session conversation에서 agent가 중요한 사용자/상황 정보를 persistent memory로 유지하게 하는 것
Base method Mem0: natural-language memory extraction, vector-based similar memory retrieval, LLM tool-call update
Graph variant Mem0g: entity-relation triplet 기반 directed labeled graph memory
Main lifecycle extraction -> update/consolidation -> retrieval -> answer generation
Update operations ADD, UPDATE, DELETE, NOOP
Evaluation focus LOCOMO accuracy + token consumption + p50/p95 latency
Key trade-off full-context의 높은 품질 vs memory-based system의 낮은 latency/token cost

Mem0는 크게 write path와 read path로 나눌 수 있다.

  • Write path: 새 대화가 들어오면 salient memory를 추출하고, 기존 memory와 비교해 memory store를 갱신한다.
  • Read path: 질문이 들어오면 query와 관련된 memory만 검색해 answer generation prompt에 넣는다.

이 구분이 중요하다. 많은 RAG system은 read path만 설계한다. 하지만 agent memory에서는 write path가 망가지면, 잘못된 memory가 장기 상태로 남는다. Mem0는 ADD / UPDATE / DELETE / NOOP를 explicit operation으로 두면서, memory store를 계속 정리하려고 한다.

3-2. Module breakdown

1) Incremental message-pair ingestion

Mem0는 conversation 전체를 batch로 다시 처리하는 대신, 새 interaction unit을 incremental하게 처리한다. 논문은 새 message pair $(m_{t-1}, m_t)$를 입력으로 둔다. 보통 user message와 assistant response가 하나의 pair가 된다.

이 설계는 production setting에서 자연스럽다. 실제 agent는 매 turn 이후 memory를 업데이트해야 한다. 하루치 대화를 다 모아서 batch summary를 만드는 방식은 offline 분석에는 좋지만, 사용자가 바로 다음 turn에서 이전 정보를 기대하는 interactive assistant에는 느릴 수 있다.

다만 pair 단위 처리는 memory granularity를 어떻게 잡을지에 민감하다. 한 turn 안에 여러 사실이 섞여 있을 수도 있고, 반대로 한 사실이 여러 turn에 걸쳐 완성될 수도 있다. Mem0는 이를 보완하기 위해 extraction prompt에 conversation summary와 최근 message window를 함께 넣는다.

2) Context-aware memory extraction

extraction 단계에서는 세 가지 입력을 함께 본다.

  1. 전체 conversation을 요약한 summary $S$
  2. 최근 message sequence ${m_{t-m}, …, m_{t-2}}$
  3. 현재 message pair $(m_{t-1}, m_t)$

논문은 summary generation을 asynchronous module로 둔다. 즉 memory extraction main path를 막지 않으면서 summary를 주기적으로 refresh한다. 이 구조는 실무적으로 중요하다. summary가 매 turn synchronous하게 생성되면 latency가 올라가고, summary가 너무 늦게 갱신되면 context가 낡아진다. Mem0는 두 문제 사이에서 summary를 background context로 쓰는 쪽을 택한다.

extraction function $\phi$는 LLM으로 구현된다. 출력은 candidate memory set $\Omega = {\omega_1, \omega_2, …, \omega_n}$다. 여기서 memory는 raw text chunk가 아니라 future interaction에서 재사용할 수 있는 salient fact다.

3) Similar-memory retrieval for update

candidate memory가 나오면 바로 저장하지 않는다. 먼저 vector DB에서 top $s$개의 semantically similar existing memories를 찾는다. 이 similar memory set과 candidate fact를 LLM에 넘기고, LLM이 memory operation을 고른다.

논문 설정에서는 contextual reference로 이전 message $m = 10$개, similar memory 비교 대상으로 $s = 10$개를 사용한다. LLM operation에는 GPT-4o-mini가 사용되고, dense embedding 기반 vector DB가 update phase의 similarity search를 담당한다.

이 부분이 Mem0와 단순 extraction-based memory의 차이다. 단순히 “중요해 보이는 문장”을 append-only로 저장하면 중복과 contradiction이 빠르게 쌓인다. Mem0는 새 fact가 기존 memory와 어떤 관계인지 판단한다.

4) ADD / UPDATE / DELETE / NOOP as memory operations

Mem0의 memory update는 네 가지 operation으로 정리된다.

Operation Meaning Example intuition
ADD 기존 memory에 없는 새 사실을 추가 “User started learning Korean.”
UPDATE 기존 memory를 더 풍부하거나 최신 정보로 보강 “User likes Italian food” -> “User likes vegetarian Italian food”
DELETE 새 정보와 충돌하는 기존 memory 제거 “User lives in Seoul” -> “User moved to Busan”
NOOP 이미 있거나 중요하지 않은 정보라 변경하지 않음 잡담, 중복, 일시적 정보

이 설계는 간단해 보이지만 agent memory에서는 매우 중요하다. memory system은 단순한 vector store가 아니라 mutable state store다. 상태 저장소에는 update semantics가 있어야 한다. 특히 사용자 선호나 일정처럼 시간이 지나며 바뀌는 정보는 append-only retrieval만으로는 다루기 어렵다.

다만 DELETE는 위험한 operation이기도 하다. 실제 product에서는 물리 삭제보다 invalidation, tombstone, provenance-preserving update가 더 안전할 수 있다. 논문 appendix의 algorithm은 DELETE를 포함하지만, Mem0g에서는 obsolete relationship을 물리 제거하지 않고 invalid 표시해 temporal reasoning을 가능하게 한다는 점이 더 실무적으로 설득력 있다.

5) Mem0g: graph-based memory extension

Mem0g는 base Mem0에 graph memory를 붙인 변형이다. memory는 directed labeled graph $G = (V, E, L)$로 표현된다.

  • $V$: entity node. 예: Alice, San Francisco, conference, project
  • $E$: relation edge. 예: lives_in, prefers, owns, happened_on
  • $L$: node type label. 예: Person, Location, Event

각 entity node는 entity type, embedding vector, metadata/timestamp를 가진다. relation은 $(v_s, r, v_d)$ 형태의 triplet으로 표현된다. Mem0g의 extraction은 두 단계다.

  1. LLM이 text에서 entity와 type을 추출한다.
  2. LLM이 entity pair 사이의 meaningful relationship을 생성한다.

새 relation triplet이 들어오면 source/destination entity embedding을 계산하고, 기존 node 중 similarity threshold $t$를 넘는 node가 있는지 확인한다. node가 있으면 재사용하고, 없으면 새 node를 만든다. conflict가 발견되면 LLM-based update resolver가 obsolete relationship을 판단한다. 중요한 점은 관계를 바로 지우지 않고 invalid로 표시할 수 있다는 것이다. 이는 시간적으로 바뀐 사실을 추적해야 하는 memory system에 특히 유용하다.

6) Dual retrieval in Mem0g

Mem0g의 retrieval은 두 경로를 가진다.

  1. Entity-centric retrieval: query에서 주요 entity를 찾고, graph에서 해당 node와 연결된 incoming/outgoing relation을 탐색해 relevant subgraph를 만든다.
  2. Semantic triplet retrieval: query 전체를 dense embedding으로 인코딩하고, graph의 relation triplet text와 similarity를 계산해 threshold 이상 triplet을 가져온다.

이 dual retrieval은 targeted entity query와 broader conceptual query를 모두 다루기 위한 설계다. 구현 측면에서는 Neo4j를 graph database로 사용하고, LLM-based extractor/update module에는 GPT-4o-mini의 function calling capability를 활용한다.

내가 보기엔 Mem0g는 “graph가 더 똑똑하다”를 증명하기 위한 모듈이라기보다, long-term memory에서 어떤 query type이 relational structure를 필요로 하는가를 확인하기 위한 실험 장치에 가깝다. 결과도 이 해석에 맞다. temporal reasoning에서는 graph가 유리하지만, 단순 retrieval이나 일부 multi-hop에서는 natural-language dense memory가 더 효율적이다.

7) Comparison with RAG / full-context / memory providers

Approach Memory representation Strength Weakness
Full-context raw conversation 전체 정보 손실이 적고 quality upper bound에 가까움 token cost와 p95 latency가 큼
Standard RAG fixed-size conversation chunks 구현이 쉽고 범용적 chunk noise, boundary issue, larger context cost
Mem0 compact natural-language memories 낮은 latency와 token cost, update semantics extraction/update 품질이 LLM에 의존
Mem0g entity-relation graph + memories temporal/relational reasoning에 유리 graph construction, retrieval, maintenance overhead
Zep / LangMem 등 system별 memory abstraction production-oriented reference benchmark setting과 internal design에 따라 cost/latency 차이 큼

4. Training / Data / Recipe

4-1. Data

이 논문은 model weight를 새로 학습하는 논문이라기보다, memory system architecture와 evaluation recipe를 제안하는 논문이다. 핵심 dataset은 LOCOMO다.

LOCOMO는 long-term conversational memory를 평가하기 위해 설계된 benchmark로, 논문 기준 다음 특성을 가진다.

  • 10개의 extended conversations
  • conversation당 약 600 dialogues
  • conversation당 평균 약 26k tokens
  • multiple sessions로 분산된 대화
  • conversation당 평균 약 200 questions와 ground-truth answers
  • question category: single-hop, multi-hop, temporal, open-domain
  • adversarial category는 ground truth answer가 없어 이번 평가에서 제외

이 dataset 구성은 Mem0의 목표와 잘 맞는다. 단일 세션 QA가 아니라, 여러 session에 흩어진 사실을 기억하고, 때로는 시간 순서를 판단해야 하기 때문이다.

다만 dataset 규모는 크지 않다. 10개 conversation이라는 점은 반드시 limitation으로 봐야 한다. long-term memory 시스템은 domain, user behavior, memory density, time gap, privacy policy에 따라 성능이 크게 달라질 수 있다. LOCOMO는 좋은 stress test지만, 바로 production distribution 전체를 대표한다고 보기는 어렵다.

4-2. Training strategy

이 논문에는 일반적인 의미의 neural network training recipe가 없다. 대신 다음과 같은 memory operation recipe가 있다.

Component Paper setting / role
LLM for operations GPT-4o-mini
Context window for extraction previous messages $m = 10$
Similar memory candidates for update top $s = 10$
Base memory store natural-language memory + dense vector retrieval
Graph memory store Neo4j-based directed labeled graph
Mem0g extraction LLM-based entity extraction + relation triplet generation
Update interface LLM function/tool call selecting ADD / UPDATE / DELETE / NOOP

이 recipe의 본질은 prompt/program design이다. LLM을 classifier처럼 fine-tune하지 않고, function calling interface를 통해 memory operation selector로 사용한다. 장점은 빠르게 적용할 수 있다는 것이다. 단점은 memory quality가 prompt, LLM choice, function schema, retrieval 후보 품질에 강하게 의존한다는 것이다.

4-3. Baselines and evaluation recipe

비교군은 꽤 넓다.

  1. Established LOCOMO baselines: LoCoMo, ReadAgent, MemoryBank, MemGPT, A-Mem
  2. Open-source memory solution: LangMem
  3. RAG baselines: conversation을 chunk size 128, 256, 512, 1024, 2048, 4096, 8192로 나누고, $k = 1$ 또는 $k = 2$로 retrieval
  4. Full-context baseline: entire conversation history를 그대로 LLM context에 넣음
  5. Proprietary model system: OpenAI ChatGPT memory feature를 gpt-4o-mini 기준으로 평가
  6. Memory provider: Zep

RAG baseline에서 $k > 2$를 피한 이유도 중요하다. 평균 conversation length가 약 26k tokens이므로, 더 큰 k는 full-context와 가까워져 selective retrieval의 의미가 줄어든다.

평가 metric은 두 그룹으로 나뉜다.

Metric group Metrics Why it matters
Response quality F1, BLEU-1, LLM-as-a-Judge $J$ lexical overlap만으로는 factual correctness를 충분히 평가하기 어려움
Deployment memory/retrieved token consumption, search latency, total latency production agent에서는 latency와 token cost가 실제 병목

논문이 LLM-as-a-Judge를 추가한 이유는 타당하다. 예를 들어 정답이 “Alice was born in March”인데 모델이 “Alice was born in July”라고 답하면, lexical overlap은 높지만 사실은 틀렸다. long-term memory QA에서는 이런 오류가 치명적이다.

4-4. Engineering notes

내가 실무 관점에서 중요하게 본 engineering note는 네 가지다.

첫째, summary refresh가 asynchronous라는 점이다. long-term memory extraction에는 global context가 필요하지만, 매 turn summary를 synchronous하게 갱신하면 latency가 커진다. background summary는 quality와 latency 사이의 타협이다.

둘째, update 전에 similar memory를 retrieve한다는 점이다. candidate fact만 보고 ADD를 결정하면 중복 memory가 늘어난다. 기존 memory 후보를 함께 넣어야 UPDATE / DELETE / NOOP 판단이 가능하다.

셋째, OpenAI memory baseline의 측정 조건을 조심해야 한다. 논문은 OpenAI approach에 generated memories 전체를 answer context로 넣는 방식으로 평가했다고 설명한다. selective retrieval API가 없기 때문에 생기는 benchmark accommodation이다. 따라서 OpenAI total latency에는 memory pre-extraction/search 비용이 완전히 반영되어 있다고 보기 어렵다.

넷째, token metric이 두 종류라는 점이다. Table 2의 token 수는 answer-time context에 들어간 retrieved memory/chunk tokens다. 반면 Section 4.5의 7k / 14k / 600k tokens는 long-term memory store를 materialize하는 평균 token footprint에 가깝다. 이 둘을 혼동하면 안 된다.

5. Evaluation

5-1. Main results

먼저 overall deployment 비교를 보면 Mem0의 포지션이 잘 보인다.

Method Context / memory tokens Total p50 latency Total p95 latency Overall J
Full-context 26,031 9.870s 17.117s 72.90 +/- 0.19
Best RAG example, k=2, chunk 256 256 chunk 0.802s 1.907s 60.97 +/- 0.20
OpenAI 4,437 0.466s 0.889s 52.90 +/- 0.14
Zep 3,911 1.292s 2.926s 65.99 +/- 0.16
Mem0 1,764 0.708s 1.440s 66.88 +/- 0.15
Mem0g 3,616 1.091s 2.590s 68.44 +/- 0.17

여기서 핵심은 full-context가 여전히 가장 높은 Overall J를 기록한다는 점이다. 따라서 이 논문을 “Mem0가 full-context보다 정확하다”로 읽으면 안 된다. 정확한 해석은 Mem0/Mem0g가 full-context에 가까운 품질을 훨씬 낮은 token cost와 latency로 제공한다에 가깝다.

Full-context의 p95 total latency는 17.117s이고, Mem0는 1.440s다. 단순 계산으로는 p95 latency가 약 91.6% 낮다. answer-time context token도 26,031에서 1,764로 줄어든다. 이 차이는 interactive agent에서 매우 크다.

반면 Mem0g는 Mem0보다 Overall J가 높지만, latency와 token cost도 함께 증가한다. Mem0g의 p95 total latency는 2.590s이고, context/memory tokens는 3,616이다. 즉 graph memory는 성능을 올릴 수 있지만 공짜가 아니다.

5-2. Category-level results

LOCOMO question category별 결과를 보면 Mem0와 Mem0g의 성격 차이가 더 선명하다.

Category Strong result in paper Interpretation
Single-hop Mem0 J 67.13, Mem0g J 65.71 단일 사실 retrieval은 compact natural-language memory가 충분히 강함
Multi-hop Mem0 J 51.15, Mem0g J 47.19 graph가 항상 multi-hop을 개선하지 않음. dense memory가 더 효율적일 수 있음
Open-domain Zep J 76.60, Mem0g J 75.71, Mem0 J 72.93 external/open-domain 통합에서는 Zep이 약간 앞서고, Mem0g가 근접
Temporal Mem0g J 58.13, Mem0 J 55.51 event order와 temporal relation에는 graph memory가 유리

가장 흥미로운 부분은 Mem0g가 single-hop과 multi-hop에서 항상 우위가 아니라는 점이다. 직관적으로는 graph가 더 구조적이므로 multi-hop에 유리할 것 같지만, 논문 결과에서는 Mem0가 multi-hop J에서 더 높다. 저자들은 graph representation이 복잡한 integrative task에서 overhead나 redundancy를 만들 수 있다고 해석한다.

반대로 temporal reasoning에서는 Mem0g가 강하다. 시간 순서, event sequence, relative date를 다뤄야 할 때는 entity와 relation, timestamp가 더 직접적으로 도움이 된다. 즉 graph memory는 universal upgrade라기보다 temporal/relational query를 위한 specialized representation에 가깝다.

5-3. What really matters in the experiments

이 논문의 실험에서 내가 중요하게 본 포인트는 네 가지다.

첫째, full-context는 좋은 upper bound지만 production baseline은 아니다. 전체 대화를 넣으면 정보 손실이 적다. 그래서 quality는 높다. 하지만 p95 latency 17s 수준은 interactive assistant에서 부담이 크다. 특히 conversation이 더 길어질수록 비용은 더 커진다.

둘째, RAG chunk retrieval은 memory abstraction을 대체하지 못한다. Table 2에서 RAG는 chunk size와 k에 따라 성능이 많이 흔들린다. chunk가 커진다고 항상 좋아지는 것도 아니다. 대화 memory에서는 raw chunk보다 salient fact representation이 더 중요한 경우가 많다.

셋째, graph memory는 선택적으로 써야 한다. Mem0g는 Overall J를 올리고 temporal reasoning에 강하지만, Mem0보다 latency가 높고 single-hop/multi-hop에서 항상 낫지 않다. 따라서 production system에서는 모든 user memory를 graph로 밀어 넣기보다, 관계/시간/계획/프로젝트 구조가 중요한 domain에 graph를 붙이는 것이 더 합리적이다.

넷째, memory availability도 성능의 일부다. 논문은 Zep graph construction이 비동기 LLM call과 background processing 때문에 즉시 retrieval에서 지연될 수 있다고 관찰한다. 이는 중요하다. 좋은 memory를 만들더라도 바로 쓸 수 없다면 interactive setting에서는 약점이 된다.

5-4. Token and construction overhead

논문은 memory system overhead도 별도로 분석한다. 평균 memory store materialization 측면에서 Mem0는 conversation당 약 7k tokens, Mem0g는 약 14k tokens를 사용한다고 보고한다. 반면 Zep의 memory graph는 600k tokens를 넘는다고 설명한다. 이는 Zep이 node마다 abstractive summary를 cache하고 edge에도 facts를 저장하는 구조에서 redundancy가 생기기 때문이라고 분석한다.

이 숫자는 Table 2의 answer-time memory tokens와는 다른 metric이다. 하지만 둘 다 같은 메시지를 준다. long-term memory system에서는 “질문에 넣는 context”뿐 아니라, “memory store를 유지하기 위해 내부적으로 생성/저장하는 representation”도 cost다. production agent에서는 두 비용을 모두 봐야 한다.

6. Limitations

  1. LOCOMO 규모와 domain coverage가 제한적이다. 10개 extended conversation 기반 benchmark는 long-term memory stress test로 의미가 있지만, 실제 product traffic 전체를 대표한다고 보기는 어렵다. 고객지원, 의료, 금융, 개발 assistant, personal assistant마다 memory density와 risk profile이 다르다.

  2. LLM-based extraction/update 품질에 강하게 의존한다. Mem0는 GPT-4o-mini를 memory extractor, operation selector, graph extractor로 사용한다. 다른 LLM을 쓰거나 prompt를 바꾸면 extraction precision, hallucinated memory, deletion/update 품질이 달라질 수 있다.

  3. memory write error가 장기적으로 누적될 수 있다. 잘못 저장된 memory는 이후 retrieval에서 반복적으로 사용될 수 있다. 이는 일반 RAG의 one-time retrieval error보다 위험하다. hallucinated preference나 잘못된 user fact가 persistent state가 되는 문제는 더 깊게 다뤄야 한다.

  4. DELETE / UPDATE semantics는 production에서 더 조심해야 한다. 논문은 ADD / UPDATE / DELETE / NOOP를 제안하지만, 실제 서비스에서는 provenance, timestamp, confidence, source message, user visibility, restore mechanism이 필요하다. 개인화 memory를 조용히 삭제하거나 덮어쓰는 것은 auditability 측면에서 위험하다.

  5. Graph memory는 항상 좋은 선택이 아니다. Mem0g는 temporal reasoning에 강하지만, single-hop과 multi-hop 일부에서는 Mem0보다 낮은 결과를 보인다. 또한 graph construction과 retrieval latency가 더 크다. graph는 “고급 기능”이 아니라 query type에 따라 selective하게 켜야 하는 representation이다.

  6. LLM-as-a-Judge metric 의존성이 있다. J score는 lexical metrics보다 semantic correctness를 잘 잡을 수 있지만, judge model bias, prompt sensitivity, answer length policy에 영향을 받을 수 있다. production에서는 human eval, task-specific validators, user satisfaction signal과 함께 봐야 한다.

  7. OpenAI memory baseline은 해석이 까다롭다. 논문은 selective retrieval API가 없기 때문에 generated memories 전체를 context로 넣는 방식으로 평가한다. 이는 공정한 재현을 위한 선택이지만, 실제 ChatGPT memory product behavior와 완전히 같은 setting이라고 단정하면 안 된다.

  8. Privacy / security / consent 문제가 본문 중심은 아니다. long-term memory는 사용자 선호와 민감 정보를 지속적으로 저장할 수 있다. 어떤 정보를 저장하지 말아야 하는지, 사용자가 어떻게 확인/삭제할 수 있는지, multi-user environment에서 memory isolation을 어떻게 할지는 별도의 production design이 필요하다.

7. My Take

7-1. Why this matters for my work

내 관점에서 Mem0의 가장 큰 가치는 agent memory를 context extension이 아니라 state management로 재정의했다는 점이다. 최근 long-context LLM이 좋아지면서 “그냥 많이 넣으면 되지 않나”라는 생각을 하기 쉽다. 하지만 production agent에서는 context window보다 더 중요한 제약이 있다.

  • 매 query latency budget
  • token cost
  • stale memory 관리
  • conflicting user preference 처리
  • privacy와 consent
  • source/provenance 추적
  • multi-session personalization
  • memory retrieval failure 시 fallback

Mem0는 이 문제 중 일부를 꽤 명확한 architecture로 정리한다. 특히 ADD / UPDATE / DELETE / NOOP operation은 단순하지만 좋은 abstraction이다. memory를 append-only log로만 보지 않고, mutable knowledge base로 본다.

내가 agent/RAG pipeline에 이 아이디어를 가져간다면, 처음부터 graph memory로 가지는 않을 것 같다. 먼저 Mem0-style natural-language atomic memory + vector search + explicit update operation을 만들고, temporal/relational query가 실제로 병목인 domain에서만 graph memory를 붙일 것이다. 실험 결과도 이 전략을 지지한다.

7-2. Reuse potential

재사용 가치가 큰 부분은 다음과 같다.

1) Memory write path를 명시적으로 분리하기

대부분의 RAG system은 read path에 집중한다. 하지만 personal agent라면 turn 이후에 memory write path가 필요하다.

실무적으로는 다음 구조를 둘 수 있다.

  1. user/assistant turn 종료
  2. memory extraction prompt 실행
  3. candidate facts 생성
  4. similar memories retrieval
  5. ADD / UPDATE / DELETE / NOOP 결정
  6. memory store update
  7. source message id, timestamp, confidence 저장

이 구조는 domain-specific memory에도 바로 쓸 수 있다. 예를 들어 developer assistant에서는 “사용자가 선호하는 stack”, “프로젝트 구조”, “반복되는 bug context”를 memory로 저장할 수 있다. customer support에서는 “고객의 제품 구성”, “이전 ticket”, “선호 연락 방식”이 memory가 된다.

2) Atomic natural-language memory부터 시작하기

Mem0 결과를 보면, natural-language memory는 latency와 성능 균형이 좋다. graph는 temporal reasoning에 좋지만 비용이 있다. 따라서 MVP나 production v1에서는 다음 원칙이 합리적이다.

  • raw conversation chunk를 그대로 저장하지 말 것
  • 너무 추상적인 summary만 저장하지 말 것
  • answer에 바로 넣을 수 있는 atomic memory sentence를 저장할 것
  • timestamp와 source를 반드시 붙일 것
  • 최신성, confidence, user-confirmed 여부를 metadata로 관리할 것

3) Graph memory는 selective하게 적용하기

Graph memory가 필요한 domain은 분명 있다.

  • 사용자의 가족/팀/조직 관계
  • 프로젝트 dependency
  • 여행 일정과 event order
  • 금융 거래와 entity relationship
  • 의료 history와 약물/증상 관계
  • long-running task plan과 상태 전이

하지만 모든 memory를 graph로 만들 필요는 없다. graph는 relation query가 많고, time/order/conflict reasoning이 중요하며, maintenance cost를 감당할 수 있을 때 가치가 커진다.

4) Memory deletion보다 invalidation을 선호하기

사용자 정보는 바뀐다. “서울에 산다”가 “부산으로 이사했다”로 바뀔 수 있다. 이때 예전 memory를 완전히 지우면 temporal question에는 답하기 어려워진다. 반대로 둘 다 active로 두면 현재 상태가 모호해진다.

그래서 production memory에서는 다음 metadata가 필요하다고 본다.

Metadata Purpose
source message id memory provenance 추적
created_at / updated_at temporal reasoning
valid_from / valid_to outdated memory 관리
confidence extractor uncertainty 반영
user_confirmed 사용자가 직접 확인한 memory 구분
privacy label 저장/검색/삭제 정책 적용
status active, obsolete, deleted, user_hidden 등

Mem0g가 obsolete relationship을 invalid로 표시하는 방향은 이 점에서 좋다. long-term memory는 현재 상태만이 아니라 상태 변화의 history를 다뤄야 한다.

7-3. Follow-up papers

후속으로 같이 읽으면 좋은 논문/시스템은 다음과 같다.

  • LOCOMO: long-term conversational memory benchmark 자체를 이해하기 위한 출발점.
  • MemGPT: LLM을 operating system처럼 보고 memory hierarchy를 설계하는 관점.
  • MemoryBank: long-term memory와 forgetting mechanism을 다루는 초기 memory-augmented LLM agent 계열.
  • ReadAgent: long document를 gist memory와 selective lookup으로 처리하는 human-inspired reading pipeline.
  • A-Mem: LOCOMO baseline으로 등장하는 memory architecture. Mem0와 비교해 update/retrieval 구조를 보면 좋음.
  • Zep: production memory provider 관점에서 graph memory와 operational overhead를 비교할 때 유용.
  • LongMemEval / BEAM 계열 benchmark: LOCOMO 외의 longer horizon memory evaluation을 확인할 때 필요.

8. Summary

  • Mem0는 LLM agent의 long-term memory를 extraction -> update -> retrieval lifecycle로 설계한 production-oriented memory architecture다.
  • 핵심은 raw conversation chunk가 아니라 salient fact를 저장하고, ADD / UPDATE / DELETE / NOOP로 memory store를 관리하는 것이다.
  • Mem0g는 entity-relation graph를 추가해 temporal reasoning에는 강하지만, 모든 query type에서 base Mem0보다 좋은 것은 아니다.
  • full-context는 높은 quality upper bound를 제공하지만, Mem0는 훨씬 낮은 p95 latency와 token cost로 좋은 trade-off를 만든다.
  • 실무적으로는 natural-language atomic memory부터 시작하고, graph memory는 temporal/relational reasoning이 실제 병목일 때 selective하게 붙이는 전략이 좋아 보인다.

댓글남기기