개념

memgen의 사고 모델. 한 번 읽으면 나머지 API가 자명해집니다.

메모리 루프

모든 상호작용은 같은 루프의 세 가지 연산 중 하나:

┌──────────┐    add(messages)         ┌───────────┐
│ your     │ ───────────────────────▶ │  memgen   │  → LLM extracts
│ app      │                          │  Memory   │  → embeds
│          │ ◀─── search(query) ───── │  Store    │  → stores
└──────────┘                          └───────────┘
       │                                    ▲
       │  reads retrieved memories          │
       │  feeds them to YOUR LLM            │
       └────────────────────────────────────┘

memgen은 당신의 챗 LLM을 호출하지 않습니다. 저장/검색만. 가져온 메모리를 어떻게 쓸지는 당신의 앱 코드가 결정.

스코핑: user_id, agent_id, app_id, run_id

메모리는 4개 자유 문자열 ID로 파티션. 통상 의미:

필드수명전형적 의미
user_id영속최종 사용자 (이메일, 계정 ID)
agent_id영속AI 에이전트 정체성 ("travel_bot_v2")
app_id영속앱 컨텍스트 ("mobile", "web", "slack")
run_id일시적한 세션 (티켓, 회의, 여행)

add에 일부만 전달, search에 일부를 필터로 전달. 독립적 차원입니다.

client.add(
    messages=[...],
    user_id="alice",                # this person
    agent_id="travel_bot_v2",       # this AI agent
    run_id="trip-paris-2026",       # this trip session
)

client.search("hotel preferences", user_id="alice")
client.search("hotel preferences", run_id="trip-paris-2026")

extraction_policy & label_taxonomy (프로젝트별)

memgen 도메인 특화의 유일한 다이얼. client.project.update(...)로 한 번 설정. 이후 모든 호출이 따릅니다.

  • extraction_policy — 추출 LLM system prompt에 주입되는 자연어 가이드라인. 당신의 도메인 전문성을 텍스트로.
  • label_taxonomy{label_name: description} 페어 목록. 자동 분류기가 이 풀에서만 태그를 선택.
mem0의 custom_instructions + custom_categories에 해당. 같은 개념, 우리 이름.

레이어드 추출: core + extensions

모든 메모리는 단순 문자열이 아닌 구조화 payload를 들고 다닙니다:

{
  "core": {
    "summary":     "...",
    "entities":    [...],
    "tags":        [...],
    "key_facts":   [...],
    "importance":  1,
    "timestamp":   "ISO 8601"
  },
  "extensions": {
    "ai_tutor": { ... }
  }
}

core는 자동. extensionsextractextension 인자로 opt-in.

동기 vs 비동기 추출

  • add(messages, ...) — fire-and-forget. 백그라운드 추출. 채팅 루프에서 사용.
  • extract(messages, ..., store=False) — 추출 완료 대기, 구조화 결과 반환. store=True면 저장도. 검사/모더레이션 용도.

검색

summary 필드 대상 dense vector 검색. 필터는 임베딩 스코어와 결합:

client.search(
    query="programming preferences",
    filters={
        "user_id": "alice",
        "categories": ["preferences"],
        "metadata": {"channel": "email"},
    },
    top_k=10,
    threshold=0.3,
)

저수준 제어(raw 임베딩, 추출 래퍼 없음)는 Engine API 참조.

memgen이 하지 않는 것

  • 챗 응답 생성 — 당신의 코드가 OpenAI / Claude / Gemini / Ollama를 호출.
  • 대화 transcript 저장 — summary + facts만 추출하고 임베딩 후 raw turn 폐기. (필요하면 metadata에 직접 첨부.)
  • 사용자 계정 관리 — ID는 자유 문자열. 사용자 시스템은 직접 보유.

아키텍처 (개요)

┌────────────┐   /v1/memories/*   ┌─────────────┐
│ your app   │ ─────────────────▶ │  Backend    │ ─→ extraction LLM (Ollama / Flash)
│  + SDK     │                    │             │ ─→ embedding (memory-engine)
└────────────┘ ◀─── search ─────  │             │ ─→ Postgres (metadata)
                                  └─────────────┘ ─→ Qdrant (vectors)