테마 전환

Mnemo: 로컬 LLM에 이식 가능한 장기 기억 레이어 더하기

Easton editorial illustration: portable local memory cartridge, local model terminal dock, SQLite graph index

"Mnemo GitHub README는 프로젝트 위치, Docker + Ollama quickstart, Rust crate 구조, SDK 예제, 테스트 수, benchmark 조건을 확인하는 데 사용했습니다."

Ollama 모델은 이미 질문에 답할 수 있습니다. 하지만 대화는 매번 처음부터 시작됩니다. 어제 이야기한 프로젝트 결정, 오늘 설정한 선호, 내일도 필요한 제약은 모두 잊힙니다.

이것이 로컬 LLM의 기억 부족 문제입니다. Ollama가 제공하는 것은 “답할 수 있는” 모델 서비스입니다. 무엇을 답하는지, 이전 제약을 기억하는지는 매번 사용자가 얼마나 다시 설명하느냐에 달려 있습니다.

Mnemo는 또 다른 RAG를 만드는 도구가 아닙니다. 지식 그래프와 엔티티 추출로 장기 기억을 관리해 로컬 LLM이 프로젝트 결정과 엔티티 관계를 기억하게 합니다. 매번 “이 API는 무엇을 하는 건가요?”라고 다시 묻지 않게 만드는 레이어입니다.

1. Mnemo란 무엇인가: 위치와 핵심 기능

1.1 위치 설명 읽기

“local-first AI memory layer”에서 중요한 부분은 두 가지입니다.

  • local-first: 데이터가 로컬에 저장됩니다. 클라우드로 올라가지 않고, 이전 가능하며, 특정 SaaS의 생존에 의존하지 않습니다
  • memory layer: 또 다른 RAG도, 또 다른 agent 프레임워크도 아닙니다. 담당하는 일은 기억입니다. 엔티티 추출, 그래프 구축, 의미 기반 검색입니다

예를 들어 “이 프로젝트의 API base URL은 무엇인가요?”라고 물었다고 해봅니다. 순수 벡터 검색은 “API”와 관련된 문서 조각을 여러 개 반환할 수 있지만, 어떤 프로젝트를 말하는지는 모릅니다. 그래프 검색은 “프로젝트 -> API -> baseUrl” 관계를 따라가 이전에 설정한 구성값을 직접 반환할 수 있습니다.

전제는 엔티티 추출이 정확해야 한다는 점입니다. LLM이 “API base URL”을 “API”와 “base URL”이라는 두 엔티티로 잘못 나누면 그래프가 갈라지고 검색 연결이 끊깁니다. 노이즈 축적은 여기서 시작됩니다.

위치가 분명해졌으니 핵심 기능을 봅니다.

1.2 핵심 기능 매트릭스

Mnemo README는 네 가지 핵심 기능을 제시합니다.

  1. persistent knowledge graph(영속 지식 그래프)

    • 엔티티와 관계를 SQLite에 저장합니다. 일회성 벡터가 아닙니다
    • 그래프 구조는 조회, 내보내기, 이전이 가능합니다
  2. entity extraction(엔티티 추출)

    • 대화에서 사람, 프로젝트명, API명, 결정 같은 엔티티를 자동 식별합니다
    • 순수 벡터 검색이 아닙니다. “이 API의 용도는 무엇인가요?”라는 질문을 조회 가능한 엔티티-관계 구조로 바꿉니다
    • 엔티티 추출 품질은 LLM의 이해 능력에 좌우됩니다. llama3 같은 로컬 LLM은 복잡한 대화에서 오인식할 수 있고, 노이즈 축적은 지속적인 위험입니다. README는 자동 정리 방법을 제공하지 않으므로 그래프 품질을 정기적으로 점검해야 합니다
  3. semantic retrieval(의미 기반 retrieval)

    • 그래프와 벡터를 결합하고, 검색 시 순수 유사도보다 엔티티 관계를 우선합니다
    • 벡터 검색의 노이즈를 줄입니다. 유사도는 높지만 의미적으로 관련 없는 문서가 지배하지 않게 합니다
  4. graph-first vs pure vector search

순수 벡터 검색은 “무엇이 비슷한가”를 찾습니다. 그래프 검색은 “무엇이 연결되어 있는가”를 찾습니다. 전자는 의미적으로 비슷하지만 무관한 노이즈를 반환할 수 있습니다. 후자는 엔티티 사이의 관계 사슬을 따라갑니다.

비교하면 더 분명합니다.

관점순수 벡터 검색Mnemo 지식 그래프
검색 로직유사도 랭킹엔티티-관계 추적
노이즈 위험높음. 비슷하지만 무관한 결과가 섞임낮은 편. 엔티티 앵커가 있음
설명 가능성낮음. 벡터는 블랙박스높음. 그래프를 볼 수 있음
이전성벡터는 깔끔하게 내보내기 어려움SQLite는 내보낼 수 있음
적합한 용도문서 검색프로젝트 기억, 엔티티 관계

1.3 기술 스택과 라이선스

기술 스택:

  • Rust. 다음 절에서 볼 네 개의 crate로 나뉩니다
  • SQLite. 로컬 저장, WAL mode
  • petgraph. 인메모리 그래프
  • OpenAI / Ollama / Anthropic API. LLM 백엔드

라이선스: MIT License. 사용, 수정, 배포가 가능합니다.

위험 알림:

  • 초기 단계 프로젝트입니다. 2026-06-05 GitHub README 기준입니다
  • API와 구조가 바뀔 수 있습니다
  • 대규모 운영 검증은 확인되지 않았습니다
  • README 성능 수치는 자체 측정이며 독립 검증이 아닙니다

2. 구조 구성: 네 개의 Rust crate

Mnemo는 Rust로 작성되었고, 네 개의 crate로 나뉩니다. 책임은 명확합니다.

mnemo-core: 핵심 로직

  • 엔티티 추출, 그래프 구축, 검색 로직
  • 특정 LLM 백엔드에 의존하지 않고 인터페이스를 정의합니다

mnemo-api: 서버

  • HTTP API를 제공합니다. 기본 포트는 8080입니다
  • 대화를 받고 core를 호출한 뒤 결과를 반환합니다
  • Health check: curl http://localhost:8080/health

mnemo-cli: 명령줄 도구

  • 디버깅, 관리, 조회
  • HTTP를 거치지 않고 로컬 SQLite를 직접 조작합니다

mnemo-bench: 성능 테스트

  • README의 122 Rust tests, 21 Python tests, 12 benchmarks가 여기에 해당합니다
  • 자체 측정값의 출처입니다

네 crate로 나눈 장점:

  • core는 API에 의존하지 않고 단독 테스트할 수 있습니다
  • cli는 서비스를 띄우지 않고 로컬 디버깅을 쉽게 합니다
  • bench는 독립되어 운영 코드에 영향을 주지 않습니다

아쉬운 점:

  • Docker를 쓰지 않으면 완전한 Rust toolchain이 필요합니다
  • crate 간 API가 바뀌면 여러 곳을 함께 고쳐야 할 수 있습니다

3. 설치와 배포: 세 가지 경로

Mnemo는 복잡도 순서로 세 가지 배포 경로를 제공합니다.

3.1 Docker + Ollama: 가장 빠른 시작

전제: Docker와 Ollama가 설치되어 있습니다.

# 1. 프로젝트 clone
git clone https://github.com/zaydmulani09/mnemo.git
cd mnemo

# 2. Docker 시작
docker compose up -d

# 3. Docker 안에서 모델 받기
docker exec mnemo-ollama ollama pull llama3

# 4. health check
curl http://localhost:8080/health

주의: 명령은 바뀔 수 있습니다. GitHub README를 기준으로 확인하세요.

설명: Docker compose는 두 컨테이너를 시작합니다. 서버인 mnemo-api와 Ollama 서비스인 mnemo-ollama입니다. 후자는 선택 사항입니다. 로컬에 이미 Ollama가 실행 중이라면 mnemo-api 컨테이너만 쓰고 MNEMO_LLM_BASE_URL=http://host.docker.internal:11434/v1로 로컬 Ollama에 연결할 수 있습니다.

LLM 연결 검증: health check가 {"status":"ok"}를 반환하면 API는 시작된 것입니다. 하지만 LLM 연결은 아직 검증되지 않았습니다. curl로 테스트 요청을 보냅니다.

curl -X POST http://localhost:8080/v1/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "이 프로젝트의 API base URL은 무엇인가요?"}'

엔티티 추출 결과가 반환되면 LLM 연결은 정상입니다.

장점:

  • Rust toolchain이 필요 없습니다
  • Docker가 의존성을 자동 처리합니다
  • Ollama와 Mnemo가 같은 compose 네트워크에 있어 네트워크 설정이 단순합니다

단점:

  • Docker가 리소스를 사용합니다
  • SQLite를 보려면 컨테이너에 들어가야 해서 디버깅이 번거롭습니다
  • 로그가 두 컨테이너에 나뉩니다

3.2 Binary: 로컬 빌드

전제: cargo와 rustc를 포함한 Rust toolchain, 그리고 Ollama가 설치되어 있습니다.

# 1. 프로젝트 clone
git clone https://github.com/zaydmulani09/mnemo.git
cd mnemo

# 2. API crate 빌드
cargo install --path crates/mnemo-api

# 3. Ollama 주소 설정
export MNEMO_LLM_BASE_URL=http://localhost:11434/v1

# 4. 서비스 시작
mnemo-api

주의: 명령은 바뀔 수 있습니다. GitHub README를 기준으로 확인하세요. 이 경로에는 Rust toolchain이 필요합니다.

설명: 빌드 시간은 하드웨어에 따라 다릅니다. Apple M2에서는 약 2~3분이고, Windows/Linux에서는 더 오래 걸릴 수 있습니다. 빌드가 실패하면 README가 요구하는 Rust version을 확인하세요. 빌드 후 mnemo-api는 현재 디렉터리에 SQLite 파일, 보통 mnemo.db를 만들고 그래프 구조를 저장합니다.

Ollama 연결 검증: 시작 전에 Ollama가 localhost:11434에서 실행 중이고 모델을 ollama pull llama3로 받은 상태인지 확인합니다. 시작 후 curl로 테스트합니다.

curl -X POST http://localhost:8080/v1/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "테스트"}'

장점:

  • Docker에 의존하지 않습니다
  • 로컬 프로세스라 로그가 같은 터미널에 남아 디버깅이 쉽습니다
  • mnemo-cli로 로컬 SQLite를 직접 조작할 수 있습니다
  • 환경 변수로 포트와 DB 경로를 바꿀 수 있습니다

단점:

  • 완전한 Rust toolchain이 필요합니다
  • 첫 빌드가 오래 걸릴 수 있습니다
  • cargo.lock이 오래된 경우처럼 의존성 문제가 생길 수 있습니다

3.3 OpenAI-compatible: 클라우드 LLM

전제: OpenAI / Anthropic / 기타 OpenAI-compatible API key가 있습니다.

환경 변수 목록, 2026-06 GitHub README 기준 확인:

export MNEMO_LLM_BASE_URL=https://api.openai.com/v1
export MNEMO_LLM_API_KEY=sk-...
export MNEMO_LLM_MODEL=gpt-4o-mini
export MNEMO_LLM_PROVIDER=openai

그다음 시작합니다.

mnemo-api

주의: 환경 변수 이름은 바뀔 수 있습니다. GitHub README를 기준으로 확인하세요.

적합한 경우:

  • 로컬 계산 자원이 부족해 클라우드 LLM을 씁니다
  • OpenAI API 사용량이 이미 있습니다
  • 데이터가 클라우드로 전송되는 것을 감수합니다. 클라우드 LLM을 쓰면 대화 내용이 클라우드 API로 전송됩니다. local-first의 프라이버시 장점은 로컬 저장에만 적용됩니다

세 가지 경로 중 상황에 맞는 것을 고릅니다. 다음은 성능 데이터입니다.

4. 성능: README 자체 측정값

Mnemo README에는 2026-06-05 version의 성능 자체 측정이 나와 있습니다.

테스트 조건:

  • Apple M2, debug build
  • SQLite WAL mode
  • petgraph는 인메모리

성능 수치:

  • 전체 검색 파이프라인: 약 4.2 ms
  • Release build는 3~5배 빠르다고 되어 있습니다. 대략 0.8~1.4 ms입니다

주의: README 자체 측정이며 독립 검증이 아닙니다. 성능은 하드웨어, 데이터량, LLM 백엔드에 따라 바뀝니다.

이 숫자를 읽는 법:

  • 4.2 ms는 검색 시간이며 LLM 추론 시간이 아닙니다. 병목은 LLM 추론입니다
  • SQLite WAL과 인메모리 그래프 조합은 검색을 빠르게 만들 수 있습니다
  • 하지만 이것은 검색 단계만 측정한 것이며, 대화 속도가 아닙니다

실제 체감은 다음에 좌우됩니다.

  • LLM 추론 시간. 검색보다 훨씬 느립니다
  • 대화 내용 길이. 엔티티 추출에도 LLM 추론이 필요합니다
  • 데이터량. 그래프가 커질수록 검색이 느려질 수 있습니다

권장: 대상 하드웨어에서 mnemo-bench를 실행하세요. README 숫자는 참고값이지 약속값이 아닙니다.

5. Local-first 특성과 경계

5.1 Local-first의 장점

Local-first의 핵심은 데이터가 로컬에 있다는 점입니다.

구체적인 장점:

  1. 프라이버시 보호

    • 대화 내용, 엔티티, 관계가 로컬 SQLite에 저장됩니다
    • 로컬 LLM을 쓰는 한 제3자 SaaS로 업로드되지 않습니다
  2. 데이터 제어

    • SQLite 파일은 내보내기, 백업, 이전이 가능합니다
    • 특정 SaaS의 생존에 의존하지 않습니다. 서비스가 사라져도 데이터는 남습니다
  3. 이전성

    • 머신을 바꿀 때 SQLite 파일을 복사하면 됩니다
    • 기억을 다시 “학습”시킬 필요가 없습니다
  4. 디버깅 가능성

    • SQLite는 표준 형식이라 어떤 SQLite 도구로도 볼 수 있습니다
    • 그래프 구조가 보입니다. 블랙박스 벡터가 아닙니다

5.2 잠재 위험과 경계

Local-first에는 장점이 있지만 위험도 있습니다.

  1. 노이즈 축적

    • 엔티티 추출은 완벽하지 않고 오인식할 수 있습니다
    • 오인식된 엔티티는 이후 검색에 영향을 줍니다
    • 정기 정리가 필요하지만 Mnemo에는 자동 정리 기능이 없습니다
    • 노이즈 축적은 Mnemo만의 문제가 아니라 모든 자동 기억 시스템의 공통 문제입니다. 차이는 Mnemo의 그래프가 보인다는 점입니다. 노이즈 엔티티와 잘못된 관계를 볼 수 있습니다. 벡터 시스템의 노이즈는 벡터 안에 숨어 보이지 않습니다. 이것은 그래프의 장점이자 관리 부담입니다
  2. rollback 제한

    • SQLite WAL에는 rollback 능력이 있지만, Mnemo는 고수준 “기억 취소” 인터페이스를 공개하지 않습니다
    • 잘못 저장된 기억을 수동 삭제하는 것은 번거롭습니다
    • 더 심각한 경우는 “Redis를 캐시로 사용” 같은 잘못된 결정을 저장하는 것입니다. 이후 관련 대화가 이 결정을 전제로 추론할 수 있습니다. 이를 철회하려면 그래프의 관련 엔티티와 관계를 모두 수동 삭제해야 할 수 있고, 그래프를 다시 만드는 것보다 더 어려울 수 있습니다
    • 중요한 결정을 저장하기 전에 테스트 환경에서 엔티티 추출이 정확한지 확인하세요
  3. hidden state

    • 그래프 구조가 복잡해 눈치채지 못한 관계가 저장될 수 있습니다
    • 왜 그 결과가 반환됐는지 알기 어려운 검색 결과가 나올 수 있습니다
  4. 적용 경계

    • 데이터량이 크면 SQLite + 인메모리 그래프가 압박을 받습니다
    • 팀 협업에서는 로컬 SQLite가 여러 사람의 동시 쓰기에 적합하지 않습니다

5.3 적합한 경우 vs 부적합한 경우 판단표

상황적합성이유
개인 프로젝트, 소규모 팀적합데이터량이 작고, 프라이버시 요구가 높으며, 이전이 쉽습니다
GB급 대용량 데이터부적합SQLite + 인메모리 그래프 압박과 노이즈 축적
여러 사람이 쓰는 팀 협업부적합로컬 SQLite는 동시 쓰기에 적합하지 않습니다
강한 프라이버시 요구적합로컬 LLM을 쓰는 한 데이터가 클라우드로 나가지 않습니다
전역 공유 기억 필요부적합local-first는 로컬 전용이지 전역 공유가 아닙니다
기존 Ollama 환경 있음적합직접 통합 가능하고 학습 비용이 낮습니다
Rust toolchain 없음조건부Docker 경로를 쓸 수 있지만 디버깅은 번거롭습니다

판단: “개인 프로젝트, 높은 프라이버시 요구, 기존 Ollama, 크지 않은 데이터량”이라면 Mnemo는 시도해볼 만합니다. “대용량 데이터, 팀 협업, 전역 공유 기억”이 필요하다면 Mnemo가 더 성숙해질 때까지 기다리거나 다른 방안을 고려하는 편이 좋습니다.

구체적인 제안:

  • 먼저 테스트 환경에서 Docker 경로를 한 번 실행하고 그래프 구조, 엔티티 추출 품질, 검색 결과를 확인합니다
  • 테스트 대화로 노이즈 위험을 검증합니다. 일부러 관련 없는 말을 해보고 Mnemo가 오인식하는지 확인합니다
  • 정리 방안을 준비합니다. SQLite 도구로 그래프 구조에 익숙해져 잘못된 엔티티를 수동 삭제하는 방법을 알아둡니다
  • README 업데이트를 확인합니다. 초기 프로젝트이므로 API, 구조, 배포 명령이 바뀔 수 있습니다

6. 다음 단계: 시리즈 안내

Ollama 로컬 LLM 시리즈의 앞선 글을 아직 읽지 않았다면, 순서대로 보는 편이 좋습니다.

  1. Ollama 입문: 로컬에서 대규모 언어 모델을 실행하는 첫 단계

    • 아직 Ollama를 설치하지 않았다면 여기서 시작합니다
  2. Ollama API 호출: curl부터 OpenAI SDK 호환 인터페이스까지

    • Mnemo는 OpenAI-compatible API를 사용하므로 Ollama API 인터페이스를 이해해야 합니다
  3. Ollama Embedding 실전: 로컬 벡터 검색과 RAG 구축

    • Mnemo의 의미 기반 검색은 embedding에 의존합니다. 이 글은 embedding 기초를 다룹니다
  4. AI Agent 기억 관리: 장기 기억과 지식 거버넌스 실전

    • Mnemo는 기억 레이어 도구입니다. 이 글은 Agent 기억의 거버넌스 방향을 다룹니다

이 네 편을 읽은 뒤 Mnemo를 설치하면 이해가 더 쉽습니다. 다음 단계는 로컬에서 Mnemo Docker 경로를 실행하고 지식 그래프가 어떤 형태인지 보는 것입니다.

Docker와 Ollama로 Mnemo 최소 검증 실행하기

주력 Agent에 붙이기 전에 임시 환경에서 Mnemo의 서비스 시작, 모델 연결, 기억 쓰기, 검색, 영속성, 정리 가능성을 확인합니다.

⏱️ Estimated time: 1-2 hours

  1. 1

    Step 1: 저장소를 clone하고 compose 시작하기

    GitHub README에 따라 mnemo 저장소를 clone하고 `docker compose up -d`를 실행합니다. mnemo-api와 mnemo-ollama 컨테이너가 시작되는지 확인합니다.
  2. 2

    Step 2: 테스트 모델 받기

    컨테이너 안에서 `docker exec mnemo-ollama ollama pull llama3`를 실행하거나, 현재 README가 권장하는 모델을 선택합니다.
  3. 3

    Step 3: API 상태 확인하기

    `http://localhost:8080/health`를 요청합니다. LLM 연결을 의심하기 전에 서비스 자체에 접근 가능한지 먼저 확인합니다.
  4. 4

    Step 4: 테스트 기억 하나 쓰기

    README의 Python SDK나 API 예제로 프로젝트 기억을 1개 씁니다. 첫날부터 실제 주력 프로젝트에 연결하지는 않습니다.
  5. 5

    Step 5: 검색과 재시작 후 영속성 확인하기

    자연어로 방금 쓴 기억을 조회하고, 컨테이너를 재시작한 뒤 다시 조회합니다. SQLite 데이터가 사라지지 않아야 합니다.
  6. 6

    Step 6: 삭제와 만료 연습하기

    일부러 잘못된 기억을 쓰고 삭제, 만료 표시, 그래프 재구축을 시도합니다. 이후 답변이 오래된 사실을 쓰지 않는지 확인합니다.

FAQ

기억이 계속 늘어나서 결국 노이즈가 되지 않나요?
그럴 수 있습니다. Mnemo의 엔티티 추출은 자동이며, LLM이 잘못 식별할 수 있습니다. 노이즈는 누적됩니다. 완화하려면 mnemo-cli나 SQLite 도구로 주기적으로 그래프를 확인하고 엔티티 필터링 규칙을 두어야 합니다. README에는 완전한 자동 정리 방식이 없기 때문에 그래프 품질은 사람이 관리해야 합니다.
Mnemo는 벡터 검색보다 어떤 점이 낫나요?
핵심 차이는 그래프 검색과 유사도 랭킹의 조합입니다. 벡터 검색은 비슷한 조각을 찾기 때문에 비슷하지만 관련 없는 내용을 반환할 수 있습니다. 지식 그래프는 엔티티 관계를 따라가므로 앵커가 있고 설명하기 쉽습니다. 프로젝트 결정과 엔티티 관계에도 더 잘 맞습니다. 다만 잘못된 엔티티 추출은 그래프를 오염시키고, 그래프 구축에도 LLM 추론이 필요합니다.
Mnemo가 잘못된 기억을 저장하면 되돌릴 수 있나요?
SQLite WAL에는 낮은 수준의 rollback 능력이 있지만, Mnemo README에는 ‘마지막 기억 취소’ 같은 고수준 인터페이스가 없습니다. 잘못 저장된 기억은 보통 SQLite 도구로 수동 삭제하거나 그래프를 재구축해야 합니다. 그래서 파일럿 단계에서 삭제, 만료, 재구축 흐름을 먼저 연습해야 합니다.
Mnemo는 어떤 LLM 백엔드를 지원하나요?
README에 따르면 Ollama, OpenAI, Anthropic 또는 다른 OpenAI-compatible API에 연결할 수 있습니다. 클라우드 LLM을 쓰면 대화 내용은 해당 API로 전송됩니다. local-first의 프라이버시 장점은 로컬 저장에만 적용되고, 클라우드 추론 전송까지 보호하지는 않습니다.
여러 agent가 하나의 기억 DB를 공유할 수 있나요?
이론적으로 SQLite 파일을 공유할 수는 있지만, Mnemo는 병렬 쓰기를 위한 잠금 메커니즘을 문서화하지 않았습니다. 두 agent가 동시에 쓰면 SQLite 충돌이 생길 수 있습니다. 더 안정적인 방식은 agent마다 기억 DB를 분리하거나 읽기 전용으로 공유하는 것입니다.
Mnemo 데이터는 어떻게 이전하나요?
SQLite 파일을 새 머신으로 복사하고, 같거나 호환되는 LLM 백엔드로 서비스를 시작합니다. embedding 공간은 모델 변경에 따라 호환되지 않을 수 있습니다. 이전 후에는 테스트 대화를 실행해 엔티티 검색이 정상인지 확인해야 합니다.

2분 읽기 · 게시일: 2026년 6월 5일 · 수정일: 2026년 7월 14일

시리즈 읽기 경로1편 중 1편

Ollama 로컬 LLM 가이드

이 시리즈의 첫 글을 읽고 있습니다. 다음 글로 이어가거나 시리즈 허브에서 전체 경로를 확인하세요.

시리즈 허브 보기

이전

이 시리즈의 시작입니다.

다음

현재 이 시리즈의 최신 글입니다.

관련 글

댓글

GitHub로 로그인하여 댓글을 남기세요

Easton BlogEaston Blog