Index
2026-06-25 — Experiment

Fine-walk recall 스윕: 텍스트 메모리(m3v2)가 시각 메모리(m2)를 3배 압도

SceneMem (API track) | gemini-3.5-flash · recall-report · --recall-walk fine · diverse12 (12 에피소드 / 39 recall task)

TL;DR — diverse12 fine 스윕 (n=39)

0.564
m3v2 place_acc
0.179
m2 place_acc
14/39
m3v2 혼자 정답
23.5 / 5.4
로그줄 / keyframe
$6.2
m3v2 비용/메서드

1 측정 설정

회상(--target recall) 모드: 전 에피소드를 한 번 순회하며 메모리를 누적(Phase 1)하고, 에피소드당 recall task 3개가 그 메모리를 공유해 "그 물건 어디 뒀어?"를 답한다(Phase 2). 이번 스윕은 누적 walk를 --recall-walk fine(세그먼트를 fine-subtask 단위로 쪼개 leadup 윈도로 observe)로 고정하고 4개 메모리 메서드를 비교한다.

model = gemini-3.5-flash recall-style = report walk = fine (fine-subtask + leadup) set = diverse12 (12 ep / 39 task) metric = place_acc (회상한 fixture가 GT 배치와 slot-match) methods = control(무메모리) · m1(균일 history 이미지) · m2(keyframe, MemER) · m3v2(subtask 텍스트 로그)

채점 place_acc = 회상 답의 물건+장소가 GT 배치와 일치한 비율. m3v2=append 텍스트 로그, m2=모델이 지목한 keyframe 이미지를 re-cluster해 최근 8개 노출.

2 결과 — 순위와 정답 분포

method메모리place_accslot_accaction_accexact비용
m3v2subtask 텍스트 로그0.5640.2820.9230.128$6.20
m2keyframe 이미지 (MemER)0.1790.0770.6670.000$10.42
m1균일 history 이미지0.0770.0260.6410.000$11.92
control없음0.0260.0000.5640.000$6.20

정답 분포 — 어느 메서드가 맞췄나 (39개 recall task)

각 task마다 4개 메서드의 정/오답 패턴을 집계하면, m3v2혼자 정답인 경우가 압도적이다:

패턴 (control · m1 · m2 · m3v2)건수해석
✗ · ✗ · ✗ · ✗15아무도 못 맞춤 (남은 한계 — §5)
✗ · ✗ · ✗ · 14m3v2만 정답 (전체의 36%)
✗ · ✗ · · 5m2 + m3v2
✗ · · ✗ · 2m1 + m3v2
✗ · · · 1control 빼고 전부
✗ · ✗ · · ✗1m2만 정답 (텍스트의 실패 — §5)
· ✗ · ✗ · ✗1control만 (노이즈/우연)
m3v2 정답 22개 = 혼자(14) + m2동반(5) + m1동반(2) + 전체(1). m2m3v2 없이 단독으로 기여한 건 단 1건. 즉 시각 메모리가 텍스트 위에 더해주는 정보가 거의 없다 — m3v2가 m2를 거의 완전히 포함(superset)한다.

3 왜 m3v2가 이기나 — "추측" vs "조회"

m3v2만 맞춘 14개의 전형. 같은 회상 질문에 메서드별 답:

회상 질문 (GT)controlm1m2m3v2
steak 어디? freezercounterfridgestovefreezer ✓
shrimp/bowl 어디? microwavecountercountersinkmicrowave ✓
fish 어디? ovencounteroven(hedge)counteroven ✓

이미지 메서드는 배치를 못 봐서 상식으로 추측(steak→fridge)하거나 최근 장면에 끌린다(→counter/sink). m3v2는 walk 중 만든 텍스트 로그에서 해당 줄을 조회한다. 위 fish 예의 실제 m3v2 메모리 로그(25줄 중 발췌):

9. Navigate to the oven 10. Pick up the fish from the counter 11. Place the fish on the oven rack ← 이 줄을 조회 → "oven" ✓ 12. Close the oven door ... 25. Place the bread on the cutting board (fine walk가 에피소드 전체 ~25개 행동을 사실로 기록)
채점 주의(정직): 위 fish 행의 m1은 "in/on the oven"이라 장소는 맞았으나 "in/on" 헤지로 slot-match 실패(m3v2의 깨끗한 "on the oven"은 통과). 일부 m3v2 우위엔 이런 표현-포맷 효과가 섞여 있다. 그러나 steak(→fridge/stove로 장소 자체가 틀림)·microwave(→counter/sink) 같은 다수 사례는 순수하게 장소 오답이라 포맷 효과가 아니다.

4 왜 m2는 정체하나 — 정보밀도 병목

m2(MemER keyframe)는 fine walk로 nomination 기회가 늘었는데도 place_acc가 coarse와 동일(0.179)했다. 메모리 적재량을 보면 이유가 명확하다:

23.5
m3v2 로그 줄/에피소드
5.4
m2 keyframe/에피소드 (cap 8)
~4×
기록 밀도 차

한 에피소드 ~23개 fine-subtask를 m3v2는 23.5줄로 거의 전부 담지만, m2는 8칸 cap + 최근편향 re-cluster eviction으로 평균 5.4장만 남긴다. 게다가 그 5.4장은 이미지라 회상 시 모델이 다시 인식해야 한다(텍스트는 이미 명제로 박제됨). 즉 m2의 병목은 walk 입도가 아니라 (a) 8-slot 용량 + (b) 회상 시 이미지 재인식 부담 — fine walk로는 못 푸는 구조적 한계.

텍스트가 토큰당 정보밀도에서 압도: "Place the fish on the oven rack" 1줄 vs 그 장면 이미지 1장. 텍스트는 4배 더 많은 사건을 더 싼 비용($6.2 vs $10.4)에 담는다.

5 남은 한계 — 아무도 못 맞춘 15/39

fine walk로도 절대값은 0.564. 전부 실패한 15개의 실패 양상:

유형예 (GT → m3v2 오답)원인
희귀 fixture 어휘bagel/baguette → toaster oven (m3v2 "counter"/"oven")"toaster oven"을 모델이 "oven"/"counter"로 기록 — 어휘 불일치
RestockBowls 데이터bowl → cabinet (m3v2 "sink"/"microwave")알려진 tfi 데이터 이슈 + 동일 물건 다중 배치 혼동
텍스트 조회 오선택bowl → microwave (m2만 정답, m3v2 "in the bowl")로그에 유사 물건의 중간 배치가 여러 줄 → 엉뚱한 줄 조회
텍스트 메모리의 고유 실패 모드(m2만 맞춘 1건): 같은 종류 물건이 여러 번 배치되면 로그에 비슷한 줄이 쌓여 m3v2엉뚱한 줄을 조회한다("bell pepper in the bowl" vs 정답 "in the microwave"). 시각 keyframe은 이 경우 마지막 장면을 직접 봐서 맞췄다. 드물지만(1/39) 텍스트 회상의 구조적 약점.

6 Takeaway & 다음

구조화된 텍스트 메모리가 장기 회상의 기본선이다

올바른 누적 walk(fine + leadup) 하에서 subtask 텍스트 로그가 시각 메모리를 3.1배 압도하고, 시각 메모리가 추가로 기여하는 정보는 거의 없다(m3v2가 m2를 superset). 핵심은 정보밀도 — 텍스트는 ~23개 사건을 명제로 박제해 조회 가능하게 만들지만, 8-slot keyframe은 ~5장에 압축되며 회상 시 재인식 부담까지 진다. 비용도 텍스트가 최저. ⇒ 이후 open-VLM 튜닝/ours 설계의 메모리 기본선은 텍스트 로그로 가는 게 맞다.