‹ Index
2026-06-02 · scene-mem-benchmark · zero-shot API eval

scene-mem API eval — 종합 결과

zero-shot Gemini-2.5-flash (Letsur gw) · 3 eval contract 비교 · trainstruct 50% → 키프레임-FIFO + 스텝별 task = 0/30 (n=30 / 10 시나리오)

TL;DR

50%
trainstruct (전체 대화)
n=2 · 인플레
0/2
키프레임-FIFO
n=2 · 회상질의 고정
0/30
faithful (FIFO+per-seg)
n=30 / 10 시나리오
10/30
parse_fail
(전부 중간스텝, taint 0)

1. 배경 / 목적

scene-mem-benchmark (Keh0t0, RoboCasa-based)는 로봇이 긴 멀티태스크 에피소드를 수행한 뒤, "그 물체가 어디 놓였는지"를 회상하는 능력을 측정한다. 우리는 zero-shot API 모델(Letsur 게이트웨이 경유 Gemini-2.5-flash)이 이 벤치마크에서 어디까지 도달하는지 측정하려 했고, 그 과정에서 벤치마크 자체의 "충실도 갭"(eval 계약이 실제 MemER 메커니즘과 얼마나 일치하는가)을 두 차례 보정해 가며 진짜 측정에 도달했다.

2. 방법론 — 3 eval 계약 비교

(a) trainstruct (멀티턴 전체 대화) — 초기 계약

학습 JSONL(build_scene_mem_v2.build_turns_for_test) 그대로 멀티턴 [system, u0, a0, u1, a1, …, uF, aF]로 autoregressive. 매 turn의 user에 그 세그먼트 instruction + 메모리 키프레임 이미지 + recent 이미지. assistant 턴은 모델 자기 출력 누적(GT 절대 미투입). 학습된 LoRA엔 byte-identical이지만 zero-shot엔 모델이 자기 이전 subtask 텍스트를 다시 읽을 수 있어 메모리 회상이 trivialize.

(b) gt_score 키프레임-FIFO (architecture-faithful) — 1차 보정

실제 MemER 배포(MemERDeploymentPolicy + EpisodicMemory) 메커니즘. 매 스텝 단일턴(이전 user/assistant 텍스트 누적 0), 메모리 = 키프레임 이미지만 bounded FIFO(≤8)로 다음 스텝에 전달. 텍스트 transcript 인플레 제거. 단 초기에는 instruction이 매 스텝 회상질의로 고정돼 중간 task 부재가 또 다른 충실도 갭이었음.

(c) faithful = (b) + 스텝별 현재-task instruction — 2차 보정 (본 측정)

--gt-per-segment-instruction. subtasks.json으로 timestep→세그먼트 매핑, 매 스텝 그 시점 현재 세그먼트 task instruction 주입, 회상질의는 최종 스텝만. 실제 MemER 배포(매 스텝 현재 task로 conditioning + 키프레임 FIFO + 별도 회상 질의)에 정확히 부합. 이게 본 측정의 계약.

두 충실도 갭을 모두 보정한 뒤(faithful)야 zero-shot이 실제로 무엇을 할 수 있는지 측정 가능. trainstruct 50%는 측정 결과가 아니라 계약 결함의 부산물.

실제 와이어 프롬프트 (faithful, 매 스텝)

[ {role: system, content: BUILDER_SYS + SCENE_MEM_FORMAT_GUIDANCE}, {role: user, content: [ {text: "Task: <현재 세그먼트 task instruction>\n ← per-seg: 매 스텝 변경 ← 최종 스텝만 회상질의 Here are the selected frames from the entirety of the full video that are of particular importance:\n"}, image_url × memory_count ← EpisodicMemory FIFO 키프레임 (0~8장) {text: "Here is a video of the most recent actions the robot has executed:\n"}, image_url × 8 ← recent window ]} ] prior assistant turn 없음 · 매 스텝 독립 · 메모리는 키프레임 이미지로만 전달 params: model=gemini-2.5-flash, temperature=0, max_tokens=2048, extra_body={safety_settings: BLOCK_NONE × 5 categories}, sleep 0.5s 사이 호출 (rate pacing, exception retry 없음)

system prompt = 빌더 원문 DEFAULT_SYSTEM_PROMPT("You are a robot program that predicts actions. … Return a JSON with current_subtask, keyframe_positions.") + SCENE_MEM_FORMAT_GUIDANCE(범용 주방 어휘로 출력 형식 제약, GT 비포함 — zero-shot format adapter).

3. 결과

3.1 3 계약 비교 (동일 2 샘플, combo_002_L29_S48_0089)

계약m1 final-querym2 turn해석
trainstruct (전체 대화 누적)50% (1/2)38%인플레 — 모델이 자기 이전 텍스트 스크롤백
키프레임-FIFO (회상질의 고정)0/20%텍스트 누적 제거, 단 중간 task 부재
키프레임-FIFO + 스텝별 task (faithful)0/25%실제 MemER 배포 그대로

3.2 본 측정 (faithful) — n=30 / 10 시나리오

지표
metric_1 final-query accuracy0/30 (0.0%)
metric_2 turn (fine / composite)4.16% (fine 4.65% / composite 0%)
metric_4 chunked / not-chunked0/20 (chunked) · 0/10 (not-chunked)
parse_failures10건 — 전부 중간스텝 content_filter (최종스텝 taint 0)
소요26825s (7.5h)
모델 / 계약gemini-2.5-flash · methodology=memer_keyframe_fifo_deployment_perseg_instr

3.3 task 유형별 (faithful n=30)

task 유형nm1목적지 fixture (GT)
MoveFridgeToFreezer30/3freezer
RestockBowls100/10cabinet
OvenBroilFish20/2oven (bottom rack)
ToastBagel70/7toaster oven
MicrowaveThawingFridge40/4microwave
PlaceMicrowaveSafeItem20/2microwave
FilterMicrowavableItem20/2microwave

3.4 ground-truth로 0/30 검증 (extreme metric → 의심·검증)

4. 증거 — 영상

읽는 법: 좌측 = wrist(상) + agentview_left(하) 카메라 스택. 우측 = 현재 task 시점의 정보 패널(CURRENT TASK fed to MemER / GROUND TRUTH — 현재 세그먼트 task + atomic fine_subtasks / MemER predicted subtask / 최종 스텝에 빨강 "MEMORY RECALL QUERY" 마커). 하단 = memory FIFO 썸네일(실제 모델이 기억하는 비디오 프레임). 화면 ✅/❌는 제거(per-step 무의미; 권위 수치 = metrics.json).

4.1 대조 — 같은 steak 케이스, 두 계약의 차이

(a) trainstruct (인플레 = "맞춤" 50% 케이스)
모델이 최종 turn 컨텍스트에서 자기 이전 답을 다시 읽고 Place the steak in the freezer를 출력 → 채점 ✓. 학습 LoRA용 계약(byte-identical), zero-shot엔 transcript 스크롤백으로 trivialize.
(b) faithful — 같은 시나리오, 진짜 키프레임-FIFO
텍스트 누적 제거 + 스텝별 현재-task. 최종 회상에서 Place the steak in the pan on the stove(정답 freezer) ✗. 메모리 FIFO 썸네일이 끝까지 에피소드 후반만 담아 초반 steak 배치 프레임이 보존 안 됨 → 0 회상의 메커니즘이 눈으로 보임.
같은 시나리오·같은 모델인데 (a)가 ✓, (b)가 ✗인 이유는 모델 실력 차이가 아니라 (a)가 자기 텍스트를 다시 읽을 수 있었기 때문. (b)가 진짜 측정.

4.2 faithful n=30 대표 — task 유형별 실패 패턴

RestockBowls (bowl → cabinet)
최종: Place the bowl on the counter ✗ (정답 cabinet)
OvenBroilFish (fish → oven)
최종: Place the fish on the counter ✗ (정답 bottom rack of oven)
ToastBagel (bagel → toaster oven)
최종: Place the bagel in the fridge ✗ (정답 toaster oven)
MicrowaveThawingFridge (steak → microwave)
최종: Place the cup on the counter ✗ (정답 steak→microwave; object까지 틀린 최악)
4 task 유형 모두 같은 패턴 — 중간 task는 따라가지만(narration 정상) 최종 회상에서 목적지 fixture를 매번 틀림. 메모리 FIFO를 보면 초반 배치 키프레임이 결코 보존 안 됨이 일관됨.

5. 의미 (Takeaway)

의견: 이 결과는 "Gemini가 scene-mem을 풀 수 없다"의 일반 주장이 아니라 "두 충실도 갭을 보정한 진짜 측정에서 n=30 한정 0/30". trainstruct 50% 같은 인플레 수치를 떠올린다면, 두 계약 갭(텍스트 누적·중간 task 부재)을 같이 검토해야 한다.

6. 한계 / 다음

7. 재현 커맨드

conda activate memer # 본 측정 (faithful n=30) python scripts/eval_scene_mem_benchmark.py --mode gt_score \ --predictor openai --api-model gemini-2.5-flash \ --api-key-file ~/envs/api_keys.txt --max-new-tokens 2048 \ --gt-per-segment-instruction \ --val-jsonl data/scene_mem_v2/val.jsonl \ --split-json data/scene_mem_v2/scenarios_split.json \ --data-dir /home/nas_main/taewoongkang/Dataset/scene-mem-benchmark/data \ --output-dir eval_outputs/b1_gtscore_perseg_n30 --limit 30 --stride 100 # 영상 (passthrough = 저장된 Path-2 프레임필드 사용, 모델 재호출 0) python scripts/reconstruct_gtscore_steps.py \ --predictions eval_outputs/b1_gtscore_perseg_n30/predictions.jsonl \ --data-dir /home/nas_main/taewoongkang/Dataset/scene-mem-benchmark/data \ --out-dir eval_outputs/b1_gtscore_perseg_n30/steps --ref-cam robot0_agentview_left python scripts/render_scene_mem_video.py \ --scenario-dir <DATA>/<scenario> \ --predictions <steps>/<scenario>__<test_id>.steps.jsonl \ --test-idx <0|1|2> --cameras robot0_eye_in_hand robot0_agentview_left \ --output <OUT>/<scenario>__<test_id>.mp4 # 변형 # --predictor qwen ... (학습 LoRA) # --gt-per-segment-instruction 빼면 standing-recall 모드 (FIFO만) # --mode trainstruct ... (멀티턴 전체 대화 계약, LoRA 평가용)

상세 설계·진단·코드 변경·중간 산출물은 claude/260519/plan-scene_mem_api_eval.md에 시간순 기록. 결과 디렉토리: eval_outputs/b1_gtscore_perseg_n30/ (predictions.jsonl + metrics.json + report.md + 자동 HTML).