무엇인가
MemStrata는 MemStrata.dev의 Neeraj Yadav가 2026년 6월 25일 arXiv에 올린 단독 저자 초고 「Temporal Validity in Retrieval Memory: Eliminating Stale-Fact Errors for AI Agents over Evolving Knowledge」(arXiv 2606.26511, 21쪽)의 로컬 기억 계층입니다. 에이전트와 언어 모델 사이에서 대화의 사실을 저장하고, 질문이 오면 토큰 예산에 맞춘 문맥을 묶어 줍니다.
논문이 붙인 이름은 낡은 사실 오류(stale-fact error), 이미 바뀐 사실의 옛 값을 지금 값처럼 내놓는 실패입니다. 결제 서비스 포트가 8000에서 8080으로 바뀌면 저장소에는 두 문장이 다 남고, 숫자 하나만 다른 두 문장은 질문에 거의 같은 유사도를 받습니다. RAG는 둘 다 찾아오고 어느 쪽이 지금 값인지 가릴 장치가 없습니다. 논문의 주장은 세 문장입니다. ① RAG에는 시계가 없다. ② 유사도를 더 조율해서는 풀리지 않는다 — 바뀐 값이 같은 뜻의 다른 표현보다 오히려 더 비슷하다. ③ 그러니 대체는 구조로 판정한다. 같은 (주어, 관계)에 다른 값이 오면 새것이 옛것을 대체하고, 옛것은 지우지 않고 기간을 닫는다.
무대는 가장 빨리 낡는 지식인 코드입니다. 함수 이름(get_user_by_id → fetch_user), 엔드포인트(/api/v1 → /api/v2), 설정 값(1800초 → 3600초), 의존성 버전(numpy 1.24.0 → 1.26.4)이 커밋 한 줄로 바뀌고 아무도 에이전트에게 옛 기억을 지우라고 말하지 않습니다. 논문 스스로 "기여는 원장이라는 기본 장치가 아니라 그것을 LLM 기억의 결정적 대체 규칙과 묶은 것"이라고 씁니다. 1985년 스노드그래스·안의 유효 시간/기록 시간, SQL:2011 시간 테이블, Datomic의 철회와 같은 계보입니다.
어떻게 동작하나
정규화 문장 해시가 있으면 버림, 비용 0
(주어, 관계, 값)으로 쪼개지면 (주어, 관계)가 열쇠. 같은 열쇠·다른 값 → 옛 행 기간 닫고 새 행. 같은 값 → 강화
세 칸으로 안 쪼개지는 산문은 유사도 + LLM 판정, 모순 아닌 비슷한 문장은 별개로 보관
2단계의 "LLM을 쓰지 않는다"는 판정에 관한 말입니다. 문장을 세 칸으로 쪼개는 추출에는 LLM이 쓰입니다(부록 C.1 extract_triple 프롬프트). 추출 규칙의 핵심은 "값만 다른 두 문장은 반드시 같은 주어와 관계를 내야 한다"와 "값이 함수 이름이면 주어를 '사용자 기록을 기본 키로 찾는 함수'처럼 하는 일로 바꿔 쓴다"입니다. 주어에 이름이 들어가면 이름이 바뀔 때 열쇠도 바뀌기 때문입니다.
각 행은 valid_from·valid_to·superseded_by를 갖고, 검색은 활성 행만 봅니다. 퇴역한 행은 과거 시점 질문용으로 남지만 그 조회는 구현만 하고 평가하지 않았습니다. 읽기 경로는 코사인 상위 k → 퇴역 행 거름이고, 세 칸 재구성문이 아니라 원문 문장을 넣었을 때 정확도가 돌아왔습니다(함수 이름 0.80 → 1.00, 다른 개선과 함께 측정).
논문의 실험과 숫자
먼저 98쌍 보정 실험(영어, nomic-embed-text)입니다. 원 사실 대비 평균 코사인이 병합 0.938, 모순 0.812, 중복 0.800, 새 사실 0.477로, 값이 바뀐 문장이 같은 뜻의 다른 표현보다 더 비슷했습니다. 유사도 문턱으로 중복을 가르는 AUROC는 0.5926이고, 문턱을 0.80 → 0.98로 올려도 정밀도는 0.28 → 0.67, 그때 재현율 0.31입니다. 정밀도 0.67은 '중복이니 버린다'고 판정한 셋 중 하나가 사실 새 값이라는 뜻입니다.
벤치마크는 표지 없음 불변식을 지킵니다. 옛 문장과 새 문장은 값 하나 빼고 글자까지 같고, old·legacy·deprecated 같은 단어는 단위 테스트로 금지됩니다. 지금 값의 유일한 신호는 들어온 순서입니다. 앞선 벤치마크에서 '[OUTDATED]' 표지를 지우자 LLM 재정렬 RAG는 14점, 게이트 조건은 18점 떨어졌고 MemStrata는 4점 떨어졌습니다. 답변은 Qwen2.5-Coder-7B, 채점은 Qwen2.5-Coder-3B 두 개, 온도 0·네트워크 차단입니다.
| 항목 (논문 보고) | 단순 RAG | MemStrata |
|---|---|---|
| 고정 지식 정답률 (프로젝트 사실 50 / LoCoMo 대화 30) | 0.86 / 0.30 | 0.82 / 0.30 |
| 바뀐 지식 정답률 (함수 30·설정 20·의존성 20·API 20) | 0.20~0.47 | 0.95~1.00 |
| 낡은 사실 오류율 · 답 강제 (함수·설정·의존성·API) | 0.40 · 0.35 · 0.15 · 0.35 | 0.03 · 0 · 0 · 0 |
| 검색 지연 | 약 2.1초 | 약 2.1초 (LLM 재정렬·검증 조건 16~18초) |
기권을 허락하면 RAG의 실패는 기권 뒤에 숨습니다(설정 값 벤치에서 20문항 중 6개에만 답함). 유사도+LLM 판정으로 대체하는 '놀람 게이트'는 기권 허용에서도 25~60%를 옛 값으로 답했습니다. 절제 실험에서 쓸 때 과감히 합치면 고정 지식이 무너지고(프로젝트 사실 0.86 → 0.62), 대체를 빼면 바뀐 지식 평균이 0.99 → 0.33으로 RAG(0.32)와 같아지며 지어낸 답 비율이 0.04 → 0.25로 약 6배가 됩니다.
코어닷투데이 실측
2026년 10월 31일, 논문 데이터가 공개되지 않아 한국어 사실 30개(함수 이름 6·설정 값 6·의존성 5·API 5·회사·생활 8, 표지 없음)를 직접 만들어 핵심 주장을 다시 쟀습니다. 검색은 BGE-M3 코사인 상위 5개, 답변·추출은 qwen3.5:9b(온도 0, 생각 끔), 추출 프롬프트는 논문 C.1을 옮기되 예시는 시험 문항과 겹치지 않게 새로 썼고, 채점은 문자열 대조입니다.
유사도 실험. 원문 대비 중복(같은 값, 다른 표현)과 모순(같은 표현, 값만 바뀜)의 코사인을 로컬 임베딩 다섯 개로 쟀습니다.
| 임베딩 | 중복 | 모순 | 모순+표현 | AUROC (중복>모순) |
|---|---|---|---|---|
| BGE-M3 | 0.907 | 0.909 | 0.826 | 0.46 |
| Nomic v2 MoE | 0.875 | 0.880 | 0.767 | 0.47 |
| EmbeddingGemma 300M | 0.891 | 0.874 | 0.772 | 0.59 |
| Qwen3 임베딩 0.6B | 0.883 | 0.914 | 0.813 | 0.34 |
| Qwen3 임베딩 8B | 0.912 | 0.921 | 0.844 | 0.44 |
다섯 중 네 모델에서 값만 바뀐 문장이 평균적으로 더 비슷했고, AUROC는 0.34~0.59로 큰 모델이라고 나아지지 않았습니다. 질문 대비로도 옛 문장과 새 문장의 유사도 차이는 평균 0.009(최대 0.04)였고, 21개는 옛 문장이 더 높았으며, 30개 모두 상위 5개에 함께 들어왔습니다.
종단 실험 (30문항).
| 조건 | 새 값 | 옛 값 | 둘 다 | 기권 |
|---|---|---|---|---|
| 단순 RAG · 기권 허용 | 1 | 0 | 11 | 18 |
| 단순 RAG · 답 강제 | 10 | 12 | 7 | 1 |
| RAG + 기록 순서 표시 (논문에 없는 비교군) | 26 | 1 | 3 | 0 |
| 결정적 대체 · 기권 허용 | 25 | 1 | 4 | 0 |
| 결정적 대체 · 답 강제 | 26 | 1 | 3 | 0 |
- 문제는 한국어에서도 진짜였습니다. 답을 강제한 RAG는 40%(12/30)를 옛 값으로 답했습니다(논문 15~40%의 상단).
- 기록 순서 한 줄이 차이의 대부분을 메웠습니다. 검색된 문장마다 "[기록 37]" 같은 순번을 달고 "같은 대상에 값이 여럿이면 가장 나중 기록이 지금 값"이라는 한 문장만 더한 RAG가 결정적 대체와 같은 26/30이었습니다. 성능의 원천은 '대체'보다 '시간 정보를 쓴 것'에 가까웠습니다.
- 병목은 열쇠 추출이었습니다. 같은 틀인데도 열쇠가 맞은 것은 25/30. 네 번은 세 칸을 만들지 않았고(논문 프롬프트 첫 예시를 번역한 get_user_by_id 문장 포함), 한 번은 값으로 함수 이름 대신 '토스페이먼츠 API'를 골랐습니다.
- 늦게 도착한 옛 문서에서는 뒤집혔습니다. 새 값을 먼저, 옛 값을 나중에 넣자 들어온 순서 대체는 26개에서 옛 값으로 지금 값을 퇴역시켰고 1개만 맞혔습니다(기록 순서 RAG 3개). 문서 작성일을 시간으로 쓰자 RAG 29, 결정적 대체 26으로 회복했습니다.
- 표현까지 바뀐 모순은 열쇠가 4/30만 맞았습니다. 주어 문자열이 "결제서비스|포트는" 대 "결제서비스가리슨하는포트|번호는"으로 갈려 새 사실로 쌓였고, 답 강제에서 17개가 옛 값, 13개가 정답이었습니다.
- 범위·다중 값. 스테이징·운영처럼 둘 다 참인 6쌍은 잘못된 대체 0건·12문항 정답이었지만 한 쌍의 열쇠에서 '운영'이 빠졌습니다. "3.10과 3.11 지원" → "3.11과 3.12 지원" 같은 6쌍은 열쇠가 하나도 안 만들어져 RAG와 똑같이 옛 값을 섞어 답했습니다.
저장소가 사실 90개뿐이라 두 값이 늘 상위 5개에 함께 들어온 조건이고, 시나리오는 코어닷투데이가 만들었으며 모델은 9B 하나입니다.
언제 쓰고, 언제 피하나
| 상황 | 구성 |
|---|---|
| 포트·경로·버전·설정처럼 문장 하나에 값 하나, 표현이 고정된 사실 | (주어, 관계) 열쇠 + 결정적 대체 + 퇴역 행 거름 |
| 기존 RAG를 당장 손보고 싶다 | 검색 조각에 기록 시각·순번을 붙이고 "나중 것이 지금 값" 한 문장 추가. 한국어 실측 26/30 |
| 옛 문서 일괄 이관·백업 복원·과거 메일함 연결이 있다 | 들어온 순서 대신 작성일·커밋 시각·시행일을 valid_from에. 기록 순서는 26/30을 뒤집었다 |
| 환경·지점·등급·연도별로 다른 값 | 범위 단어가 열쇠에 남았는지 규칙으로 검사 |
| 표현이 자주 바뀌는 회의록·대화 산문 | 문자열 열쇠는 피한다. 통제 어휘·엔티티 ID로 정규화하거나 다른 판정을 붙인다 |
| 값이 집합인 사실 (지원 버전 목록 등), 말로 밝히지 않은 암묵적 변화 | 세 칸 열쇠 하나로는 표현 불가. 원소 단위로 쪼개거나 별도 설계 |
| 권위가 순서와 다른 공적 기록 (공포일 ≠ 시행일, 공문 > 보도자료) | 순서 규칙 대신 권위 기반 대체 + 기권 |
한계와 주의
- 재현할 수 없습니다. 초록은 하네스·프롬프트·데이터셋 공개를 말하지만 2026년 10월 31일 현재 arXiv 부속 파일도 공개 저장소도 없습니다(arXiv v1뿐). 제품 엔진은 PyPI
memstrata-coder로 배포되는데 라이선스가 독점이고, 저자 GitHub에는 "소스는 비공개"라고 적힌 바이너리 저장소만 있습니다. - 추출 프롬프트의 예시가 벤치마크 첫 문항입니다. 부록 C.1의 예시 get_user_by_id 문장과 SESSION_TIMEOUT 1800초가 각각 함수 이름·설정 값 벤치마크의 첫 문항입니다. 논문의 '깨끗한 대체 약 97%'는 이 조건의 숫자이고, 겹치지 않는 예시로 돌린 코어닷투데이 실측은 25/30(83%)이었습니다.
- 산문에서는 RAG에 졌습니다. 부록 B.8의 격리된 산문 벤치(fair_contradiction)에서 열쇠 추출은 약 44%, MemStrata는 0.62로 LLM 재정렬 RAG 0.74보다 낮았습니다. 저자는 "자가 틀렸다"며 본 결과에서 뺐습니다. 저자의 8월 후속(arXiv 2608.20685)은 SWE-bench 이슈 707개에서 고른 깨끗한 단일 값 전환 130개로 0.91 대 RAG 0.57~0.59를 보고했지만, 실제 수정 중 깨끗한 단일 값 전환은 약 18%뿐이라고 인정합니다.
- 옛 문장을 다시 읽으면 무너집니다. 10월 후속(arXiv 2610.07715)에서 같은 130개 전환의 정확도가 98.5%였다가 옛 문장을 한 번 다시 읽히자 10.8%(낡은 값 88.5%)로 떨어졌습니다. 재활성화를 막으면 97.7%로 회복하지만 정당한 되돌리기를 알아챌 수 없게 됩니다.
- '이중 시간'이라 부르지만 시간은 하나입니다. valid_from은 들어온 순서로 채워집니다. 갱신(세계가 바뀜)과 수정(틀린 기록 정정)도 구별하지 않고 같은 열쇠의 다른 값은 무조건 퇴역입니다.
- 빠진 비교군과 서술 불일치. 시각을 붙인 RAG가 비교군에 없어, 성능이 결정적 대체에서 왔는지 시간 정보에서 왔는지 가를 수 없습니다. AUROC 0.59는 초록에서 '모순 vs 중복', 5.1절에서 '중복 vs 나머지'로 설명이 다릅니다. 바뀐 지식 벤치는 20~30문항이라 0.05가 문항 하나이고, '검색 지연 약 2.1초'는 논문 환경 측정값입니다.
- 퇴역한 값은 보여 주지 말아야 합니다. 다른 논문 「Ground Truth First」(arXiv 2607.21962)는 이중 시간 간선을 답변 모델에 그대로 보여 주면 과거 지식 갱신 문항 81개 중 72개로, 이력을 산문으로 녹인 경우(79개)보다 나빴다고 보고합니다. MemStrata가 읽기에서 퇴역 행을 거르는 선택은 옳습니다.




