coredot.today
기술 탐색으로 돌아가기
에이전트 기억연구

TOKI

기억의 모순 해결은 '누가 더 똑똑한가'가 아니라 동시성 제어다 — 네 전략에 격리 수준 계약을 붙이고, 진 사실은 감사 행에, LLM 판정은 키로 장부에

직접 해보기 6실측
종류
논문
사실 확인
2026.11.01

TRY IT

직접 해보기

OVERVIEW

개요

무엇인가

TOKI는 홍콩과기대 왕쯔밍이 2026년 6월 4일 arXiv에 올린 「TOKI: A Bitemporal Operator Algebra for Contradiction Resolution in LLM-Agent Persistent Memory」(arXiv 2606.06240)의 기억 쓰기 계약입니다. 에이전트 기억에 '담당자는 박 과장'과 '담당자는 이 대리'가 함께 들어오면 무엇을 믿을지를, 50년 된 데이터베이스 문제인 동시성 제어로 다시 씁니다.

mem0·Graphiti·Letta·MIRIX는 모두 모순이 생기면 하나를 고르지만, 그 방법이 어떤 동시 실행 조건에서만 안전한지 밝힌 엔진은 없습니다. 에이전트는 읽고 나서 쓰기 전까지 LLM을 부르느라 수 초를 쓰므로 그 틈이 웹 서비스보다 수천 배 넓습니다. TOKI는 이중 시간 데이터베이스, 격리 수준 이론(베렌슨 1995, 아디아 1999), 출처 반가환(그린 등 2007)을 기억의 쓰기 경로에 옮기고, 고전 이론에 없던 LLM 판정자가 만드는 새 이상 세 가지에 이름을 붙입니다. 정확도 우위는 주장하지 않습니다. 내놓는 것은 계약의 언어입니다.

어떻게 동작하나

모순은 (주어, 술어)가 같고, 목적어가 다르고, 유효 기간이 한 순간이라도 겹치는 경우입니다. 사실은 한 표에 담기고(세 쌍, 유효 시간, 시스템 시간, 출처 다항식, 확신도, 전략 표시) 숨은 열 row_kind가 행을 current와 audit로 나눕니다. 기본 검색은 current만 보므로 감사 행을 쌓아도 기존 질의의 답은 바뀌지 않습니다(명제 5).

연산자승자 선택격리 전제전제보다 약하면
⊕t 최신 우선(시스템 시각, id)가 큰 쪽RC 읽기 커밋P4 갱신 손실
⊕p 증거 가중(확신도, 시각, id)가 큰 쪽SI 스냅숏 격리A5B 쓰기 스큐
⊕? 확인 대기도착한 콜백이 고른 쪽RC + 콜백콜백 경계
⊕c 규칙 정책정책 행이 고른 쪽정책 표에 SRP3 팬텀

네 연산자는 모두 사실 × 사실 → (승자, 감사 기록) 꼴이고, 표는 "어디까지 안전한지"의 계약서입니다. 쓰기 경로는 모순 상대가 둘 이상이면 추측하지 않고 오류를 내고, ⊕?·⊕c의 판정은 연산자 커밋보다 먼저 판정 로그에 키와 함께 적으며, 진 쪽 행은 시스템 시간을 닫아 감사 행으로 보냅니다.

새 이상무슨 일인가방어 (축)
N1 판정 재현 불일치같은 모순을 다시 판정하면 다른 승자. 확률 p로 A를 고르는 판정자는 두 번 물으면 2p(1−p)로 갈린다판정 로그를 (읽은 집합, 디코더 묶음) 키로 기록하고 SR로 읽기 (격리)
N2 믿음 표류 스큐확신도를 읽는 사이 남이 같은 분할의 다른 행을 고침. 쓰기 스큐의 분할판(주어, 술어) 분할 직렬화 (격리)
N3 감사 소거진 사실과 근거를 되살릴 수 없음. 격리 수준과 무관감사 행 (스키마), 복원 정밀도는 출처 운반체 (출처)

보조정리 1은 판정 호출을 '판정 로그 행의 없으면 넣기/읽기'로 바꿔 읽어 N1을 고전 이상(흐린 읽기, 팬텀)으로 환원하고, 정리 5는 판정자가 조금이라도 비결정적이면 로그를 키로 남기지 않는 시스템에 반드시 N1이 나는 실행이 있다는 하한입니다. 논문 보고로는 이상 9가지 × 격리 수준 6가지 54칸 전수 시험에서 경비 수준 이상 32칸 0%, 아래 22칸 100%였고, 최신 LLM 판정자(온도 1.0)에서 로그를 지킨 참조 구현은 연속 판정 245쌍 중 불일치 0쌍, 로그 없는 변형은 0.167~0.204로 2p(1−p)와 R² 0.98로 맞았습니다.

빠른 시작

저장소가 열리지 않으므로 주장을 손으로 재현하는 쪽이 현실적입니다. 아래는 코어닷투데이 실측의 '이중 대체' 시나리오를 줄인 스케치입니다(열 이름은 예시). 두 세션이 같은 순간에 읽고 잠깐 쉬었다 쓰게 하고, 격리 수준만 바꿔 현재 행 수를 셉니다.

sql
-- 세션 A는 '아목시실린', 세션 B는 '세팔렉신'으로 같은 페니실린 행을 대체한다
BEGIN ISOLATION LEVEL READ COMMITTED;   -- REPEATABLE READ / SERIALIZABLE 로 바꿔 비교
UPDATE memory SET sys_end = now()
 WHERE subject = '앨리스' AND predicate = '복용약'
   AND object = '페니실린' AND sys_end IS NULL;   -- 영향받은 행 수가 0이면 다시 읽는다
INSERT INTO memory (subject, predicate, object, sys_start)
VALUES ('앨리스', '복용약', '아목시실린', now());
COMMIT;

SELECT count(*) FROM memory
 WHERE subject = '앨리스' AND predicate = '복용약' AND sys_end IS NULL;   -- 1이어야 정상

READ COMMITTED에서는 늦은 세션의 UPDATE가 이미 닫힌 행을 찾지 못해 0행을 고치고 지나가, 현재 값이 2개가 됩니다.

코어닷투데이 실측

2026년 10월 말, 크레딧이 들지 않는 로컬 환경에서 확인했습니다.

① PostgreSQL 17(도커) 두 에이전트 동시 쓰기. 배리어로 같은 순간에 읽고 50ms 쉰 뒤 쓰게 해서 격리 수준마다 50번씩 돌렸습니다.

격리 수준갱신 손실이중 대체정리 에이전트의 쓰기 스큐
READ COMMITTED (기본값)50/50 발생50/50, 현재 값 2개50/50, 현재 값 0개
REPEATABLE READ (SI)50/50 한쪽 중단50/50 한쪽 중단50/50, 현재 값 0개
SERIALIZABLE50/50 한쪽 중단50/50 한쪽 중단50/50 한쪽 중단 (40001)

② 로컬 4B 판정자. 한국어 업무 모순 36쌍(분명한 갱신 8, 애매 12, 근거 대등 10, 규칙 충돌 6)을 원래 순서와 A·B를 뒤바꾼 순서로 Qwen3-4B-Instruct-2507(MLX)에 묻고, 답 토큰 확률을 직접 읽었습니다.

  • 72칸 중 19칸이 흔들렸습니다(0.05 < p < 0.95). 그중 13칸이 근거 대등, 4칸이 애매한 쌍이었습니다.
  • 온도 1.0의 연속 두 판정 불일치율 7.97%(예측 2p(1−p) 9.21%). 흔들리는 칸에서 t번 재질의가 모두 같을 확률은 2번 68.5% → 10번 18.0% → 24번 4.5%로 논문 그림 6과 같은 모양이었습니다.
  • 온도 0인데 A·B 순서만 바꿔 승자가 바뀐 쌍이 36쌍 중 13쌍. 분명한 부서 이동 쌍도 새 기록이 B 자리면 1.00, A 자리면 0.18이었습니다. 뒤집힌 쌍은 내용이 아니라 자리를 고른 것이고, 어느 자리인지는 쌍마다 달라(A 6쌍, B 7쌍) 고정 편향으로 보정할 수 없습니다.
  • 새 기록을 고른 비율은 분명한 갱신 16칸 중 15칸, 근거 대등 20칸 중 10칸, 규칙 충돌 12칸 중 3칸. 2026년 식약처 고시보다 2024년 내부 지침을 고르기도 해서, 권위 순서는 규칙 정책(⊕c)이 정해야 합니다.

판정 로그 키에는 프롬프트가 들어가므로 [옛, 새]와 [새, 옛]의 판정은 다른 키가 되어 서로를 보호하지 못합니다. 온도 0은 해결책이 아니고, 키와 프롬프트를 함께 정규화(사실 id 순 정렬, 순서 없는 집합 키)해야 합니다.

언제 쓰고, 언제 피하나

상황TOKI 관점의 처방
사람 한 명과 비서 하나최신 우선(⊕t, RC)으로 충분할 수 있다. "갱신 손실을 감수한다"고 적어 둔다
하위·정리 에이전트, 여러 채널이 같은 기억을 쓴다"읽기 → LLM → 쓰기"를 한 트랜잭션에, 분할 직렬화, 감사 행, 키 붙은 판정 로그
의료·금융·약관처럼 권위 순서가 있는 값규칙 정책(⊕c)을 따로 두고 정책 표는 SR. 권위 판단을 LLM에 맡기지 않는다
감사·규제 대응진 사실 + 출처 + 판정 기록. 같은 근거가 반복되면 다중차수 출처
SERIALIZABLE이 없는 벡터·그래프 저장소키별 잠금이나 조건부 쓰기로 같은 키의 쓰기만이라도 직렬화
과거 시점 질의("3월 20일에 먹던 약")가 중요TOKI 쓰기 경로 그대로는 피한다. 변경·정정을 먼저 가르는 단계를 붙인다

한계와 주의

  • 재현할 수 없습니다. 논문이 밝힌 저장소(github.com/ZenAlexa/toki-bitemporal-memory)는 2026년 10월 31일 기준 404이고, 부록 D의 기준 시스템 커밋 해시도 조회되지 않습니다. mem0 해시는 표 15(a623caf)와 본문(a623cfa…)이 다릅니다.
  • 판정표 칸마다 무게가 다릅니다. N3 실행 칸은 값 소실이 아니라 superseded_by 같은 대체자 필드 이름의 유무를 검사했습니다(표 16). mem0 현재 기본 경로(2026년 4월 패키지 2.0.0)는 ADD만 하고 history 표를 남기며, Graphiti는 옛 간선을 invalid_at으로 남기고 무효화는 논문 설명과 달리 쓰기 때 일어납니다. 정작 hard delete하는 MIRIX는 보류였습니다. 같은 사유로 Graphiti·Letta의 N2는 보류인데 Zep만 '허용'이고, Zep은 지원 종료된 legacy/ 판(T)과 Cloud API(I)를 읽었으며 처리를 Graphiti에 넘기므로 독립 표본도 아닙니다. 기준 시스템의 N1 '허용'은 실행이 아니라 코드를 옮겨 적은 칸에서 왔습니다.
  • 초록의 숫자. "+0.86"은 LoCoMo 전체가 아니라 50문항 조각의 감사 방어 켬/끔 쌍체 비교(audited_current_vs_stale)이고 문항 선정은 미공개입니다. 다른 시스템과의 직접 비교는 세 신뢰구간이 모두 0을 포함했고 모두 정확도 12% 이하였습니다.
  • 인용 하나가 원문에 없습니다. 서론의 "BeliefShift가 모순의 최대 42%를 못 푼다"는 원문에 없고, 부분 점수 평균인 CRR 0.58에서 1 − 0.58로 계산한 것으로 보입니다.
  • 승자 독식, 일관 ≠ 정답. 진 쪽 행 전체를 빼므로 변경과 정정을 구분하지 않습니다. 판정 로그는 판정을 일관되게 만들 뿐 옳게 만들지 않으니 재판정 조건(새 근거, 모델 교체, 이의)을 따로 둡니다.
  • 범위. 정리는 관계형 일정 모형 안, 실험은 단일 프로세스, 분산은 범위 밖입니다. 직렬화는 재시도를 요구해 논문 부록의 PostgreSQL 17.6 SERIALIZABLE 시험에서 작성자 4명이면 쓰기 36건 중 11건만 커밋됐습니다. 그래도 넉 달 사이 후속 논문 여덟 편 이상이 인용했고 MemTX는 TOKI를 기준선으로 다시 구현했습니다.

DEEP DIVE

더 깊이 읽기