개인용 AI의 영혼으로서의 .txt 파일 — FileRAG 메모리 아키텍처
요약
대화 기록의 토큰 제한과 휘발성 문제를 해결하기 위해 .txt 파일을 활용한 FileRAG 메모리 아키텍처를 제안합니다. 단순 메시지 저장을 넘어 주제 이탈 감지 및 중복 제거를 통해 사용자의 정보를 요약된 형태로 영구 저장하는 방식입니다.
핵심 포인트
- 메시지 객체가 아닌 관계와 요약 정보를 저장하는 '영혼 파일' 개념 도입
- 주제 이탈(Topic Drift) 감지를 통한 효율적인 데이터 증류(Distillation)
- 코사인 유사도를 활용한 중복 데이터 방지 및 데이터 품질 유지
- BM25와 의미론적 검색을 결합한 하이브리드 RAG 아키텍처
개인용 AI의 영혼으로서의 .txt 파일 — FileRAG 메모리 아키텍처
Dharanidharan J (JD) 작성
Full Stack & AI Engineer | Jarvix 구축 중
아무도 말하지 않는 문제
모든 챗봇(Chatbot) 튜토리얼은 동일한 내용을 가르칩니다:
history = []
history.append({"role": "user", "content": message})
그리고 그것은 작동합니다 — 작동하지 않을 때까지는 말이죠.
500번의 대화(Turn)가 지나면, 당신의 딕셔너리(Dict)는 사용자가 누구인지 잊어버립니다. 1,000번의 대화가 지나면, 토큰 제한(Token limits)에 도달합니다. 재시작 후에는 모든 것이 사라집니다. Redis는 지속성(Persistence)에 도움을 주지만, 여전히 초기 사실들을 노이즈 아래에 묻어버립니다. 벡터 데이터베이스(Vector DBs)는 검색(Retrieval)에 도움을 주지만, 저장 공간을 팽창시키고 인프라가 필요합니다.
만약 메모리 자체가 그냥 하나의 파일이라면 어떨까요?
아이디어
사용자가 나누는 모든 대화는 일반적인 .txt 파일로 증류(Distill)됩니다. 그 파일이 바로 두뇌입니다. 새로운 쿼리(Query)가 들어올 때마다, 하이브리드 BM25 + 의미론적 RAG (Semantic RAG)가 파일에서 가장 관련 있는 청크(Chunks)를 검색하여 컨텍스트(Context)로 주입합니다.
users/
└── jd.txt ← 영혼 파일 (soul file)
영혼 파일은 다음과 같은 모습입니다:
[Turns 1-5]
- 사용자의 이름은 JD, 소프트웨어 엔지니어
- 새로운 메모리 아키텍처인 FileRAG를 구축 중
...
인간이 읽을 수 있고, 편집 가능하며, 당신의 것입니다.
이것이 왜 다른가
대부분의 메모리 시스템은 **메시지(Messages)**를 저장합니다. FileRAG는 **관계(Relationship)**를 저장합니다.
| 시스템 | 저장하는 것 |
|---|---|
| Dict / Redis | 가공되지 않은 메시지 객체 (Raw message objects) |
| ... |
사용 기간이 길어질수록 AI는 당신을 더 잘 이해하게 됩니다 — 더 많은 메시지를 가지고 있기 때문이 아니라, 당신이 누구인지에 대한 더 나은 요약본을 가지고 있기 때문입니다.
아키텍처
사용자 메시지 (User message)
↓
주제 이탈 확인 (Topic drift check, 코사인 유사도 (cosine similarity))
...
핵심 혁신:
1. 주제 이탈 증류 (Topic-Drift Distillation)
맹목적으로 N번의 대화마다 기다리는 대신, 시스템은 현재 버퍼(Buffer)와 새로운 메시지 사이의 의미론적 유사도(Semantic similarity)를 측정합니다. 유사도가 0.25 미만으로 떨어지면, 즉시 증류를 수행하고 새로운 블록을 시작합니다. 이를 통해 주제별 청크(Topic chunks)를 깨끗하고 독립적으로 유지할 수 있습니다.
2. 중복 제거 (Deduplication)
새로운 청크 (Chunk)를 작성하기 전에, 모든 기존 청크를 대상으로 코사인 유사도 (Cosine similarity)를 확인합니다. 유사도가 92%를 초과하면 해당 청크는 건너뜁니다. 이는 불필요한 대화 내용이 영혼 파일 (Soul file)을 오염시키는 것을 방지합니다.
3. 비상 종료 핸들러 (Emergency Exit Handler)
SIGINT 및 SIGTERM 신호를 가로챕니다. Ctrl+C를 누르면 프로세스가 종료되기 전 현재 버퍼 (Buffer)를 즉시 증류 (Distill)합니다. 데이터는 아무것도 잃어버리지 않습니다.
4. 하이브리드 검색 (Hybrid Retrieval)
BM25는 정확한 키워드 (프로젝트 이름, 사용자 이름 등)를 포착합니다. 의미론적 검색 (Semantic search)은 의미 (취향, 성격 등)를 포착합니다. 이 둘을 결합하면 각각을 단독으로 사용할 때보다 뛰어난 성능을 발휘합니다.
벤치마크 결과 (Benchmark Results)
_Pop!OS, NVIDIA GPU, sentence-transformers all-MiniLM-L6-v2 임베딩 (Embeddings) 환경에서 테스트됨
소규모 (20 턴)
| 지표 (Metric) | Dict | Redis | Vector DB | FileRAG |
|---|---|---|---|---|
| 쓰기 속도 (ms) | 0.0004 | 0.30 | 33.38 | 20.33 |
| ... | ||||
| 소규모 규모에서는 Dict와 Redis가 속도 면에서 승리합니다. FileRAG는 정확도 면에서 대등한 성능을 보여줍니다. 공정한 결과입니다. |
중규모 (500 턴)
| 지표 (Metric) | Dict | Redis | Vector DB | FileRAG |
|---|---|---|---|---|
| 쓰기 속도 (ms) | 0.0002 | 0.08 | 22.23 | 18.93 |
| ... | ||||
| 여기서부터 흥미로워집니다. Dict와 Redis는 완전히 실패합니다. 핵심 사실들이 490턴에 달하는 노이즈 아래에 파묻히기 때문입니다. FileRAG는 여전히 완벽하게 검색해냅니다. |
대규모 (1000 턴)
| 지표 (Metric) | Dict | Redis | Vector DB | FileRAG |
|---|---|---|---|---|
| 저장 용량 (KB) | 69.47 | 67.51 | 4338.36 | 938.74 |
| ... | ||||
| FileRAG의 총 저장 용량에는 ChromaDB 인덱스 (Index) 오버헤드가 포함되어 있습니다. 영혼 파일 자체, 즉 실제 사람이 읽을 수 있는 메모리는 1000턴 기준 단 18 KB에 불과합니다. |
| 지표 (Metric) | Dict | Redis | Vector DB | FileRAG |
|---|---|---|---|---|
| 저장 용량 (KB) | 3,478 | 3,381 | 76,159 | 29,812 |
| 영혼 파일 (KB) | — | — | — | ~1,865 |
| 정확도 (Accuracy) | 0% | 0% | ~67% | ~100% |
10만 턴(100k turns) 규모에서 Vector DB는 인덱스 저장에만 약 74 MB를 소비하게 됩니다. 반면 FileRAG의 영혼 파일은 2 MB 미만을 유지하며, 사람이 읽을 수 있고, 휴대 가능하며, 프라이빗 (Private)합니다.
결론 (The Verdict)
| 카테고리 | Dict | Redis | Vector DB | FileRAG |
|---|---|---|---|---|
| 가장 빠른 쓰기 (Fastest write) | ✅ | ✅ | ❌ | 보통 (Medium) |
| ... |
FileRAG가 가장 빠르지는 않습니다. 가장 단순하지도 않습니다. 하지만 인프라 요구 사항을 늘리지 않으면서도, **대화가 길어질수록 더 정확해지는 유일한 아키텍처 (Architecture)**입니다.
인간에 비유하기 (The Human Analogy)
당신의 뇌는 모든 대화를 토씨 하나 틀리지 않고 기록하지 않습니다. 경험을 감정, 사실, 패턴과 같은 기억으로 압축합니다. 해마 (Hippocampus)가 이를 증류하고, 대뇌 피질 (Cortex)이 저장합니다.
FileRAG도 동일한 작업을 수행합니다:
대화 (Conversation) → 증류 (Distillation) → 소울 파일 (Soul file) → 검색 (Retrieval) → 자연스러운 응답 (Natural response)
경험 (Experience) → 해마 (Hippocampus) → 피질 (Cortex) → 회상 (Recall) → 자연스러운 행동 (Natural behaviour)
소울 파일은 데이터베이스가 아닙니다. 그것은 AI가 당신에게 말을 하기 전에 읽는 일기장입니다.
한계점 (솔직하게)
- **쓰기 속도 (Write speed)**가 Dict/Redis보다 느림 — 임베딩 (Embedding)에 시간이 소요됨
- 1만 명 이상의 동시 사용자에게 부적합 — 파일 I/O는 수평적 확장 (Scale horizontally)이 어려움
- **증류 품질 (Distillation quality)**이 사용된 LLM에 따라 달라짐 — 약한 요약기는 약한 기억을 생성함
- **1만 회 이상의 턴 (Turns)**은 소울 파일 오염을 방지하기 위해 중복 제거 (Deduplication)가 필요함 (구현되어 있으나 복잡성이 추가됨)
스택 (Stack)
LLM → Groq (llama3-70b-8192)
증류 (Distillation) → Groq (llama3-70b-8192) 5턴마다 또는 주제 이탈 시
임베딩 (Embeddings) → sentence-transformers/all-MiniLM-L6-v2
...
코드 가져오기
전체 구현체 — main.py, benchmark.py 및 아키텍처 — 는 GitHub에서 확인할 수 있습니다:
→ github.com/dharanidh75/filerag-memory
이것은 또한 Pop!_OS를 위한 로컬 우선 (Local-first) 음성 AI 어시스턴트인 Jarvix에 구축되고 있는 메모리 레이어이기도 합니다.
향후 계획 (What's Next)
- v2: 구조화된 메모리 스키마 (Structured memory schema) (사실, 선호도, 타임라인)
- v3: 세션별로 격리된 소울 파일을 가진 다중 사용자 지원
- v4: 더 높은 추출 품질을 위한 미세 조정 (Fine-tuned)된 증류 모델
- v5: 프로덕션 준비 완료된 API 레이어
로컬 AI를 구축 중이거나, 개인용 비서가 필요하거나, 혹은 챗봇이 재시작될 때마다 당신이 누구인지 잊어버리는 것에 지쳤다면 — FileRAG를 사용해 보세요.
영혼 파일(soul file)은 18 KB입니다. 당신의 AI는 단순한 딕셔너리 (dict) 이상의 가치를 누릴 자격이 있습니다.
Dharanidharan J (JD)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기