핵심 요약
대형 언어 모델 기반 에이전트의 한계인 휘발성 메모리를 해결하기 위해 단기 메모리(STM)와 장기 메모리(LTM)를 결합한 EverMem 스타일의 아키텍처를 제안한다. FAISS를 이용한 시맨틱 검색과 SQLite를 이용한 메타데이터 저장을 병행하여 에이전트가 문맥에 맞는 과거 정보를 소환할 수 있게 한다. 특히 중요도 점수 산출과 주기적인 메모리 압축(Consolidation) 로직을 통해 무한히 확장 가능한 메모리 관리 체계를 구현한다. 이를 통해 에이전트는 단순한 챗봇을 넘어 사용자의 선호와 과거 결정을 기억하는 지능형 비서로 진화한다.
배경
Python 프로그래밍 기초, 벡터 임베딩 및 유사도 검색 개념, SQLite 기본 쿼리 지식, Hugging Face Transformers 라이브러리 사용 경험
대상 독자
LLM 에이전트의 기억력과 일관성을 개선하고자 하는 AI 엔지니어 및 연구자
의미 / 영향
이 아키텍처는 에이전트가 단순한 일회성 도구가 아니라 사용자와 함께 성장하는 '개인화된 OS' 역할을 할 수 있음을 시사한다. 특히 온디바이스나 로컬 환경에서도 FAISS와 SQLite 같은 경량 도구로 강력한 메모리 시스템을 구축할 수 있다는 실무적 가치를 제공한다.
섹션별 상세
def add_memory(self, role: str, text: str, meta: Optional[Dict[str, Any]] = None) -> str:
// ...(중략)
conn = sqlite3.connect(self.db_path)
cur = conn.cursor()
cur.execute(
"INSERT OR REPLACE INTO memories (mid, role, text, created_ts, importance, tokens_est, meta_json) VALUES (?, ?, ?, ?, ?, ?, ?)",
(mid, role, text, created_ts, importance, tokens_est, json.dumps(meta, ensure_ascii=False)),
)
conn.commit()
conn.close()
vec = self._embed([text])
fid = self.next_faiss_id
self.next_faiss_id += 1
self.index.add(vec)
self.id_map[fid] = mid
self._persist_faiss()
return midSQLite에 정형 데이터를 저장하고 동시에 FAISS 인덱스에 벡터를 추가하여 하이브리드 메모리를 구축하는 함수
def _importance_score(self, role: str, text: str, meta: Dict[str, Any]) -> float:
base = 0.35
length_bonus = min(0.45, math.log1p(len(text)) / 20.0)
role_bonus = 0.08 if role == "user" else 0.03
pin = 0.35 if meta.get("pinned") else 0.0
signal = meta.get("signal", "")
signal_bonus = 0.18 if signal in {"decision", "preference", "fact", "task"} else 0.0
q_bonus = 0.06 if "?" in text else 0.0
number_bonus = 0.05 if any(ch.isdigit() for ch in text) else 0.0
return float(min(1.0, base + length_bonus + role_bonus + pin + signal_bonus + q_bonus + number_bonus))텍스트의 길이, 역할, 메타데이터 신호를 기반으로 기억의 중요도를 0~1 사이로 계산하는 로직
def consolidate(self) -> Optional[str]:
// ...(중략)
items_sorted = sorted(items, key=lambda x: (-(x.importance + 0.15 * (1.0 / (1.0 + (_now_ts() - x.created_ts) / 3600.0))), -x.created_ts))
picked = items_sorted[:18]
summary = self._compress_memories(picked, max_chars=520)
// ...(중략)
self.add_memory(
role="system",
text=f"Consolidated memory: {summary}",
meta={"signal": "consolidation", "pinned": True, "importance": 0.95},
)
return cid중요도가 높은 기억들을 선별하여 LLM으로 요약하고 시스템 메모리로 재저장하는 기억 통합 로직
실무 Takeaway
- 벡터 검색(FAISS)과 관계형 DB(SQLite)를 병행하여 시맨틱 맥락과 구조화된 사실 정보를 모두 정확히 복기하는 메모리 시스템을 구축할 수 있다.
- 자동화된 중요도 점수 산출과 주기적 요약(Consolidation)을 통해 LLM의 컨텍스트 윈도우 제한 문제를 해결하고 장기적인 성능을 유지할 수 있다.
- 검색된 장기 기억 블록을 프롬프트에 명시적으로 구분하여 주입함으로써 모델의 할루시네이션을 줄이고 사용자 맞춤형 일관성을 확보할 수 있다.
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.