장기 메모리를 사용하면 에이전트가 세션 간에 기억할 수 있습니다. 단기 메모리(각 대화마다 재설정됨)와 달리, 장기 메모리는 무기한 지속되어 개인화된 경험, 과거 상호작용으로부터 학습, 시간에 따른 지식 구축을 가능하게 합니다.
장기 메모리 없이는 모든 대화가 처음부터 시작됩니다:
세션 1: 사용자: "다크 모드를 선호합니다" 에이전트: "알겠습니다!"
세션 2: 사용자: "설정을 변경해주세요" 에이전트: "어떤 설정인가요?" ← 모든 것을 잊어버림
장기 메모리와 함께:
세션 1: 사용자: "다크 모드를 선호합니다" 에이전트: "알겠습니다!" → 메모리에 저장
세션 2: 사용자: "설정을 변경해주세요" 에이전트: "다크 모드를 활성화해드리겠습니다" ← 기억함
SpoonOS는 저장, 인덱싱, 의미 검색을 처리하는 관리형 메모리 서비스인 Mem0과 통합됩니다:

| 기능 | 도움이 되는 방법 |
|---|---|
| 의미 검색 | 의미로 메모리 찾기: "사용자 선호도"가 "다크 모드를 좋아합니다"를 찾음 |
| 자동 스코핑 | 메모리가 사용자/에이전트별로 자동으로 격리됨 |
| 우아한 폴백 | Mem0이 다운되어도 작업이 빈 결과를 반환 (크래시 없음) |
| 메모리 유형 | 예시 |
|---|---|
| 선호도 | "사용자는 간결한 응답을 선호합니다" |
| 사실 | "사용자의 포트폴리오에 BTC와 ETH가 포함됩니다" |
| 컨텍스트 | "사용자는 밈 코인에 집중하는 일일 트레이더입니다" |
| 히스토리 | "사용자가 지난주에 Solana DeFi 프로토콜에 대해 물었습니다" |
pip install spoon-ai mem0ai
export MEM0_API_KEY="your-mem0-key"
from spoon_ai.memory.mem0_client import SpoonMem0
mem0 = SpoonMem0({"user_id": "user_123"})
# 저장 및 검색
mem0.add_text("사용자는 다크 모드를 선호합니다")
results = mem0.search("UI 선호도")
print(results)
핵심 클래스: spoon_ai.memory.mem0_client.SpoonMem0
from spoon_ai.memory.mem0_client import SpoonMem0
mem0 = SpoonMem0({
"api_key": "YOUR_MEM0_API_KEY", # 또는 MEM0_API_KEY env 변수
"user_id": "user_123", # 모든 작업을 이 사용자로 스코핑
"collection": "my_namespace", # 선택적 네임스페이스 격리
"metadata": {"project": "demo"}, # 쓰기에 자동 첨부
"filters": {"project": "demo"}, # 쿼리에 자동 적용
"async_mode": False, # 동기 쓰기 (기본값)
})
if not mem0.is_ready():
print("Mem0 서비스를 사용할 수 없습니다")
대화 히스토리 또는 개별 텍스트를 저장합니다:
# 대화 메시지 추가
mem0.add_memory([
{"role": "user", "content": "Solana 밈 코인을 좋아합니다"},
{"role": "assistant", "content": "알겠습니다, Solana에 집중하겠습니다"},
], user_id="user_123")
# 단일 텍스트 추가 (간단한 방법)
mem0.add_text("사용자는 낮은 가스 수수료를 선호합니다")
비동기 변형: await mem0.aadd_memory(messages, user_id=...)
results = mem0.search_memory(
"Solana 밈 코인 고위험",
user_id="user_123",
limit=5,
)
for r in results: # results는 Mem0 응답에서 추출된 문자열 목록입니다
print("-", r)
비동기 변형: await mem0.asearch_memory(query, user_id=...)
all_memories = mem0.get_all_memory(user_id="user_123", limit=20) # 클라이언트가 준비되지 않았거나 호출이 실패하면 [] 반환
경로: examples/mem0_agent_demo.py
핵심 아이디어: 에이전트(ChatBot)가 Mem0으로 구성되어 재시작 후에도 사용자 선호도를 기억할 수 있습니다.
from spoon_ai.chat import ChatBot
USER_ID = "crypto_whale_001"
SYSTEM_PROMPT = "...포트폴리오 어시스턴트..."
mem0_config = {
"user_id": USER_ID,
"metadata": {"project": "web3-portfolio-assistant"},
"async_mode": False, # 다음 쿼리가 데이터를 볼 수 있도록 동기 쓰기
}
# 장기 메모리가 활성화된 LLM 생성
llm = ChatBot(
llm_provider="openrouter",
model_name="openai/gpt-5.1",
enable_long_term_memory=True,
mem0_config=mem0_config,
)
흐름:
mem0_config로 새로운 ChatBot 다시 로드; 에이전트가 답변하기 전에 과거 선호도를 기억합니다 (Mem0 검색을 통해).데모 실행:
python examples/mem0_agent_demo.py
MEM0_API_KEY를 설정하거나 mem0_config에 api_key를 전달하세요.user_id (또는 agent_id)를 사용하세요. 더 엄격한 격리가 필요한 경우 collection/filters를 포함하세요. 래퍼는 누락된 경우 user_id를 필터와 메타데이터에 자동으로 주입합니다.async_mode=False를 유지하세요. 래퍼는 항상 추가에 대해 mem0_config.get("async_mode", False)를 사용합니다 (호출당 오버라이드 없음).SpoonMem0.is_ready()를 사용하면 Mem0이 설치되지 않았거나 구성되지 않은 경우 LTM을 비활성화할 수 있습니다. 그렇지 않으면 클라이언트를 사용할 수 없을 때 헬퍼가 빈 결과를 반환합니다.