무엇인가
StateMem은 UIUC 지아웨이 한(Jiawei Han) 연구실이 2026년 8월 20일 arXiv에 올린 「Can Agent Memory Systems Track Evolving State?」(arXiv 2608.19652)에 나오는 상태 장부형 에이전트 기억입니다. 논문은 함정 벤치마크 StateMemBench와 어느 기억 시스템에든 씌울 수 있는 답변 프롬프트 StateMemWrapper를 함께 내놓았습니다.
논문이 겨누는 실패는 상태 표류(state drift), 필요한 사실이 맥락 안에 있는데도 낡은 버전에 따라 행동하는 일입니다. "주석 1,600건, 예산 600달러"라고 했다가 "1,200건으로 하죠"라고 바꿨는데 비서는 여전히 예산 600달러라고 답합니다. 600달러는 실제로 있었던 말이지만 건수에 기대어 계산된 값이라 이미 낡았습니다. 저자들은 회상(recall)과 상태 추적이 서로 다른 축이라, 검색이나 맥락 창을 키워서는 고쳐지지 않는다고 주장합니다. 상태는 바탕 사실(새 발언이 대체), 파생값(입력이 바뀌면 재계산), 선언된 규칙·결정(새 입력에 재적용, 권한 있는 철회로만 바뀜)으로 나뉩니다. 1976년 make와 1979년 진리 유지 시스템(TMS)의 생각을 LLM 기억으로 옮긴 셈입니다.
어떻게 동작하나
TurnEncoder가 턴마다 LLM 1회 호출, 상태 단위 (id, content, priority, source, deps) 추가·대체
대체된 단위는 지우지 않고 superseded, 재확인기가 의존 그래프를 걸어 needs_recheck 표시 (LLM 0회)
활성·재확인 단위로 상태 블록을 결정론적으로 조립, 답변 호출 1회에 재계산 안내와 함께 투입
deps의 derived_from은 값이 다른 단위의 값에서 계산됐다는 뜻, coupled_with는 유효성이 다른 단위의 상태에 달렸다는 뜻입니다("자동이체는 카드 3에" ↔ "카드 3 해지"). TurnEncoder 출력은 {"add": [...], "supersede": [...]} JSON뿐이고, 재확인기는 O(|E|)에 끝납니다. 질문 시점에는 BINDING·PREFERENCES·! NEEDS RECHECK 구역의 상태 블록과 "재확인 표시된 숫자는 쓰지 말고 계산식에 현재 입력을 넣어 다시 계산하라"는 안내가 들어갑니다. 무엇이 낡았는지는 결정론적 층이 정하고, LLM은 답만 다시 계산하는 분업입니다.
StateMemWrapper는 저장소도 턴별 처리도 없이 마지막 답변 프롬프트만 바꿉니다(구조는 아래 '빠른 시작'). 질문당 약 350토큰(고정 지시문 155 + 추적 약 180)이 늘어납니다.
StateMemBench는 시나리오를 상태 연산 프로그램으로 만들어 결정론적으로 재생한 정답과, '최근 언급 신뢰'·'적힌 값 재사용' 같은 게으른 독자 정책의 답이 갈릴 때만 함정으로 채택합니다. 시나리오 234개·문항 322개(상태 116, 순서 72, 현저성 51, 반-함정 39, 복합 44), 짧은 Set A(18세션, 중앙값 165턴)와 긴 Set B(약 38세션, 599턴). 약한 독자(Haiku 4.5)가 5번 중 3번 이상 실제로 표류한 것만 남기고, 숨은 보기(정답·표류 답·중립 오답)로 오답을 '표류'와 '그 밖'으로 나눠 셉니다.
논문이 보고한 숫자
| 항목 (논문 보고) | 결과 |
|---|---|
| LongMemEval 오라클(회상률 1.0) 실패 36개 중 표류 | 44.4% (윌슨 95% 구간 30~60%), 다중 세션 71.4% vs 지식 갱신 25.0% |
| 추론 모드 끔 → 켬 (DeepSeek-V4-Flash, 50문항) | 42 → 38 정답 (맥니마 p=0.34) |
| StateMemBench 장문맥 (같은 백본 Qwen·DeepSeek / 최고 GPT-5.4-Nano) | 0.149 / 0.277 |
| StateMem · DeepSeek | 0.363 (최고 기억 시스템 A-Mem 0.199, Dense 검색 0.205) |
| StateMem · Qwen 3.5 9B | 0.233 (Mem0 0.149, GraphRAG 0.224와는 유의차 없음 p=0.82) |
| 소거 (DeepSeek): 추출만 → +대체 표시 → 전체 | 0.174 → 0.298 → 0.363, 재계산 안내 뺌 0.301, 의존 전파 뺌 0.373 |
| 회상형 벤치 (DeepSeek, 장문맥 대비) | LongMemEval 0.656 vs 0.666, LoCoMo 0.592 vs 0.587 |
| 래퍼 (6 백엔드 × 2 백본) | 단독 대비 +31.7~+66.6점, 그중 구조 몫 +15.0~+31.7점, 12칸 모두 유의 |
의존 전파는 긴 대화의 반-함정에서 과하게 번져 12.5점을 잃었습니다. 대화가 맥락 창에 들어가면 래퍼가 StateMem 자신보다 높았고(Qwen 0.283 대 0.567 이상), 저자들은 영구 저장소는 창에 들어가지 않을 때 쓸모 있다고 봅니다.
빠른 시작
논문의 코드와 데이터는 공개되지 않았지만(아래 '한계와 주의'), 래퍼 프롬프트는 부록 F.1에 원문이 실려 있어 지금 쓰는 기억 시스템의 답변 호출만 바꿔 시험할 수 있습니다. 구조는 이렇습니다.
같은 길이의 "관련 정보를 요약한 뒤 답하라"는 대조 프롬프트(부록 F.2) 를 함께 돌리면 래퍼 − 대조가 순수한 '상태 구조'의 몫입니다. 자기 시나리오에는 바뀌지 않아야 하는 반-함정도 섞어야 '무조건 최신 값' 꼼수가 걸러집니다.
코어닷투데이 실측
2026년 10월, 논문 백본과 같은 계열인 Qwen 3.5 9B를 로컬 Ollama에서 온도 0·추론 끔으로 돌렸습니다. 논문 생성 방식을 축소해 템플릿 사건 프로그램으로 한국어 18세션 대화를 만들고(짧은 판본 중앙값 114턴, 긴 판본 366턴), 유형 5개 × 4개 × 2판본 = 40문항에 세 가지 답변 프롬프트를 썼습니다. 일반("대화를 보고 답하라"), 대조(부록 F.2 원문), 래퍼(부록 F.1 원문). 지시문은 영어 원문, 대화는 한국어이고 숨은 보기 4개와 단어 일치로 채점했습니다. 약한 독자 관문은 두지 않았습니다.
| 함정 유형 (각 8문항) | 일반 | 대조 | 래퍼 |
|---|---|---|---|
| 상태 — 규칙 재적용 | 4 (표류 4) | 2 (표류 5) | 8 |
| 현저성 — 시끄러운 경쟁자 | 5 (표류 2) | 5 (표류 3) | 8 |
| 순서 — 파생값 재계산 | 7 (표류 1) | 8 | 8 |
| 복합 — 여러 메커니즘 | 4 (표류 4) | 4 (표류 4) | 6 (표류 2) |
| 반-함정 — 바꾸지 말 것 | 8 | 8 | 8 |
| 합계 (40문항) | 28 · 표류 11 | 27 · 표류 12 | 38 · 표류 2 |
- 래퍼는 한국어에서도 통했고, 대조군은 아니었습니다. 정답 28 → 38, 표류 11 → 2, 긴 판본 20문항 전부 정답. 같은 길이의 '요약 먼저'는 27로 효과가 없었습니다(상태 유형은 4 → 2). 효과의 정체는 무엇을 어떤 순서로 생각할지 정해 주는 데 있었습니다.
- 비용은 작았습니다. 입력 중앙값 5,054 → 5,267토큰, 출력 약 60 → 374토큰, 호출 시간 23초 → 27초(머신 공유).
- 방해 문장 하나가 순서 함정을 살렸습니다. 템플릿 순서 문항은 일반 프롬프트도 7/8을 풀었지만, 논문 부록처럼 "그러니까 오늘은 7개" 한 구절을 넣은 판본 4개에서는 일반 0/4(표류 2·보기 밖 2), 대조 1/4, 래퍼 4/4였습니다.
- 래퍼도 놓친 복합 실패. 생수 시나리오에서 "한 달치 24묶음이니까 일반 주문, 그걸로 계속 가자"고 힘주어 말한 뒤 조용히 "매주 9묶음으로 늘릴게"라고 하자, 짧은 판본 2개에서 래퍼의 추적에 그 갱신이 아예 빠졌습니다. 추적에 무엇을 넣을지는 여전히 모델의 주의력에 달려 있습니다.
- 추론을 켜도 래퍼보다 못했습니다. 상태·현저성·복합 짧은 판본 12문항에서 일반·추론 끔 7, 일반·추론 켬 9, 래퍼 10. 추론 켬은 출력 중앙값 약 4,900토큰이었고, 한도 6,000에서는 8/12가 답을 못 써 2만으로 다시 돌렸습니다.
40문항·템플릿 대화·관문 없음이라 방향의 확인입니다. StateMem 본체(턴마다 LLM 호출)는 시험하지 않았습니다.
언제 쓰고, 언제 피하나
| 상황 | 구성 |
|---|---|
| 이미 Mem0·벡터 검색·장문맥을 쓰고 있고 대화가 창에 들어간다 | 답변 호출에 래퍼만 씌운다. 질문당 약 350토큰, 호출 수 그대로 |
| 규칙 + 계속 바뀌는 입력 (예산·주문량·보너스 구간·"F1 최고가 메인 표") | 값이 아니라 계산식과 derived_from을 저장, 대체를 명시적으로 기록 |
| 대화가 맥락 창을 넘는 장기 에이전트 | StateMem식 상태 단위 저장소 + 재확인 표시 (턴마다 인코더 호출 비용 감수) |
| 권한이 얽힌 조직 결정 (계약서 > 이메일, 임원 > 팀장) | StateMem의 priority는 hard/soft 두 단계뿐. 출처·권한 순서를 따로 설계한다 |
| 의존 관계를 아무도 말해 주지 않는 실제 대화 | TurnEncoder의 관계 추출 품질은 검증되지 않았다. 의존 전파를 끄고 시작하는 편이 안전할 수 있다 |
한계와 주의
- 코드와 데이터가 공개되지 않았습니다. 논문은 "StateMemBench를 공개한다"고 쓰지만 2026년 10월 25일 기준 arXiv에 코드 링크가 없고, 깃허브·허깅페이스에서도 공식 저장소를 찾지 못했습니다. 한 커뮤니티 목록은 '논문만 있음(paper_only)'으로 분류합니다. 지금은 아무도 숫자를 재현할 수 없습니다.
- 부록 표 12의 Dense '단독' 행이 본문 표 6과 맞지 않습니다. 표 12는 DeepSeek에서 전부 0%, Qwen에서 반-함정 23% 하나뿐이라 가중 합이 0%·약 5%여야 하는데, 표 6의 Dense 단독은 31.7%·21.7%입니다. 다른 백엔드는 반올림 범위에서 맞으므로 기재 오류로 보이며, Dense의 구조 효과 크기는 조심해서 읽어야 합니다.
- "표류율 64.3% → 49.1%"는 백본 비교입니다. 닫힌 보기 분석에서 StateMem이 가장 크게 개선된 이 숫자는 Qwen → DeepSeek로 답변 모델을 바꿨을 때의 변화이지, 장문맥 대비 개선이 아닙니다. 표류율 단독으로 보면 보기 밖 답이 많은 '기억 없음'(5.6%, 보기 밖 94%)이 우수해 보이는 착시도 있습니다.
- 자기 벤치마크 이점. StateMem은 함정을 만든 정책 계열을 겨냥해 설계돼 격차는 상한선입니다. 채점 모델(DeepSeek-V4-Pro)이 백본 하나와 같은 가족이고, 숫자는 모두 단일 실행·소중형 백본입니다. 표류 비율도 판정 모델 라벨이라 사람은 더 적게 줬습니다.
- 현저성은 사실상 풀리지 않았습니다. Qwen 백본에서 StateMem의 현저성은 0.020으로 같은 백본 장문맥(0.098)보다 낮습니다. 상태 단위로 정리하며 '한 번만 지나가듯 말한 사실'이 떨어진다는 신호로도 읽힙니다. 긴 Set B에서 StateMem만 떨어지는(0.411 → 0.295) 현상도 논문이 해석하지 않았습니다.
- 의존 관계는 대사에 명시돼 있습니다. 벤치마크는 "1,600건이니까 작업자 5명"처럼 인과를 말로 밝혀 둡니다. 실전에서 TurnEncoder가 관계를 얼마나 잘 뽑는지는 재지 않았습니다.
- 비용과 길이. StateMem 본체는 시나리오당 인코더 호출 165~600번이고, 대화는 3천~1만 5천 토큰으로 요즘 맥락 창보다 훨씬 짧습니다. 압축으로 지시를 잃은 2026년 2월 OpenClaw 사고 같은 경우가 아니라, 모든 기록이 맥락 안에 있는 조건의 표류만 잽니다.




