Mem0로 기억하기

본 글은 Claude Sonnet 4로 작성 후, 수정한 글입니다.


mem0란?

mem0는 AI 애플리케이션을 위한 메모리 관리 시스템이다. 쉽게 말하면, 챗봇이 사용자와의 대화를 기억하고 맥락을 유지할 수 있게 도와주는 도구다. 사용자의 선호도, 대화 히스토리, 중요한 정보들을 자동으로 저장하고 관리한다.

  • 자동 메모리 추출: 대화에서 중요한 정보를 자동으로 식별하고 저장
  • 맥락 유지: 이전 대화 내용을 바탕으로 더 자연스러운 대화 가능
  • 개인화: 사용자별로 맞춤화된 응답 제공
  • 다양한 저장소 지원: 벡터 데이터베이스, 그래프 데이터베이스 등 다양한 백엔드 지원

데이터 저장 방식

mem0는 설정에 따라 다양한 방식으로 데이터를 저장할 수 있다:

  • In-memory: 메모리에 임시 저장 (재시작 시 사라짐)
  • 파일 시스템: 로컬 파일로 영구 저장 - 기본적으로 ~/.mem0/ 디렉토리에 SQLite 데이터베이스와 벡터 인덱스 파일들이 생성됨
  • 외부 서비스: Qdrant, Chroma 등 벡터 데이터베이스 또는 Neo4j 같은 그래프 데이터베이스

실제 구현

이제 Python과 LangChain을 사용해서 mem0를 활용한 간단한 챗봇을 만들어보자.

1. 설치 및 설정

# 환경 설정
import os
from typing import List, Dict, Optional, Any
from mem0 import Memory
from langchain.llms import OpenAI
from langchain.schema import HumanMessage, AIMessage

# OpenAI API 키 설정
os.environ["OPENAI_API_KEY"] = "your-api-key-here"

2. mem0 초기화

class ChatbotWithMemory:
    def __init__(self) -> None:
        # mem0 메모리 시스템 초기화 (기본값: 파일 시스템 저장)
        self.memory: Memory = Memory()
        
        # LangChain LLM 초기화
        self.llm: OpenAI = OpenAI(temperature=0.7)
        
    def get_user_memories(self, user_id: str) -> List[Dict[str, Any]]:
        """사용자의 기억을 조회한다."""
        return self.memory.get_all(user_id=user_id)
    
    def create_context_from_memories(self, memories: List[Dict[str, Any]]) -> str:
        """기억된 내용을 바탕으로 컨텍스트를 생성한다."""
        if not memories:
            return ""
        
        context = "사용자에 대해 알고 있는 정보:\n"
        for memory in memories:
            context += f"- {memory['memory']}\n"
        
        return context

3. 메모리 기능이 있는 챗봇 구현

    def chat(self, user_id: str, message: str) -> str:
        """메모리 기능을 활용한 대화 처리"""
        
        # 1. 기존 기억 조회
        memories: List[Dict[str, Any]] = self.get_user_memories(user_id)
        context: str = self.create_context_from_memories(memories)
        
        # 2. 프롬프트 구성
        prompt: str = f"""
            {context}

            사용자: {message}
            어시스턴트: 위의 정보를 참고해서 친근하고 도움이 되는 답변을 해주세요.
            """
        
        # 3. LLM으로 응답 생성
        response: str = self.llm.invoke(prompt)
        
        # 4. 대화 내용을 메모리에 저장
        self.memory.add(
            messages=[
                {"role": "user", "content": message},
                {"role": "assistant", "content": response}
            ],
            user_id=user_id
        )
        
        return response
    
    def add_user_info(self, user_id: str, info: str) -> None:
        """사용자 정보를 직접 메모리에 추가"""
        self.memory.add(
            messages=[{"role": "user", "content": info}],
            user_id=user_id
        )

4. 사용 예시

# 챗봇 인스턴스 생성
chatbot: ChatbotWithMemory = ChatbotWithMemory()

# 사용자 ID
user_id: str = "user_123"

# 첫 번째 대화
print("봇:", chatbot.chat(user_id, "안녕하세요! 저는 파이썬 개발자입니다."))

# 두 번째 대화
print("봇:", chatbot.chat(user_id, "제가 좋아하는 음식은 피자예요."))

# 세 번째 대화 - 이전 정보를 기억하는지 확인
print("봇:", chatbot.chat(user_id, "제 직업이 뭐였죠?"))

# 저장된 기억 확인
memories: List[Dict[str, Any]] = chatbot.get_user_memories(user_id)
print("\n저장된 기억들:")
for memory in memories:
    print(f"- {memory['memory']}")

참고: 위 코드는 mem0의 기본 설정을 사용하므로 파일 시스템에 데이터가 저장된다. 프로그램을 재실행해도 이전 대화 내용이 유지된다.

5. 고급 기능 활용

class AdvancedChatbot(ChatbotWithMemory):
    def search_memories(self, user_id: str, query: str) -> List[Dict[str, Any]]:
        """특정 주제에 대한 기억 검색"""
        return self.memory.search(query=query, user_id=user_id)
    
    def update_memory(self, user_id: str, memory_id: str, new_content: str) -> None:
        """기존 기억 업데이트"""
        self.memory.update(memory_id=memory_id, data=new_content)
    
    def delete_memory(self, user_id: str, memory_id: str) -> None:
        """특정 기억 삭제"""
        self.memory.delete(memory_id=memory_id)
    
    def get_memory_stats(self, user_id: str) -> Dict[str, Any]:
        """메모리 통계 정보 조회"""
        memories: List[Dict[str, Any]] = self.get_user_memories(user_id)
        return {
            "총 기억 수": len(memories),
            "최근 기억": memories[0]['memory'] if memories else None
        }

실제 활용 시나리오

# 일정 관리
chatbot.chat(user_id, "내일 오후 2시에 회의가 있어요.")
chatbot.chat(user_id, "내일 일정이 뭐가 있었죠?")