AI 스터디 · 7주차

agentmemory
— AI 코딩 에이전트의 영속 기억, 내부 구현까지 뜯어보기

rohitg00/agentmemory — "쓰면 이렇게 됩니다"가 아니라 hooks.json · hybrid-search.ts · local.ts를 직접 읽고 "이런 코드라서 그 결과가 나옵니다"를 확인

왜 이 주제? (1~6주차와의 연결) 1주차 OT · 2주차 하네스 · 3주차 LLM Wiki · 4주차 OMC/Octopus · 5주차 superpowers · 6주차 Vectorless RAG. 이번 주는 "세션마다 기억을 잃는" AI 에이전트의 근본 문제와, 그걸 hooks + 하이브리드 검색으로 해결한 오픈소스를 깊게 봅니다. 전부 Claude Code 구독 안에서(추가 과금 없이) 쓸 수 있는 것들.

출처: github.com/rohitg00/agentmemory — README, Apache-2.0

1/10 문제

AI 에이전트는 세션마다 기억을 잃는다

"저번에 말했잖아요, 이 프로젝트는 TypeScript strict 쓰고
테스트는 vitest야." → 에이전트: "안녕하세요, 뭘 도와드릴까요?"

Claude Code, Cursor, Cline 등 모든 코딩 에이전트의 공통 고통 — 컨텍스트는 세션과 함께 증발한다.

매 세션마다 반복되는 일

  • 프로젝트 스택·규칙 재설명
  • 이전에 해결한 버그 원인 재설명
  • 아키텍처 결정 배경 재설명
  • "저번에 왜 그렇게 했는지"를 모름

이상적인 에이전트라면

  • 지난 세션에서 뭘 했는지 알고
  • 프로젝트 관례를 이미 파악하고
  • 관련 과거 작업을 스스로 불러오고
  • 사람이 반복 설명할 필요가 없어야
비유: 매일 출근할 때마다 자기소개서를 제출해야 하는 직장. 10번 일해도 첫날처럼 처음부터 설명해야 한다.

출처: github.com/rohitg00/agentmemory — README "The Problem" 섹션

2/10 순진한 접근

CLAUDE.md에 수동으로 메모? — 한계가 있다

가장 흔한 해결책: CLAUDE.md에 프로젝트 규칙을 적어두기. 실제로 많이 쓰이고, 없는 것보다 훨씬 낫다. 하지만:

항목수동 CLAUDE.mdagentmemory
캡처 주체 사람이 직접 써야 함 에이전트 활동을 hooks가 자동 캡처
기억 범위 사람이 기억해야 쓸 수 있음 모든 툴 사용·결과·오류가 저장됨
검색 파일 전체를 컨텍스트로 주입 관련 부분만 하이브리드 검색으로 주입
압축 없음 — 계속 커짐 자동 압축 (BM25 + 요약)
외부 서비스 불필요 (장점) 불필요 — 로컬 SQLite
수동 메모의 진짜 문제: 사람이 기억해야 기록할 수 있다. 정작 가장 가치 있는 정보 — "왜 이 결정을 했나", "이 버그의 원인은 X였다" — 는 해결하고 나면 잊어버리고 안 적는다.

출처: github.com/rohitg00/agentmemory — README 비교 섹션; 직접 분석

3/10 agentmemory 답

자동 캡처 → 압축 → 세션 시작 주입

agentmemory의 핵심 루프 세 단계. 사람이 아무것도 하지 않아도 돌아간다.

에이전트 활동
Edit·Write·Read·Glob·Grep...
hooks 캡처
PostToolUse 등 자동 실행
SQLite 저장
로컬 iii-engine
압축·인덱싱
BM25 + 벡터
세션 시작 주입
SessionStart 훅으로
설치 한 줄: npm install -g @agentmemory/agentmemory 또는 npx @agentmemory/agentmemory
라이선스: Apache-2.0 / 별점: ~23k★ (주장) / 태그라인: "#1 Persistent memory for AI coding agents based on real-world benchmarks" (주장)

지원 환경: Claude Code (플러그인), Cursor · Gemini CLI · Cline · Goose (MCP 서버 설정), 그 외 모든 에이전트 (REST API, 주장: 128 endpoints on port 3111).

비유: 에이전트의 "해마(hippocampus)". 경험을 실시간으로 기록해두고, 다음 세션 시작 때 관련 기억만 꺼내 전두엽(컨텍스트 창)에 올려준다.

출처: github.com/rohitg00/agentmemory — README, package.json

4/10 저장 구조

로컬 SQLite + iii-engine — 외부 DB 불필요

agentmemory는 클라우드나 외부 벡터 DB를 쓰지 않는다. 모든 데이터는 로컬 SQLite와 자체 인덱스 엔진(iii-engine)에 저장된다.

저장되는 것

  • Observations (압축된 관찰 단위)
  • Memories (명시적으로 저장된 기억)
  • BM25 역인덱스
  • 벡터 임베딩 (선택적)
  • 지식 그래프 엣지 (엔티티 관계)

MCP 도구로 접근

  • memory_recall — 관련 기억 검색
  • memory_compress_file — 파일 압축
  • 총 ~56개 tool 정의 (검증됨)
  • 에이전트가 직접 호출 가능
KV 구조 (src/state/schema.ts 패턴): KV.observations(sessionId) → 세션별 관찰 버킷, KV.memories → 전역 기억 버킷. HybridSearch는 두 버킷에서 결과를 조합해 반환한다 (src/state/hybrid-search.ts:293-305 확인).
비유: 개인 일기장(SQLite)에 색인(BM25)과 의미 지도(벡터)와 인물 관계도(그래프)를 동시에 붙여둔 것. 전부 내 컴퓨터 안.

출처: src/state/hybrid-search.ts · src/mcp/tools-registry.ts

6/10 무과금 동작

기본값: LLM 호출 없음 — 임베딩도 로컬 384차원

이 주제가 스터디 기준(추가 과금 없음)을 통과한 이유. 기본 설정에서 외부 API 호출이 전혀 없다.

// src/providers/embedding/local.ts (검증된 실제 코드)
export class LocalEmbeddingProvider implements EmbeddingProvider {
  readonly name = "local";
  readonly dimensions = 384;
  private extractor: Awaited<ReturnType<Pipeline>> | null = null;

  async embedBatch(texts: string[]): Promise<Float32Array[]> {
    const extractor = await this.getExtractor();
    const output = await extractor(texts, { pooling: "mean", normalize: true });
    return vectors.map((v: number[]) => new Float32Array(v));
  }

  private async getExtractor() {
    // @ts-ignore - optional peer dependency
    transformers = await import("@xenova/transformers");
    return transformers.pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
  }
}

모델: all-MiniLM-L6-v2 (Xenova/Transformers.js 포팅) — 384차원, 평균 풀링 + 정규화. Node.js에서 로컬 실행, 인터넷 연결 불필요.

완전 무료 경로

  • 기본 provider: no-op (LLM 호출 없음)
  • BM25 압축만으로 핵심 기능 동작
  • 임베딩: LocalEmbeddingProvider (로컬)
  • 외부 DB: 없음 (SQLite)

선택적 유료 경로

  • Anthropic / OpenAI / Gemini 임베딩
  • Ollama / LM Studio (로컬 LLM)
  • 비용 추정: ~170K tokens/yr ≈ $10 (주장)
  • 로컬 임베딩 선택 시 $0

출처: src/providers/embedding/local.ts — 직접 읽어 검증

7/10 Claude Code 연동 · 구현 해부

hooks.json — 에이전트 활동이 자동으로 기록되는 이유

"사용자가 아무것도 안 해도" 캡처되는 핵심: Claude Code의 hooks 시스템에 node 스크립트를 등록해 에이전트의 모든 도구 사용에 끼어들어 기록한다.

// plugin/hooks/hooks.json (검증된 실제 파일 전체 구조)
{
  "hooks": {
    "SessionStart":    [{ "command": "node .../session-start.mjs" }],
    "UserPromptSubmit":[{ "command": "node .../prompt-submit.mjs" }],
    "PreToolUse":      [{ "matcher": "Edit|Write|Read|Glob|Grep",
                          "command": "node .../pre-tool-use.mjs" }],
    "PostToolUse":     [{ "command": "node .../post-tool-use.mjs" }],
    "PostToolUseFailure":[{ "command": "node .../post-tool-failure.mjs" }],
    "PreCompact":      [{ "command": "node .../pre-compact.mjs" }],
    "SubagentStart":   [{ "command": "node .../subagent-start.mjs" }],
    "SubagentStop":    [{ "command": "node .../subagent-stop.mjs" }],
    "Stop":            [{ "command": "node .../stop.mjs" }],
    "SessionEnd":      [{ "command": "node .../session-end.mjs" }]
  }
}

핵심 훅 세 가지: SessionStart = 관련 기억 주입, PostToolUse = 툴 결과 캡처, PreCompact = 압축 전 중요 내용 저장.

왜 이게 중요한가: PreToolUse의 matcher Edit|Write|Read|Glob|Grep는 Claude Code가 파일을 읽거나 쓸 때마다 발동된다. 에이전트가 코드를 탐색하고 수정하는 모든 행위가 기억 후보가 되는 것. 사람이 "이거 기억해"라고 말하지 않아도.
비유: 모든 서랍을 열고 닫을 때마다 자동으로 사진이 찍히는 연구실. 나중에 "그 서랍 뭐 있었더라"를 검색으로 찾을 수 있다.

출처: plugin/hooks/hooks.json — 직접 읽어 검증

8/10 트레이드오프

좋은 점과 한계 — 솔직하게

관점강점한계 / 주의점
비용 기본값 $0 (로컬 임베딩, no-op LLM) @xenova/transformers 설치 필요 (optional)
프라이버시 모든 데이터 로컬 SQLite — 클라우드 전송 없음 로컬 디스크에 모든 에이전트 활동이 저장됨
검색 품질 BM25+Vector+Graph RRF 융합 — 단일 방식보다 강함 임베딩 없으면 의미 검색 불가, BM25만 동작
노이즈 PreCompact + 압축으로 중요도 필터링 저품질 관찰이 많으면 검색 정밀도 저하 가능
성숙도 Apache-2.0, MCP/REST/플러그인 3가지 연동 초기 프로젝트 — API 변경 가능성
주의: hooks.json을 Claude Code 설정에 등록하면 모든 도구 사용마다 node 스크립트가 실행된다. 디스크 I/O + SQLite 쓰기가 추가되므로, 고빈도 툴 사용 세션에서 체감 지연이 생길 수 있다.

출처: github.com/rohitg00/agentmemory — 소스 직접 분석 기반 평가

9/10 정리

agentmemory가 푼 것과 그 방법

문제
세션마다 기억 소실
기존 접근
수동 CLAUDE.md
agentmemory
hooks 자동 캡처
검색
BM25+Vector+Graph RRF
무과금
로컬 모델 $0

AI 에이전트의 기억은
코드 한 줄 없이 hooks 설정만으로 자동화할 수 있다.

핵심 파일검증된 사실
plugin/hooks/hooks.jsonSessionStart · PostToolUse · PreCompact 등 12개 훅 등록, matcher: Edit|Write|Read|Glob|Grep
src/state/hybrid-search.tsRRF_K=60, bm25Weight=0.4, vectorWeight=0.6, graphWeight=0.3, 자동 정규화
src/providers/embedding/local.tsLocalEmbeddingProvider, dimensions=384, all-MiniLM-L6-v2, mean pooling+normalize
src/mcp/tools-registry.ts~56개 MCP tool 정의 (memory_recall, memory_compress_file 포함)
이번 주에 해볼 것 (딱 하나): Claude Code에 agentmemory 플러그인을 설치하고, 한 세션 작업 후 다음 세션에서 memory_recall로 이전 작업이 나오는지 확인해보기.

출처: github.com/rohitg00/agentmemory — 소스 직접 검증 (2026-06)

10/10

감사합니다

질문 / 각자의 "에이전트에게 또 설명한 경험" 공유


참고 자료

출처: 위 모든 링크 — 직접 소스 분석 (2026-06-16 기준)

1 / 10← / → 넘기기 · a: 스크롤 · n: 노트