Grep은 죽었다: Claude Code가 기억하게 만드는 방법

8 hours ago 3

  • 클로드 코드의 세션 간 컨텍스트 유실 문제를 해결하기 위해 로컬 검색 엔진 QMD와 /recall 스킬을 결합한 메모리 시스템 구축
  • QMD는 Obsidian 볼트를 인덱싱하는 로컬 검색 엔진으로, BM25·시맨틱·하이브리드 세 가지 검색 모드 지원
  • /recall 스킬은 시간순·주제별·그래프 시각화 세 가지 모드로 과거 세션의 풀 컨텍스트를 즉시 복원
  • 700개 세션의 JSONL 대화 기록을 자동 파싱·임베딩하여 QMD 인덱스에 반영하는 자동화 파이프라인 구현
  • 도구가 바뀌어도 컨텍스트만 유지하면 어떤 AI 에이전트에서든 활용 가능하다는 컨텍스트 중심 워크플로우 제시

문제: 세션마다 초기화되는 Claude Code

  • Claude Code의 모든 대화는 제로 상태에서 시작되며, 3주간 700개 세션을 진행하면서 과거 결정사항과 프로젝트 컨텍스트를 추적하기 어려운 상황 발생
  • 세션 중반에 컨텍스트 한도(60%)에 도달하면 compact 또는 hand off가 필요하고, 이 과정에서 결정사항의 절반이 유실
  • 다음 날 작업을 이어가려 할 때 무엇을 했는지 기억나지 않는 불편함이 반복됨
  • 기존 방식인 파일 grep 기반 검색은 확장성이 없음

QMD: 볼트 전용 로컬 검색 엔진

  • QMD는 Shopify CEO Tobias Lutke 가 만든 로컬 검색 엔진으로, Obsidian 볼트를 인덱싱하여 1초 이내에 검색 결과 반환
  • 볼트 폴더별로 QMD collection을 매핑(노트, 일일 기록, 세션, 트랜스크립트 등)하여 집중 검색 수행 가능
  • qmd collection list, qmd search "video workflow" -c notes -n 3 등 단일 명령으로 작동
  • Claude Code의 기본 검색은 Haiku 서브 에이전트가 모든 파일을 grep하는 브루트 포스 방식으로, 테스트 결과 3분 소요에 300개 파일 반환, 결과 품질도 낮음
  • QMD 검색은 즉각적이고 더 정확하며 토큰 소모가 적음 — 서브 에이전트 불필요

Grep vs BM25 vs 시맨틱 검색

  • BM25 (qmd search): 결정론적 풀텍스트 검색으로, grep처럼 키워드를 매칭하되 각 파일에 점수를 부여
    — 단어 출현 빈도와 전체 문서 대비 희소성 기반, AI나 임베딩 없이 수학적 연산만 사용
    • "sleep" 5회 언급된 짧은 노트가 10,000단어 파일에서 1회 언급된 것보다 높은 점수
  • 시맨틱 (qmd vsearch): 임베딩 기반으로 정확한 단어가 없어도 의미로 검색 가능
  • 하이브리드 (qmd query): BM25와 시맨틱을 결합
  • "sleep" 검색 벤치마크 비교:
    • grep: 200개 파일 반환, sleep() 프로그래밍 명령어까지 포함하는 노이즈 다수
    • BM25: 2초 내에 수면 품질 실험, 수면 중단 기록 등 관련 결과 반환
    • 단, qmd search "insomnia"는 볼트에 해당 단어가 없어 결과 0
    • 시맨틱: "couldn't sleep, bad night" 검색 시 수년 전 설정한 취침 습관 목표까지 발견 — 5개 결과 중 4개가 검색어를 포함하지 않음
    • 하이브리드: sleep quality improvement 89%, sleep interrupted at 3am 51%, health sleep optimization 42%로 최적 순위 제공
  • 권장 사용 패턴: 검색의 80%는 BM25로 처리(구조화된 노트에 적합), 트랜스크립트와 비정형 메모에는 시맨틱 검색 추가

시맨틱 검색의 실제 발견 사례

  • "find the days when I was happy and what was the reason" 같은 비정형 질의에 Claude가 자동으로 여러 검색을 조합:
    • qmd vsearch "happy, grateful, excited", "energy, great day, feeling good", "satisfaction, accomplishment" 등 복수 검색 실행
  • 수개월간의 일일 노트에서 의미적 연결을 발견 — "가장 행복한 날은 무언가를 출시하고 사우나나 9시간 수면으로 좋은 회복을 한 날"이라는 패턴 도출

/recall 스킬: 작업 시작 전 컨텍스트 로드

  • /recall은 QMD 위에서 작동하는 Claude Code 스킬로, 작업 시작 전에 컨텍스트를 자동 로드함
  • 세 가지 모드 지원:
    • temporal: 날짜 기반 세션 히스토리 스캔 (/recall yesterday, /recall last week)
    • topic: QMD 컬렉션 대상 BM25 검색 (/recall topic graph)
    • graph: 세션과 파일의 인터랙티브 시각화 (/recall graph last week)
  • /recall yesterday 테스트 결과: 하루 동안의 39개 세션을 타임라인으로 재구성 — 각 세션의 시간, 메시지 수, 작업 내용 표시
  • /recall topic "QMD video" 결과: 세션과 노트 전체에서 대시보드, 프로덕션 계획, 투두 리스트 등 관련 파일을 1분 이내에 반환 — 브루트 포스 grep 대비 시간·토큰·결과 품질 모두 우위
  • graph 모드는 세션을 컬러 블롭으로 시각화하여 오래된 세션은 흐리게, 최근 세션은 보라색으로 하이라이트 — 파일은 goals, research, voice, docs, content, skills 등 타입별 클러스터링
  • 예시: 점심 장소 탐색 세션을 일주일 후 그래프에서 발견하고, 해당 파일 경로를 Claude Code에 복사하여 이전 대화를 이어서 작업 가능

700개 세션의 자동 인덱싱

  • Claude Code는 모든 대화를 JSONL 파일로 로컬 저장 — 3주간 700개 세션 축적
  • 원본 파일에는 tool uses, 시스템 프롬프트, role 등이 포함되어 있어 이를 파싱하여 클린 마크다운(실제 사용자 메시지와 시그널) 으로 변환 후 QMD 인덱스에 임베딩
  • 터미널 종료 시 자동 hook이 실행되어 세션을 QMD에 export·embed — 별도 수동 작업 없이 항상 최신 인덱스 유지

실행하지 않은 아이디어 발견

  • "find the ideas that I have never acted on" 검색 시 Claude가 QMD 결과를 종합하여 발견한 내용:
    • 10월 19일 — PhD 작성 대시보드 구축 계획이 있었으나 실행하지 않음
    • 일러스트레이션 기반 앱 아이디어가 있었으나 후속 조치 없음
    • Obsidian 워크플로우 화면 녹화 아이디어가 있었으나 실행하지 않음
  • 수개월 전에 작성하고 완전히 잊은 내용들이 재발견됨
  • 모든 임베딩은 로컬에 저장

컨텍스트 중심 워크플로우

  • 노트가 Obsidian 안에 갇혀 있지 않고 실제 목표 달성에 활용되는 유용한 컨텍스트로 전환
  • 도구는 변하지만(새 모델, 새 에이전트) 컨텍스트만 유지하면 Claude Code, Codex, Gemini CLI 등 어디서든 작동 가능
  • 메모리 레이어는 스킬 형태로 전체 스택에서 작동
  • 실제 구성: Obsidian Sync로 Mac과 상시 가동 Mac Mini 간 볼트 동기화, Mac Mini에서 OpenClaw가 24/7 실행 — 폰에서 OpenClaw 접속 시 동일한 볼트·QMD 인덱스·스킬을 어디서나 사용 가능
  • 전체 스택 구조:
    • 하단: Obsidian Vault
    • 중간: QMD Search
    • 상단: Claude Code / OpenClaw
    • 컨텍스트가 아래에서 위로 흐르는 구조

Read Entire Article