TL;DR. 에이전트 메모리의 위험은 읽기가 아니라 쓰기에 있다. 분야는 retrieval(RAG·용량·검색)을 최적화하는데, 1차 출처를 직접 파보니 부패는 consolidation·update에서 들어온다 — 세 독립 연구가 수렴한다. (1) LLM이 메모리를 계속 갱신하면 효용이 no-memory 밑으로 떨어지고(GPT-5.4가 메모리 없이 풀었던 ARC-AGI의 54%를 consolidation 후 실패), (2) 에이전트는 새 증거가 와도 무효해진 신념을 retract하지 못하며(최고 모델도 55.2%), (3) 쓰기 단계 오류는 한참 뒤 읽기에서 터진다. consolidation 붕괴와 stale 캐스케이드를 결정론 코드로 모델링하니 같은 모양이 재현됐다. 처방은 읽기 개선이 아니라 쓰기 게이트다.
아직 안 정해진 질문
에이전트 메모리 카테고리는 "컨텍스트 윈도우 바깥에 무엇을 보관하나"를 지도로 줄세웠다. 그 평가 벤치 글이 직접 비워둔 칸이 있다 — 시간이 지나 무효해지는 메모리를 누가 약화시키는가는 "측정 도구 없음"으로 남았다. 분야의 에너지는 더 잘 검색하는 쪽(RAG·하이브리드 검색·용량 확장)에 쏠려 있다. 그런데 메모리가 틀리는 자리는 거기가 아닐 수 있다. 무엇이 메모리를 부패시키는가 — 검색 실패인가, 아니면 쓰는 행위 자체인가. 여기엔 합의가 없다. 헤드라인("X 메모리 시스템이 SOTA")으로는 답이 안 나온다 — 페이퍼의 실패 분석을 직접 대조하고, 부패 메커니즘을 모델로 돌려봐야 나온다.
어떻게 팠는가
두 갈래로 팠다 — 1차 출처 세 편을 깊이 읽어 실패의 출처를 대조하고, 각 페이퍼가 보고한 부패 메커니즘을 결정론 코드 토이로 모델링한 뒤 실제 모델에 직접 돌려 같은 모양이 나오는지 확인했다.
- 1차 출처 — Useful Memories Become Faulty(갱신 부패), STALE(무효화 인지 벤치), MemTrace(오류 귀속). 셋은 각각 발견·벤치·디버거로 접근이 다른데 같은 곳을 가리킨다.
- 재현 ① 결정론 토이 — (A) consolidation을 손실 있는 반복 갱신으로 모델링(매 라운드 일부 사실이 소실되거나 오염되어 잘못된 값으로 굳음)하고 raw 보존과 효용을 비교. (B) 의존 신념 그래프에서 root 사실을 갱신할 때 naive 덮어쓰기 vs 의존성 인지 무효화의 stale 잔존율을 측정.
- 재현 ② 라이브 — 구체적 사실 10개를 메모리에 넣고 연속 consolidation(직전 압축본을 다시 압축)을 실제 모델(Claude subagent·Gemini Flash)로 반복하며, 매 라운드 살아남은 사실을 필자가 원본 10개 대비 직접 채점.
발견
세 출처와 두 토이가 한 문장으로 모인다 — 읽기 경로는 멀쩡하고, 부패는 전부 쓰기 경로에서 일어난다.
갱신은 효용을 no-memory 밑으로 떨어뜨린다
Useful Memories Become Faulty의 단정은 직관에 반한다 — "메모리 효용은 먼저 오르다 떨어지고, no-memory baseline 아래로 갈 수 있다." 출처는 부실한 경험이 아니라 consolidation 과정 자체다. 같은 trajectory도 갱신 스케줄이 다르면 질적으로 다른 메모리가 나온다. 수치(논문 self-report): GPT-5.4가 메모리 없이 풀었던 ARC-AGI 문제의 54%를 consolidation 후 실패했고, raw episode를 보존한 에이전트가 forced-consolidation의 정확도를 두 배로 냈다.
토이 A가 이 모양을 재현한다. raw 보존은 효용이 평평(전 사실 정확, 오염 0)한 반면, 손실 있는 consolidation은 매 라운드 사실을 잃고 일부를 오염된 값으로 굳힌다.
| 갱신 라운드 | consolidation 효용 | raw 효용 | no-memory |
|---|---|---|---|
| 0 | 90 | 90 | 50 |
| 4 | 46 (← no-memory 밑으로) | 90 | 50 |
| 12 | 28 | 90 | 50 |
오염된 사실이 능동적으로 오도하기 때문에(없느니만 못함), consolidation 효용은 4라운드 만에 no-memory(50) 아래로 내려가고 12라운드엔 raw의 3.2분의 1이 된다. 갱신은 공짜 압축이 아니라 손실 + 오염이다.
라이브 재현 — 같은 모양이 실제 모델에서
토이가 가정이 아님을 확인하려고, 구체적 사실 10개를 메모리에 넣고 연속 consolidation(직전 압축본을 다시 압축)을 실제 모델로 돌렸다. 매 라운드 살아남은 사실은 필자가 원본 대비 직접 채점했다.
| 라운드 | Claude (Opus, subagent) | Gemini 2.5 Flash |
|---|---|---|
| 0 (seed) | 10/10 | 10/10 |
| 1~3 ("절반씩") | 10/10 (포맷만 손실) | R1 10/10 · R2 8/10 |
| 4 (예산 ≤12단어) | 7/10 | — |
| 5 (예산 ≤6단어) | 3/10 | — |
두 모델이 같은 방향을 찍었다. Flash는 완만한 "절반" 압박에도 2라운드 만에 pnpm·Vitest를 조용히 떨궜다(8/10). Opus는 더 버텼다 — 3라운드까지 사실을 다 지키고 포맷만 깎았다. 그러나 토큰 예산이 묶이자 무너졌다 — ≤12단어에서 Tailwind v4·리전이 사라지고 Sonnet 4.6이 Sonnet으로(버전 손실), ≤6단어에선 10개 중 3개만 남았다. 손실은 경고 없이 일어났다 — 어느 라운드도 "이걸 버린다"고 말하지 않았다. 강한 모델은 부패를 지연시킬 뿐 면역이 아니다. 토이가 모델링한 두 부패 모드 중 라이브가 그대로 재현한 건 손실이다 — 사실이 경고 없이 떨어지고 버전이 잘렸다(Sonnet 4.6→Sonnet). 틀린 값으로 굳는 오염은 토이 A가 보여준 모드다.
무효화는 캐스케이드에서 실패한다
STALE은 새 증거가 암묵적으로 옛 신념을 무효화할 때 에이전트가 그걸 아는지 잰다. 결과는 처참하다(논문 self-report) — 최고 모델 Gemini-3.1-pro도 55.2%, 대부분의 메모리 프레임워크는 10% 미만. 두 실패가 핵심이다. 인지 ≠ 적용 — 상태를 직접 물으면 76%인데 갱신된 신념을 실제 과제에 적용하면 39%로 떨어진다. 전제 편향 — 질의가 옛 정보를 전제로 깔면 92%가 30%로 무너진다. 그리고 한 사실의 변화가 의존 신념으로 전파되는 Type II가 모든 시스템에서 가장 어렵다.
토이 B가 Type II를 재현한다. root 사실 하나에 의존 신념 8개가 걸린 그래프에서 root를 갱신하면:
| 갱신 정책 | stale로 남는 의존 신념 |
|---|---|
| naive 덮어쓰기(latest-write-wins) | 8/9 = 89% |
| 의존성 인지 무효화 | 0/9 = 0% |
naive 덮어쓰기는 root만 고치고 파생 신념을 건드리지 않는다. 무효화가 캐스케이드를 따라가지 못하면, 갱신했다고 믿는 메모리의 89%가 여전히 옛값이다.
오류는 쓰기에서 들어와 읽기에서 터진다
MemTrace는 메모리 실패를 연산 단위로 귀속한다 — extraction·retrieval·update·response 등 7개 범주(5개가 메모리 고유). 160개 주석 실패 분석의 핵심 발견 두 가지: 실패는 무작위가 아니라 연산 수준의 정보 손실·정렬 어긋남이고, 쓰기(construction)에서 들어온 오류가 한참 뒤 읽기(retrieval·response)에서 터져 진단을 어렵게 한다. 검색 단계만 보면 원인이 안 보인다 — 오류는 이미 쓰일 때 심어졌다.
세 발견이 같은 비대칭을 가리킨다. 토이 A·B에서 읽기 경로는 양쪽 모두 동일하게 두었다 — 갈린 건 오직 쓰기다. 분야가 retrieval을 갈고닦는 동안, 부패는 consolidation·update·construction에서 조용히 들어온다. 이건 프롬프트 인젝션 조사의 결론과 같은 모양이다 — 거기서도 방어는 읽는 텍스트가 아니라 *내보내는 툴콜 와이어*에 둬야 닫혔다. 두 경우 모두 맞는 채널을 지켜야 한다. 메모리에서 맞는 채널은 쓰기다.
결론
메모리를 만들거나 운영한다면, 할 일은 검색을 더 갈고닦는 게 아니다 — 쓰는 순간을 막는 것이다.
- 자동 consolidation을 끄고 raw episode를 1차 증거로 둔다. LLM이 세션 요약·메모리 압축을 자동으로 돌리게 두지 않는다. 압축은 명시적으로 게이트해서 필요할 때만 — 토이에서 효용은 4라운드 만에 no-memory 밑으로 떨어졌다.
- 갱신은 덮어쓰지 말고 의존 신념까지 무효화한다. root만 고치면 그걸 전제로 깐 파생 신념 89%가 옛값으로 남는다. 루트 변경이 의존 항목을 무효화·재계산하도록 설계한다.
- 검색 개선에 자원을 더 붓지 않는다. 이미 쓸 때 심긴 오류는 retrieval을 아무리 갈아도 못 고친다 — 부패한 기억을 더 잘 꺼내올 뿐이다.
- 진단은 쓰기 단계에서 시작한다. 메모리가 틀리면 검색부터 보지 말고, 그 사실이 쓰일 때 손실·오염됐는지를 먼저 본다.
한 줄로 — 메모리는 더 잘 기억하기가 아니라 잘못 쓰지 않기다. 읽기를 최적화하던 노력을 쓰기 게이트와 의존성 인지 무효화로 옮겨라.
이 조사가 말하지 못하는 것
라이브 재현은 단일 시드(사실 10개)·모델당 한 번의 런이고 Gemini는 일일 쿼터로 2라운드에서 끊겼다 — 소표본이라 절대 수치가 아니라 방향(갱신할수록 사실이 조용히 소실)만 읽어야 한다. 토이의 90·46·28·89% 같은 수도 메커니즘을 결정론으로 모델링한 비대칭의 모양(쓰기는 부패, 읽기는 불변)이지 절대 벤치가 아니다. 손실·오염 비율은 가정값이고, 실제 consolidation의 부패율은 모델·스케줄·예산에 따라 흔들린다 — "rises then falls below no-memory"라는 방향은 견고해도 특정 라운드 수를 절대 기준으로 읽으면 안 된다. STALE·Useful의 퍼센트는 1차 출처 인용이다. 또 이 글은 부패 한 문제만 본다 — 프라이버시·용량은 eval 벤치 글이 다룬다.
다음 조사
consolidation 게이트를 실제 메모리 루프에서 어떻게 자동 도출하느냐 — 무엇을 raw로 남기고 무엇을 압축할지 결정 기준을 못 세우면 게이트는 너무 빡빡하거나(압축 안 함) 너무 느슨하다(다 압축). 그리고 의존성 인지 무효화를 자유 텍스트 메모리(그래프가 아닌)에서 어떻게 거느냐 — STALE Type II를 닫으려면 파생 신념의 의존 관계를 어디선가 추적해야 한다. 다음 조사 후보다.
1차 출처
- Useful Memories Become Faulty When Continuously Updated by LLMs — consolidation 효용이 no-memory 밑으로, raw가 두 배
- STALE: Can LLM Agents Know When Their Memories Are No Longer Valid? — 무효화 인지 벤치(최고 55.2%), Type II 캐스케이드가 최난
- MemTrace: Tracing and Attributing Errors in LLM Memory Systems — 오류는 연산 단위, 쓰기에서 들어와 읽기에서 발현
- 에이전트 메모리 카테고리 · 평가 벤치 글의 "측정 도구 없음" 빈 칸 — 이 조사가 메우는 자리
- 재현 — ① 결정론 토이(consolidation vs raw 효용 12라운드, stale 캐스케이드 의존 신념 8개) + ② 라이브 다회 consolidation(Claude subagent·Gemini Flash, 사실 10개 시드), 이 글에서 직접 작성·실행