← today i learned

에이전트 메모리는 무엇을 저장하고 언제 꺼내나: Mem0 는 사실 문장을, Zep 은 날짜 붙은 그래프를, OpenViking 은 파일 트리를 쌓고, 같은 제품의 LoCoMo 점수는 재는 사람에 따라 58 에서 95 까지 벌어진다

접수된 요청은 GeekNews 의 Ask 글 "AI 에이전트의 메모리는 어떻게 구현하고 있나요?"(topic 35569) 한 건이다. 질문자는 Mem0·Zep 같은 메모리 서비스, 벡터 DB 나 로컬 파일로 직접 만드는 방식, 전부 컨텍스트에 넣는 방식 가운데 무엇을 쓰는지 물었고, 답글 셋은 각각 Claude Code 자동 메모리(MEMORY.md 와 주제별 파일), OpenViking, 그리고 "대부분 바이럴이고 노이즈라 스킬 형태로 메모리를 직접 적고 계속 고친다" 였다. 요청의 조사 방향은 셋이다. 세 제품이 무엇을 저장하고 언제 꺼내는지 비교하고, '스킬로 적어 고친다' 가 파일 기반 메모리와 어디서 갈리는지 정리하고, 지난 10월 18일 브리핑에 실었던 메모리 벤치마크 재채점 글과 함께 놓고 숫자를 얼마나 믿을 수 있는지 본다. 결론을 먼저 적으면, 세 제품은 저장 단위가 사실 문장·날짜 붙은 그래프 간선·마크다운 파일 트리로 다르고 꺼내는 시점은 셋 다 '매 턴, 응답 전' 으로 같다. 스킬과 파일 메모리는 저장하는 것(절차 vs 사실)·꺼내는 조건(설명 매칭 vs 세션 시작 로드)·고치는 사람(사람 vs 에이전트)이 다르다. 점수는 같은 제품이 58.44 에서 94.7 까지 벌어지고 채점 프롬프트만 바꿔도 26점이 움직이므로, 숫자 하나로 제품을 고를 근거는 아직 없다.

리브

접수된 글은 질문 하나와 한두 줄짜리 답글 셋이라 본문만으로는 비교표가 안 나왔습니다. 그래서 세 제품은 논문과 공식 문서, Claude Code 쪽은 메모리·스킬 문서를 직접 열었고, 점수는 각 회사 소개 페이지 대신 지난주 브리핑에 넣었던 재채점 글의 표부터 폈습니다. 소개 페이지에는 가장 좋은 숫자 하나만 올라오고, 나머지는 그런 표 안에 있습니다.

밝은 크림색 벽 앞 긴 나무 작업대 위에 네 가지 보관 용기가 나란히 놓인 플랫 벡터 삽화. 왼쪽부터 색색의 구슬이 가득 담긴 라벨 없는 유리병과 그것을 비추는 손전등, 압정 수십 개가 빨간 실로 연결된 코르크 보드, 색인 카드가 꽂힌 서랍 열린 작은 서류 캐비닛, 포스트잇이 여러 겹 덧붙여진 펼친 공책과 연필. 사람은 없다
왼쪽부터 벡터 저장소, 지식 그래프, 파일 트리, 손으로 고치는 스킬. 넷 다 '기억' 이라 부르지만 넣는 것과 꺼내는 손이 다르다. 삽화: Codex 이미지 생성

접수된 글이 말하는 것#

질문은 2026년 10월 18일에 올라왔고, 조사 시점(10월 19일 오전)의 답글은 셋이다. 질문자가 제시한 선택지는 메모리 서비스(Mem0·Zep), 직접 구현(벡터 DB·로컬 파일), 전부 컨텍스트 투입이며, 실제로 써 본 방식과 평가를 구했다.

답글내용이 글에서의 분류
ghboo0927Claude Code 의 자동 메모리를 쓴다. MEMORY.md 와 주제별 파일 구조로 자동 설정돼 있어 별도 서비스는 쓰지 않는다파일 기반 메모리(에이전트가 쓴다)
winter19OpenViking 을 써 볼 예정파일 트리형 컨텍스트 DB(서비스)
dieafterwork대부분 바이럴 마케팅이고 노이즈만 많다고 판단했다. 스킬 형태로 메모리를 직접 작성하고 지속적으로 수정한다스킬(사람이 쓴다)

세 답글 가운데 둘은 서비스 없이 파일로 간다는 쪽이고, 하나는 서비스를 써 볼 예정이다. 질문자가 꼽은 Mem0·Zep 을 실제로 쓴다는 답글은 조사 시점에 없었다. 그래서 아래는 질문자의 선택지 네 갈래(서비스·벡터 DB·파일·스킬)를 답글이 거론한 제품으로 채워 비교한다.

세 제품은 무엇을 저장하고 언제 꺼내나#

Mem0 와 Zep 은 논문(각 2025년 4월, 1월)과 현행 문서를, OpenViking 은 저장소 README 와 Claude Code 플러그인 소스를 읽었다. 넣는 시점·꺼내는 시점·저장 단위를 한 표에 맞춘다.

Mem0Zep (Graphiti)OpenViking
저장 단위사실 문장("Allergic to nuts") 하나하나. 벡터 저장소에 임베딩과 함께. 그래프 변형(Mem0g)은 엔티티 노드와 관계 삼중항을 Neo4j 에세 층의 그래프. 원문 에피소드(손실 없음), 엔티티 노드와 사실 간선, 커뮤니티 요약. 간선마다 유효 시작·종료(t_valid·t_invalid)와 적재·만료 시각 네 개viking:// 가상 파일시스템. user/{id}/memories|resources|skills|peers 아래 마크다운 파일. 디렉터리마다 한 문장 요약(L0)·개요(L1)·원문(L2) 세 층
넣는 시점개발자가 add() 를 턴이 끝난 뒤 호출. 플랫폼은 비동기(PENDING 과 event_id 반환)사용자 메시지마다 thread.add_messages. 에피소드가 들어올 때마다 그래프를 증분 갱신세션 커밋 때 대화를 보관하고 메모리를 추출. 백그라운드 처리. Claude Code 플러그인은 Stop 훅에서 자동 캡처, PreCompact·SessionEnd 에서 커밋
넣을 때 하는 일LLM 이 최근 대화(직전 교환 + 비동기 요약 + 최근 10개 메시지)에서 후보 사실을 뽑고, 사실마다 유사 메모리 10개를 찾아 ADD·UPDATE·DELETE·NOOP 중 하나를 고른다(2025 논문). 현행 문서는 추가 전용(ADD-only)이라고 쓴다직전 4개 메시지를 함께 보고 엔티티 추출, 이름 임베딩으로 중복 해소, 사실 추출 후 같은 엔티티 쌍 안에서 중복 제거, 모순되는 기존 간선에는 무효 시각을 적는다(삭제하지 않음)VikingMem 논문의 '이벤트 구동 추출·갱신·통합' 가운데 일부를 공개. 추출 결과가 사람이 열어 고치고 합칠 수 있는 마크다운 파일
꺼내는 시점개발자가 응답 전에 search(query). 반환은 메모리 문장과 점수 목록, 프롬프트에 넣는 법은 개발자 몫사용자 메시지를 넣은 직후, 응답 생성 전에 thread.get_context. 최근 4개 메시지를 쿼리로 삼아 사용자 그래프 전체를 검색플러그인이 UserPromptSubmit 훅에서 매 프롬프트 전에 자동 회상, SessionStart 에서 프로필·메모리 색인 주입. 모델이 MCP 도구를 부를 필요 없음
꺼내는 방식임베딩 유사도(+ 선택 리랭커)코사인 유사도 + BM25 + 그래프 BFS, 리랭커는 RRF·MMR·에피소드 언급 수·노드 거리·크로스인코더find(질의 직접) 와 search(세션 맥락으로 검색 계획). 에이전트가 ls·tree·read·grep 으로 직접 탐색도 가능, L0→L1→L2 순으로 연다
모델에 주는 형태문장 목록조립된 컨텍스트 블록. USER_SUMMARY 와 FACTS, 사실마다 (from - to) 또는 present마크다운 조각(요약 층 우선)
사람이 볼 수 있나대시보드(플랫폼)·CLI(OSS)API 로 그래프 검색디렉터리를 열면 파일. 편집·병합 가능
운영 형태SaaS 와 Apache-2.0 OSSSaaS. 엔진 Graphiti 는 OSSAGPL-3.0 자체 호스팅 + Volcengine 호스팅. 2026-01-05 공개, 10월 19일 기준 별 40.3k, v0.5.0 (10월 9일)

세 제품의 공통점은 '꺼내는 시점' 줄에 있다. 셋 다 매 턴 응답 직전에 검색하고, 그 결과를 프롬프트 어딘가에 끼운다. 차이는 검색의 입력과 출력이다. Mem0 는 질의 문장 하나로 문장 목록을, Zep 은 최근 대화 네 개로 날짜가 붙은 사실 블록을, OpenViking 은 세션 맥락으로 파일 트리의 요약 층을 돌려준다. 어느 쪽이든 모델은 '지금 꺼내진 것' 만 보고 저장소 전체는 보지 않는다.

'언제 넣나' 는 세 제품 모두 한 턴이 끝난 뒤이고, 셋 다 그 시점에 LLM 호출을 한 번 이상 쓴다. Mem0 논문은 이 호출에서 사실마다 추가·갱신·삭제·무시를 고르게 했는데, 2026년 10월의 현행 문서는 저장을 "덮어쓰거나 지우지 않는 추가 전용" 이라 쓰고 만료된 메모리를 검색에서 숨기는 방식으로 바꿨다. Zep 은 처음부터 지우지 않는 설계다. 새 사실이 옛 사실과 어긋나면 옛 간선에 무효 시각만 적고 둘 다 남긴다.

파일 메모리와 '스킬로 적어 고친다' 는 어디서 갈리나#

첫 답글의 Claude Code 자동 메모리와 셋째 답글의 스킬은 둘 다 로컬 마크다운 파일이고, 둘 다 별도 서비스가 없다. 그래서 같은 범주로 읽기 쉬운데, 공식 문서를 나란히 놓으면 네 지점에서 다르다.

자동 메모리(MEMORY.md + 주제별 파일)스킬(SKILL.md)
저장하는 것사실. 문서는 네 종류를 든다: 사용자(역할·선호), 피드백(교정·확인된 방식), 프로젝트(코드에서 못 읽는 진행 상황·결정), 참조(외부 자료 위치). 코드베이스에서 유도되는 것과 CLAUDE.md 에 이미 있는 것은 적지 않는다절차. 어떤 일을 어떻게 하는지. frontmatter 의 description 이 '언제 쓰는가', 본문이 '그때 따르는 지시'
누가 쓰나에이전트. 세션 중 교정과 선호를 보고 스스로 저장한다("Saved 2 memories")사람. 답글의 '지속적으로 수정' 은 틀린 결과를 보고 사람이 파일을 고친다는 뜻
언제 로드되나세션 시작에 MEMORY.md 의 앞 200줄 또는 25KB. 주제별 파일은 필요할 때 에이전트가 파일 도구로 읽는다. 서브에이전트에는 안 들어간다(fork 제외)세션 시작에는 이름과 설명만. 본문은 설명이 맞거나 사용자가 /이름 으로 부를 때 로드되고, 그 뒤 턴마다 컨텍스트에 남는다
꺼내는 조건조건 없음. 색인은 항상 로드되고, 세부는 에이전트의 판단설명 매칭. 설명과 when_to_use 를 합쳐 1,536자에서 잘리므로 핵심 용례를 앞에 쓴다. disable-model-invocation: true 면 사람만 부른다
범위저장소 단위(worktree 공유), 머신 로컬. 다른 머신·클라우드와 공유되지 않는다개인(~/.claude/skills)·프로젝트(.claude/skills)·플러그인. git 으로 옮겨진다
크기 지침색인 한 줄에 메모리 하나. 한계에 가까워지면 Claude Code 가 줄이라고 알린다500줄 이하. 로드된 뒤 매 턴 토큰을 먹으므로 본문은 짧게, 참조 자료는 보조 파일로

차이를 한 줄로 줄이면 메모리는 '무엇이 그렇다' 를 에이전트가 쌓고, 스킬은 '이럴 때 이렇게 한다' 를 사람이 고친다. 셋째 답글이 "노이즈" 라고 부른 것은 첫째 범주에 생기는 문제다. 서비스든 자동 메모리든 LLM 이 대화에서 사실을 뽑아 쌓으면 틀린 사실·중복·시효 지난 사실이 섞이고, 그걸 걸러 내는 비용(Mem0 의 갱신 호출, Zep 의 무효화, OpenViking 의 추출 후 병합)이 제품의 본체다. 스킬은 쌓지 않으므로 그 비용이 없고, 대신 사람이 매번 고쳐야 한다는 비용이 있다. 어느 쪽이 싼지는 대화량과 틀린 기억의 피해 크기로 정해지고, 이 글에서 숫자로 답할 수 있는 문제는 아니다.

두 방식이 같은 점도 적어 둔다. 둘 다 평문이라 사람이 열어 읽을 수 있고, 추출 LLM 호출이 없고, 검색 인프라가 없다. OpenViking 이 벡터 DB 제품 사이에서 파일 트리를 들고 나온 이유도 README 첫 단락에 이렇게 쓰여 있다. 대부분의 에이전트 메모리는 텍스트가 들어가고 임베딩이 나오는 블랙박스라 무엇이 저장됐는지 아무도 못 보니, 디렉터리를 열어 보고 고칠 수 있게 하자는 것이다.

리브

셋째 답글의 방식이 저는 제일 마음에 들었습니다. 저장이 아니라 편집이라서요. 다만 그 방식은 틀린 결과를 보고 파일을 고치는 사람이 있어야 돌아가고, 서비스 세 개는 그 사람을 턴마다 LLM 호출 하나로 대신하겠다는 제안입니다. 값은 거기서 갈립니다. 한편 Zep 이 어긋난 사실을 지우지 않고 무효 날짜만 적어 두는 쪽도 좋았습니다. 1587년 지도의 작가가 2년 뒤 자기 초상화를 경첩처럼 덧붙여 밑의 옛 얼굴을 남겨 둔 것과 같은 정직함입니다. 벤치마크 쪽은 그 반대였는데, 그 얘기는 아래에 있습니다.

숫자를 얼마나 믿을 수 있나#

양손에 저울처럼 두 물건을 올려 견주는 리브 스티커세 제품은 모두 LoCoMo(10개의 긴 대화, 질문 1,986개) 점수를 내세운다. 지난 브리핑에 실은 코어닷투데이의 재채점 글(10월 11일)이 그 숫자들을 한 표에 모아 놓았고, 거기에 각 회사 발표를 겹치면 아래 그림이 된다. 한 제품(Zep)의 LoCoMo 점수를 누가 잤는지에 따라 늘어놓은 것이다.

Zep 의 LoCoMo 점수, 측정자별 50 60 70 80 90 100 LoCoMo LLM-as-judge 점수(%) Mem0 재측정 58.44 MemOS 논문 59.22 Mem0 논문(2025-04) 65.99 Zep 정정치(2025-05) 75.14 MIRIX 79.09 EverMemOS 81.06 · 85.22 Zep 자체(2026, gpt-5.4) 94.7 참고: Mem0 자체(2026-10) 92.5
같은 제품 Zep 의 LoCoMo 점수. 파란 점이 Zep 자신의 발표, 회색이 타사·제3자 측정. 맨 아래 Mem0 의 2026년 자체 점수는 비교용이다. 측정자마다 응답 모델·채점 모델·채점 프롬프트가 다르므로 한 축에 놓였다고 비교 가능한 것은 아니다. 출처: 코어닷투데이 재채점 글의 집계, Mem0 연구 페이지

36점 차이는 제품이 바뀐 결과가 아니라 측정이 바뀐 결과다. 재채점 글이 그 간격을 세 조각으로 분해했다.

정답지가 7% 틀렸다

5번 범주(적대적 질문 446개, 그중 444개는 정답 필드가 없음)를 빼고 남은 1,540개 정답을 Claude Sonnet 5.5 가 대화 원문(세션 날짜·사진 설명 포함)과 대조했다. 틀렸거나 모호한 것이 108개, 7.0% 였고 추론·상식 범주는 30.2% 였다. '틀림' 판정 52개 중 24개를 사람이 다시 봤더니 13개는 명백히 틀렸고 8개는 애초에 답할 수 없는 문제, 3개는 감사자의 오류나 모호한 경우였다. 2026년 4월 Penfield Labs 의 독립 감사도 6.4% 를 보고했다. 정답지가 이 정도면 상위 제품 사이의 몇 점 차이는 정답지 오류 안에 들어간다.

채점 프롬프트만 바꾸면 26점이 움직인다

같은 gpt-4o-mini 답변 1,540개를 채점 모델은 gemini-3.1-flash-lite 로 고정하고 채점 프롬프트만 넷으로 바꿨다.

같은 답변, 채점 프롬프트만 바꾼 점수 0 50 100 Mem0 2026 프롬프트 81.4 Mem0 2025 프롬프트 70.3 엄격 채점 56.4 LongMemEval 식 55.8
답변 1,540개와 채점 모델은 동일. 프롬프트만 바꿔 81.4 에서 55.8 까지. 채점 모델만 바꾼 실험(2025 프롬프트 고정)은 62.1 에서 74.0 으로 12점이 움직였다. 출처: 코어닷투데이

Mem0 의 2026년 프롬프트는 정답과 오답 후보를 둘 다 나열한 답변을 100% 정답 처리했고, 날짜가 8-13일 어긋난 답변도 100% 받아 줬다. 대화를 전혀 주지 않고 답하게 해도 2025년 프롬프트로는 25.9% 가 나온다(엄격 채점 11.6%). 채점기가 이만큼 관대하면 메모리 제품의 기여분과 모델의 추측분이 섞인다.

신뢰 구간이 ±3.1 이다

질문 1,540개가 대화 10개에서 나오므로 독립 표본이 아니다. 대화 단위 클러스터 부트스트랩을 돌리면 95% 구간이 ±3.1(독립 가정이면 ±2.3, 설계 효과 1.88)이고, 범주별로는 추론 ±9.7, 시간 ±5.4 로 더 넓다. 위 그림의 점들 사이 간격 대부분은 이 구간보다 작거나 채점 편차보다 작다.

풀컨텍스트 기준선이 자주 이긴다

Zep 의 2025년 반박 글이 먼저 짚은 지점이다. LoCoMo 대화는 평균 16,000-26,000 토큰이라 메모리 없이 통째로 넣어도 들어가고, Mem0 논문 자체의 풀컨텍스트(gpt-4o-mini)가 72.90 으로 Mem0 의 66.88·Mem0g 의 68.44 를 넘었다. 재채점 글이 같은 설정을 재현하니 74.0(5.86달러)이었고, gemini-3.1-flash-lite 로는 80.7(2.51달러)이었다. LongMemEval 쪽도 같다. Zep 논문의 풀컨텍스트는 gpt-4o 로 60.2 였는데 2025년 정제판 데이터에 gemini-3.1-flash-lite 를 쓰면 81.6(±3.4, 14.95달러)이 나온다. 정제판은 500문항 중 454개의 건초더미를 바꿨으므로 정제 전후 점수도 서로 비교할 수 없다.

OpenViking 의 수치도 같은 눈으로 봐야 한다. README 는 0.3.22 판을 Doubao 2.0 Pro 로 돌려 Claude Code 단독 57.21 이 OpenViking 을 붙이면 80.32, OpenClaw 는 24.20 이 82.08 이 됐다고 쓴다. 상승 폭은 크지만 '단독' 쪽은 메모리 기능 없이 긴 대화를 하네스에 그대로 넣은 조건이고, 채점 프롬프트와 정답지는 위와 같은 LoCoMo 다. tau2-bench 의 리테일 70.94→77.81, 항공 54.38→66.25 는 과제 성공률이라 성격이 다르고, 재현 스크립트가 저장소에 있다는 점은 다른 두 회사보다 낫다.

지표를 고르는 법은 재채점 글의 권고 다섯 가지가 쓸 만하다. 같은 응답 모델의 풀컨텍스트 기준선을 항상 함께 보고, 채점기에 일부러 틀린 답(모호한 답·양다리 답·근접 날짜)을 넣어 통과하는지 먼저 시험하고, 정답지를 강한 모델로 검증하고, 문항 수와 클러스터로 최소 검출 가능 효과를 먼저 정하고, 자기 서비스에서 실제로 아픈 실패 유형으로 작은 시험을 따로 만든다.

리브

Zep 이 2025년에 처음 낸 숫자는 84 근처였고, 5번 범주를 분자에만 넣었다는 지적을 받아 75.14 로 고쳤습니다. 고친 것은 좋은데 반박 글에는 고치기 전 숫자가 남아 있지 않아서 제3자 집계를 보고야 알았습니다. 틀린 사실에 무효 날짜를 적어 두는 자기 제품의 설계를 자기 블로그에도 적용했으면 저 그림의 점이 하나 더 있었을 겁니다. 이 조사에서 가장 믿을 만한 숫자는 어느 회사의 점수도 아니고 60달러를 들여 남이 다시 채점한 ±3.1 이었습니다.

정리#

출처#