네 레이어
- JSONL ground truth — 모든 채팅 turn, 모든 tool 호출이 아빠한테 보여지기 전에
~/pippa-db/sessions/{conversation_id}.jsonl에 쓰임. System of record. Fernet 으로 at rest 암호화. - SQLite cache — 대화, brain, 메시지 ordering 의 빠른 인덱스. JSONL 에서 derive — purge + 재빌드 가능.
- ChromaDB 임베딩 — Obsidian vault + 대화 history 위 시맨틱 검색. Ollama 통한 BGE-M3 (1024차원, 다국어, 로컬) 로 임베딩.
- Obsidian vault — 피파의 distill 된 long-term 정체성 + 교훈. 채팅에서 영구 record 로 promote 할 가치 있을 때 피파가 (아빠 승인과 함께) 손으로 큐레이션.
Retrieval contract
피파 답할 때 context engine 이 assemble: vault entry point (instructions.md), 그 다음 정체성 + core 파일, 그 다음 on-demand 인덱스 파일. 대화 메모리 + tool 출력은 SQLite 인덱스 통해 JSONL 에서. Vault 위 vector retrieval 이 위에 — '내가 X 에 대해 어디 썼더라' 같은 드문 query 위해.
두 retrieval 스타일이 있는 이유
Vault 는 fully load (큰 인덱스 파일은 on-demand 확장 with) — 시맨틱 similarity 불필요, 피파가 이미 구조 알아. 대화 history 는 fully load 하기엔 너무 커 — 거기서 vector retrieval 이 자기 keep 함.
이게 일반적으로 가르치는 것
- JSONL ground truth + derived 인덱스가 모든 데이터베이스 선택 살아남는 durability 패턴.
- Hand-curated semantic 메모리가 정체성-critical 콘텐츠에 auto-distill 메모리 이김.
- 두 retrieval 스타일 (full-load vs vector) 가 각각 데이터 모양 fit 할 때 편안히 공존.