무엇인가
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 규칙 정책 | 정책 행이 고른 쪽 | 정책 표에 SR | P3 팬텀 |
네 연산자는 모두 사실 × 사실 → (승자, 감사 기록) 꼴이고, 표는 "어디까지 안전한지"의 계약서입니다. 쓰기 경로는 모순 상대가 둘 이상이면 추측하지 않고 오류를 내고, ⊕?·⊕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로 맞았습니다.
빠른 시작
저장소가 열리지 않으므로 주장을 손으로 재현하는 쪽이 현실적입니다. 아래는 코어닷투데이 실측의 '이중 대체' 시나리오를 줄인 스케치입니다(열 이름은 예시). 두 세션이 같은 순간에 읽고 잠깐 쉬었다 쓰게 하고, 격리 수준만 바꿔 현재 행 수를 셉니다.
-- 세션 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개 |
| SERIALIZABLE | 50/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를 기준선으로 다시 구현했습니다.




