[SpoonOS] 장기 기억 메모리

네오 블록체인·2025년 12월 17일

SpoonOS

목록 보기
15/27

장기 메모리: 세션 간 기억하기

장기 메모리를 사용하면 에이전트가 세션 간에 기억할 수 있습니다. 단기 메모리(각 대화마다 재설정됨)와 달리, 장기 메모리는 무기한 지속되어 개인화된 경험, 과거 상호작용으로부터 학습, 시간에 따른 지식 구축을 가능하게 합니다.

왜 장기 메모리가 필요할까요?

장기 메모리 없이는 모든 대화가 처음부터 시작됩니다:

세션 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)  # 클라이언트가 준비되지 않았거나 호출이 실패하면 [] 반환

데모: 지능형 Web3 포트폴리오 어시스턴트

경로: 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,
)

흐름:

  1. 세션 1 – 선호도 캡처: 사용자가 고위험 Solana 밈 트레이더라고 말함; 모델이 응답; Mem0이 상호작용을 저장합니다.
  2. 세션 2 – 동일한 mem0_config로 새로운 ChatBot 다시 로드; 에이전트가 답변하기 전에 과거 선호도를 기억합니다 (Mem0 검색을 통해).
  3. 세션 3 – 사용자가 안전한 Arbitrum 수익으로 전환; 새 정보가 저장됨; 후속 쿼리가 업데이트된 선호도를 반영합니다.

데모 실행:

python examples/mem0_agent_demo.py

참고사항 및 모범 사례

  • 항상 MEM0_API_KEY를 설정하거나 mem0_configapi_key를 전달하세요.
  • 메모리가 스코핑되도록 안정적인 user_id (또는 agent_id)를 사용하세요. 더 엄격한 격리가 필요한 경우 collection/filters를 포함하세요. 래퍼는 누락된 경우 user_id를 필터와 메타데이터에 자동으로 주입합니다.
  • 데모/테스트 중에는 읽기 후 쓰기 지연을 피하기 위해 async_mode=False를 유지하세요. 래퍼는 항상 추가에 대해 mem0_config.get("async_mode", False)를 사용합니다 (호출당 오버라이드 없음).
  • 부재를 우아하게 처리하세요: SpoonMem0.is_ready()를 사용하면 Mem0이 설치되지 않았거나 구성되지 않은 경우 LTM을 비활성화할 수 있습니다. 그렇지 않으면 클라이언트를 사용할 수 없을 때 헬퍼가 빈 결과를 반환합니다.
profile
스마트 이코노미를 위한 퍼블릭 블록체인, 네오에 대한 모든것

0개의 댓글