Mem0 Paper review

Mem0: Building Production-Ready AI Agents with Scalable Long-Term Memory

https://arxiv.org/abs/2504.19413

Mem0는 Mem0 팀(research@mem0.ai)에서 만든 장기 메모리 시스템이다.

2025년 4월 28일에 나왔고, 저자 5명에 23쪽이다. 학회 발표는 없고 arXiv에만 있다.

대화에서 사실을 뽑아서 메모리에 추가, 수정, 삭제하는 방식이고, 제목에 production-ready가 들어간 것처럼 정확도보다 지연이랑 비용을 앞에 내세운다.

나중에 볼 Rate-Distortion 논문에서는 되돌릴 수 없는 압축을 문제로 보는데, Mem0가 딱 요약으로 덮어쓰는 비가역 설계다. ReFind 비교표에서 25.1로 낮게 나오는 것도 이거랑 관련이 있을 것 같다.

좀 더 자세히 알아보자.

1. Introduction

LLM은 컨텍스트 창 크기가 정해져 있어서, 세션이 끊기거나 창이 넘치면 정보를 이어갈 방법이 없다.

Figure 1 예시가 이 논문의 동기다. 사용자가 채식이고 유제품을 못 먹는다고 말했는데, 다음 세션에서 시스템이 그걸 잊고 맞지 않는 추천을 한다. 메모리가 있으면 그 조건이 유지된다.

2. Mem0

사실을 뽑는 추출 단계와, 그걸 메모리에 반영하는 갱신 단계로 나뉜다.

Mem0 아키텍처 (논문 Figure 2)

2.1 추출 단계

새 메시지 쌍 (m_{t-1}, m_t)가 들어오면 시작한다. 보통 사용자 발화랑 어시스턴트 응답 한 쌍이다.

맥락은 두 가지를 같이 준다.

  • 대화 요약 S : DB에서 가져온다. 전체 대화 이력을 요약한 것
  • 최근 메시지 {m_{t-m}, ..., m_{t-2}} : m은 최근 몇 개를 볼지 정하는 하이퍼파라미터

S로 전체 주제를 알고, 최근 메시지로 아직 요약에 안 들어간 세부를 챙긴다고 한다.

요약은 비동기로 따로 돌린다. 메인 파이프라인이랑 별개로 주기적으로 갱신해서, 추출할 때 최신 맥락을 쓰면서도 지연이 안 생기게 했다.

2.2 갱신 단계

뽑은 사실마다 기존 메모리랑 비교한다.

벡터 임베딩으로 비슷한 기존 메모리 상위 s개를 꺼내고, 새 사실이랑 같이 LLM에게 tool call로 넘긴다. LLM이 네 가지 중 하나를 고른다.

  • ADD : 같은 뜻의 메모리가 없으면 새로 만든다
  • UPDATE : 기존 메모리에 정보를 보탠다
  • DELETE : 새 정보랑 모순되는 메모리를 지운다
  • NOOP : 아무것도 안 한다

따로 분류기를 두지 않고 LLM이 직접 판단하게 했다.

2.3 Mem0g

메모리를 방향이 있는 레이블 그래프 G = (V, E, L)로 둔 버전이다.

  • 노드 V : 엔티티 (Alice, San_Francisco)
  • 엣지 E : 관계 (lives_in)
  • 레이블 L : 노드 타입 (Alice → Person, San_Francisco → City)

엔티티 노드마다 타입, 임베딩 벡터, 생성 타임스탬프가 있고, 관계는 (v_s, r, v_d) 트리플이다.

추출은 두 단계다.

  1. 엔티티 추출기가 사람, 장소, 사물, 개념, 사건, 속성을 뽑는다
  2. 관계 생성기가 엔티티 쌍마다 관계가 있는지 보고 트리플을 만든다

갱신할 때는 충돌을 찾아서 해소하는 과정이 돈다.

3. 평가

LOCOMO 벤치마크에서 여섯 종류의 베이스라인이랑 비교한다. 메모리 증강 시스템, 청크 크기랑 k를 바꾼 RAG, 전체 컨텍스트, 오픈소스 메모리(LangMem), 상용 모델(OpenAI ChatGPT 메모리), 메모리 플랫폼(Zep)이다.

지표는 F1, BLEU-1(B1), LLM-as-a-Judge(J) 세 가지다.

3.1 질문 유형별

방법 Single Hop (J) Multi-Hop (J) Open Domain (J) Temporal (J)
A-Mem* 39.79 18.85 54.05 49.91
LangMem 62.23 47.92 71.12 23.43
Zep 61.70 41.35 76.60 49.31
OpenAI 63.79 42.92 62.29 21.71
Mem0 67.13 51.15 72.93 55.51
Mem0g 65.71 47.19 75.71 58.13

표를 보면,

  1. 그래프 버전이 항상 좋은 건 아니다. Mem0g는 temporal(58.13)이랑 open-domain(75.71)에서 앞서는데, multi-hop에서는 Mem0보다 낮다(47.19 vs 51.15). 논문은 그래프를 탐색하는 오버헤드나 중복 때문일 수 있다고 한다.
  2. temporal에서 OpenAI가 크게 낮다. 원인은 프롬프트로 시키는데도 만들어진 메모리 대부분에 타임스탬프가 빠져 있었다고 한다.
  3. open-domain은 Zep이 76.60으로 Mem0g(75.71)보다 조금 높다. 논문도 Zep이 작지만 의미 있는 차이로 앞선다고 인정한다.

-> 2번을 보면 시간 정보를 저장할 때 안 넣으면 나중에 시간 질문은 못 푸는 것 같다.

3.2 지연과 비용

방법 메모리 토큰 검색 p50 검색 p95 전체 p50 전체 p95 전체 J
Full-context 26,031 — — 9.870 17.117 72.90
A-Mem 2,520 0.668 1.485 1.410 4.374 48.38
LangMem 127 17.99 59.82 18.53 60.40 58.10
Zep 3,911 0.513 0.778 1.292 2.926 65.99
OpenAI 4,437 — — 0.466 0.889 52.90
Mem0 1,764 0.148 0.200 0.708 1.440 66.88
Mem0g 3,616 0.476 0.657 1.091 2.590 68.44

이 논문이 제일 내세우는 부분이다.

J 점수는 Full-context가 72.90으로 제일 높다. 대화를 전부 넣으면 제일 잘 맞힌다. 대신 p95가 17.1초고 토큰이 26,031개다.

Mem0는 J를 72.90 → 66.88로 6점 정도 내주고, p95를 17.1초 → 1.44초로 줄인다. 토큰은 26,031 → 1,764다. abstract에 나오는 “p95 지연 91% 감소, 토큰 90% 이상 절감”이 여기서 나온 숫자다.

LangMem은 메모리 토큰을 127개까지 줄였는데 p95가 59.82초다. 토큰이 적다고 빠른 건 아니다.

4. 지금 관점: 왜 ReFind 표에서 25.1이었나

Mem0 논문만 보면 좋은 시스템이다. 그런데 ReFind의 6개 벤치마크 표에서는 Mem0가 25.1로 BM25-RAG(48.8)의 절반이었다.

왜 이렇게 다른지 생각해보면,

  1. 벤치마크가 다르다. Mem0 논문은 LOCOMO 하나로만 평가했다. ReFind는 여섯 개를 썼고, FC-MH(다중홉 사실 통합)에서 Mem0는 2.0이었다. LOCOMO는 대화 QA 위주라 Mem0가 잘하는 단일홉 사실 찾기랑 잘 맞는다.
  2. 되돌릴 수 없는 설계다. Mem0는 대화에서 사실만 뽑고 원문은 남기지 않는다. Rate-Distortion 논문 용어로 하면 P-rev 위반이고, 질문이 오기 전에 뭐가 중요한지 LLM이 정하니까 P-q도 위반이다. 추출에서 빠진 세부는 나중에 복구가 안 된다.
  3. 대신 지연은 확실히 빠르다. 검색 p95 0.2초다. Zep 0.778초, A-Mem 1.485초다. 매 턴 메모리를 봐야 하는 챗봇에서는 무시하기 어려운 차이다.

-> DELETE가 특히 걸린다. 모순이라고 판단해서 지웠는데 그 판단이 틀렸으면 되돌릴 방법이 있나?? 앞에서 본 Zep은 지우지 않고 t_invalid를 찍는 쪽으로 풀었다.

정리하면 Mem0가 맞는 곳은 이렇다.

  • 사용자 프로필이나 선호처럼 사실로 줄여도 괜찮은 것
  • 지연 여유가 적은데 매 턴 메모리를 봐야 하는 경우
  • 시간 추론 (Mem0g 쪽)

반대로 조심해야 할 곳은 이렇다.

  • 나중에 원문 세부가 필요한 것
  • 여러 사실을 엮어야 하는 다중홉 질문
  • 잘못 지우면 큰일 나는 도메인

-> 둘을 섞으면 어떨까 싶다. Mem0로 뽑은 사실은 빠르게 쓰고, 원문은 따로 보관해뒀다가 사실로 답이 안 나오면 원문을 검색하는 식이다. Rate-Distortion 논문의 다중 충실도(P-fid)가 이런 모양이다. Mem0의 추출을 버리는 게 아니라 되돌릴 수 있게 만드는 것이다.

5. Conclusion

고정된 컨텍스트 창 문제를 두 가지 구조로 푼다.

Mem0는 단순한 질문에서 빠르게 검색하고 토큰이랑 연산을 아낀다. Mem0g는 그래프로 관계를 정리해서 복잡한 사건 순서나 맥락을 엮는 데 쓴다.

LOCOMO 기준으로 단일홉 5%, 시간 11%, 다중홉 7% 상대 개선이고, full-context보다 p95 지연이 91% 줄었다고 한다.

여태까지 메모리 시스템들이 정확도를 올리는 데 집중했다면, 이 논문은 J 6점을 내주고 지연을 12배 줄이는 쪽을 택했다. 그게 맞는지는 서비스마다 다를 것 같다. 초당 수천 건을 처리해야 하면 맞고, 정확도가 먼저면 아니다.

다음은 From Human Memory to AI Memory다. 사람의 기억 분류에서 출발해서, AI 메모리를 대상·형태·시간 세 축으로 8분면에 나누는 서베이다.

Leave a comment