에이전트 메모리 엔진 (5/10) — Hermes 영속 메모리 FTS5 실전: 2단 구조
MEMORY.md·USER.md 토큰 상한, state.db FTS5, session_search, 한국어 토큰화 주의, 외부 프로바이더 8개
핵심 요약
- 대상 독자: Hermes 설치 후(#12) 자기 학습 · 장기 기억 동작 원리를 이해하고 튜닝하려는 사용자.
- 얻을 것: 공식
/docs/user-guide/features/memory기준 메모리 2단 구조(active ~1,300 토큰 + SQLite FTS5 무제한), MEMORY.md·USER.md 정확한 상한, 세션 검색 원리(Gemini Flash 요약), 한국어 FTS5 토큰화 함정, 외부 프로바이더 8종 비교, 주입 시점과 prefix cache의 관계. - 선행 조건:
hermes기본 동작,~/.hermes/레이아웃 이해.
1. 핵심 통찰 — 메모리는 2층이다
많은 사용자가 착각하는 지점: "Hermes가 전부 기억한다"는 말은 실제로 두 별개 시스템을 합친 것이다.
| 레이어 | 정체 | 크기 | 로드 방식 |
|---|---|---|---|
| Active Memory | ~/.hermes/memories/MEMORY.md + USER.md |
약 1,300 토큰 상한 | 매 세션 시작 시 시스템 프롬프트에 주입 |
| Session Search (FTS5) | ~/.hermes/state.db (SQLite FTS5 인덱스) |
사실상 무제한 | Agent가 session_search 도구로 필요할 때만 조회 |
즉, 짧은 주기로 참조되는 것은 Active에 들어가고, 장기 아카이브는 FTS5 검색으로 꺼내온다. 둘의 역할을 구분하지 못하면 Active가 불어나 프롬프트가 뚱뚱해지거나, 반대로 모든 걸 FTS5에만 기대서 일관성이 떨어진다.
2. Active 메모리 — MEMORY.md + USER.md
2.1 정확한 한도 (공식 수치)
| 파일 | 역할 | 토큰 근사 | 문자 상한 |
|---|---|---|---|
MEMORY.md |
Agent의 개인 노트 (환경 팩트, 컨벤션, 학습된 것) | ~800 토큰 | 2,200자 |
USER.md |
사용자 프로필 (선호, 소통 스타일, 기대치) | ~500 토큰 | 1,375자 |
합계 약 1,300 토큰 / 3,575자. 이 크기를 넘어서는 내용은 active에 두지 말고 FTS5에 맡긴다.
2.2 주입 시점 — "프롬프트 캐시 전략"
공식 명시:
"The system prompt injection is captured once at session start and never changes mid-session."
즉, MEMORY.md를 세션 중에 수정해도 그 세션의 시스템 프롬프트에는 반영 안 된다. 다음 세션부터 반영. 이유: prefix cache 무효화를 막아 비용을 낮추기 위해.
(Claude Code도 비슷한 전략 — 자세한 비용 구조는 토큰·캐시 해부.)
2.3 Agent의 조작 API — 3 action
Agent는 memory 도구로 MEMORY.md·USER.md를 조작한다.
| action | 동작 |
|---|---|
add |
새 엔트리 추가 |
replace |
substring 매칭으로 업데이트 |
remove |
substring 매칭으로 삭제 |
read action은 없다. 읽기는 자동으로 system context에 올라간다 — agent가 명시적으로 읽지 않는다.
2.4 직접 편집도 가능
vim ~/.hermes/memories/MEMORY.md
vim ~/.hermes/memories/USER.md
다만 agent가 add·replace로 같은 내용을 다시 추가할 수 있으므로, 사용자가 직접 편집한 내용은 agent가 학습할 가치가 있다고 agent가 판단하는 형태로 기록되는 것이 가장 안전.
2.5 설정에서 토글
~/.hermes/config.yaml:
memories:
memory:
enabled: true
# char_limit 등 커스터마이즈 가능 (공식 문서의 "customizable character limits")
user:
enabled: true
비활성 시 active 주입 없이 FTS5만 사용.
3. Session Search — SQLite FTS5 기반
3.1 저장 위치와 구조
- DB 파일:
~/.hermes/state.db - 엔진: SQLite + FTS5 풀텍스트 인덱스
- 보관: 모든 대화의 메시지 히스토리, lineage, 메타데이터, 풀텍스트 인덱스
- 용량: 사용자 로컬 디스크 한계까지 (사실상 무제한)
3.2 session_search 도구 — agent가 호출
Agent는 session_search를 호출해서 과거 세션을 찾는다. 공식 명시:
"The agent can search its past conversations using the
session_searchtool, which returns relevant past conversations with Gemini Flash summarization."
흐름:
- Agent가 쿼리 결정 ("지난주에 로그인 버그 고쳤을 때 어떻게 했지")
- FTS5가 일치하는 세션 후보 반환
- Gemini Flash로 관련 부분을 요약
- 요약만 현재 컨텍스트에 주입
이 덕분에 오래된 세션 10개를 통째로 컨텍스트에 붓지 않고 150~300 토큰짜리 요약만 사용. Active 메모리 1,300 토큰보다 훨씬 큰 지식을 다룰 수 있다.
3.3 사용자가 직접 검색
hermes sessions browse # 인터랙티브 검색 UI
hermes sessions list # 최근 목록
hermes sessions export # JSONL로 뽑아서 외부 분석
hermes sessions browse가 세션 탐색의 기본 진입점.
4. 한국어 FTS5 — 토큰화 함정
SQLite FTS5는 기본 tokenizer가 공백·구두점 기준 split이다. 한국어·일본어·중국어처럼 단어 경계가 공백이 아닌 언어에서 문제가 된다.
4.1 기본 동작의 한계
"사용자 인증 흐름"을 저장 → FTS5는사용자,인증,흐름3개 토큰으로 분할 (공백 기반 동작 시)."사용자인증흐름"처럼 공백 없이 적으면 1개 토큰으로만 저장됨.- 그래서
"인증"만 검색해도 후자는 히트 안 되고 전자만 히트. - 교착어(조사·어미)로 인해
"인증을","인증이","인증한"이 모두 다른 토큰으로 저장됨.
4.2 Hermes 공식 노트
공식 문서는 한국어 FTS5 tokenizer 이슈를 명시적으로 다루지 않는다. 관찰 기반:
- 짧은 키워드 검색은 대체로 동작. 긴 구문 검색은 공백 유무에 따라 miss 가능.
- LLM Flash 요약 단계가 부분 매칭 부재를 일부 보완.
4.3 실용 팁
한국어 사용자에게:
- MEMORY.md 키워드를 공백 포함으로 기록.
"API 키 관리"가"API키관리"보다 FTS5 히트율 높음. - 중요 엔티티는 영문 원어도 병기.
"OpenClaw (오픈클로)"처럼. - 조사 최소화.
"인증 흐름은 ..."대신"인증 흐름: ..."스타일. - 찾고 싶은 날짜·번호는 명확히. FTS5는 숫자 문자열에 강함.
4.4 영문 환경이라면
영문 위주 메모리면 기본 tokenizer로 충분. OR, AND, NEAR(), MATCH 같은 FTS5 고급 문법이 Hermes 내부에서 어떻게 사용되는지는 공식 문서가 밝히지 않았으므로, 세부 쿼리 문법은 직접 테스트해보는 것이 안전.
5. Context Files — 메모리와 다른 축
메모리(자기 학습)와 별개로, 프로젝트별 지침을 주입하는 context file 레이어가 있다. Active 메모리와 혼동하기 쉬워서 정리.
5.1 공식 파일 5종
| 파일 | 역할 | 탐색 |
|---|---|---|
.hermes.md / HERMES.md |
프로젝트 지침 (최고 우선순위) | git root까지 walk |
AGENTS.md |
프로젝트 지침·컨벤션·아키텍처 | CWD + 서브디렉터리 |
CLAUDE.md |
Claude Code 컨텍스트 호환용 | CWD + 서브디렉터리 |
SOUL.md |
글로벌 페르소나 | HERMES_HOME만 |
.cursorrules |
Cursor IDE 컨벤션 | CWD만 |
5.2 우선순위 — "하나만 선택"
공식 명시:
"Only one project context type is loaded per session (first match wins):
.hermes.md→AGENTS.md→CLAUDE.md→.cursorrules."
.hermes.md가 있으면 다른 프로젝트 파일은 무시.- SOUL.md는 이 경쟁과 무관하게 항상 별도로 로드 (어차피 페르소나만 다룸).
5.3 크기·절단 규칙
- 파일당 최대 20,000자 (~7,000 토큰).
- 초과 시 70% head + 20% tail + 10% marker 비율로 절단. 중간이 날아간다.
- 서브디렉터리 AGENTS.md는 8,000자 상한.
- 절단 알림:
[...truncated AGENTS.md: kept 14000+4000 of 25000 chars...]
5.4 점진적 발견 (progressive)
Agent가 서브디렉터리로 이동하면서 해당 위치의 AGENTS.md를 동적으로 주입. 모노레포에 서브팀별 AGENTS.md를 두는 패턴이 자연스럽게 작동.
5.5 보안 — 프롬프트 인젝션 차단
모든 context file은 주입 전 프롬프트 인젝션 패턴 스캔:
- "ignore previous instructions"
- 숨겨진 div
- credential exfiltration 시도
- 제로 폭 문자
걸리면 표시:
[BLOCKED: AGENTS.md contained potential prompt injection...]
외부 repo clone 후 AGENTS.md 실행 시 이 방어층이 있다.
6. 외부 메모리 프로바이더 8종
공식 지원:
| 프로바이더 | 특징 |
|---|---|
| honcho | Dialectic user modeling (observation → hypothesis → verified). Hermes 기본 선택지. |
| openviking | (세부는 공식 문서 참조) |
| mem0 | 대중적 오픈소스 메모리 레이어 |
| hindsight | (세부는 공식 문서 참조) |
| holographic | (세부는 공식 문서 참조) |
| retaindb | (세부는 공식 문서 참조) |
| byterover | 벡터+트리 하이브리드 (OpenClaw 커뮤니티에서도 언급) |
| supermemory | Notion·GitHub·Gmail 통합형 메모리 SaaS |
6.1 설정
hermes memory setup # 대화형 선택
hermes memory status # 현재 설정
hermes memory off # 외부 provider 끄기
6.2 Honcho 심화
Honcho는 별도 서브커맨드 집합을 가진다.
hermes honcho status # 연결 상태
hermes honcho peers # 프로파일 간 peer identity
hermes honcho sessions # Honcho session 매핑
hermes honcho map # 디렉터리 → session 매핑
hermes honcho peer # peer 이름 조회/변경
hermes honcho mode # recall 모드 표시/설정
hermes honcho tokens # 토큰 예산 표시/설정
hermes honcho identity # AI peer 표현 시딩
hermes honcho enable # 프로파일에서 활성
hermes honcho disable # 비활성
hermes honcho sync # 모든 프로파일에 설정 동기화
hermes honcho migrate # openclaw-honcho에서 마이그레이션
Honcho 특징: 사용자를 "peer"로 모델링, dialectic 추론(observation 1회 → hypothesis 2회+ → verified 3일+) 단계화. 확증편향 방지 구조가 특징.
6.3 선택 기준
- 혼자 쓰는 로컬 → Active + state.db만으로 충분. 외부 프로바이더 불필요.
- 여러 기기·장기 보관 필요 → supermemory / mem0 같은 SaaS.
- 벡터 검색 품질이 중요 → byterover / mem0.
- 사용자 모델링 심화 → honcho.
7. 실전 패턴 — 무엇을 어디에 두는가
7.1 Active 메모리 (MEMORY.md / USER.md)
들어가야 할 것:
- "사용자 이름/호칭" (USER.md)
- "선호하는 언어: 한국어/영어 혼용 OK" (USER.md)
- "이 개발자는 Node보다 Rust 선호" (USER.md)
- "pnpm 사용, npm 피함" (MEMORY.md)
- "테스트는 make test로" (MEMORY.md)
들어가지 말아야 할 것: - 지난주 에러 해결 기록 → FTS5에 자연 축적 - 특정 함수 구현 이력 → 세션에 이미 있음 - 긴 설정 파일 내용 → AGENTS.md나 실제 파일 참조
7.2 Session Search (FTS5)
agent가 알아서 찾는다. 사용자 관점에서는 긴 대화를 마친 후 세션을 의미 있는 이름으로 저장하는 것만 신경 쓰면 된다.
/title rate-limit-migration-2026-04
나중에 session_search가 이 제목으로도 히트.
7.3 Context Files
- 프로젝트별 규칙 →
AGENTS.md(codex·claude 호환) - 개인 페르소나 →
SOUL.md - 팀 전용 문서 → 프로젝트 내부 markdown (agent가 필요 시
read도구로 접근)
7.4 외부 프로바이더
시작하지 말 것. 기본 2층으로 운영해보고, 정말 "여러 기기 동기화 / 수만 개 세션 / 팀 공유 메모리"가 필요할 때만 추가.
8. 메모리 감사 · 백업
8.1 내용 확인
cat ~/.hermes/memories/MEMORY.md
cat ~/.hermes/memories/USER.md
언제든 열어서 확인 가능. agent가 "기억한" 내용이 의도와 다르면 직접 삭제·수정.
8.2 SQLite 쿼리
sqlite3 ~/.hermes/state.db
.schema
SELECT id, title, created_at FROM sessions ORDER BY created_at DESC LIMIT 10;
스키마 세부는 공식 문서가 밝히지 않으므로 .schema로 실측 확인.
8.3 백업
hermes backup -o ~/hermes-$(date +%Y%m%d).zip
~/.hermes/ 전체를 zip. 메모리·세션·config 모두 포함.
8.4 프라이버시 관점
- 로컬에만 저장 — 외부 프로바이더를 붙이지 않는 한 메모리는 사용자 기기에만 머문다.
- 대화 내용 = LLM provider에 전송됨. Hermes 메모리가 아니라 LLM 호출 로그가 더 큰 프라이버시 리스크.
9. 반대 시나리오 — 메모리 시스템을 비활성화해야 할 때
- 민감한 일회성 작업 →
--ignore-rules플래그로 memory·rules 자동 주입 스킵. - CI에서 비대화 사용 → 세션 저장 자체가 불필요.
--no-session-persistence(공식 지원 여부 실험 필요) 또는 임시 profile로 격리. - 여러 사람 공유 서버 → 서로의 메모리가 섞이지 않게
hermes profile로 분리. - 메모리 오염 의심 → MEMORY.md/USER.md 내용을 직접 확인 → 문제 항목 삭제 → 다음 세션부터 깨끗.
10. 체크리스트 — 메모리 튜닝 5분
- [ ]
cat ~/.hermes/memories/MEMORY.md— 생각한 대로 기록되고 있나? - [ ]
cat ~/.hermes/memories/USER.md— 사용자 프로필 정확한가? - [ ] 불필요한 항목이 있으면 직접
vim편집 또는 agent에게/memory로 지시 - [ ]
hermes sessions stats— 세션 저장소 크기 확인 - [ ] 3개월 넘은 세션 정리:
hermes sessions prune --days 90 - [ ] (선택)
hermes memory status— 외부 프로바이더 구성 확인 - [ ] 백업:
hermes backup -o ~/hermes-$(date +%Y%m%d).zip
11. 다음 단계
메모리가 손에 익었다면:
- OpenClaw → Hermes 마이그레이션 체크리스트 (예정) — 메모리·스킬 이전 실전.
- 설치 + SOUL.md — 기본.
- 명령어 치트시트 —
hermes memory/hermes honcho전체.
참고
- 공식 Memory Feature 문서
- Context Files 문서
- NousResearch/hermes-agent GitHub
- SQLite FTS5 공식 문서 — tokenizer 동작 심화
이 글은 "AI 코딩 CLI 진입 가이드" 시리즈의 14/15 편입니다. last verified: 2026-04-25 (hermes-agent.nousresearch.com/docs/user-guide/features/memory + context-files 기준).
시리즈 전체 안내: 시리즈 목차
댓글
댓글 쓰기