에이전트의 기억 방식 - 그리고 무엇을 잊을지 결정하는 것이 왜 진정한 기술인가
요약
에이전트의 효율적인 목표 달성을 위한 기억(Memory) 메커니즘을 다룹니다. 컨텍스트 윈도우의 한계를 지적하며, 작업 기억, 에피소드 기억, 의미 기억, 절차적 기억의 네 가지 유형과 이를 구현하는 기술적 방식을 설명합니다.
핵심 포인트
- 컨텍스트 윈도우는 영구적 기억이 아닌 휘발성 작업 기억(RAM)임
- 에이전트 기억은 단기, 장기 에피소드, 장기 의미, 절차적 기억으로 구분됨
- 효율적인 기억 관리를 위해 요약(Summarization)과 벡터 검색이 필수적임
- 무엇을 기억하고 무엇을 잊을지 결정하는 것이 에이전트 설계의 핵심 기술임
에이전트가 기억하는 방식 - 그리고 무엇을 잊을지 결정하는 것이 왜 진정한 기술인가
매 단계마다 백지 상태로 시작하는 에이전트는 목표를 진정으로 추구할 수 없습니다. 메시지를 보낼 때마다 당신에게 자신을 다시 소개하고, 방금 무엇을 시도했는지 잊어버리며, 똑같은 실수를 영원히 반복할 것입니다. **기억 (Memory)**은 상태가 없는 (stateless) 모델을 무언가를 축적하는 존재로, 즉 당신이 누구인지, 이미 무엇을 했는지, 그리고 지난 화요일에 무엇을 배웠는지를 아는 존재로 바꾸는 것입니다. 이 포스트는 그것이 어떻게 작동하는지, 그리고 더 중요하게는, 에이전트가 무엇을 기억해야 하는지를 결정하는 규율에 대해 다룹니다.
컨텍스트 윈도우 (Context window)는 기억이 아닙니다.
가장 먼저 버려야 할 생각: 모델의 컨텍스트 윈도우 (context window)는 기억이 아닙니다. 컨텍스트 윈도우는 작업 기억 (working memory) - 즉, 하드 드라이브가 아닌 RAM입니다. 이는 유한하며, 매 요청마다 초기화되고, 그 안의 모든 토큰은 비용을 발생시키며 모델의 주의력 (attention)을 희석시킵니다. 전체 대화 기록과 지식 베이스를 프롬프트에 쑤셔 넣는 것은 확장 가능하지 않으며, 일정 수준을 넘어서면 적극적으로 해를 끼칩니다. 모델이 오래된 세부 정보의 바다 속에서 중요한 신호를 놓치게 만들기 때문입니다. 진짜 기억은 윈도우 외부에 존재하며, 필요할 때 선택적으로 윈도우로 로드됩니다.
네 가지 종류의 기억
인지 과학 (cognitive science)에서 느슨하게 빌려오자면, 에이전트의 기억은 보통 네 가지 유형으로 나뉘며, 좋은 시스템은 이들 모두를 사용합니다:
- 단기/작업 기억 (Short-term/working memory) - 현재의 대화와 에이전트의 최근 생각 및 관찰 내용입니다. 컨텍스트 윈도우 (context window) 안에 존재합니다.
- 장기 에피소드 기억 (Long-term episodic memory) - 무슨 일이 일어났는지에 대한 기록입니다: 과거의 대화, 결정, 그리고 이전 작업의 결과물들입니다.
- 장기 의미 기억 (Long-term semantic memory) - 사실과 지식입니다: 사용자가 누구인지, 도메인 정보, 문서 등입니다. 이것이 검색 증강 생성 (Retrieval-Augmented Generation, RAG)이 가져오는 대상입니다.
- 절차적 기억 (Procedural memory) - 일을 수행하는 방법입니다: 학습된 기술, 도구 사용 패턴, 그리고 재사용 가능한 전략들입니다.
단기 기억: 롤링 버퍼 (rolling buffer)
가장 단순한 기억 방식은 최근의 대화 턴(turns)을 프롬프트(prompt)에 그대로 유지하는 것입니다. 문제는 대화가 컨텍스트 창(window)의 크기를 초과한다는 점이며, 따라서 표준적인 방법은 마지막 몇 개의 턴은 원문 그대로 유지하고, 그 이전의 내용들은 요약(summarise)하여 압축된 노트로 만드는 것입니다:
def build_context(history, window=6):
recent = history[-window:]
older = history[:-window]
...
이 방식은 이전 내용의 요지(gist)를 보존하면서도 프롬프트의 크기를 제한된 범위 내로 유지합니다. 다소 투박하지만, 현재 서비스 중인 거의 모든 채팅 에이전트(chat agent)의 근간이 되는 방식입니다.
장기 기억: 임베딩 (embeddings)과 벡터 검색 (vector search)
세션(sessions)을 넘나들며 기억하기 위해, 에이전트는 정보를 외부 저장소에 기록하고 나중에 정확한 키워드가 아닌 의미(meaning)를 바탕으로 이를 검색합니다. 그 메커니즘은 임베딩 (embeddings)입니다. 각 텍스트 조각은 고차원 벡터(high-dimensional vector)로 변환되어 벡터 데이터베이스(vector database)에 저장되며, 나중에 현재 쿼리(query)와 가장 유사한 벡터를 찾아냄으로써 검색됩니다. 이를 통해 에이전트는 사용자가 사실이 저장된 방식과 완전히 다른 방식으로 질문하더라도 관련 사실을 회상할 수 있습니다.
# 기억 기록하기
vec = embed("사용자는 창가 좌석과 채식 식단을 선호함.")
store.add(id="pref-1", vector=vec, text="사용자는 창가 좌석과 채식 식단을 선호함.")
...
이러한 검색 단계 덕분에 에이전트는 컨텍스트 창(context window)을 비대하게 만들지 않고도 장기 기억을 가질 수 있습니다. 즉, 모든 것을 저장하되 현재 순간과 관련된 소수의 기억만을 불러오는 것입니다.
왜 벡터 검색만으로는 충분하지 않은가
벡터 유사도 (Vector similarity)는 강력하지만 투박하며, 이에 의존하기 전에 그 한계를 아는 것이 중요합니다. 유사도는 최신성 (recency), 권위 (authority), 또는 워크플로우 상태 (workflow state)가 아닌, 오직 관련성 (relevance)에만 의존합니다. 단순히 단어들이 가깝다는 이유만으로, 사용자가 어제 변경한 오래된 선호도나 나중에 무효화된 초안의 사실을 아무렇지 않게 불러올 것입니다. 벡터 검색은 어떤 기억이 최신인지, 어떤 것이 권위 있는지, 또는 다단계 작업 중 사용자가 어디에 있는지 이해하지 못합니다. 실제 서비스용 메모리 시스템 (Production memory systems)은 이를 보완하기 위해 최신성 가중치 (recency weighting), 출처 순위 지정 (source ranking), 그리고 명시적 상태 (explicit state)를 계층적으로 추가합니다. 2026년의 메모리는 단순히 붙여놓고 잊어버리는 데이터베이스가 아니라, 측정 가능한 트레이드오프 (trade-offs)가 존재하는 실제 엔지니어링 분야로 다뤄집니다.
컨텍스트 엔지니어링 (Context engineering): 진정한 기술
이 모든 것은 사람들이 점점 더 **컨텍스트 엔지니어링 (context engineering)**이라 부르는 분야로 귀결됩니다. 즉, 매 단계마다 컨텍스트 윈도우 (context window)에 무엇을 넣을지 의도적으로 결정하는 것입니다. 프롬프트 엔지니어링 (Prompt engineering)이 _'지시어를 어떻게 작성할 것인가?'_를 묻는다면, 컨텍스트 엔지니어링은 _'모델이 지금 당장 어떤 정보를 보아야 하며, 무엇을 제외해야 하는가?'_를 묻습니다. 이는 영리한 프롬프트를 작성하는 것보다, 제한된 작업 기억 (working-memory) 예산을 관리하는 것에 더 가깝습니다.
최근 영향력 있는 패턴 중 하나는 **에이전틱 컨텍스트 엔지니어링 (Agentic Context Engineering, ACE)**입니다. 이는 에이전트가 세 가지 역할의 루프를 통해 컨텍스트를 능동적으로 큐레이션(curate)하도록 합니다. 즉, **생성기 (Generator)**가 시도를 생성하면, **반성기 (Reflector)**가 이를 평가하여 누락되었거나 잘못된 부분을 표시하고, **큐레이터 (Curator)**가 그 교훈을 추출하여 미래의 컨텍스트를 개선하는 성장하는 "플레이북 (playbook)"에 담습니다. 보고된 결과에 따르면, 기반 모델을 재학습시키지 않고도 에이전트 벤치마크에서 유의미한 정확도 향상을 보였습니다. 이러한 개선은 전적으로 더 나은 컨텍스트를 제공함으로써 이루어졌습니다. 이것이 하나의 실험을 통해 보여준 컨텍스트 엔지니어링의 핵심 논지입니다.
시작을 위한 실용적인 패턴들
- 최근 대화는 그대로 유지하고 이전 대화는 요약하기 (Summarise old turns, keeping recent ones verbatim) - 프롬프트 길이를 제한하면서도 핵심 요지 (gist)를 보존합니다.
- 덤프(dump)하지 말고 검색하기 (Retrieve, don’t dump) - 전체 저장소를 다 가져오는 대신, 매 단계마다 가장 관련성이 높은 상위 몇 개의 기억만을 가져옵니다.
- 기억에 시간과 출처 태그 달기 (Tag memories with time and source) - 오래된 매칭 결과보다 최근의 권위 있는 정보를 우선시할 수 있습니다.
- 중요한 것만 다시 기록하기 (Write back what matters) - 작업이 끝난 후에는 전체 대화 기록이 아니라, 지속적인 사실(durable facts)과 교훈만을 저장합니다.
핵심 요약 (The takeaway)
기억은 챗봇과 시간이 흐름에 따라 진정으로 역량 (competence)을 축적하는 에이전트를 구분 짓는 요소입니다. 하지만 핵심은 "모든 것을 저장하라"가 아니라 그 반대입니다. 진정한 기술은 큐레이션 (curation)입니다. 즉, 매 단계마다 모델이 잘 작동할 수 있게 하는 최소한의 정보 집합을 결정하고, 나머지는 필요할 때까지 장기 저장소에 남겨두는 것입니다. 컨텍스트 (context)를 핵심 인프라로 취급하면, 에이전트는 동시에 더 정교해지고, 비용은 저렴해지며, 신뢰성은 높아집니다.
시리즈 다음 내용: 에이전트 하나가 할 수 있는 일에는 한계가 있습니다. 다음 편에서는 멀티 에이전트 시스템 (multi-agent systems) — 오케스트레이션 (orchestration), A2A 프로토콜, 그리고 전체 시스템이 혼돈에 빠지지 않고 어떻게 전문화된 에이전트 팀에게 목표를 분배할 수 있는지에 대해 살펴보겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기