Memora 소개
AI 에이전트에게 "기억"이 없다는 문제
몇 달째 이어지는 프로젝트를 도와주는 직장 AI 비서를 떠올려봅시다. 매주 나누는 대화 속에서 제약 조건이 바뀌고, 마일스톤이 합의되고, 일정이 수정되고, 수십 명의 이해관계자 의견이 쌓입니다. 나중에 동료에게 보낼 업데이트를 부탁하면, 비서는 최신 결정뿐 아니라 그 결정에 이르기까지의 과정, 즉 무엇을 시도했고 무엇을 포기했으며 누가 어떤 의견을 냈는지까지 함께 기억하고 있어야 합니다. 이 논문은 바로 이 지점, 즉 대형 언어 모델(LLM) 기반 에이전트가 장기간에 걸쳐 쌓이는 경험을 어떻게 저장하고 다시 꺼내 써야 하는가라는 문제를 다룹니다. Microsoft Research가 ICML 2026에 발표한 Memora 는 기억을 요약하지도, 잘게 쪼개지도 않으면서 필요한 부분만 정확히 찾아내는 새로운 메모리 구조를 제안합니다.
오늘날의 LLM 에이전트는 계획 수립, 도구 사용, 다단계 추론에서 상당한 능력을 보여주고 있습니다. 하지만 지능은 그 순간의 추론 능력만으로 완성되지 않습니다. 경험을 어떻게 조직하고, 추상화하고, 다시 활용하는가에 뿌리를 둔 시간에 걸친 학습과 적응 능력이야말로 지능의 또 다른 축입니다. 지금의 에이전트는 반복되는 작업이나 사용자 의도를 매번 독립된 사건으로 취급하는, 사실상 상태를 가지지 않는(stateless) 존재에 가깝습니다. 축적된 경험을 조직할 원칙적인 메커니즘이 없다 보니, 에이전트는 매번 계획을 다시 세우고 똑같은 추론 과정을 반복하며, 이는 불안정한 성능과 눈덩이처럼 불어나는 토큰 비용으로 이어집니다.
이 문제를 풀기 위한 시도는 크게 두 갈래로 나뉘어 왔고, 둘 다 같은 벽에 부딪힙니다. 한쪽은 구체성(specificity) 을 우선시합니다. 원문 대화나 문서 조각을 그대로 저장하는 RAG 계열이나, Mem0처럼 대화에서 원자적인 사실을 추출해 저장하는 방식이 여기 속합니다. 세부 정보는 살아있지만, 원문 로그는 정제되지 않은 잡음으로 에이전트를 압도하고, 서사적 맥락이 잘려나간 고립된 사실들은 장기 과제에 필수적인 상호 의존성을 놓치기 일쑤입니다. 반대쪽은 추상화(abstraction) 를 우선시해, 경험을 고수준 요약으로 압축합니다. 효율적이지만 특정 제약 조건, 예외 상황, 수치 같은 과제에 결정적인 세부 사항이 요약 과정에서 통째로 사라집니다.
이 대비를 좀 더 살펴보면, 그래프 기반 메모리 시스템(HippoRAG, GraphRAG, Zep 등)도 있습니다. 개체 사이의 관계를 명시적으로 구조화해 연결성은 개선하지만, 미리 정의된 온톨로지(ontology)에 얽매이는 순간 유연성을 잃고, 그래프가 커질수록 검색 잡음도 함께 늘어난다는 새로운 트레이드오프를 떠안습니다. 결국 세 갈래 접근 모두 표현 구조 자체에 구멍이 있습니다. 고수준 개념과 저수준 세부 정보를 잇는 구조적 연결고리가 없다 보니, 에이전트는 자신의 과거를 제대로 탐색하지 못하고, 관련 없는 사실의 홍수와 쓸모없는 막연한 요약 사이에서 하나를 강제로 골라야 하는 처지에 놓입니다.
발상의 전환: 저장은 그대로, 색인만 가볍게
Memora의 핵심 통찰은 단순합니다. 무엇을 저장할지 와 어떻게 그것을 찾아낼지 를 완전히 분리하자는 것입니다. 기억의 내용 자체는 풍부하고 표현력 있게 그대로 두되, 색인과 검색을 담당하는 얇은 구조 계층(structural layer) 을 별도로 둡니다. 기존 시스템들은 대부분 저장된 내용 자체를 색인해 검색합니다. 원문 임베딩이든 그래프 노드 순회든, 무엇이 저장되는가 와 어떻게 접근하는가 가 한 몸으로 묶여 있었고, 이것이 앞서 본 추상화와 구체성 사이의 트레이드오프를 강제해 왔습니다. Memora는 이 결합을 풀어냅니다.
구체적으로, 각 메모리 항목은 두 요소로 구성됩니다. 프라이머리 abstraction(primary abstraction) 은 6~8단어 정도의 짧은 문구로, 그 기억이 근본적으로 무엇에 관한 것인지를 포착하는 정체성 역할을 합니다. 메모리 값(memory value) 은 실제 상세 내용을 담는 그릇입니다. 여기서 결정적인 부분은, 오직 프라이머리 abstraction 만 임베딩되어 유사도 검색에 쓰이고, 값 자체는 그 내용을 통해 직접 검색되지 않는다는 점입니다. 이 분리 덕분에 한 주제에 대한 새 정보가 들어오면, 기존의 같은 프라이머리 abstraction 아래로 병합되지 조각난 중복 기록으로 흩어지지 않습니다. 예를 들어 프로젝트의 진행 상황을 나타내는 타임라인은 "Memora 프로젝트 타임라인"이라는 하나의 프라이머리 abstraction 아래, 마일스톤과 설계 변경과 실험과 의사결정이 계속 덧붙는 단일 항목으로 유지됩니다.
여기에 큐 앵커(cue anchor) 가 더해집니다. 큐 앵커는 메모리 값에서 추출된 짧고 문맥을 담은 태그로, 프라이머리 abstraction 이 놓치는 다양한 관점의 접근 경로를 열어줍니다. 마이크로소프트 연구팀이 든 예시를 빌리면, "Dave와 Sarah가 프로토타입 일정을 4월 1일로, 파일럿을 5월 2일로, MVP를 5월 30일로 미루기로 합의했다"는 발화가 있다고 해봅시다. 지식 그래프 시스템이라면 Person → agreed_on → Milestone → has_date → Date 같은 사전 정의된 개체 유형과 관계 스키마가 필요하고, 새로운 관계 유형이 등장할 때마다 스키마를 확장해야 합니다. Memora에서는 "Dave와 Sarah가 합의한 Project Orion 일정 갱신"이라는 프라이머리 abstraction 이 정식 접근점 역할을 하는 한편, "Dave의 Project Orion 업데이트", "Project Orion 프로토타입 일정", "Project Orion 파일럿 타임라인" 같은 큐 앵커들이 온톨로지에 얽매이지 않고도 대안 검색 경로를 제공합니다. Dave의 최근 기여에 대한 질의든, 프로토타입 일정에 대한 질의든, 파일럿 시점에 대한 질의든 서로 다른 단서를 거쳐 같은 기억으로 수렴하면서, 세부 내용은 메모리 값 안에 고스란히 보존됩니다.
프라이머리 abstraction 이 하나의 기억에 정확히 하나씩 대응하는 1:1 관계라면, 큐 앵커는 여러 기억이 하나의 앵커를 공유할 수 있는 n:m 관계입니다. 이렇게 공유된 큐 앵커와 프라이머리 abstraction 사이의 관계로부터, 명시적인 엣지 구성 없이도 암묵적 메모리 그래프(implicit memory graph) 가 자연스럽게 형성됩니다. 아래 그림은 데이터 수집부터 세그멘테이션, 메모리 구성, 정책 기반 검색, 그룹 상대 정책 업데이트, 최종 검색 결과에 이르는 Memora의 전체 파이프라인을 보여줍니다.
Memora의 동작 원리
문제 정의: 관련성은 최대로, 크기는 최소로
Memora는 메모리 관리를 두 개의 함수로 정식화합니다. 하나는 문서, 로그, 코드, 표, 에이전트 상호작용 기록 등 이질적인 데이터 스트림 \mathcal{D} 를 구조화된 메모리 집합 \mathcal{M} 으로 옮기는 메모리 구성 함수 \mathcal{F}_{m}: \mathcal{D} \to \mathcal{M} 이고, 다른 하나는 질의 q 가 들어오면 관련된 부분집합 \mathcal{M}_{q} \subseteq \mathcal{M} 을 골라내는 검색 함수 \mathcal{Q}(q, \mathcal{M}) \to \mathcal{M}_{q} 입니다. 설계의 핵심 과제는 \mathcal{M}_{q} 의 관련성은 최대화하면서, 그 크기(|\mathcal{M}_{q}| \ll |\mathcal{M}| )와 검색 지연을 최소화하는 표현을 찾는 일입니다. 이는 고수준의 의미 스캔과 세밀한 문맥 조회를 동시에 지원해야 한다는 뜻이기도 합니다.
세그멘테이션과 에피소딕 메모리: 서사적 맥락을 잃지 않기
데이터 항목 d 가 들어오면, Memora는 먼저 세그멘테이션 함수 \mathcal{S}(d) 로 내용을 의미적으로 결이 맞는 세그먼트 \{s_1, \ldots, s_k\} 로 쪼갭니다. 이 단계가 메모리 항목이 생성되고 갱신되는 단위(granularity)를 결정하기 때문에, 프라이머리 abstraction 이 관련 정보를 얼마나 잘 통합하면서도 문맥의 구체성을 지킬 수 있는지가 여기서 갈립니다. 비정형 대화문에는 프롬프트 기반 추출을, 문서 헤더 같은 구조가 있는 파일에는 그 구조를 그대로 활용하는 식으로 데이터 형식에 따라 구현이 달라집니다.
각 세그먼트마다 에피소딕 메모리(episodic memory) e_i = \mathcal{E}(s_i) 를 함께 만듭니다. 이는 참여자, 의도, 시간적 범위를 담은 고수준 요약일 수도 있고, 정확한 표현과 미묘한 뉘앙스를 지키기 위해 원문 세그먼트 자체를 그대로 유지할 수도 있습니다. 검색과 추론 과정에서 같은 에피소딕 메모리에 묶인 항목들은 함께 그룹으로 묶여, 에이전트가 개별 사실을 둘러싼 더 넓은 맥락을 복원할 수 있게 해줍니다. 논문의 그래뉼래리티(granularity) 실험은 이 설계가 단순한 장식이 아니라는 것을 보여줍니다. 원문 세그먼트를 에피소딕 메모리로 쓴 조합(Episodic (Segment) + Factual)이 0.863 점으로 가장 높았고, 추출된 요약을 쓴 조합은 0.838 점, 사실 정보만 남긴 조합(Factual only)은 0.833 점에 그쳤습니다. 사실 정보만으로도 준수한 기준선이 되지만, 에피소딕 메모리가 제공하는 "연결 조직"이 근거를 다지는 데 결정적이라는 뜻입니다.
프라이머리 abstraction: 기억을 하나의 그릇에 담기
프라이머리 abstraction 은 개별 관측이 아니라 안정적이고 의미 있는 개념을 중심으로 기억을 조직하기 위해 도입되었습니다. 새 세그먼트 s 가 들어오면, Memora는 두 단계, 즉 추출과 통합을 거쳐 메모리 항목을 구성합니다.
먼저 추출 단계에서 후보 메모리 항목의 집합 \mathcal{F}_{a}(s) = \{m_i\}_{i=1}^{N} 을 만드는데, 각 m_i = (a_i, v_i) 는 프라이머리 abstraction a_i 와 그에 대응하는 값 v_i 로 구성됩니다. 통합 단계에서는 기존 메모리 저장소 \mathcal{M} 가운데 새 abstraction a_i 와 코사인 유사도가 가장 높은 상위 k 개를 찾고, 유사도 임계값 \gamma 이상인 것만 남깁니다. 이렇게 걸러진 후보들에 대해 LLM 기반 판단 함수 \mathcal{J} 가 새 후보가 기존 항목 중 하나와 같은 개념을 가리키는지 판정합니다. 일치하는 항목 m^{\star}(a_i) 를 찾으면 그 항목에 새 내용을 병합하는 갱신(Update) 을, 찾지 못하면 완전히 새로운 항목을 만드는 생성(Create) 을 수행합니다. 논문은 기본 임계값으로 \gamma = 0.80 을 사용했는데, 명백히 중복인 항목만 병합하면서도 과도한 통합은 막기 위한 값이라고 설명합니다.
이 create-or-update 규칙 덕분에, 시스템은 새로운 개념이 필요할 때만 새 abstraction 을 만들고, 기존 개념에 부합하는 정보는 계속 그 위에 살을 붙입니다. 실제로 프라이머리 abstraction 계층만 추가해도(큐 앵커와 정책 검색 없이) 전체 LLM-as-a-Judge 점수가 0.653 에서 0.795 로 뛰어올랐고, 대화당 평균 메모리 항목 수도 Mem0의 651 개에서 Memora의 344 개로 거의 절반이 되었습니다. 프라이머리 abstraction 계층을 걷어내면 Memora는 사실상 Mem0와 같아진다는 점이 흥미로운데, 둘 다 데이터에서 사실적 기억을 추출하지만 Mem0는 추출된 텍스트 조각을 곧바로 임베딩하고 검색하는 반면, Memora는 구조적 abstraction 계층을 통해 색인함으로써 저장 내용의 표현력을 지키면서도 조각화를 피합니다.
큐 앵커: 여러 각도에서 같은 기억에 닿기
프라이머리 abstraction 은 안정적이고 압축된 조직을 제공하지만, 의도적으로 거칠기 때문에 유연한 검색에 필요한 세부 사항을 전부 담지는 못합니다. 큐 앵커는 이 빈틈을 메우기 위한 가볍고 세밀한 의미적 고리입니다. 각 큐 앵커는 주요 개체나 주제와 핵심 측면을 조합한 형태로 만들어지며, 프라이머리 abstraction 과 달리 배타적이지 않은 n:m 매핑을 이룹니다. 하나의 메모리 항목이 여러 큐 앵커에 연결될 수 있고, 같은 큐 앵커가 여러 메모리 항목에 걸쳐 나타날 수도 있습니다.
새로운 큐 앵커가 생성되면 저장소에 이미 같은 앵커가 있는지 존재 여부를 확인해, 있으면 기존 인스턴스에 연결하고 없으면 새로 만듭니다. 반대로 메모리 항목이 삭제되거나 병합될 때는 관련된 큐-메모리 연결도 함께 갱신되고, 모든 연결을 잃은 큐 앵커는 자동으로 제거되어 큐 앵커 집합이 늘 간결하고 중복 없는 상태로 유지됩니다. 논문의 소거 실험(ablation)은 큐 앵커의 역할이 단순한 부가 기능이 아님을 보여줍니다. 정책 기반 검색기가 의미 기반 검색기보다 꾸준히 앞서는데, 큐 앵커를 제거하면 이 우위가 사라지고 두 검색기가 비슷해집니다. 즉 정책 검색기의 이점은 정책 네트워크가 더 복잡해서가 아니라, 큐 앵커를 따라 메모리 그래프를 순회하는 능력 자체에서 나온다는 뜻입니다.
정책 기반 검색: 검색을 능동적 추론 과정으로 바꾸기
Dense Passage Retrieval 같은 표준적인 의미 기반 검색 방법은 복잡한 추론에 필요한 다단계(multi-hop) 의존성을 놓치는 경우가 많습니다. Memora는 이를 해결하기 위해 메모리 검색 자체를 마르코프 결정 과정(Markov Decision Process) 으로 정식화합니다. 질의 q 와 검색 예산 B 가 주어지면, 시점 t 에서의 상태는 s_t = (q_t, \mathcal{W}_t, \mathcal{F}_t, b_t) 로 정의됩니다. 여기서 q_t 는 시간에 따라 다듬어질 수 있는 현재 질의 표현이고, \mathcal{W}_t 는 지금까지 검색한 메모리들의 작업 집합, \mathcal{F}_t 는 작업 집합과 직접 연결되어 있지만 아직 검색되지 않은 후보들의 프론티어, b_t 는 남은 검색 예산입니다.
각 단계에서 정책 \pi_{\theta}(a_t \mid s_t) 는 세 가지 원자적 행동 중 하나를 고릅니다. Refine(재질의) 은 현재 질의가 불충분하거나 방향이 어긋났다고 판단될 때 질의를 다시 만들어 탐색 전략을 전환합니다. Expand(확장) 는 프론티어에서 관련성 높은 기억을 골라 작업 집합을 키우며 새로운 근거를 직접 더합니다. Stop(종료) 은 충분한 정보가 모였다고 판단될 때 검색을 끝냅니다. 이 세 행동을 반복하며 정책은 즉각적인 의미 유사도를 넘어서는 관련 정보를 찾아내고, 정적인 검색 방법이 놓치기 쉬운 다단계 의존성을 효과적으로 포착합니다.
이 정책은 프롬프트로 유도되는 LLM(제로샷)부터 완전히 학습된 검색 모델까지 다양한 방식으로 구현될 수 있습니다. 논문은 DeepSeekMath 에서 제안된 그룹 상대 정책 업데이트(Group-Relative Policy Optimization, GRPO) 로 검색 정책을 최적화하는 방법도 함께 탐구합니다. 하나의 질의에 대해 현재 정책으로 G 개의 검색 궤적 \{\tau^{(i)}\}_{i=1}^{G} 을 샘플링하고, 각 궤적에 대해 판단자(judge)가 (i) 최종 답변의 정확성, (ii) 검색된 기억들 사이의 정보 중복도, (iii) 검색 비용이라는 세 기준으로 점수 J(\tau^{(i)}) 를 매깁니다. 절대적인 점수 대신 그룹 내 상대적 우위를 계산해 학습을 안정화합니다.
이렇게 얻은 그룹 상대 우위(advantage) 는 그룹 내에서 평균이 0이 되도록 정규화되어, 판단자의 편향이나 점수 스케일에 덜 민감하면서도 같은 질의에 대한 궤적들 사이의 상대적 개선을 장려합니다. 정책은 양의 상대적 우위를 가진 궤적의 행동일수록 확률을 높이는 방향으로 갱신되며, 정책 이탈을 막기 위해 참조 정책과의 KL 발산 항을 선택적으로 더할 수 있습니다.
RAG와 지식 그래프는 Memora의 특수한 사례일 뿐이다
논문은 여기서 한 걸음 더 나아가, 표준 RAG와 지식 그래프 기반 검색이 모두 Memora의 제한된 특수 사례로 표현될 수 있음을 형식적으로 증명합니다. "전통적인 RAG와 KG 기반 검색 모두 적절한 키 공간과 관계를 선택함으로써 Memora의 특수한 사례로 표현될 수 있다" 는 것이 핵심 주장입니다. 예컨대 프라이머리 abstraction 을 청크 내용 자체와 같게 두고 (a(s) = v(s) = s ), 큐 앵커 집합을 비워두고, 행동 공간을 단일 단계의 top-k 검색으로 제한하면 Memora는 정확히 flat RAG 와 같은 결과를 냅니다. 지식 그래프 기반 검색 역시 큐 앵커만을 통한 순회로 재현할 수 있습니다. 이 통일된 틀은 Memora가 기존 접근법을 특수 사례로 포함하면서, 혼합된 키 기반 검색과 abstraction 우선의 범위 축소, 구조화된 순회를 통한 원리적 효율성 개선까지 지원하는 더 표현력 있는 상위 집합이라는 점을 보여줍니다 (수학적 증명은 논문 부록 D 참고).
실험 결과: LoCoMo와 LongMemEval에서 새로운 SOTA
벤치마크와 베이스라인
연구팀은 평균 600 턴(약 $20$k 토큰)에 이르는 초장문 다중 턴 대화를 다루는 LoCoMo 와, $115$k 토큰 길이의 문맥에서 유저-어시스턴트 상호작용을 다루는 LongMemEval 두 벤치마크로 Memora를 평가합니다. LoCoMo는 단일 홉, 다단계, 시간 관련, 개방형 질문 등 다양한 유형의 질의응답 쌍으로 긴 대화 이력에 걸친 정보 종합 능력을 시험하고, LongMemEval은 극단적인 문맥 창(context window)에 걸친 장기 기억의 견고함을 테스트합니다. 비교 대상은 전체 문맥을 그대로 프롬프트에 넣는 Full Context, 청크 단위로 검색하는 RAG, 그리고 HippoRAG, Zep, Mem0, LangMem, Nemori 등 다양한 메모리 시스템입니다. 평가는 응답의 의미적 타당성을 가장 잘 포착하는 LLM-as-a-Judge 점수를 주요 지표로 삼고, LoCoMo에서는 BLEU와 F1 점수도 보조 지표로 함께 보고합니다.
전체 성능: 심지어 전체 문맥보다 낫다
아래 그래프가 보여주듯, 정책 검색기를 쓴 Memora (P)는 LoCoMo에서 0.863 점으로 모든 비교 대상을 앞섭니다. 의미 기반 검색기를 쓴 Memora (S)도 0.849 점으로 뒤를 잇습니다. 흥미로운 지점은 Memora가 전체 대화 이력을 통째로 넣은 Full Context 베이스라인(0.825)마저 능가한다는 사실입니다. 연구팀은 이를 Memora가 "문맥 잡음(context noise)"을 줄이는 능력으로 설명합니다. "관련 없는 대화 턴을 걸러내고 정제된 메모리 구조를 제시함으로써, Memora는 모델의 주의(attention) 메커니즘이 희석되는 것을 막아, 결과적으로 완전한 문맥보다 정제된 문맥이 더 날카로운 추론으로 이어진다는 것을 실증적으로 보여준다" 는 것입니다. RAG(0.633), Mem0(0.653), Nemori(0.794) 같은 강력한 베이스라인 대비 격차도 뚜렷합니다. LongMemEval에서도 Memora는 87.4\% 의 정확도로 다른 모든 베이스라인을 앞서며 일관된 우위를 보였습니다. 더 나아가 Memora는 전체 문맥을 그대로 넣는 방식보다 최대 98\% 더 적은 토큰만 사용하고도 이 성능을 냅니다. 정확도와 효율을 동시에 챙긴 셈입니다.
Ablation: 성능은 어디서 나오는가
앞서 프라이머리 abstraction 계층 하나만 추가해도 점수가 0.653 에서 0.795 로 뛴다고 언급했는데, 여기에 갱신(update) 로직과 큐 앵커, 정책 검색을 차례로 더하면 추가적인 향상이 이어집니다. 직접 콘텐츠를 임베딩하는 두 극단, 즉 Mem0처럼 조각나고 고립된 항목을 만들거나 RAG처럼 풍부한 내용을 하나의 흐릿한 벡터로 뭉개는 방식 모두를, Memora의 abstraction 계층은 표현력 있고 조각나지 않은 콘텐츠는 그대로 저장하면서 가벼운 abstraction 으로 색인함으로써 동시에 피해갑니다. 부록에 실린 세 가지 사례 연구 중 하나에서는, RAG가 전혀 다른 프로젝트의 "화려한 그릇" 이야기라는 무관하지만 의미적으로 그럴싸한 대화 조각에 이끌려 엉뚱한 답을 내놓고, Mem0는 "아이들이 진흙으로 뭔가 만드는 것을 즐겼다" 처럼 사실이지만 지나치게 일반적이고 조각난 정보만 내놓는 반면, Memora는 "아이들의 도자기 작업"과 "강아지 얼굴 컵" 사이의 세밀한 개체 결합을 그대로 보존해 정확한 답을 끌어냅니다.
지연시간과 구성 비용: 정책 검색의 대가
정책 검색기는 평균 3 단계 이상의 순차적 LLM 호출을 거치기 때문에, 의미 기반 검색기보다 지연시간이 눈에 띄게 큽니다(평균 종단 간 지연 5.7 초 대 1.1 초). 메모리 구성 비용 역시 살펴볼 가치가 있습니다. 최적화 전 Memora의 대화당 평균 구성 시간은 1322.0 초로 Mem0의 1350.9 초와 비슷했지만, 답변 품질은 0.863 대 0.653 으로 훨씬 높았습니다. 즉 성능 향상은 추가 연산량이 아니라 더 나은 메모리 표현 자체에서 나온다는 뜻입니다. 연구팀은 여기에 원문 소스에서 인덱스 오프셋만 예측하고 전체 메모리 값을 생성하지 않는 최적화를 더해, 품질 손실을 최소화하면서 구성 시간을 739.9 초로 줄였습니다. 45\% 의 속도 향상입니다.
메모리 구성에 더 저렴한 모델을 써도 될까요? 연구팀은 기본값인 gpt-4.1-mini 대신 훨씬 저렴한 gpt-5.4-nano로 메모리를 구성해 봤습니다. 가장 나쁜 조합(nano + 의미 검색)조차 0.763 점으로 여전히 gpt-4.1-mini를 쓴 Mem0(0.653)와 RAG(0.633)를 앞섰고, 정책 기반 검색과 결합하면(nano + 정책) 0.851 점까지 회복되어 mini + 정책 검색(0.863) 대비 겨우 1.4\% 차이로 좁혀졌습니다. Memora의 우위가 강력한 구성 모델에 의존하는 것이 아니라 구조 자체에서 나오며, 검색 정책이 저렴한 구성 모델의 품질 격차를 상당 부분 메워준다는 뜻입니다.
작은 모델로 정책을 옮겨심기: GRPO 학습 결과
정책을 명시적으로 최적화할 수 있을까요? 연구팀은 Qwen 2.5 1.5B라는 작은 백본 모델을 LoCoMo의 70/30 학습/평가 분할로 GRPO 학습시켜, 남겨둔 30\% 테스트 구간에서 평가했습니다. GRPO로 학습된 검색기는 전체 LLM-as-a-Judge 점수 0.841 을 기록해, 기본 모델 베이스라인의 0.829 를 시간 관련, 개방형, 단일 홉 과제 전반에서 일관되게 앞섰습니다. 검색 정책이 학습 가능하며, 훨씬 작은 모델로도 효과적으로 증류(distillation)될 수 있다는 것을 보여주는 결과입니다.
Memora 직접 써보기
Memora는 논문과 함께 코드도 공개되어 있어, 누구나 직접 설치해 자신의 에이전트에 붙여볼 수 있습니다. Python 3.10 이상이 필요합니다.
git clone https://github.com/microsoft/Memora
cd Memora
pip install -e .
가장 단순한 사용 흐름은 메모리에 문맥을 추가하고, 다시 질의로 불러오는 것입니다.
from memora.memora_client import MemoraClient
# 설정으로 초기화 (자세한 config 구성은 quickstart.py 참고)
memory_client = MemoraClient(cfg=cfg, user_id="my_user")
# 문맥을 메모리에 추가
memory_client.add("Alice is moving to Seattle for a new job.", type="doc")
# 의미 기반 검색으로 질의
results = memory_client.query("Where is Alice moving?", top_k=5)
for entry in results:
print(f"{entry.index}: {entry.value}")
# 정책 기반 검색으로 더 정교하게 질의
results = memory_client.advance_query("Where is Alice moving?", query_type="prompt", top_k=5)
에이전트 안에 통합하는 방식도 어렵지 않습니다. 사용자 메시지가 들어올 때마다 관련 기억을 검색해 응답을 생성하고, 그 대화를 다시 메모리에 추가하기만 하면 됩니다.
from memora.memora_client import MemoraClient
class MyAgent:
def __init__(self, cfg):
self.memory_client = MemoraClient(cfg=cfg, user_id="agent_user")
def generate_response(self, user_message):
memories = self.memory_client.query(user_message, top_k=5)
response = ... # 에이전트 로직
conversation = f"User: {user_message}\nAssistant: {response}"
self.memory_client.add(conversation, type="doc")
return response
논문에서 사용한 LoCoMo, LongMemEval 벤치마크 실험도 Hydra 설정 기반으로 그대로 재현할 수 있습니다.
cd app/locomo
python run_memora.py \
llm.model="gpt-4.1-mini" \
memory.memory_store="memora-cue" \
memory.enable_cue_index=True \
retrieval.strategy="prompt"
GRPO로 검색 정책을 직접 학습시키는 실험적 파이프라인(GPU 필요)도 함께 제공되며, 자세한 옵션은 저장소의 LoCoMo README에 정리되어 있습니다. (자세한 설정 옵션은 저장소의 conf/ 디렉터리를 참고해주세요)
한계와 향후 연구 방향
정책 기반 검색이 주는 이득에는 대가가 따릅니다. 매 단계가 별도의 LLM 호출이라 순차적 지연이 의미 기반 검색보다 몇 배 더 크고, 실시간성이 중요한 서비스에서는 이 트레이드오프를 신중히 저울질해야 합니다. 또한 create-or-update 판정과 GRPO 보상 설계 모두 LLM 판단자(judge)의 품질에 기대는 구조라, 판단자 자체의 편향이나 실수가 메모리 품질에 그대로 전이될 위험도 남아 있습니다.
연구팀이 밝힌 다음 단계들도 이 한계와 맞닿아 있습니다. MemLoop 는 검색과 과제 실패로부터 메모리 시스템이 스스로 학습하고, 오류를 메모리 파이프라인의 특정 단계로 귀속시켜 시간이 지날수록 스스로 개선하는 방법을 탐구합니다. Deferred Memory 는 충분한 문맥이나 증거, 미래의 효용이 확보되기 전까지 무엇을 저장할지 성급하게 결정하지 않고 메모리 구성 자체를 미루는 문제를 다룹니다. Group Memory 는 소유권과 접근 경계, 민감한 맥락의 출처를 지키면서 팀과 에이전트 사이에 지식을 공유하는 방법을 살핍니다.
결국 이 논문이 던지는 메시지는 벤치마크 점수를 한 줄 올리는 것 이상입니다. 에이전트가 세션이 끝나면 모든 것을 잊어버리는 대신, 몇 달 몇 년에 걸쳐 사용자와 협업하고 조직의 지식을 축적해 나갈 수 있으려면, 저장과 검색을 분리하는 이런 구조적 전환이 반드시 필요한 다음 단계라는 것입니다. Memora는 코드와 함께 이 방향의 첫걸음을 공개했고, 커뮤니티가 이 표현 위에서 무엇을 더 만들어낼 수 있을지는 이제부터가 시작입니다.
Memora 논문
Memora 소개 블로그 (Microsoft Research)
Memora GitHub 저장소
더 읽어보기
-
ReasoningBank: 성공과 실패 경험으로부터 스스로 진화하는 에이전트 추론 메모리 프레임워크 (feat. Google)
-
LightMem: LLM 및 AI Agent를 위한 효율적인 경량 메모리 프레임워크에 대한 연구 및 라이브러리
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. ![]()
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()


