Turning Conversation Logs into Obsidian Long-Term Memory: A Pipeline That Distills Them Every Night

개요

클로드 코드 환경 시리즈의 일환으로, 본 콘텐츠는 대화 로그(Layer 1)를 Obsidian Vault(Layer 4)로 자동 변환하는 파이프라인 구현을 상세히 설명하며, 자동화된 일일 처리 과정에서 발생하는 문제점들을 해결하는 방법에 초점을 맞춘다.

주요 내용

* 파이프라인 구성:
* Harvest: extract_conversations.py 스크립트를 통해 최신 상태로 대화 로그를 갱신한다.
* Distill: Headless Claude -p를 사용하여 지난 28시간의 변경 사항을 Obsidian Vault의 해당 도메인에 추가한다.
* Backup: 모든 실행 시 Git Commit 및 Private Repo 푸시를 수행하여 변경 사항을 백업하고 필요 시 롤백할 수 있도록 한다.
* 처리 분할: Claude 대화와 Codex 대화의 처리를 두 개의 독립적인 실행으로 분리하여, 단일 실행 시 발생하는 타임아웃 문제를 방지한다.
* Trap 1: launchd와 TCC (보호 폴더 접근)
* iCloud 동기화 및 macOS TCC(Privacy protection)로 인해 ~/Documents 내 Vault 접근이 launchd에서 실패하는 문제를 겪었다.
* 이는 silent failure로 이어질 수 있으므로, 사전 점검(preflight check)에서 조기에 감지하고 알림을 전송한다.
* 해결책으로 /bin/bash에 대한 Full Disk Access 권한을 시스템 설정에서 부여하고, 스크립트는 보호 영역 외부(~/.claude/scripts/)에 위치시킨다.
* Trap 2: Sleep 및 이중 실행 (자체 복구 메커니즘)
* 기기 슬립 시 야간 작업이 중단되는 문제를 해결하기 위해, 여러 시간 슬롯에 걸쳐 재시도하고 성공 시 즉시 종료하는 자체 복구 메커니즘을 구현했다.
* mkdir lock을 사용하여 이중 실행을 방지하고, 오래된 잠금 파일은 프로세스 생존 여부에 따라 자동 복구한다.
* 환각(Fabrication) 방지:
* AI가 존재하지 않는 정보를 만들어내는(예: 모호한 기간을 구체적인 시간으로 확장) 것을 방지하기 위해 두 가지 대책을 마련했다.
* 정족수(Ground Truth) 분리: Google Calendar API에서 가져온 시간 기록 이벤트를 별도 파일로 덤프하여 유일한 '정족수'로 지정하고, AI에게 이를 유일한 스케줄 소스로 참조하도록 지시한다.
* 최후 성공값(Last-Known-Good) 보존: API 호출 실패 시에도 이전 성공 값을 유지하고, 'stale' 표시를 붙여 재구축하도록 한다.
* 프롬프트에서도 "추측으로 불확실한 정보 추가 금지", "날짜/시간 정보는 확인된 정보와 추측을 명확히 분리" 등의 제약을 설정한다.
* 신선도 판단 (Freshness Judgment):
* 생성된 결과물이 '오늘의 출력'인지 판단하기 위해, 아카이빙되는 파일이 실행 시작 시간보다 최신인지 mtime을 사용하여 확인한다.
* 이를 통해 타임아웃 발생 시에도 이전 날짜의 결과물이 성공으로 기록되는 것을 방지한다.

시사점

해당 파이프라인은 대화 로그와 같은 비정형 데이터를 구조화된 장기 기억으로 자동 변환하는 실용적인 방법을 제시하며, AI 기반 자동화 시스템 구축 시 발생할 수 있는 다양한 기술적 함정(TCC, 슬립, 이중 실행, 환각, 결과물 위조 등)을 어떻게 식별하고 해결할 수 있는지에 대한 구체적인 해결책을 제공하여 실무 적용에 대한 통찰을 제공한다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions