← 프로젝트로 돌아가기
01 기획 — 기억(remember)·회상(recall) 파이프라인

Project 05 / 21

Mnemosure

AI 에이전트가 세션을 넘겨도 결정과 그 이유를 기억하되, 모르면 모른다고 답하고, 아는 것은 출처를 인용하며, 사실이 바뀌면 스스로 정정하는 메모리 레이어. MCP 표준 서버.

기간
2026.06 ~ 2026.07 (운영 중)
역할
기획설계개발
기술
PythonFastAPIMCPEmbedding Search

요약

AI 에이전트가 세션을 넘겨도 결정과 그 이유를 기억하되, 모르면 모른다고 답하고, 아는 것은 출처를 인용하며, 사실이 바뀌면 스스로 정정하는 메모리 레이어. MCP 표준 서버라 Claude Code 등 어떤 MCP 지원 에이전트에도 도구로 연결된다. 구명은 Grounded Recall.

  • 형태: 개인 프로젝트 · 오픈소스(MIT)
  • 역할: 단독 기획·설계·배포 (구현은 Claude Code 페어 프로그래밍)
  • 배포: PyPI 5개 버전(0.0.1~0.3.0) · MCP 서버 · npm 포인터 · Docker

문제

LLM과 여러 세션에 걸쳐 협업하면 두 가지 실패가 누적된다. 내린 결정을 잊는 것(망각)과, 내린 적 없는 결정을 지어내는 것(환각). 기존 요약 인수인계나 단순 RAG는 둘 다 막지 못한다. 이 두 실패가 서로를 악화시키는 구조를 메모리 설계로 동시에 공략하는 것이 목표였다.

설계와 결정

  • 선별 저장 — 대화에서 결정·변경·실패·사실만 추출해 저장한다. 잡담은 폐기하고, 실패 기록은 교훈이므로 영구 보존한다. 새 결정이 옛 결정을 갈아엎으면 대체(supersedes)·인과(because) 관계로 연결하는 지식 그래프형 구조.
  • 회상 파이프라인 — 질의 임베딩 → 코사인 검색(대체된 옛 기억도 일부러 포함, “낡은 믿음을 바로잡으려면 먼저 찾아야 한다”) → 재순위 → 연합 2홉 확장 → 그 증거에만 근거해 답변 생성.
  • 정직성 이중 게이트 — 최상위 검색 점수가 기준선 미달이면 “기록에 없음”을 반환하고, 답변 규칙으로 증거 밖 진술을 금지한다. 모든 답변에 확신도(certain/vague/unknown)와 출처 인용을 강제.
  • 망각의 재정의 — 삭제가 아니라 핵심/주변 분별. 임계값으로 억누르니 직접 질문까지 막히는 부작용을 발견하고 “끌어오기는 넓게, 말하기 단계에서 절제”로 설계를 전환했다.
  • 판단 주체 분리 — 대체와 후속 보완을 구분 판정하고(보완은 대체가 아님) 다대일 대체를 허용한다. “임계값은 효율용 사전 필터일 뿐, 판단 주체는 LLM 게이트”라는 원칙으로, 유사도로 구분할 수 없던 가짜 인과(0.225 vs 진짜 0.237)를 게이트 정교화로 해결했다.
  • 모델 역할 분업 — 추출·임베딩·재순위·답변에 4개 모델을 역할 배분해 비용과 정확도의 균형을 맞췄다. 싼 모델이 거르고 비싼 모델은 최종 답변만 담당한다.

평가 방법 (직접 설계)

  • “질문=축” 가정의 실패와 재설계 — 처음엔 질문마다 검증 축을 미리 배정했으나, 같은 질문에서 시스템마다 다른 실패가 나오는 것을 관찰했다. 질문을 분류하지 않고 답변에 실제로 나타난 행동을 라벨링(정확/누락/환각/잡음/정직)하는 방식으로 바꿨다.
  • 공정 비교 통제 — 비교군(요약 인수인계·단순 RAG)의 답변 생성 모델을 동일하게 고정해, 성능 차가 모델이 아니라 기억 구조에서만 나오도록 했다.
  • 자기에게 불리한 채점 버그도 수정 — 채점 LLM이 출처 날짜를 “미래라서 지어냈다”고 오판(출처를 다는 쪽만 불리)한 것을 발견해 채점 지침을 고쳤다. 반대로 시나리오를 쉽게 바꿔 점수를 올리려던 시도는 스스로 되돌렸다. “시험이 아니라 시스템을 고친다.”
  • 재현성 — 전 파이프라인 temperature 0, 평가 스냅샷 고정 서빙. 기억의 원본 대화까지 데모에서 열람할 수 있어 “추출이지 하드코딩이 아님”을 제3자가 검증할 수 있다. 채점기는 데모 표시용 도구로 제품 패키지에서 분리했다.

성과

자체 설계 평가셋 기준이며 외부 공인 벤치마크는 아니다. 방법론과 스냅샷을 저장소에 공개해 재현 가능하다.

  • 가상 프로젝트 2종(자동매매 봇 개발기 8문항, SaaS 요금제 개편 11문항), 총 19문항 평가.
  • Mnemosure 19/19 (정확 17 + 정직 2, 환각·누락 0) vs 요약 인수인계 6/19 (누락 11·환각 1) vs 단순 RAG 9/19 (환각 6·누락 7).
  • 세션 누적 회상 정확도: Mnemosure 1.0 유지 vs 요약 방식 0.8 → 0.4 하락. “요약은 다시 쓰일 때마다 앞선 결정과 이유를 밀어낸다”는 실패 메커니즘을 정량화했다.

배포와 운영

  • 제품 경계 정의 — 패키지는 코어 온리(기억 라이브러리 + MCP 서버), 데모·평가 하니스는 저장소 전용으로 분리했다. 저장 경로는 문맥을 감지한다(설치본=빈 창고, 저장소=커밋 데이터, 환경변수 재정의).
  • 3채널 버전 통일 — git 태그·PyPI·npm이 항상 동일 버전. npm은 실코드 없는 포인터(pip 안내), PyPI가 알맹이.
  • MCP 실전 함정 해결 — 클라이언트가 서버를 깨끗한 환경으로 띄워 키가 전달되지 않는 문제(목록만 되고 회상만 인증 실패)를 진단해 설정 파일 자동 로딩으로 해결. 실제 MCP 클라이언트로 도구 3종 검증.
  • Docker 컨테이너화 — 키는 이미지 미탑재·런타임 주입, 헬스체크, 바인딩 주소 환경변수화.

v0.3.0 리아키텍처

  • 특정 클라우드(DashScope) 전용 연동을 OpenRouter 단일 게이트웨이로 교체. 키 하나로 Claude·GPT·Qwen 등 임의 모델 조합이 가능해졌다. 원 설계가 모델 호출을 단일 파일에 몰아둔 덕에 “설정 + 파일 하나 + 호출부 6곳”으로 전환을 끝냈다.
  • 재순위 선택화(끄면 유사도 폴백), 로컬 임베딩(fastembed) 옵션 지원.
  • 마이그레이션 안전장치 — 창고에 임베딩 모델 메타를 기록해 불일치 시 조용히 망가지는 대신 실행 거부와 안내, 일괄 재임베딩 CLI 제공.
  • 무료 티어 실호출로 e2e 검증(한/영, MCP 클라이언트 접속 포함) 후에만 배포. 검증 중 402 원인(출력 상한 미지정)을 찾아 기본 상한 4096으로 수정.

기술

Python · FastAPI · MCP(Model Context Protocol) · OpenRouter(OpenAI 호환) · 임베딩 검색(bge-m3 / fastembed, 코사인 유사도) · 리랭킹(Cohere rerank) · Docker · PyPI