하이브리드 메모리: 벡터 + 그래프 + 키-값(Vector + Graph + KV, Mem0)

Mem0(Chhikara et al., 2025)는 메모리를 세 저장소가 병렬로 동작하는 구조로 다룹니다. 의미적 유사도(semantic similarity)를 위한 벡터(vector), 빠른 사실 조회(fact lookup)를 위한 키-값(KV), 엔티티-관계 추론(entity-relationship reasoning)을 위한 그래프(graph)입니다. 검색할 때는 채점 계층(scoring layer)이 세 결과를 융합합니다. 이것이 2026년 외부 메모리의 프로덕션 표준입니다.

유형: Build 언어: Python (stdlib) 선수 학습: Phase 14 · 07 (MemGPT), Phase 14 · 08 (Letta Blocks) 소요 시간: 약 75분

학습 목표

  • 단일 저장소, 즉 벡터만, 그래프만, KV만으로는 에이전트 메모리에 부족한 이유를 설명합니다.
  • Mem0의 세 병렬 저장소와 각 저장소가 무엇에 최적화되어 있는지 말할 수 있습니다.
  • Mem0의 융합 채점(fusion scoring)을 설명합니다. 관련성(relevance), 중요도(importance), 최신성(recency)을 사용하며, 계층 구조가 아니라 가중합(weighted sum)입니다.
  • add()가 세 저장소에 모두 쓰고 search()가 결과를 융합하는 장난감 3저장소 메모리를 표준 라이브러리로 구현합니다.

문제

하나의 저장소는 세 질의 유형 중 하나에는 틀립니다.

  • 의미적 유사도(Semantic similarity) - "지난주에 에이전트 표류(agent drift)에 대해 무엇을 논의했지?" 벡터가 이깁니다. KV와 그래프는 놓칩니다.
  • 사실 조회(Fact lookup) - "사용자의 전화번호가 무엇이지?" KV가 이깁니다. 벡터는 낭비이고, 그래프는 과합니다.
  • 관계 추론(Relationship reasoning) - "어떤 고객들이 같은 청구 법인(billing entity)을 공유하지?" 그래프가 이깁니다. 벡터와 KV는 답할 수 없습니다.

프로덕션(production) 에이전트는 한 세션 안에서 세 가지 질의 유형을 모두 사용합니다. 단일 저장소 메모리는 그중 두 유형에서 항상 틀립니다. Mem0의 기여는 세 저장소를 하나의 add/search 표면 뒤에 연결하고, 채점 함수로 결과를 융합한 것입니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.단일 메모리 저장소(벡터만, 그래프만, KV만)가 프로덕션 에이전트에 부족한 이유는 무엇인가요?

2.Mem0의 융합 채점(fusion scoring)이 검색 결과 순위를 매기기 위해 결합하는 세 가지 요소는 무엇인가요?

0/2 답변 완료

개념

병렬 세 저장소

Mem0(arXiv:2504.19413, 2025년 4월)은 add(text, user_id, metadata)에서 다음을 수행합니다.

  1. 텍스트에서 후보 사실(candidate facts)을 추출합니다. 이는 LLM이 주도하는 단계입니다.
  2. 각 사실을 의미 검색을 위해 벡터 저장소에 씁니다. 임베딩(embedding)을 사용합니다.
  3. 각 사실을 (user_id, fact_type, entity) 키를 사용하는 KV 저장소에 씁니다. O(1) 조회를 위함입니다.
  4. 각 사실을 관계 질의를 위한 타입 있는 간선(typed edge)으로 그래프 저장소(Mem0g)에 씁니다.

search(query, user_id)에서는 다음을 수행합니다.

  1. 벡터 저장소가 임베딩 코사인 유사도(embedding cosine) 기준 top-k를 반환합니다.
  2. KV 저장소가 질의에서 유도한 (user_id, type, entity) 키에 대한 직접 조회 결과를 반환합니다.
  3. 그래프 저장소가 질의 엔티티에서 도달 가능한 하위 그래프(subgraph)를 반환합니다.
  4. 채점 계층이 세 결과를 융합합니다.

융합 채점(Fusion scoring)

score = w_relevance * relevance(q, record)
      + w_importance * importance(record)
      + w_recency * recency(record)
  • 관련성(Relevance) - 벡터 코사인, KV 정확 일치, 그래프 경로 가중치입니다.
  • 중요도(Importance) - 쓰기 시점에 태그로 붙이거나 학습합니다. 이름, ID, 정책처럼 더 중요한 사실이 있습니다.
  • 최신성(Recency) - 마지막 쓰기 또는 읽기 이후 시간에 대한 지수 감쇠(exponential decay)입니다.

가중치는 제품별로 조정합니다. 채팅 에이전트는 w_recency를 높이고, 컴플라이언스(compliance) 에이전트는 w_importance를 높이며, 검색(retrieval) 에이전트는 w_relevance를 높입니다.

Mem0g와 시간 추론(Temporal reasoning)

Mem0g는 충돌 탐지기(conflict detector)를 추가합니다. 새로운 사실이 기존 간선과 모순되면, 기존 간선은 삭제되지 않고 invalid로 표시됩니다. 시간 질의, 예를 들어 "3월에 사용자의 도시는 어디였나?"는 특정 시점에서 유효한 하위 그래프를 따라갑니다.

이것은 Letta의 무효화(invalidation) 패턴을 컴플라이언스 등급(compliance-grade) 행동으로 일반화한 것입니다.

벤치마크 숫자

Mem0 논문은 2025년에 다음을 보고합니다.

  • LoCoMo(긴 형식 대화 메모리): 91.6
  • LongMemEval(긴 범위 에피소드 메모리): 93.4
  • BEAM 1M(100만 토큰 메모리 벤치마크): 64.1

비교 기준선인 전체 컨텍스트 128k LLM, 평평한 벡터 저장소, 평평한 KV는 모두 10점 이상 차이로 뒤처집니다. 벤치마크만으로 선택을 정당화할 수는 없으며, 운영 형태가 더 중요합니다. 하지만 이 숫자는 융합 설계가 단순한 오차가 아니라는 것을 보여줍니다.

범위 분류(Scope taxonomy)

Mem0는 메모리를 범위별로 나눕니다.

  • 사용자 메모리(User memory) - 세션을 넘어 지속되며 user_id를 키로 합니다.
  • 세션 메모리(Session memory) - 하나의 스레드 안에서 지속됩니다.
  • 에이전트 메모리(Agent memory) - 에이전트 인스턴스별 상태입니다.

모든 쓰기는 하나의 범위를 고릅니다. 검색은 범위별 가중치로 여러 범위를 질의할 수 있습니다. 범위를 생각 없이 섞으면 "어시스턴트가 Alice에게 Bob의 프로젝트를 말해버리는" 사고가 납니다.

이 패턴이 잘못되는 지점

  • 임베딩 표류(Embedding drift). 처음 100개 질의에서는 맞아 보이던 벡터 결과가 말뭉치가 커질수록 나빠집니다. 사용 빈도 상위 N개 레코드를 주기적으로 재임베딩하세요.
  • KV 스키마 증가(KV schema creep). (user_id, type, entity)는 간단해 보이지만, 모든 팀이 자기 type을 추가하기 시작합니다. 분기마다 type 집합을 감사하세요.
  • 그래프 폭발(Graph explosion). 시끄러운 추출기 하나가 메시지마다 간선 50개를 추가합니다. add 호출당 그래프 쓰기 수를 제한하고, 낮은 신뢰도의 간선은 버리세요.

만들어보기

code/main.py는 세 저장소 패턴을 표준 라이브러리로 구현합니다.

  • VectorStore - 임베딩 대체물로 단순 토큰 겹침 유사도를 사용합니다.
  • KVStore - (user_id, fact_type, entity)를 키로 하는 딕셔너리입니다.
  • GraphStore - 타입 있는 간선(subject, relation, object, valid)입니다.
  • Mem0 - add(), search(), 융합 채점, 범위 인식 검색을 가진 최상위 파사드(facade)입니다.
  • 다중 사용자, 다중 세션 대화에 대한 실행 추적입니다.

실행합니다.

python3 code/main.py

출력은 세 개의 별도 회상 경로와 융합 top-k를 보여줍니다. main() 상단의 채점 가중치를 바꿔보고 순위가 어떻게 달라지는지 보세요.

사용해보기

  • Mem0(Apache 2.0) - 프로덕션 준비가 되어 있습니다. Postgres + Qdrant + Neo4j로 자체 호스팅하거나 관리형 클라우드를 사용할 수 있습니다.
  • Letta - core/recall/archival 3계층 구조입니다. 벡터와 그래프 백엔드는 직접 가져옵니다.
  • Zep - 시간 지식 그래프(temporal KG; Temporal Knowledge Graph)와 사실 추출을 갖춘 상용 대안입니다.
  • 사용자 정의 빌드(Custom builds) - 추출기를 정확히 통제해야 하거나(컴플라이언스), 융합 가중치를 직접 조정해야 할 때(최신성이 지배적인 음성 에이전트) 선택합니다.

산출물 만들기

outputs/skill-hybrid-memory.md는 융합 채점기, 범위 분류, 시간적 무효화가 연결된 3저장소 메모리 스캐폴드(scaffold)를 생성합니다.

연습문제

  1. 장난감 벡터 유사도를 실제 임베딩 모델(sentence-transformers, Ollama, OpenAI embeddings)로 교체하세요. 합성 긴 대화에서 recall@10을 측정합니다. 1000번 쓰기 뒤 순위가 표류하나요?
  2. 시간 질의 search(query, as_of=timestamp)를 추가하세요. 그 시각 또는 그 이전에 유효한 레코드만 반환합니다. 어떤 저장소에 가장 많은 작업이 필요하나요?
  3. 충돌 탐지기를 구현하세요. 들어오는 사실이 그래프 간선과 모순되면 기존 간선을 무효화하고 둘 다 로그로 남깁니다. "user lives in Berlin" -> "user lives in Lisbon"으로 테스트하세요.
  4. 융합 채점기에 user_feedback 차원, 예를 들어 검색된 레코드에 대한 좋아요를 추가하세요. 게임화(gaming), 즉 에이전트가 이미 좋아했던 레코드만 돌려주는 일을 어떻게 막나요?
  5. Mem0 문서(docs.mem0.ai)를 읽어보세요. 장난감 구현을 mem0 클라이언트 호출로 옮깁니다. 같은 20개 테스트 질의에서 검색 품질을 비교하세요.

핵심 용어

용어흔한 설명실제 의미
하이브리드 메모리(Hybrid memory)"벡터와 그래프와 KV"세 저장소에 병렬로 쓰고 검색 시 융합합니다.
사실 추출(Fact extraction)"메모리 수집(Memory ingestion)"텍스트를 (entity, relation, fact) 튜플로 나누는 LLM 단계입니다.
융합 채점(Fusion scoring)"관련성 순위"관련성, 중요도, 최신성의 가중합입니다.
범위(Scope)"메모리 네임스페이스"user / session / agent입니다. 누가 무엇을 볼지 결정합니다.
Mem0g"메모리 그래프"관계 질의를 위한 시간적 유효성을 가진 타입 있는 간선입니다.
시간적 무효화(Temporal invalidation)"소프트 삭제(Soft delete)"모순된 간선을 invalid로 표시합니다. 삭제하지 않습니다.
임베딩 표류(Embedding drift)"검색 부패"말뭉치가 커지며 벡터 품질이 떨어지는 현상입니다. 주기적으로 재임베딩합니다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

hybrid-memory

Generate a Mem0-shaped three-store memory system (vector + KV + graph) with a fusion scorer, scope taxonomy, and temporal invalidation.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.사용자가 베를린에서 리스본으로 이사했습니다. Mem0의 충돌 탐지기(conflict detector)는 이를 어떻게 처리해야 하나요?

2.10,000번의 쓰기 후 팀이 벡터 저장소의 recall@10이 크게 저하된 것을 발견했습니다. 가장 유력한 원인은 무엇인가요?

3.Mem0에서 메모리 범위(user, session, agent)를 생각 없이 섞는 것이 왜 위험한가요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다