홈으로 돌아가기

Memory OS: 에이전트 메모리에서 추론 역설과 SGR

이 기사는 Memory OS 아키텍처를 분석합니다: 추출에서의 추론 역설, flat RAG에서 ConceptHypothesis 온톨로지로의 전환, SQLite/Neo4j 데이터 계약. 규모 — 1억 670만 토큰, 240만 에지. 에이전트 메모리의 핵심 솔루션.

o4-mini 역설: Memory OS에서 추론이 추출을 어떻게 깨뜨리는가
Advertisement 728x90

# 메모리 OS 아키텍처: 추론 역설에서 계층적 메모리 그래프로

o4-mini 같은 강력한 모델이 높은 reasoning_effort에서 구조화된 객체 추출 시 스키마 엄격성을 깨뜨립니다. Pydantic 스키마를 고수하지 않고 구조를 '개선'하려 합니다: 객체 병합, JSON 필드 수정, 개념 타입 모호화. 300개 이상의 프롬프트 테스트에서 역관계가 드러났습니다: 추론이 많아질수록 결정성이 떨어집니다.

SGR (스키마 가이드 추론)에서 response_format과 엄격한 StrictBase (extra='forbid', Optional/default 없음)를 사용해 부분적으로 해결되지만, 모델이 여전히 제약과 싸웁니다. 시맨틱 매퍼 도입으로 reasoning_effort를 줄이고, 데이터 계약, 검증, 후처리에 규율을移行했습니다.

결과:

Google AdInline article slot
  • 토큰 비용 48% 감소;
  • 추출 품질 5.2 → 7.11 상승;
  • message_id로 완전 추적 가능.

검증기는 JSON 스키마를 재귀적으로 확인: additionalProperties: false, 모든 필드가 required. 이는 에이전트 메모리의 핵심 신호로, 추출 시 LLM 지능은 스키마 실행에만 사용하고 창의성은 배제합니다.

대규모 데이터셋에서 플랫 RAG의 실패와 관리형 메모리로의 전환

플랫 RAG는 데모에서는 빛나지만 Jocker(3,253 대화, 24,639 메시지) 같은 대형 코퍼스에서 무너집니다: 혈통 없음, 시간적 의미 없음, 업데이트 규칙 없음. 검색은 소스 연결 없는 유사 청크만 끌어당겨 그래프 슬러지를 만듭니다 — 세분화 부족한 수천 노드 (Jocker 리팩토링 전 26,000+).

계층 분리가 필수입니다:

Google AdInline article slot
  • 검색: top-k 유사 청크;
  • 메모리: 지식 객체, 링크, 시간 변화, 수정, 열화.

이 없으면 시스템이 복잡 쿼리에서 환각이 가득한 청크 인덱스로 전락합니다.

핵심 온톨로지: ConceptHypothesis를 일등 시민으로

핵심 온톨로지에서 타입화된 객체와 관계를 시작합니다. 느슨한 엔티티/요약 대신 ConceptHypothesis:

from pydantic import BaseModel, ConfigDict, Field
from typing import List, Literal, Optional
from datetime import datetime

class StrictBase(BaseModel):
    model_config = ConfigDict(extra="forbid")

class EvidenceSpan(StrictBase):
    source_id: str
    message_id: str
    text: str
    confidence: float

class ConceptRelation(StrictBase):
    target_id: str
    relation: Literal["causes", "conflicts_with", "supports", "instance_of", "enables"]
    confidence: float

class ConceptHypothesis(StrictBase):
    concept_id: str
    title: str
    type: Literal["behavioral_pattern", "project", "event", "tension", "goal", "belief", "entity"]
    description: str
    state: Literal["active", "weak", "merged", "split", "archived"]
    confidence: float
    aliases: List[str]
    evidence_spans: List[EvidenceSpan]
    relations: List[ConceptRelation]
    revision_count: int
    first_seen: Optional[datetime]
    last_seen: Optional[datetime]

이 객체는 증거 스팬, 관계, 신뢰도, 수정 횟수를 담습니다. 시간적 추론(이벤트, 모순)은 청크 부산물이 아닌 일등 기능입니다.

Google AdInline article slot

데이터 계약과 스테이징: SQLite를 유일한 진실 원천으로

데이터 계약은 파이프라인 경계에서 구조를 고정합니다. SQLite는 메시지(UUID, 텍스트, 역할, parent_id, 타임스탬프, conversation_id)의 진실 원천입니다. Neo4j 그래프: Conversation/Message/Segment/Concept/Topic 노드, HAS_MESSAGE/NEXT/CONTAINS_MESSAGE/EVIDENCE_FOR/BELONGS_TO 엣지.

핵심은 EVIDENCE_FOR: 개념이 메시지 수준 증거에 직접 연결. 연대기적 NEXT/PREVIOUS 스켈레톤으로 DB 정렬 없이 추론 가속.

스테이징 데이터베이스 (별도 SQLite)는 파이프라인 중간 상태를 완전 감사 가능하게 보관합니다.

개념 메모리 루프와 토픽 클러스터링

개념 메모리 루프: 생성/연결/정제/거부 — 가설 관리 사이클. 토픽 클러스터링은 UMAP + HDBSCAN + Optuna로 가중 링크를 통해 과압축과 개념 폭발 방지.

LongMemEval과 상태 유지 멀티에이전트 추론

LongMemEval (1억 토큰+): 4 디버그 단계, 탐색 vs 실행. 상태 유지 멀티에이전트: Planner/Scout/Synthesizer로 계층 검색.

에이전틱 가드너, 무효화, MCP

에이전틱 가드너 — 전용 그래프 유지 파이프라인. 이중 시간 사실 무효화/수리. MCP — 주권 메모리 인터페이스.

규모: 1억 6,700만 토큰, 63만 2,868 의미 단위, 240만 엣지.

주요 교훈:

  • 높은 추론이 SGR 깨뜨림; 시맨틱 매퍼와 낮은 노력 사용;
  • 플랫 RAG → 그래프 슬러지; 증거 스팬과 시간 온톨로지 요구;
  • Pydantic StrictBase의 ConceptHypothesis — 관리 압축 기반;
  • SQLite 진실 원천 + Neo4j 혈통/연대기;
  • 멀티에이전트 + 가드너로 1억 토큰+ 규모.

— Editorial Team

Advertisement 728x90

다음 읽기