AI 에이전트 기억 시스템의 구조와 원리
현재 다수의 AI 에이전트 메모리 라이브러리들이 인지과학의 용어를 차용해 쓰고 있지만, 실제 엔지니어링 구현은 그 의미를 제대로 반영하지 못하고 있습니다. 이 글은 에이전트의 기억 시스템이 대화에서 정보를 추출하는 '추출기', 데이터를 저장하고 모순을 처리하는 '저장소', 필요한 정보를 검색하는 '검색기'라는 세 가지 핵심 구성 요소로 이루어져 있음을 설명합니다. 개발자들은 이 세 가지 구조의 동작 방식과 설계 선택(정보 압축, 모순 처리 등)을 이해함으로써 어떤 메모리 라이브러리든 평가하고 활용할 수 있습니다.
모든 에이전트 메모리 라이브러리는 '에피소드 기억(episodic)', '의미 기억(semantic)', 때로는 '절차적 기억(procedural)'이라는 동일한 단어들을 사용합니다. 이는 인지과학의 어휘를 그대로 API로 가져온 것입니다. 하지만 그 이면의 엔지니어링은 함께 가져오지 않는 경우가 많습니다. 어떤 라이브러리는 의미 기억과 동일한 방식의 저장 및 검색 방식을 사용하면서 절차적 기억이라는 필드를 제공하기도 하는데, 이는 별개의 시스템이 아니라 단순한 레이블(이름표)에 불과합니다.
더 깊은 혼란의 원인은 '기억(memory)'이라는 단어 자체에 있습니다. 이 라이브러리들이 구축하는 대부분의 것은 단어가 암시하는 것보다 훨씬 좁은 개념이며, 이 좁은 의미의 단어를 사용하는 것이 문제를 더욱 뚜렷하게 만듭니다. 이 용어는 1972년 엔델 툴빙(Endel Tulving)의 챕터에서 유래했습니다. 그는 사람들이 하나의 것으로 취급하던 '기억'이 실제로는 적어도 두 가지, 즉 사건에 대한 기억(무슨 일이 있었는지, 어디서, 언제 일어났는지)과 사실에 대한 기억(프랑스의 수도, 물의 끓는점 등)이라고 주장했습니다. 그는 이를 각각 에피소드 기억과 의미 기억이라고 불렀습니다. 이 둘은 작동 방식도 다르고 실패하는 방식도 다릅니다.
이 라이브러리들이 '기억'이라고 부르는 대부분의 것은 단어가 암시하는 것보다 좁습니다. 즉, 완전한 인지적 기억 시스템이 아니라 사용자를 대신하여 보관되는 사용자에 대한 자서전적 콘텐츠(사용자가 어디에 사는지, 무엇을 작업 중인지, 무엇을 결정했는지 등)인 경우가 많습니다.
에이전트 메모리 시스템의 구조
에이전트 메모리 라이브러리는 소수의 핵심 구성 요소로 만들어집니다. 이 부분들을 알면 어떤 라이브러리의 문서든 이해할 수 있습니다.
1. 추출기 (The Extractor)
대화 기록을 읽고 무엇을 보관할지 결정하는 역할을 합니다. 보통 엄격한 프롬프트나 타입이 지정된 출력 스키마를 사용하는 LLM 호출입니다. 이것은 사용자, 세계 또는 작업에 대한 짧고 추상화된 사실인 '구문(statement)'을 생성합니다. 추출기가 내리는 가장 중요한 선택은 '타이밍'입니다. 모든 메시지 후에 즉시(eagerly) 추출하면 결론이 없는 일상적인 대화에 토큰을 낭비하게 됩니다. 반대로 세션이 끝날 때 지연해서(lazily) 추출하면 대명사가 누구를 가리키는지 파악하기 위해 필요했던 문맥이 이미 사라진 상태가 됩니다. 어느 타이밍도 틀린 것은 아니지만, 각각 다른 쪽이 유지하는 것을 잃게 됩니다. 라이브러리에 대해 던져야 할 질문은 '무엇이 버려지는가'입니다. 상호참조 단서(어떤 '그'가 어떤 사람을 지칭하는지), 시간적 닻('어제', '다음 주' 등), 모호함을 해소하는 국소적 문맥이 흔히 희생됩니다. 인지적 관점에서 볼 때 추출은 상황에 맞는 사건을 맥락이 제거된 사실로 압축하는 작업입니다. 예를 들어, '화요일에 커피를 마시면서 사용자가 TypeScript를 선호한다고 언급함'이 '사용자는 TypeScript를 선호함'으로 압축됩니다. 라이브러리가 얼마나 공격적으로 압축하는가는 핵심적인 설계 결정 중 하나입니다.
2. 저장소 (The Store)
데이터베이스 역할을 합니다. 일반적으로 벡터 인덱스(의미적 유사성으로 색인된 항목), 관계형 테이블(필터링할 수 있는 열로 색인된 항목), 지식 그래프(유형이 지정된 간선으로 연결된 항목) 중 하나 이상을 사용합니다. 각 구문에는 메타데이터, 즉 타임스탬프, 때로는 신뢰도 점수, 원래 대화로 돌아가는 소스 포인터가 포함됩니다. 저장소가 해결해야 할 가장 어려운 질문은 어디에 보관할것인가가 아닙니다. 새로운 구문이 이전 구문과 모순될 때 어떻게 할 것인가입니다. 사용자가 4월까지 파리에 살다가 암스테르담으로 이사했다면, 저장소에는 두 가지 항목이 모두 현재 상태로 존재하게 됩니다. 이때 선택지는 덮어쓰기(하나의 진실, 기록 없음), 추가(둘 다 두고 검색 시 정렬하게 함), 이전 항목을 만료된 것으로 표시하고 둘 다 보관하기 중 하나입니다. '지난달에 내가 무엇을 믿었는가?'라는 질문에 답할 수 없는 저장소는 진정한 기억 시스템이 아닙니다. 그것은 단지 타임스탬프가 찍힌 스냅샷일 뿐입니다.
3. 검색기 (The Retriever)
쿼리 시점에 이 구성 요소는 현재 질문을 검색으로 변환하고 가장 관련성이 높을 가능성이 있는 구문을 반환합니다. 벡터 유사도가 기본이며, 그 위에 키워드 검색을 추가하는 것이 일반적입니다. 재순위 지정 모델(Reranker)이 표준적인 세 번째 레이어입니다. 구조적으로 이것은 RAG(검색 증강 생성)와 같습니다. 다만 말뭉치(corpus)가 문서 라이브러리가 아니라 사용자의 축적된 구문이라는 점이 다릅니다. 일부 라이브러리는 시간 필터(시대에 뒤떨어진 것으로 알려진 구문을 반환하지 않음)와 전제 조건 확인(질문 자체가 오래된 사실을 전제하고 있는지 감지하여 이를 컨텍스트로 가져오는 것을 차단함)도 실행합니다.
에이전트 메모리 라이브러리 간의 모든 차이점은 이 세 가지 부분 중 하나에 존재합니다. 라이브러리의 용도를 아직 모르더라도 이러한 측면에서 어떤 라이브러리든 설명할 수 있습니다.
기억의 종류
인지과학의 표준적인 분류 체계는 네 가지로 구성됩니다. (역주: 원문이 네 가지로 구성된다고 언급하며 끝맺음)