Mem0 Docker 설치 가이드: LLM 메모리 레이어




개요

Mem0는 AI 에이전트를 위한 범용 메모리 레이어입니다. LLM은 대화 간 기억을 유지하지 못하는 문제가 있는데, Mem0는 사용자 선호도, 컨텍스트, 대화 기록을 자동으로 추출하고 저장하여 개인화된 AI 경험을 제공합니다. 토큰 비용 90% 절감, 지연 시간 91% 감소를 달성합니다.

항목내용
GitHubhttps://github.com/mem0ai/mem0
공식 사이트https://mem0.ai
문서https://docs.mem0.ai
라이선스Apache-2.0
GitHub Stars37K+

Mem0란?

왜 Mem0인가?

❌ LLM의 근본적 문제점:
   - 대화 간 기억 없음 (Stateless)
   - 매번 동일한 정보 반복 요청
   - 개인화 불가능
   - 긴 컨텍스트 = 높은 비용

✅ Mem0의 해결책:
   - 영속적 메모리 레이어
   - 자동 사실 추출 및 저장
   - 의미 기반 검색
   - 토큰 90%+ 절감
   - 지연 시간 91% 감소

핵심 개념

"Instant memory for LLMs"
- 대화에서 핵심 정보 자동 추출
- 벡터 DB + 그래프 DB 하이브리드 저장
- 의미 기반 검색으로 관련 메모리 검색
- 세션 간 컨텍스트 유지

아키텍처

┌─────────────────────────────────────────┐
│           Your AI Application            │
├─────────────────────────────────────────┤
│              Mem0 Layer                  │
│  (추출 → 저장 → 검색 → 업데이트)          │
├──────────────┬──────────────────────────┤
│  Vector DB   │      Graph DB            │
│ (의미 검색)  │   (관계 검색)             │
│ Qdrant/Chroma│    Neo4j                 │
└──────────────┴──────────────────────────┘
        │
        ▼
┌─────────────────────────────────────────┐
│     LLM (OpenAI / Claude / Ollama)      │
│     Embedder (OpenAI / Ollama)          │
└─────────────────────────────────────────┘

주요 기능

🧠 메모리 관리

기능설명
add()대화에서 메모리 추가
search()의미 기반 메모리 검색
get()특정 메모리 조회
update()메모리 업데이트
delete()메모리 삭제
history()메모리 변경 이력

📊 메모리 범위

범위설명
user_id사용자별 메모리 (세션 간 유지)
agent_id에이전트별 메모리
run_id세션별 메모리
app_id앱별 메모리

🤖 LLM 지원

제공자모델
OpenAIGPT-4o, GPT-4, GPT-3.5
AnthropicClaude 3.5, Claude 3
GoogleGemini Pro
OllamaLlama, Mistral, Qwen
Groq초고속 추론
OpenRouter모든 모델

💾 벡터 데이터베이스

벡터DB설명
Qdrant기본값, 고성능
Chroma로컬
Pinecone클라우드
pgvectorPostgreSQL
Milvus대규모
Weaviate클라우드/로컬

🔗 그래프 데이터베이스

그래프DB설명
Neo4j관계 메모리
Memgraph실시간 그래프

🔧 임베딩

엔진모델
OpenAItext-embedding-3-small
Ollamanomic-embed-text
HuggingFace다양한 모델
Cohereembed-v3

시스템 요구 사항

항목최소권장
CPU2 코어4+ 코어
RAM4GB8GB+
저장소10GB20GB+
포트8765

Docker 설치

방법 1: OpenMemory 원커맨드 (권장)

export OPENAI_API_KEY=your-openai-api-key
curl -sL https://raw.githubusercontent.com/mem0ai/mem0/main/openmemory/run.sh | bash

접속: http://localhost:3000 (UI), http://localhost:8765 (API)

방법 2: Mem0 REST API 서버

# 저장소 클론
git clone https://github.com/mem0ai/mem0
cd mem0/server

# 환경 설정
cp .env.example .env
# .env 파일 편집: OPENAI_API_KEY 설정

# 시작
docker compose up -d

방법 3: Docker Compose (기본)

# docker-compose.yml
services:
  mem0:
    image: mem0/mem0:latest
    container_name: mem0
    restart: unless-stopped
    ports:
      - "8765:8765"
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
    volumes:
      - ./mem0_data:/app/data
    depends_on:
      - qdrant

  qdrant:
    image: qdrant/qdrant:latest
    container_name: mem0-qdrant
    restart: unless-stopped
    ports:
      - "6333:6333"
    volumes:
      - ./qdrant_data:/qdrant/storage

방법 4: 전체 스택 (Qdrant + Neo4j)

# docker-compose.yml
services:
  mem0-api:
    image: mem0/mem0:latest
    container_name: mem0-api
    restart: unless-stopped
    ports:
      - "8765:8765"
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - QDRANT_HOST=qdrant
      - QDRANT_PORT=6333
      - NEO4J_URL=bolt://neo4j:7687
      - NEO4J_USERNAME=neo4j
      - NEO4J_PASSWORD=password
    volumes:
      - ./mem0_data:/app/data
    depends_on:
      - qdrant
      - neo4j

  qdrant:
    image: qdrant/qdrant:latest
    container_name: mem0-qdrant
    restart: unless-stopped
    ports:
      - "6333:6333"
    volumes:
      - ./qdrant_data:/qdrant/storage

  neo4j:
    image: neo4j:latest
    container_name: mem0-neo4j
    restart: unless-stopped
    ports:
      - "7474:7474"
      - "7687:7687"
    environment:
      - NEO4J_AUTH=neo4j/password
    volumes:
      - ./neo4j_data:/data

  postgres:
    image: postgres:15
    container_name: mem0-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=mem0
      - POSTGRES_USER=mem0
      - POSTGRES_PASSWORD=password
    volumes:
      - ./postgres_data:/var/lib/postgresql/data

방법 5: Ollama 로컬 LLM

# docker-compose.yml
services:
  mem0:
    image: mem0/mem0:latest
    container_name: mem0
    restart: unless-stopped
    ports:
      - "8765:8765"
    environment:
      - LLM_PROVIDER=ollama
      - OLLAMA_BASE_URL=http://host.docker.internal:11434
      - OLLAMA_MODEL=llama3.2
      - EMBEDDING_PROVIDER=ollama
      - EMBEDDING_MODEL=nomic-embed-text
    volumes:
      - ./mem0_data:/app/data
    extra_hosts:
      - "host.docker.internal:host-gateway"
    depends_on:
      - qdrant

  qdrant:
    image: qdrant/qdrant:latest
    container_name: mem0-qdrant
    restart: unless-stopped
    volumes:
      - ./qdrant_data:/qdrant/storage

  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    restart: unless-stopped
    ports:
      - "11434:11434"
    volumes:
      - ./ollama:/root/.ollama

방법 6: OpenMemory MCP (Claude Desktop 연동)

# docker-compose.yml
services:
  openmemory:
    image: mem0/openmemory:latest
    container_name: openmemory
    restart: unless-stopped
    ports:
      - "8765:8765"
      - "3000:3000"
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - USER_ID=default
    volumes:
      - ./openmemory_data:/app/data
    depends_on:
      - qdrant

  qdrant:
    image: qdrant/qdrant:latest
    container_name: openmemory-qdrant
    restart: unless-stopped
    volumes:
      - ./qdrant_data:/qdrant/storage

Claude Desktop 설정 (claude_desktop_config.json):

{
  "mcpServers": {
    "mem0": {
      "transport": "sse",
      "serverUrl": "http://localhost:8765/sse"
    }
  }
}

방법 7: pgvector 사용

# docker-compose.yml
services:
  mem0:
    image: mem0/mem0:latest
    container_name: mem0
    restart: unless-stopped
    ports:
      - "8765:8765"
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - VECTOR_STORE=pgvector
      - POSTGRES_HOST=postgres
      - POSTGRES_PORT=5432
      - POSTGRES_USER=mem0
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mem0
    depends_on:
      - postgres

  postgres:
    image: pgvector/pgvector:pg15
    container_name: mem0-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=mem0
      - POSTGRES_USER=mem0
      - POSTGRES_PASSWORD=password
    volumes:
      - ./postgres_data:/var/lib/postgresql/data

방법 8: Chroma 사용

# docker-compose.yml
services:
  mem0:
    image: mem0/mem0:latest
    container_name: mem0
    restart: unless-stopped
    ports:
      - "8765:8765"
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - VECTOR_STORE=chroma
      - CHROMA_HOST=chroma
      - CHROMA_PORT=8000
    depends_on:
      - chroma

  chroma:
    image: chromadb/chroma:latest
    container_name: mem0-chroma
    restart: unless-stopped
    ports:
      - "8000:8000"
    volumes:
      - ./chroma_data:/chroma/chroma

환경 변수

LLM 설정

변수설명
LLM_PROVIDERopenai, anthropic, ollama, groq
OPENAI_API_KEYOpenAI API 키
ANTHROPIC_API_KEYAnthropic API 키
OLLAMA_BASE_URLOllama API URL
OLLAMA_MODELOllama 모델명

임베딩 설정

변수설명
EMBEDDING_PROVIDERopenai, ollama, huggingface
EMBEDDING_MODEL임베딩 모델명

벡터 스토어

변수설명
VECTOR_STOREqdrant, chroma, pgvector, pinecone
QDRANT_HOSTQdrant 호스트
QDRANT_PORTQdrant 포트 (기본: 6333)
CHROMA_HOSTChroma 호스트

그래프 스토어

변수설명
NEO4J_URLNeo4j Bolt URL
NEO4J_USERNAMENeo4j 사용자
NEO4J_PASSWORDNeo4j 비밀번호

OpenMemory

변수설명
USER_ID기본 사용자 ID
NEXT_PUBLIC_API_URLAPI URL (UI용)

Python SDK 사용

설치

pip install mem0ai

기본 사용

from mem0 import Memory

# 초기화
memory = Memory()

# 메모리 추가
result = memory.add(
    "I prefer vegetarian food and am allergic to nuts",
    user_id="user123"
)
print(result)
# [
#   {"id": "abc", "memory": "Prefers vegetarian food"},
#   {"id": "def", "memory": "Allergic to nuts"}
# ]

# 메모리 검색
memories = memory.search(
    "What are the dietary preferences?",
    user_id="user123"
)

# 모든 메모리 조회
all_memories = memory.get_all(user_id="user123")

# 메모리 업데이트
memory.update("abc", "Prefers vegan food")

# 메모리 삭제
memory.delete("abc")

채팅에 메모리 통합

from mem0 import Memory
from openai import OpenAI

memory = Memory()
openai_client = OpenAI()

def chat_with_memory(message, user_id="user123"):
    # 관련 메모리 검색
    memories = memory.search(message, user_id=user_id)
    memories_str = "\n".join([m["memory"] for m in memories])
    
    # 시스템 프롬프트에 메모리 포함
    system_prompt = f"""Answer based on user memories:
User Memories:
{memories_str}"""
    
    # LLM 호출
    response = openai_client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": message}
        ]
    )
    
    assistant_response = response.choices[0].message.content
    
    # 새 메모리 저장
    memory.add(
        [
            {"role": "user", "content": message},
            {"role": "assistant", "content": assistant_response}
        ],
        user_id=user_id
    )
    
    return assistant_response

커스텀 설정

from mem0 import Memory
from mem0.configs.base import MemoryConfig

config = MemoryConfig(
    llm={
        "provider": "ollama",
        "config": {
            "model": "llama3.2",
            "ollama_base_url": "http://localhost:11434"
        }
    },
    embedder={
        "provider": "ollama",
        "config": {
            "model": "nomic-embed-text"
        }
    },
    vector_store={
        "provider": "qdrant",
        "config": {
            "host": "localhost",
            "port": 6333
        }
    },
    graph_store={
        "provider": "neo4j",
        "config": {
            "url": "bolt://localhost:7687",
            "username": "neo4j",
            "password": "password"
        }
    }
)

memory = Memory(config)

REST API 사용

메모리 추가

curl -X POST "http://localhost:8765/v1/memories/" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "user", "content": "I love hiking in the mountains"}
    ],
    "user_id": "user123"
  }'

메모리 검색

curl -X POST "http://localhost:8765/v1/memories/search/" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "outdoor activities",
    "user_id": "user123"
  }'

모든 메모리 조회

curl "http://localhost:8765/v1/memories/?user_id=user123"

백업 및 복원

데이터 구조

./
├── mem0_data/           # Mem0 데이터
├── qdrant_data/         # Qdrant 벡터 데이터
├── neo4j_data/          # Neo4j 그래프 데이터
└── postgres_data/       # PostgreSQL 데이터

백업

# 컨테이너 정지
docker compose down

# 전체 백업
tar -czvf mem0-backup-$(date +%Y%m%d).tar.gz \
  mem0_data/ qdrant_data/ neo4j_data/

# 재시작
docker compose up -d

복원

tar -xzvf mem0-backup.tar.gz
docker compose up -d

업데이트

# 최신 이미지 가져오기
docker compose pull

# 재시작
docker compose down
docker compose up -d

트러블슈팅

Ollama 연결 안 됨

extra_hosts:
  - "host.docker.internal:host-gateway"

environment:
  - OLLAMA_BASE_URL=http://host.docker.internal:11434

Qdrant 연결 오류

컨테이너 이름으로 연결:

environment:
  - QDRANT_HOST=qdrant  # 컨테이너 이름

메모리 추출 안 됨

  • LLM API 키 확인
  • 임베딩 모델 설정 확인
  • 로그 확인: docker logs mem0

대안 비교

기능Mem0LangChain MemoryZep
자동 추출✅ LLM 기반❌ 수동
의미 검색
그래프 메모리✅ Neo4j
토큰 절감✅ 90%+
SDKPython, Node.jsPythonPython
REST API
MCP 지원✅ OpenMemory
셀프호스팅N/A

선택 가이드

용도추천
AI 에이전트 메모리Mem0
토큰 비용 절감Mem0
Claude Desktop 연동Mem0 (MCP)
관계형 메모리Mem0 (Graph)

활용 사례

1. 개인화 AI 어시스턴트

구성:

  • 사용자 선호도 자동 학습
  • 세션 간 컨텍스트 유지
  • 맞춤형 응답

결과: 진정한 개인 AI 비서

2. 고객 지원 챗봇

구성:

  • 고객별 이력 저장
  • 이전 문의 내용 참조
  • 맥락 있는 응답

결과: 고객 만족도 향상

3. AI 에이전트 시스템

구성:

  • 에이전트별 메모리 분리
  • 장기 작업 컨텍스트 유지
  • 그래프 메모리로 관계 추론

결과: 지능적 멀티 에이전트

4. 학습 도우미

구성:

  • 학습 진행 상황 기억
  • 취약점 추적
  • 맞춤형 복습

결과: 적응형 학습 시스템

5. MCP 통합 (Claude Desktop)

구성:

  • OpenMemory MCP 서버
  • Claude Desktop 연동
  • 로컬 메모리 레이어

결과: Claude에 영속 메모리 추가


마무리

Mem0는 LLM의 근본적 한계인 “기억력 없음” 문제를 해결하는 메모리 레이어입니다. 대화에서 자동으로 핵심 정보를 추출하고, 의미 기반 검색으로 관련 메모리를 찾아 개인화된 AI 경험을 제공합니다. 토큰 비용 90% 절감, 지연 시간 91% 감소를 달성합니다.

핵심 장점

장점설명
자동 추출LLM이 핵심 정보 추출
의미 검색벡터 기반 관련 메모리
그래프 메모리Neo4j 관계 추론
토큰 절감90%+ 비용 절감
지연 감소91% 지연 시간 감소
MCP 지원Claude Desktop 연동
다중 LLMOpenAI, Claude, Ollama
오픈소스Apache-2.0

이런 분께 추천

AI 에이전트에 메모리가 필요한 분
토큰 비용을 줄이고 싶은 분
개인화된 AI 경험을 구현하려는 분
Claude Desktop에 메모리를 추가하고 싶은 분
장기 컨텍스트 AI 앱을 만드는 분



댓글 남기기