# 메모리 모델 Synapse의 메모리 모델은 LLM 에이전트를 위해 설계되었습니다 — 신뢰할 수 있는 회상을 위해 충분히 구조화되어 있으면서, 모든 도메인에 대해 충분히 유연합니다. ## 메모리 구조 ```json { "id": "mem_abc123", "category": "project", "key": "project_synapse_status", "content": "Synapse v1.5.0 deployed on vps1. CI green.", "tags": ["synapse", "deployment", "v1.5.0"], "priority": "high", "source": "agent", "verified": false, "confidence": 0.85, "expires_at": null, "mind_id": "m_xyz789", "created_at": "2026-06-27T...", "updated_at": "2026-06-27T..." } ``` ## 필드 | 필드 | 타입 | 필수 | 설명 | |-------|------|----------|-------------| | `id` | string | 자동 | 고유 ID (mem_xxx) | | `category` | enum | ✅ | 8개 카테고리 중 하나 | | `key` | string | ✅ | 안정적 식별자 (업데이트에 사용) | | `content` | string | ✅ | 메모리 콘텐츠 (모든 텍스트) | | `tags` | string[] | – | 검색 및 필터링용 | | `priority` | enum | – | low, normal, high, critical (기본값: normal) | | `source` | enum | 자동 | user, agent (누가 저장했는지) | | `verified` | bool | 자동 | 사람이 검증했는지 여부 | | `confidence` | float | – | 0.0 ~ 1.0 (기본값: user 1.0, agent 0.7) | | `expires_at` | timestamp | – | 이 메모리를 잊을 시점 | | `mind_id` | string | 자동 | 이 메모리를 소유한 마인드 | | `created_at` | timestamp | 자동 | 최초 저장 시각 | | `updated_at` | timestamp | 자동 | 최종 수정 시각 | ## 카테고리 8개 카테고리가 일반적인 LLM 에이전트 사용 사례를 다룹니다: | 카테고리 | 용도 | 예시 콘텐츠 | |----------|---------|-----------------| | `identity` | 사용자가 누구인지 | "User is Michael Schäfer, software engineer in Berlin" | | `preference` | 사용자 선호도 | "Prefers concise technical responses" | | `fact` | 검증 가능한 사실 | "Office is in Berlin, timezone Europe/Berlin" | | `project` | 프로젝트 상태 | "Synapse v1.5.0 deployed, working on v1.6.0 docs" | | `skill` | 사용자 기술 | "Advanced Python, 10+ years" | | `mistake` | 과거 오류 | "Forgot to bump npm version — CI failed" | | `context` | 세션 컨텍스트 | "Currently reviewing PR #42" | | `note` | 기타 노트 | "Try Redis for caching next sprint" | ## 키: 안정적 식별자 `key` 필드는 중요합니다 — 중복을 만들지 않고 메모리를 업데이트하는 방법입니다. ```python # First store store("project", "project_synapse_status", "v1.4.0 deployed", priority="high") # Update with same key (overwrites, doesn't duplicate) store("project", "project_synapse_status", "v1.5.0 deployed", priority="high") ``` **키 규칙:** - (category, mind) 내에서 고유해야 함 - `snake_case` 사용 - 명확성을 위해 카테고리로 접두사: `preference_communication`, `mistake_npm_version` - 안정적으로 유지 — 생성 후 키를 변경하지 마십시오 ## 태그: 검색용 태그를 사용하면 빠른 필터링과 검색이 가능합니다: ```bash # Find all memories with tag "docker" GET /memory/by-tag?tag=docker # FTS5 search within tagged subset GET /memory/search?q=swarm&tag=docker ``` **태그 모범 사례:** - 메모리당 2-5개 태그 (과도한 태깅 금지) - 일관성을 위해 소문자 사용 - 프로젝트 이름, 주제, 기술 사용 - 태그는 대소문자 구분 안 함 ## 우선순위 수준 | 우선순위 | 사용 시기 | 회상 동작 | |----------|-------------|-----------------| | `critical` | 정체성, 법적, 되돌릴 수 없는 것 | 항상 회상 최상단 | | `high` | 활성 프로젝트, 핵심 선호도 | 회상에서 두드러짐 | | `normal` | 대부분의 메모리 (기본값) | 표준 회상 순서 | | `low` | 일시적, 알면 좋음 | 요약될 수 있음 | `/memory/recall`은 우선순위 (critical 먼저)로 정렬한 후 최신순으로 정렬합니다. ## 소스: User vs Agent 메모리에는 `source` 태그가 지정됩니다: - `user` — 사람이 저장 (JWT 또는 human UI를 통해) - `agent` — LLM 에이전트가 저장 (Mind Key를 통해) 이는 다음에 영향을 미칩니다: - **검증**: `user` 메모리는 자동 검증, `agent` 메모리는 검증 안 됨 - **신뢰도**: `user` 기본값 1.0, `agent` 0.7 - **회상**: `/memory/recall`은 미검증 메모리에 "(unverified)" 표시 > [!NOTE] > `agent` 소스 메모리는 적절한 회의적으로 취급하십시오. 사용자가 직접 > 명시한 것이 아니라 추론되거나 가정된 것일 수 있습니다. ## 검증 `verified` 플래그는 사람이 메모리를 확인했음을 나타냅니다: - `user` 메모리: 자동 검증 (`true`) - `agent` 메모리: 기본 미검증 (`false`) 다음을 통해 메모리 검증: ```bash curl -X POST https://synapse.schaefer.zone/memory/mem_001/verify \ -H "Authorization: Bearer YOUR_JWT" ``` > [!NOTE] > 검증에는 Mind Key (에이전트 인증)가 아닌 JWT (사람 인증)가 필요합니다. > 이는 사람만 메모리를 검증됨으로 표시할 수 있도록 보장합니다. ## 신뢰도 `confidence` 필드 (0.0 ~ 1.0)는 메모리의 신뢰도를 나타냅니다: - 1.0 — 사용자가 직접 명시 - 0.7 — 에이전트가 추론 - 0.5 — 불확실, 검증 필요 - 0.0 — 명시적으로 의심됨 저장 시 신뢰도 설정: ```json { "category": "preference", "key": "prefers_dark_mode", "content": "User seems to prefer dark mode (based on their IDE screenshots)", "confidence": 0.5, "source": "agent" } ``` ## 만료 시간에 민감한 메모리에 `expires_at` 설정: ```json { "category": "context", "key": "current_meeting_topic", "content": "Discussing Q3 roadmap", "expires_at": "2026-06-28T00:00:00Z" } ``` 만료된 메모리는 `/memory/recall`에서 반환되지 않습니다 (DB에는 여전히 존재). 곧 만료되는 메모리를 보려면 `/memory/expiring?within=7d`를 사용하십시오. ## 메모리 라이프사이클 ``` ┌─────────────────┐ │ Create │ │ POST /memory │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ Active │ ◀──── PUT /memory/:id (update) │ (in recall) │ └────────┬────────┘ │ ┌────────────┼────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Expired │ │ Verified │ │ Deleted │ │ (in DB) │ │ (flag) │ │ (gone) │ └──────────┘ └──────────┘ └──────────┘ ``` ## 회상 동작 `GET /memory/recall`은 LLM 컨텍스트에 최적화된 일반 텍스트 요약을 반환합니다: ``` Mind: Michael's Mind Memories: 12 total (10 verified, 2 unverified) [001] identity (CRITICAL) [verified] user_name Michael Schäfer Tags: person, identity [002] preference (HIGH) [verified] communication_style Prefers concise technical responses Tags: communication [003] project (HIGH) [unverified] synapse_status v1.5.0 deployed, working on v1.6.0 docs Tags: synapse, deployment ... ``` - 우선순위 (critical → low)로 정렬, 그 다음 최신순 - 미검증 메모리는 `[unverified]`로 표시 - 컨텍스트를 위해 태그 포함 - 일반 텍스트 (JSON 파싱 불필요) ## 다음 단계 - [Memory API](/docs/api/memory) - [메모리 모범 사례](/docs/guides/memory-best-practices) - [FTS5 검색](/docs/concepts/fts5-search)