티스토리 뷰

이전 글에서는 LangChain4j의 MessageWindowChatMemory가 어떤 문제를 해결하기 위해 등장했는지, 그리고 왜 “제한된 대화 맥락”이라는 구조를 채택했는지를 중심으로 살펴보았습니다. 이번 글에서는 그 연장선에서, 이 메모리 방식을 Tool 기반 AI Agent의 메모리로 사용했을 때 얻을 수 있는 이점을 정리하고, 일반적인 챗봇이나 RAG 기반 챗봇에서 자주 사용되는 영속 메모리 방식(MongoDBChatMemoryStore 등)과 비교해 보려 합니다.

 

이 비교는 어떤 방식이 더 우수한지를 판단하기 위한 것이 아니라, 서로 다른 문제를 해결하기 위해 서로 다른 전제를 갖고 설계되었다는 점을 이해하는 데 목적이 있습니다. 공식 문서를 기반으로 한 사실 위에, 실무에서 구조를 해석하며 정리한 개인적인 관점을 덧붙이는 방향으로 글을 전개합니다.

 


 

Tool 기반 AI Agent에서 메모리가 수행하는 역할

 

Tool 기반 AI Agent는 일반적인 챗봇과는 역할 자체가 다릅니다. 단순히 사용자 질문에 자연어로 응답하는 것을 넘어, Agent는 판단을 내리고, 도구를 선택하고, 실행 결과를 해석한 뒤 다음 행동을 결정합니다. 이 과정에서 메모리는 “대화를 오래 기억하는 저장소”라기보다는, 현재 작업을 수행하기 위한 맥락을 유지하는 수단에 가깝습니다.

 

LangChain4j 공식 문서에서도 Agent는 반복적인 추론과 Tool 호출을 수행하는 구조로 설명됩니다. 이때 메모리에 누적되는 메시지는 사용자 발화뿐만 아니라, Tool 호출 결과나 중간 시스템 메시지까지 포함합니다. 이러한 메시지는 성격상 대부분 단기적 의미를 가지며, 일정 시점이 지나면 더 이상 현재 판단에 기여하지 않는 경우가 많습니다.

 

이러한 맥락에서 MessageWindowChatMemory는 Tool 기반 Agent의 메모리 모델과 비교적 잘 맞는 구조를 가집니다. 최근 N개의 메시지만 유지하는 방식은, Agent가 “지금 무엇을 하고 있는지”를 이해하는 데 필요한 정보만을 남기고 나머지를 자연스럽게 제거합니다.

 


 

MessageWindowChatMemory가 전제하는 메모리 사용 시나리오

 

MessageWindowChatMemory는 기본적으로 인메모리 기반의 단기 메모리입니다. 이 구현체가 전제하는 사용 시나리오는 비교적 명확합니다. 하나의 Agent 인스턴스가 특정 작업 흐름을 수행하는 동안, 최근 대화와 Tool 실행 맥락만 유지하면 충분한 경우입니다.

 

공식 코드와 문서를 보면, 이 메모리는 장기 보존이나 재사용을 목표로 하지 않습니다. 오히려 “이 Agent가 지금 어떤 상태에 있는가”를 설명하는 최소한의 정보 집합을 관리하는 역할에 가깝습니다. 이 점은 MessageWindowChatMemory가 별도의 영속화 기능을 제공하지 않는다는 사실에서도 드러납니다.

 

Tool 기반 Agent에서 이러한 설계는 여러 장점을 가집니다. 첫째로, 메모리 관리 비용이 낮습니다. 메시지 수가 제한되어 있으므로 토큰 사용량이 예측 가능하며, Agent 실행 시간이 길어지더라도 입력 컨텍스트가 기하급수적으로 증가하지 않습니다. 둘째로, 메모리의 의미가 명확합니다. 이 메모리에 들어 있는 정보는 “지금 이 Agent 실행 흐름과 직접적으로 관련된 것”이라는 전제가 성립합니다.

 


 

일반 챗봇과 RAG 기반 챗봇의 메모리 설계 관점

 

일반적인 챗봇이나 RAG 기반 챗봇에서는 메모리를 바라보는 관점이 다소 다릅니다. 이러한 시스템에서 메모리는 종종 사용자와의 장기적인 상호작용을 유지하기 위한 수단으로 사용됩니다. 예를 들어, 사용자의 이전 질문 이력이나 선호 정보, 혹은 과거 대화 내용을 다시 불러와 응답에 반영하는 것이 목적이 됩니다.

 

MongoDBChatMemoryStore와 같은 영속 메모리 구현체는 이러한 요구를 충족하기 위해 설계되었습니다. 공식 문서에서도 MongoDB 기반 메모리는 대화 내용을 데이터베이스에 저장하고, 애플리케이션 재시작 이후에도 이를 다시 불러올 수 있는 구조를 제공합니다. 이는 다수의 사용자 세션을 장기간 관리해야 하는 챗봇 환경에서 자연스러운 선택으로 보입니다.

 

RAG 기반 챗봇의 경우, 메모리는 단순한 대화 이력을 넘어 검색 쿼리 생성이나 문맥 보강을 위한 힌트로 사용되기도 합니다. 이때 메모리는 LLM 입력에 직접 포함되거나, 벡터 검색의 조건으로 활용됩니다. 즉, 메모리는 응답 품질을 높이기 위한 “참고 정보 저장소”의 성격을 가집니다.

 


 

저장 대상과 수명 관점에서의 차이

 

MessageWindowChatMemory와 MongoDBChatMemoryStore를 비교할 때 가장 먼저 드러나는 차이는 무엇을 저장하는가얼마나 오래 저장하는가입니다.

 

MessageWindowChatMemory는 최근 메시지 몇 개만을 저장하며, 이 메시지들은 대부분 Agent의 내부 동작과 직접적으로 연관됩니다. Tool 호출 결과나 중간 판단 메시지처럼, 시간이 지나면 의미가 사라지는 정보가 주된 대상입니다. 메모리의 수명 역시 Agent 인스턴스의 생명주기와 거의 동일합니다.

 

반면, MongoDBChatMemoryStore와 같은 영속 메모리는 사용자 발화와 시스템 응답을 장기간 보존합니다. 이 정보는 이후 대화에서도 재사용될 수 있으며, 때로는 분석이나 로그 목적에도 활용됩니다. 메모리의 수명은 애플리케이션이나 데이터 정책에 의해 결정되며, 특정 대화 흐름에 국한되지 않습니다.

 

이 차이는 단순한 구현상의 선택이 아니라, 시스템이 해결하려는 문제의 차이를 반영합니다. Tool 기반 Agent에서 모든 과거 메시지를 보존하는 것은 반드시 필요한 요구가 아니며, 오히려 불필요한 복잡성을 초래할 수 있습니다.

 


 

책임 범위 관점에서의 비교

 

또 하나의 중요한 차이는 메모리가 담당하는 책임 범위입니다. MessageWindowChatMemory는 “대화 관리” 이상의 역할을 맡지 않습니다. 이 메모리는 검색을 수행하지도 않고, 요약을 생성하지도 않으며, 장기적인 사용자 모델을 구축하지도 않습니다. 오직 LLM 호출 시 전달할 최근 메시지를 관리하는 역할에 집중합니다.

 

반면, RAG 기반 챗봇의 메모리는 종종 검색 시스템과 밀접하게 결합됩니다. 대화 이력이 벡터화되어 검색 조건으로 사용되거나, 이전 응답이 새로운 질문의 배경 지식으로 작동합니다. 이 경우 메모리는 단순 저장소를 넘어, 응답 품질에 직접적인 영향을 미치는 구성 요소가 됩니다.

 

LangChain4j의 설계 방향을 보면, 이러한 책임을 ChatMemory 하나에 몰아주기보다는, 각 역할을 분리하도록 유도하는 인상을 받습니다. MessageWindowChatMemory는 그중에서도 가장 좁은 책임 범위를 가지는 구현체로 볼 수 있습니다.

 


 

Tool 기반 Agent에서 MessageWindowChatMemory를 사용할 때의 이점

 

Tool 기반 Agent에서 MessageWindowChatMemory를 메모리로 사용하면, 설계가 비교적 단순해집니다. Agent의 상태는 메모리에 남아 있는 최근 메시지로 충분히 설명되며, 추가적인 저장 전략을 고민하지 않아도 됩니다. 이는 Agent를 “작업 단위 실행 모델”로 바라볼 때 특히 유용합니다.

 

또한, 메모리의 크기가 제한되어 있기 때문에 Agent 동작을 추적하거나 디버깅할 때도 부담이 적습니다. 메모리에 남아 있는 메시지가 곧 Agent의 현재 판단 근거가 되므로, 흐름을 따라가기가 비교적 수월합니다.

 

이러한 이점은 MessageWindowChatMemory가 모든 상황에 적합하다는 의미는 아닙니다. 다만, Tool 기반 Agent라는 맥락에서는 이 단순함이 오히려 장점으로 작용할 수 있음을 시사합니다.

 


 

개인적인 정리와 비교를 통해 얻은 인사이트

 

MessageWindowChatMemory와 MongoDBChatMemoryStore를 비교하다 보면, 두 구현체를 동일한 기준으로 평가하려는 시도가 얼마나 위험한지 다시 한번 느끼게 됩니다. 이들은 같은 “메모리”라는 이름을 공유하지만, 출발점과 목적이 분명히 다릅니다.

 

Tool 기반 AI Agent는 종종 짧은 시간 동안 집중적으로 판단과 실행을 반복하는 구조를 가집니다. 이 경우 메모리는 장기 기록이 아니라, 현재 상태를 설명하는 도구에 가깝습니다. MessageWindowChatMemory는 이러한 요구를 충실히 반영한 설계로 보입니다.

 

반면, 일반 챗봇이나 RAG 기반 챗봇에서는 사용자와의 관계를 지속적으로 유지하는 것이 중요합니다. 이때 메모리는 단기 맥락을 넘어, 대화의 연속성과 일관성을 보장하는 수단이 됩니다. MongoDBChatMemoryStore와 같은 영속 메모리는 이러한 목적에 더 잘 부합합니다.

 

이 비교를 통해 얻은 개인적인 결론은, 메모리 구현체를 선택할 때 “기능이 많아 보이는가”보다는, 해결하려는 문제와 책임 범위가 무엇인가를 먼저 정리하는 것이 중요하다는 점입니다. MessageWindowChatMemory는 제한적이지만, 그 제한 덕분에 Tool 기반 Agent라는 맥락에서는 오히려 명확한 선택지가 될 수 있다고 생각합니다.