control 어디서나 바닥 (slot ≤ .06, action ≤ .07). 메모리 추가하면 큰 향상..03 → .34. 메모리 활용 능력 자체가 신모델서 극적.Goal: RoboCasa 기반 scene-memory 벤치마크(/home/nas_main/taewoongkang/Dataset/scene-mem-benchmark, 858 시나리오)에서 "로봇이 ~8분 영상으로 여러 task 수행 후, 메모리를 반영해 올바른 fine sub-task를 내보내는 능력"을 측정. 로드맵: API 트랙 → Open-VLM 튜닝 → ours. 현재 API 트랙.
모든 API call이 동일한 default 프롬프트(STEP_SYSTEM + step_user_text(goal) + STATE 이미지 + 메서드 메모리). 일관성을 위해 메모리는 "여기 메모리야"라고 텍스트로 노출하지 않고 메서드의 입력 구조에 내장. 출력 = StepOut{action, object, place, raw, keyframe_positions, memory}.
m1_history=8). naive but cheap. 중간 수준 향상.keyframe_positions emit → 결정적 1D single-linkage 클러스터링(d=5, median-low) → last-memory_length=8 유지.memory 필드에 압축 self-notes 출력 → 다음 step에 "Prior notes:" prefix로 carry-forward.직접 OpenAI / Gemini 키 없음 → Letsur OpenAI-호환 게이트웨이. 모델명은 provider 공식 ID. OpenAI gpt-*는 content-safety로 robocasa 이미지 차단 → 제외. 단가는 provider 정가 동일.
3 시나리오/시나리오, 100 시나리오 → 300 test/cell. compound 2건은 ambiguous로 graceful skip. parse_fail = 0.
모든 cell은 동일한 채점기(scene_mem_api/metrics.py + templates.py)를 통과 → 셀당 n=300 평균. 한 step 채점 흐름:
parse_subtask는 5개 정규식(navigate / pick / place / open / close)으로 fine sub-task 문자열을 (action, object, place) 3-슬롯으로 분해. 매칭 실패하거나 멀티-클로즈("X and then Y") 등 잡음이면 action="other", object=place=None. 정규화: lowercase → 관사 제거 → 보수적 단수화 → aliases.json 명시 alias만 치환. place는 중첩구("shelf in the freezer" → "freezer")만 축약.
| metric | 계산식 | 의미 |
|---|---|---|
| action_acc | p.action == g.action | 동사(navigate/pick/place/open/close/other) 일치. 가장 느슨 |
| place_acc | p.place == g.place (정규화 후) | 장소 fixture 일치. None==None도 일치(navigate/open/close엔 object 없음) |
| slot_acc ⭐ | action_ok ∧ place_ok ∧ obj_ok | 3슬롯 전부 일치. 가장 엄격, 메인 지표 |
| (참고) exact_acc | pred.strip().lower() == gt.strip().lower() | 원문 문자열 통째 일치. 조항/어순 차이도 fail |
cabinet / freezer / sink 등)에서 자주 맞추기 때문. 메모리 효과는 action / slot으로 보는 게 더 깨끗(control action ≤ .07).예: gemini-3-flash-preview / m2 = .34 / .73 / .41 = "300개 중 동사 41%, 장소 73%, 세 슬롯 모두 34% 맞음" (slot ≤ min(action, place)).
150-scn 샘플 fine 12,486건 분석에서 통계적으로 골라진 core5 grammar (T1–T5)가 92.4% 커버. 나머지 7.6%는 T6 "other"로 폴백되어 slot에서 자동 miss.
의도된 비-병합: toaster oven ≠ oven, dining counter ≠ counter, bottom rack ≠ oven 등 의미상 다른 fixture는 합치지 않음 — 모델이 "toaster oven"이라 해야 할 곳에 "oven"이라 쓰면 slot miss (의도된 엄격성).
"Place the steak on a shelf in the freezer" 같은 중첩 위치구를 마지막 fixture로 축약. 의미 동치 인정용.
같은 시나리오 M3 (over-advance):
.10 / .59 / .10 = slot .10 / place .59 / action .10. place는 over-advance pred조차 우연히 같은 fixture("freezer")를 자주 가리키므로 ~.59까지 가지만, action과 slot은 .10에 머묾. 메모리 효과의 진짜 차이는 action / slot 컬럼에 있음.중요: parse_fail / no_target_frames / ambiguous_target 도 분모에 포함됨. 그 row는 모든 슬롯 False로 미리 채워지므로 자동 miss로 평균에 weight. S=100 실험에서 parse_fail=0, no_target_frames=0, ambiguous_target=2(compound 테스트, 평균에 자동 miss로 -0.007 영향).
target_fine_idx(인덱스)와 target_fine_subtask(문자열)가 불일치. 사용자가 "tfi가 정본"으로 결정 → 일부 row가 한 칸 어긋난 평가.door[\w ]*$가 흡수해서. 실데이터에서 GT는 단일-액션이라 영향 미미하지만 모델 출력에선 발생 가능.claude/260616/analysis-metric_definitions.md (10 섹션, 각 정규식·정규화 단계별 검증 결과·워크드 예시·6 한계 상세).| model | control | m1 | m2 ⭐ | m3 |
|---|---|---|---|---|
| gemini-2.5-flash | .04 / .50 / .04 | .01 / .42 / .10 | .03 / .45 / .12 | .09 / .59 / .24 |
| gemini-3-flash-preview | .06 / .57 / .07 | .27 / .67 / .39 | .34 / .73 / .41 | .10 / .59 / .10 |
| gemini-3.5-flash | .00 / .61 / .00 | .24 / .62 / .32 | .29 / .65 / .36 | .00 / .59 / .00 |
| model | control | m1 | m2 | m3 |
|---|---|---|---|---|
| gemini-2.5-flash | .020 | .003 | .007 | .017 |
| gemini-3-flash-preview | .013 | .043 | .060 | .020 |
| gemini-3.5-flash | .000 | .057 | .100 | .000 |
.100)..09로 최고이나 강모델서 .10 → .00으로 붕괴. 원인은 §5에서 분석..03 → 3-flash-preview .34 (11×). 메모리 활용 능력 자체가 신모델에서 극적으로 향상.현상: 강모델(gemini-3-flash-preview / 3.5-flash)이 M3에서 slot ~0, action ~0으로 붕괴. control보다도 낮음.
강한 모델은 매 step memory 필드에 "이번 step에서 무엇을 했다"를 압축해서 기록함. 다음 step에 그 메모리가 "Prior notes (your own running notes):\n..."으로 carry-forward되면, 모델은 "방금 한 행동은 이미 완료된 것"으로 간주하고 다음 다음 행동을 예측함 = over-advance.
비율-분할 STATE 근사(타깃 위치 부정확) + 자체 메모리의 강한 anchor가 결합 → 타깃 step에서 target+1 행동 예측.
M2는 시각 keyframe만 모음. 모델이 "한 일"을 텍스트 단언으로 self-write하지 않으므로 over-advance bias 없음. 그저 "여기 과거 중요 프레임들 있어, 현재 STATE 보고 다음 행동 뭐가 맞아"가 됨.
읽는 법: 영상은 agentview_left 카메라(에피소드 전체 ~8분 1ep). 같은 시나리오를 M2/M3에 동일하게 입력했을 때 GT 타깃 step에서 무엇을 예측했는지 + (M3는) 누적된 self-memory 텍스트도 함께 표시. 모두 gemini-3-flash-preview S=100 셋에서 발췌.
combo_002_L29_S48_0016 / MoveFridgeToFreezer
memory 텍스트와 pred를 함께 보면 패턴이 동일하게 반복됨: "placed/successfully" → pred = "close/slide" (target+1).
"successfully placed/moved ..." → pred = "Close ..." / "Slide ..." (정답 step보다 한 칸 앞). M3 메서드의 메커니즘적 결함이지 우연한 노이즈가 아님을 영상으로 확정.3가지 옵션 (서로 배타 아님):
제안: (b) 본조치 + (a) 보조 진단 지표 병행.
target_fine_idx 버그 — 사용자 수정 대기RestockBowls 류 일부 test에서 tfi 위치와 target_fine_subtask 문자열이 불일치. 사용자가 "tfi가 정본 (버그는 데이터)"로 결정 → 데이터 측 수정 필요. 일부 test 천장 제약.
K-way 비율분할로 fine sub-task 경계 부정확. fine별 프레임 경계 데이터가 있으면 정밀화 가능.
현재 S=100 (앞 100개, 결정적 샘플). val split 정의 → full 858. claude-haiku는 비용 감안해 추가 검토 (sonnet full ~$2.8K, gemini full ~$540).
scene_mem_api/memory/m3.py의 carry-forward 프롬프트 prefix에 "이미 한 것 기록·예측 금지" 제약 추가. 또는 STEP_SYSTEM에 M3 전용 메모리 가이드 절. subagent-driven (implementer → spec review → quality review).| scale | gemini 3종 4메서드 | claude-sonnet 4메서드 |
|---|---|---|
| S=100 (현재) | ~$50 | ~$330 |
| S=858 (full) | ~$540 | ~$2.8K |
docs/specs/2026-05-19-scene-mem-api-track-design-v2.mdclaude/260528/exp-cross_model_memory_S100.mdclaude/context.md260528-v2_gemini_S100.html (영상 inspector 포함)