[Update] VAC: LLMs가 당신을 기억하도록 만드는 메모리 레이어
Source: Dev.to
Introduction
LLM이 실제로 당신이 누구인지 기억한다면 어떨까요 — 세션, 프로젝트, 그리고 시간에 걸쳐? 기존 시스템은 전적으로 입력 컨텍스트(길이 제한)에 의존하거나 환각 및 관련성 손실과 같은 문제에 시달립니다.
VAC Memory System은 지속적인 메모리를 LLM에 제공하는 독특한 Retrieval‑Augmented Generation (RAG) 아키텍처입니다. LLM은 본질적으로 파라미터에 내장된 정적인 통계 “메모리”를 유지합니다. VAC의 목표는 동적 메모리 검색을 가능하게 하여 모델을 수정하지 않고도 정확한 데이터를 추출하는 것입니다.
Key VAC Advantages
- MCA (Candidate Filtering) – Multi‑Candidate Assessment는 전통적인 벡터 데이터베이스(예: FAISS)에서 발생하는 false‑positive 문제를 해결하고, 비용이 많이 드는 연산 전에 엔터티‑레벨 정밀 필터링을 수행합니다.
- Physics‑Inspired Ranking – 텍스트 문서를 “질량”과 “중력”을 가진 “행성”으로 개념화하여 새로운 검색 메커니즘을 구현합니다.
- Modular Orchestration – VAC은 답변 생성 단계 외에 LLM에 대한 의존도를 최소화합니다.
Limitations of Current LLMs
- 장기 컨텍스트를 유지할 수 없음.
- 과거 대화를 기억할 수 없음.
- “이해”를 업데이트할 수 없음.
- 변화하는 사용자 프로필을 저장할 수 없음.
- 무상태 버블 안에서 동작함.
Problems with Conventional Retrieval
- 벡터 검색은 의미적으로 유사한 문서를 찾을 뿐, 논리적으로 올바른 문서는 찾지 못함.
- 중요한 기억이 묻혀 버림.
- 검색이 비결정적임.
- 데이터셋이 커질수록 노이즈가 증가함.
- 우선순위나 최신성 개념이 없음.
Architecture
VAC Memory System 파이프라인은 총 8단계로 구성됩니다:
- MCA‑PreFilter – 엔터티 커버리지를 기준으로 후보를 필터링하여 계산 비용을 절감합니다.
- Vector Processing with FAISS – 1024‑dim 벡터(BGE‑Large)를 이용한 임베딩 및 의미 검색.
- BM25 Search – 전통적인 정확 매칭 방식.
- Cross‑Encoder Reranking – 상위 N 후보에 대한 정밀도 최적화.
- … (나머지 오케스트레이션 단계는 간략히 생략)
Example Ranking Code (Python)
def calculate_query_coverage(query_keywords: set, memory_keywords: set) -> float:
intersection = len(query_keywords & memory_keywords)
return intersection / len(query_keywords)
def calculate_force(query_mass, memory_mass, distance):
G = 6.67430e-11 # gravitational constant (placeholder)
DELTA = 1e-6 # stability term
force = G * (query_mass * memory_mass) / (distance ** 2 + DELTA)
return force
def rank_memories(query, memories):
query_keywords = extract_keywords_simple(query)
scored_mem = [
calculate_mass(mem, query_keywords) # assumes calculate_mass returns a dict with 'force'
for mem in memories
]
return sorted(scored_mem, key=lambda x: x['force'], reverse=True)
Full Architecture Overview (8 Steps)
Query example: “Where did I meet Alice?”
(원문 기사에 다이어그램이 포함되어 있습니다; 필요에 따라 직접 시각 자료로 교체하세요.)
Evaluation
Benchmark Results
| Aspect | VAC Memory | Mem0 | Letta/MemGPT | Zep |
|---|---|---|---|---|
| LoCoMo Accuracy | 80.1 % | 66.9 % | 74.0 % | 75.1 % |
| Architecture | MCA + FAISS + BM25 + Cross‑Encoder | LLM extraction + Graph | OS‑like paging + Archive search | Summarize + Vector |
| Entity Protection | ✅ MCA pre‑filter | ❌ Semantic only | ❌ Semantic only | ❌ Semantic only |
| Latency | 2.5 s/query | ~3‑5 s | ~2‑4 s | ~2‑3 s |
| Cost / 1M tokens | <$0.10 | ~$0.50+ | ~$0.30+ | ~$0.20+ |
| Reproducibility | 100 % (seed‑locked) | Variable | Variable | Variable |
| Conversation Isolation | 100 % | Partial | Partial | Partial |
Validation Details
- Runs: 10 conversations × 10 seeds = 100 runs (총 1,540개 질문).
- Question Types: Single‑hop (87 %), Multi‑hop (78 %), Temporal (72 %), Commonsense (87 %).
- Component Recall (ground‑truth coverage):
- MCA alone: 40‑50 %
- FAISS alone: 65‑70 %
- BM25 alone: 50 %
- Union Recall (MCA + FAISS + BM25): 85‑95 %
Key insight: 단일 검색 방법만으로는 충분하지 않으며, 각 방법이 놓치는 부분을 합집합이 포착합니다.
Getting Started
- GitHub repository: VAC Memory System (실제 URL로 교체)
- 간단한 CLI 기반 통합.
Example Run
# Run with a fixed seed for reproducibility
SEED=2001 LOCOMO_CONV_INDEX=0 python orchestrator.py
- 동일한 시드를 사용하면 실행마다 동일한 결과가 나옵니다.
- 100회 실행이 검증되었습니다.
Feedback & Discussion
LLM용 메모리 시스템을 구축하거나 LoCoMo 벤치마크를 실험하는 분들의 피드백을 기다립니다.
- MCA + BM25 + FAISS 조합에 대해 어떻게 생각하시나요?
- 추가 개선 아이디어가 있나요?
GitHub 레포에 이슈나 풀 리퀘스트를 자유롭게 열어 주세요.