Mem0, Zep, Letta, LangChain/LangGraph의 메모리 시스템을 상세 비교하고, 프로젝트 요구사항에 맞는 프레임워크 선택 의사결정 트리를 제시합니다.
2026년 현재, 에이전트 메모리 영역의 주요 프레임워크는 네 가지로 압축됩니다. 각각 서로 다른 설계 철학을 기반으로 하며, 특정 사용 사례에 최적화되어 있습니다.
Mem0는 "모든 AI에 메모리를"이라는 비전 아래, 사용자 선호도와 개인화에 집중합니다. 대화에서 자동으로 저장할 가치가 있는 정보를 추출하고, 사용자별로 관리합니다.
from mem0 import Memory
# 설정: 임베딩 모델과 LLM 지정
config = {
"llm": {
"provider": "anthropic",
"config": {"model": "claude-sonnet-4-20250514"},
},
"embedder": {
"provider": "openai",
"config": {"model": "text-embedding-3-small"},
},
"vector_store": {
"provider": "qdrant",
"config": {"host": "localhost", "port": 6333},
},
}
memory = Memory.from_config(config)
# 대화에서 자동으로 메모리 추출
result = memory.add(
messages=[
{"role": "user", "content": "저는 코드 리뷰할 때 타입 안전성을 가장 중시합니다"},
{"role": "assistant", "content": "타입 안전성을 중시하시는군요."},
],
user_id="user_123",
)
# 자동 추출: "사용자는 코드 리뷰에서 타입 안전성을 최우선시한다"
# 메모리 검색
memories = memory.search(
"코드 리뷰 기준이 뭐였죠?",
user_id="user_123",
)
# 메모리 업데이트: 충돌 시 자동 갱신
memory.add(
messages=[
{"role": "user", "content": "이제는 성능도 타입만큼 중요하게 봅니다"},
],
user_id="user_123",
)
# 기존 메모리 갱신: "사용자는 코드 리뷰에서 타입 안전성과 성능을 동등하게 중시한다"장점
한계
Zep은 "시간에 따라 진화하는 에이전트 메모리"를 지향합니다. 5장에서 상세히 다뤘듯이, 에피소드/시맨틱 엔티티/커뮤니티의 3계층 지식 그래프가 핵심입니다.
from zep_cloud.client import Zep
client = Zep(api_key="your-api-key")
# 사용자 세션 생성
session = client.memory.add_session(
session_id="session_001",
user_id="user_123",
)
# 대화 추가 - 자동으로 지식 그래프 갱신
client.memory.add(
session_id="session_001",
messages=[
{
"role_type": "user",
"content": "김철수가 리더인 A 프로젝트에 참여하게 되었습니다.",
},
{
"role_type": "assistant",
"content": "A 프로젝트에 합류하시는군요.",
},
],
)
# 그래프 검색: 관계 기반 쿼리
results = client.graph.search(
user_id="user_123",
query="A 프로젝트의 리더는 누구인가?",
)
# -> 김철수 (source: 에피소드 graph traversal)
# 시간적 검색: 특정 시점의 상태
memory = client.memory.get(
session_id="session_001",
min_rating=0.5, # 관련성 임계값
)장점
한계
Letta는 운영 체제의 메모리 관리에서 영감을 받았습니다. 에이전트가 자율적으로 메모리를 관리하도록 하며, 프로그래머가 메모리 구조를 명시적으로 설계할 수 있습니다.
from letta import create_client
client = create_client()
# 에이전트 생성 시 Core Memory 구조 정의
agent = client.create_agent(
name="assistant",
memory_blocks=[
# Core Memory: 항상 컨텍스트에 포함
{
"label": "human",
"value": "이름: 미지정\n선호 언어: 미지정\n전문 분야: 미지정",
"limit": 2000, # 토큰 제한
},
{
"label": "persona",
"value": "나는 기술 어시스턴트입니다. 정확하고 도움이 되는 답변을 합니다.",
"limit": 2000,
},
],
)
# 대화 시 에이전트가 자율적으로 메모리 관리
response = client.send_message(
agent_id=agent.id,
message="저는 김영수이고 TypeScript 전문가입니다",
)
# 에이전트가 내부적으로 수행하는 동작:
# 1. core_memory_replace("human", "이름: 미지정", "이름: 김영수")
# 2. core_memory_replace("human", "선호 언어: 미지정", "선호 언어: TypeScript")
# 3. core_memory_replace("human", "전문 분야: 미지정", "전문 분야: TypeScript")Letta의 가장 독특한 특성은 에이전트가 스스로 메모리를 읽고, 쓰고, 검색하는 도구를 가지고 있다는 것입니다. 개발자가 메모리 관리 로직을 직접 구현할 필요 없이, 에이전트가 대화 중에 알아서 중요한 정보를 저장하고 필요할 때 검색합니다.
장점
한계
LangChain과 LangGraph는 범용 에이전트 프레임워크 내에 메모리 추상화를 내장하고 있습니다. 독립적인 메모리 플랫폼이라기보다, 기존 LangChain/LangGraph 애플리케이션에 메모리를 추가하는 확장 기능입니다.
from langgraph.graph import StateGraph
from langgraph.checkpoint.memory import MemorySaver
from langgraph.store.memory import InMemoryStore
# 상태 기반 체크포인팅
checkpointer = MemorySaver()
# 장기 메모리 저장소
store = InMemoryStore()
# 그래프에 메모리 통합
graph = StateGraph(AgentState)
graph.add_node("agent", agent_node)
graph.add_node("memory", memory_node)
app = graph.compile(
checkpointer=checkpointer,
store=store,
)
# 대화 시 자동으로 상태 저장/복원
result = app.invoke(
{"messages": [{"role": "user", "content": "안녕하세요"}]},
config={
"configurable": {
"thread_id": "session_001",
"user_id": "user_123",
}
},
)장점
한계
| 기준 | Mem0 | Zep | Letta | LangChain |
|---|---|---|---|---|
| 핵심 강점 | 개인화 | 지식 그래프 | 자율 관리 | 생태계 통합 |
| 자동 추출 | 우수 | 우수 | 에이전트 자율 | 제한적 |
| 관계 표현 | 약함 | 매우 강함 | 보통 | 약함 |
| 시간 추적 | 제한적 | 매우 강함 | 보통 | 제한적 |
| 도입 난이도 | 낮음 | 높음 | 중간 | 낮음 |
| 운영 복잡도 | 낮음 | 높음 (Neo4j) | 중간 | 낮음 |
| 비용 구조 | SaaS/오픈소스 | SaaS/오픈소스 | 오픈소스 | 오픈소스 |
| 최적 사용 사례 | 챗봇 개인화 | 복잡한 도메인 | 자율 에이전트 | 기존 LC 확장 |
프로젝트의 요구사항에 따라 적합한 프레임워크를 선택하는 의사결정 흐름입니다.
하나의 프레임워크만 선택해야 하는 것은 아닙니다. 프로덕션 시스템에서는 여러 프레임워크를 조합하여 사용하는 경우가 많습니다.
조합 1: Mem0 + Zep
- Mem0: 사용자 선호도와 빠른 개인화
- Zep: 도메인 지식 그래프와 관계 추론
- 적합: 고객 서비스, 기술 지원 에이전트
조합 2: Letta + LangGraph
- Letta: 자율적 메모리 관리
- LangGraph: 워크플로우 오케스트레이션
- 적합: 복잡한 멀티스텝 에이전트
조합 3: Mem0 + LangGraph
- Mem0: 간편한 메모리 저장/검색
- LangGraph: 상태 관리와 체크포인팅
- 적합: 빠른 MVP, 점진적 확장처음 시작할 때는 하나의 프레임워크로 시작하고, 요구사항이 명확해지면 추가하는 점진적 접근이 좋습니다. Mem0로 빠르게 개인화를 구현한 뒤, 관계 추론이 필요해지면 Zep을 추가하는 식입니다.
이번 장에서 다룬 프레임워크 비교와 선택의 핵심 내용을 정리합니다.
8장에서는 프로덕션 듀얼 레이어 아키텍처를 다룹니다. Hot Path(즉시 컨텍스트)와 Cold Path(외부 저장소)를 결합한 실전 아키텍처를 설계하고, 비용과 지연시간을 최적화하는 전략을 살펴봅니다.
이 글이 도움이 되셨나요?
Hot Path와 Cold Path를 결합한 듀얼 레이어 메모리 아키텍처의 설계, 하이브리드 검색, 메모리 라우팅, 비용-지연시간 최적화 전략을 다룹니다.
에이전트 메모리의 압축 기법, 3-6배 텍스트 압축과 5-40배 도구 호출 압축, 계층적 통합과 정보 손실 최소화 전략을 다룹니다.
CLAUDE.md 기반 프로젝트 메모리, 코드베이스 컨텍스트 지속, 세션 간 학습, 팀 메모리 설계 패턴 등 코딩 에이전트에 특화된 메모리 시스템을 다룹니다.