Vibe-Memory: ChatGPT의 건망증을 해결하는 AI 시맨틱 메모리 (Semantic Memory)
요약
ChatGPT의 맥락 유지 문제를 해결하기 위해 개발된 AI 시맨틱 메모리 시스템 'Vibe-Memory'를 소개합니다. 사용자의 경험과 데이터를 자동으로 임베딩하여 AI가 장기적인 맥락을 기억하도록 설계되었습니다.
핵심 포인트
- LLM의 단기 기억 한계를 극복하는 시맨틱 메모리 구현
- PostgreSQL의 pgvector를 활용한 단순하고 효율적인 아키텍처
- 복잡한 설정 없이 텍스트와 경험을 자동으로 임베딩 및 검색
- Go 언어를 사용하여 가볍고 빠른 시스템 구축
Vibe-Memory: ChatGPT의 건망증을 해결하는 AI 시맨틱 메모리 (Semantic Memory)
솔직히 말해서, 저는 AI의 메모리 문제로 충분히 데인 적이 있어서 무언가 잘못되었다는 것을 알고 있습니다.
질문 하나 해보겠습니다. ChatGPT에게 개인적인 프로젝트, 아이디어, 고민, 디자인 결정 사항 등을 이야기했는데... 일주일 뒤에 다시 돌아왔을 때 그것을 완전히 잊어버린 적이 있나요? 똑같은 기본적인 질문을 다시 던지고, 당신이 공들여 설명한 맥락 (Context)을 기억하지 못합니다. 마치 박사 학위를 가진 금붕대와 대화하는 기분이 들죠.
저는 진저리가 났습니다. 그래서 Vibe-Memory를 만들었습니다. 당신이 누구인지, 무엇을 했는지, 그리고 당신의 경험 뒤에 숨겨진 "분위기 (Vibe)"를 실제로 기억하는 AI 기반 시맨틱 메모리 (Semantic Memory) 시스템입니다. 3개월간의 개발 끝에, 제가 무엇을 배웠는지, 무엇이 고장 났는지, 그리고 왜 이것이 당신의 개인적인 AI 워크플로우에서 빠져 있던 조각이 될 수 있는지 공유하고자 합니다.
이것이 실제로 해결하는 문제는 무엇인가요?
문제는 이렇습니다. 거대 언어 모델 (Large Language Models, LLM)은 놀랍지만, "기억"하지는 못합니다. 모든 대화는 새로운 시작입니다. 매번 모든 것을 다시 설명해야 합니다. 일회성 질문에는 괜찮지만, 장기 프로젝트를 진행하거나, 일기를 쓰거나, 개인 지식 베이스를 구축하거나, 혹은 단순히 AI 어시스턴트가 진정으로 "당신"을 알기를 원할 때는 매우 지치는 일입니다.
다른 해결책들도 존재합니다:
- ChatGPT Custom GPTs: 미리 정의된 지침에는 훌륭하지만, 당신의 경험과 함께 동적으로 성장하지는 않습니다.
- 벡터 데이터베이스 (Vector databases): 대부분의 사람들에게 너무 복잡하며, 작동시키기 위해 기술적인 설정이 필요합니다.
- AI 기능이 포함된 노트 앱: 여전히 "당신"이 검색하는 것에 초점이 맞춰져 있지, "AI"가 자동으로 당신의 메모리를 사용하는 방식은 아닙니다.
저는 더 단순한 것을 원했습니다:
- 메모리 (텍스트, 노트, 경험)를 추가합니다.
- 시스템이 이를 자동으로 시맨틱하게 임베딩 (Embed) 합니다.
- AI와 채팅할 때, 관련 메모리를 자동으로 가져옵니다.
- 당신이 모든 것을 다시 설명할 필요 없이 AI가 당신의 맥락 (Context)을 파악합니다.
그게 전부입니다. 복잡한 설정도 없고, 방해가 되는 화려한 UI도 없습니다. 그저 제대로 작동하는 시맨틱 메모리 (Semantic Memory)뿐입니다.
아키텍처 (Architecture): 생각보다 단순합니다
솔직히 말해서, 처음에는 너무 복잡하게 생각했습니다. 여러 단계로 구성된 화려한 벡터 검색 파이프라인(vector search pipeline)을 만들려고 시도했고, 서로 다른 임베딩 모델(embedding models)과 캐싱 레이어(caching layers)를 도입하는 등... 정말 엉망진창이었습니다. 복잡함과 한 달 동안 씨름한 끝에, 저는 모든 것을 정말 단순한 것으로 다시 깎아냈습니다.
// Go로 작성된 핵심 아키텍처 (Architecture) — 네, 가볍고 빠르게 만들고 싶어서 Go를 선택했습니다)
type VibeMemory struct {
store VectorStore
...
이것이 말 그대로 핵심입니다. 그 외의 모든 것은 사용하기 쉽게 만들기 위해 이 주변을 감싸고 있을 뿐입니다.
벡터 저장소(vector store)의 경우, 결국 PostgreSQL 기반의 pgvector를 선택했습니다. 제 말을 들어보세요 — 요즘 다들 특화된 벡터 데이터베이스(vector databases)를 찾으려 한다는 것을 알지만, 다음과 같은 이유가 있습니다:
- 대부분의 사람들은 이미 어딘가에서 PostgreSQL을 실행하고 있습니다.
- pgvector는 성숙하고 안정적이며, 솔직히 개인적인 용도로는 충분히 빠릅니다 (저는 약 10,000개의 메모리를 가지고 있는데도 여전히 응답 시간이 100ms 미만입니다).
- ACID 준수(ACID compliance)와 실제 관계형 데이터베이스(relational database)의 모든 장점을 무료로 얻을 수 있습니다.
- 개인 프로젝트를 위해 유지 관리해야 할 추가 서비스가 없습니다.
테이블 정의는 다음과 같이 생겼습니다:
CREATE TABLE memories (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
content TEXT NOT NULL,
...
매우 직관적입니다. 1536 차원(dimension)은 OpenAI의 임베딩 모델(embedding model)을 위한 것인데, 이 모델은 저렴하며($100만 토큰당 $0.025) 이 사용 사례에 충분히 좋습니다.
임베딩(embedding) 단계의 경우, 처음에는 로컬 모델(all-MiniLM 등)로 시작했지만 솔직히 — 개인적인 용도로는 OpenAI 임베딩이 충분히 저렴하고 품질도 더 좋습니다. API 호출로 인해 약간의 지연 시간(latency)이 추가되지만, 이 사용 사례에서는 무시할 수 있는 수준입니다.
예상치 못했던 놀라운 난관들
저는 시맨틱 메모리(semantic memory)가 단순히 "모든 것을 임베딩하고 검색하는 것"이 아니라는 것을 고생하며 배웠습니다. 잘 언급되지 않는 까다로운 문제들이 몇 가지 있습니다.
1. "Vibe" 문제: 관련성(Relevance)은 단순히 시맨틱한 것만이 아니다
저를 당황하게 만든 부분은 다음과 같습니다: 때로는 두 개의 기억이 시맨틱(semantic)하게는 유사하지만, 문맥(context)상으로는 완전히 다를 수 있습니다. 또는 오래된 정보보다 최근의 정보를 더 기억하고 싶을 때도 있습니다.
예를 들어, 현재 진행 중인 사이드 프로젝트인 "Vibe-Memory"에 대해 이야기하고 있을 때, 검색 결과가 단지 "memory"라는 단어를 포함하고 있다는 이유만으로 10년 전에 작성한 "C 언어에서의 메모리 관리 (memory management in C)"에 관한 오래된 블로그 포스트를 불러오는 것을 원치 않을 것입니다.
결국 저는 큰 도움이 된 두 가지 간단한 조정 사항을 추가했습니다:
시간 가중치 (Time weighting): 더 최근의 기억에 높은 점수를 부여합니다. 복잡한 것은 아닙:
// 최신성(recency)을 기반으로 점수 향상 — 새로운 기억에 약간의 가중치를 부여
const recencyBoostHalfLife = 30 * 24 * time.Hour // 30일
age := time.Since(memory.CreatedAt)
...
이는 오래된 기억을 완전히 무시하지 않으면서도, 최근의 관련성 높은 기억들을 상단으로 끌어올리는 데 도움이 됩니다.
메타데이터 필터링 (Metadata filtering): 기억에 카테고리, 프로젝트, 태그 등 무엇이든 태그를 달 수 있습니다. 검색할 때 특정 태그로만 필터링할 수 있습니다. 매우 간단하지만 매우 효과적입니다.
2. "과도한 문맥 (Too Much Context)" 문제
많은 기억을 추가하기 시작하면, 관련 있는 기억 10개가 총 10k 토큰(tokens)에 달하게 되어 컨텍스트 윈도우 (context window) 전체를 잡아먹는 상황이 쉽게 발생할 수 있습니다.
저는 몇 가지 접근 방식을 시도해 보았습니다:
- 상위 N개만 선택 (Just take top N): 괜찮게 작동하지만, 때때로 여전히 컨텍스트를 부풀리는 여러 개의 긴 기억들이 포함될 수 있습니다.
- 주입 전 요약 (Summarize before injecting): 이 방식이 더 효과적이지만, 추가적인 임베딩 (embedding) 비용과 지연 시간 (latency)이 발생합니다.
- 긴 기억 자르기 (Truncate long memories): 현재로서는 이 방식을 선택했습니다. 각 기억의 처음 약 500 토큰 정도만 유지하는데, 이는 대개 무엇에 관한 내용인지 이해하기에 충분합니다.
트레이드오프 (tradeoff): 때로는 전체 세부 정보를 놓칠 수도 있지만, 실제로 AI가 더 많은 문맥이 필요할 때는 사용자에게 자세한 설명을 요청할 수 있습니다. 또한 컨텍스트 윈도우를 가볍게 유지하면 대화 속도가 빨라지고 비용이 저렴해집니다.
솔직히 말해서 저는 여전히 이 부분을 실험 중입니다. 이것은 완벽한 정답이 없는 문제 중 하나이며, 모든 것이 트레이드오프의 문제입니다.
3. "중복된 기억 (Duplicate Memory)" 문제
저처럼 여러 곳에 같은 생각을 여러 번 적게 되는 경우가 있습니다. 또는 기억을 업데이트했는데, 이전 버전과 새 버전이 모두 남아 있는 경우도 있죠. 이러한 중복 데이터는 검색을 방해하고 무관한 컨텍스트 (Context)를 추가합니다.
저의 해결책은 이렇습니다: 새로운 기억을 추가할 때, 먼저 의미론적으로 유사한 기존 기억이 있는지 검색합니다. 만약 특정 유사도 임계값 (저는 0.95 코사인 유사도 (Cosine Similarity)를 사용합니다)을 넘어서는 것이 있다면, 기존 것을 교체할지 아니면 둘 다 유지할지 묻습니다.
func (vm *VibeMemory) CheckDuplicate(ctx context.Context, newEmbedding []float32) (*Memory, float32, error) {
results, err := vm.store.Search(ctx, newEmbedding, 1)
if err != nil || len(results) == 0 {
...
단순하지만 효과적입니다. 정기적으로 일기를 쓰다 보면 이 방식이 의도치 않은 중복을 얼마나 자주 잡아내는지 보고 놀라실 겁니다.
장단점: 솔직하게 말해봅시다
좋습니다, 저는 이것을 3개월 동안 만들어 왔고 매일 사용하고 있습니다. 그 모든 과정 끝에 제가 느낀 점은 다음과 같습니다:
✅ 장점
-
그냥 작동합니다 — 일단 설정해 두면 더 이상 신경 쓸 필요가 없습니다. AI 대화에 관련 컨텍스트 (Context)를 자동으로 주입해 줍니다.
-
데이터가 귀하의 데이터베이스에 머뭅니다 — 모든 개인적인 기억을 제3자 앱으로 보내는 것과 달리, 모든 것은 귀하의 PostgreSQL 데이터베이스에 그대로 유지됩니다. 귀하가 데이터를 제어합니다. 원한다면 직접 쿼리할 수도 있습니다. 벤더 종속 (Vendor lock-in)도 없습니다.
-
놀라울 정도로 저렴합니다 — 총 약 100만 토큰 (Tokens)에 달하는 약 10,000개의 기억을 기준으로, 전체 재임베딩 (Re-embed) 시 임베딩 (Embeddings) 비용은 0.025달러입니다. 하루에 기억을 하나씩 추가하더라도 하루에 약 0.000025달러 수준입니다. 거의 없는 것이나 마찬가지죠. Fly.io나 Supabase 같은 플랫폼에서 PostgreSQL을 호스팅하는 비용은 몇 푼 되지 않습니다.
-
단순한 아키텍처 (Architecture) — 복잡한 분산 시스템이나 조정이 필요한 여러 서비스가 필요 없습니다. 그저 Go + PostgreSQL뿐입니다. 배포가 쉽고 유지보수가 용이합니다.
-
확장 가능함 — 깔끔한 API를 가진 단순한 Go 라이브러리이기 때문에, CLI, REST API, Slack 봇, VS Code 확장 프로그램 등 원하는 무엇이든으로 감싸서 사용할 수 있습니다.
❌ 단점
-
여전히 약간의 기술적 설정이 필요함 — pgvector가 설치된 PostgreSQL 데이터베이스가 필요하며, OpenAI API 키도 필요합니다. 아직 클릭 한 번으로 실행되는 앱은 아닙니다. 이를 위해 작업 중이지만, 아직 구현되지는 않았습니다.
-
현재는 화려한 UI가 없음 — 현재는 API/CLI 우선 방식입니다. 간단한 웹 UI를 구축 중이지만 아직 준비되지 않았습니다. 파워 유저(Power users)에게는 괜찮겠지만, 세련된 소비자용 앱을 원하신다면 아직은 아닙니다.
-
임베딩 (Embeddings)이 완벽하지 않음 — 때때로 여전히 관련 없는 기억을 불러옵니다. 아무것도 없는 것보다는 낫지만, 마법은 아닙니다. 시맨틱 검색 (Semantic search)이 100% 정확하지는 않습니다.
-
협업 기능 없음 — 단일 사용자 개인용으로 설계되었습니다. 공유 기능이나 팀 워크스페이스는 없습니다. 현재로서는 의도된 설계이지만, 해당 기능이 필요한 경우라면 한계가 될 수 있습니다.
나의 실사용 사례: 실제로 어떻게 사용하는가
나는 몇 가지 용도로 매일 Vibe-Memory를 사용합니다:
-
장기 프로젝트 컨텍스트 (Context): 몇 주마다 한 번씩 다시 시작하는 사이드 프로젝트를 진행할 때, 진행하면서 메모를 추가해 두면 다시 돌아왔을 때 AI가 내가 내린 모든 결정, 현재의 문제점, 이미 시도했던 것들을 이미 기억하고 있습니다. 흐름을 파악하기 위해 예전 메모를 다시 읽느라 시간을 허비할 필요가 없습니다.
-
AI를 활용한 개인 일기 쓰기: 나는 매일 일기를 쓰는데, Vibe-Memory는 내 기분의 패턴, 어떤 활동이 나를 행복하게 만드는지, 어떤 문제들이 반복해서 발생하는지를 기억합니다. 내가 어떤 문제를 고민하고 있을 때, AI는 과거의 유사한 상황과 내가 그것을 어떻게 처리했는지를 불러올 수 있습니다. 마치 내 과거를 실제로 기억하는 상담가와 함께 있는 것 같습니다.
-
글쓰기를 위한 지식 베이스 (Knowledge base): 이 글과 같은 기사를 쓸 때, 예전 메모, 아이디어, 초안을 검색할 수 있으며 AI는 내가 잊어버렸을 법한 점들을 연결하도록 도와줍니다.
나에게 있어 ROI (투자 대비 효율)는 엄청났습니다. 컨텍스트를 다시 설명하거나 예전 메모를 뒤지는 데 쓰는 시간을 훨씬 줄였습니다. 이제 AI는 매 대화마다 제로(0)에서 시작하는 대신, 실제로 나를 알고 있는 것처럼 느껴집니다.
시작하기: 직접 시도해보고 싶다면
Vibe-Memory를 직접 시도해보고 싶다면, GitHub에서 오픈 소스로 제공됩니다:
https://github.com/kevinten10/vibe-memory
빠른 시작(Quickstart) 방법은 다음과 같습니다:
# Clone it
git clone https://github.com/kevinten10/vibe-memory.git
cd vibe-memory
...
끝입니다. 시작하는 데 필요한 것은 말 그대로 이것뿐입니다. 자신의 프로젝트에 임베딩(Embed)하고 싶다면 API도 매우 간단합니다:
import "github.com/kevinten10/vibe-memory/pkg/vibememory"
func main() {
...
Vibe-Memory의 향후 계획
저는 여전히 이 프로젝트를 활발하게 구축하고 있습니다. 로드맵(Roadmap)은 다음과 같습니다:
- 간단한 웹 UI (Web UI) — CLI(Command Line Interface)를 사용하고 싶지 않은 경우를 위해
- 원클릭 배포 (One-click deployment) — Docker compose, Fly.io 템플릿 등
- 다양한 임베딩 모델 (Embedding model) 지원 — 로컬 모델 (Ollama), Cohere, Anthropic 등
- 더 나은 메모리 관리 UI — 메모리를 쉽게 탐색, 편집, 삭제
- 인기 도구와의 통합 (Integration) — Obsidian, VS Code, Raycast 등
마치며: 이것이 중요한 이유
AI는 놀랍지만, 현재의 AI는 대화할 때마다 기억상실증에 걸리는 천재 친구를 둔 것과 같습니다. 간단한 질문에는 괜찮지만, 장기적인 관점에서는 문제가 있습니다.
우리는 AI에게 우리가 누구인지, 무엇을 해왔는지 끊임없이 다시 가르쳐야 할 필요가 없어야 합니다. 우리의 AI는 우리를 기억해야 합니다. 우리의 프로젝트, 아이디어, 경험, 그리고 우리의 "바이브(vibe)"를 기억해야 합니다.
그것이 바로 Vibe-Memory가 지향하는 바입니다. 이 프로젝트가 ChatGPT나 Claude, 혹은 여러분이 사용하는 다른 도구들을 대체하지는 않을 것입니다. 대신, 여러분의 AI에 실제적인 장기 기억(Long-term memory)을 부여하는 누락된 계층(Layer) 역할을 할 것입니다.
저는 지난 3개월 동안 매일 이것을 사용해 왔으며, 솔직히 이것 없이 작업하는 삶으로 돌아가는 것은 상상할 수 없습니다. 일단 사용하고 나면, 이것 없이 어떻게 살았는지 의문이 들게 되는 그런 도구 중 하나입니다.
여러분은 어떠신가요?
여러분은 이와 유사한 것을 만들어 본 적이 있으신가요? AI가 여러분의 컨텍스트 (Context)를 잊어버리는 문제로 어려움을 겪고 계신가요? 개인적인 시맨틱 메모리 (Semantic Memory)를 위한 여러분만의 해결책은 무엇인가요? 여러분의 경험을 댓글로 들려주세요. 저는 항상 이를 개선하기 위한 아이디어를 찾고 있습니다.
만약 Vibe-Memory를 사용해 보신다면, 여러분의 생각을 알려주세요! GitHub에서의 PR (Pull Request)과 Issue는 언제나 환영합니다. 이 프로젝트는 오픈 소스이며 제가 적극적으로 유지보수하고 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기