API predictor(memer_eval/api_predictor.py, Letsur gemini-2.5-flash)를 B1 trainstruct eval에 연결, 3단계 smoke 디버깅(128tok 절단→형식발산→형식어댑터), n=2 검증 완료. 이어서 MemER 실제 메커니즘(키프레임-FIFO, perseg instruction)에 충실한 gt_score 두 변형 구현·검증. 3계약 비교 결과: trainstruct 50%(1/2)는 자기 transcript 되읽기 아티팩트, 키프레임-FIFO 0/2, +perseg 0/2 — architecture-faithful 두 변형 모두 zero-shot Gemini는 조기 배치 키프레임 보존 실패. 사용자 연속 지적이 인플레를 걷어냄.
MemER B1 eval(--mode trainstruct)은 로컬 Qwen3-VL LoRA를 autoregressive로 평가한다. API 모델(Gemini/Claude 등)로 동일 척도 비교를 하려면 predictor 레이어만 교체해 동일 채점/메트릭을 재사용해야 한다.
또한 trainstruct가 "학습 분포에 충실한 평가"인지, "실제 MemER 배포 메커니즘에 충실한 평가"인지 구분이 필요했다. 코드 분석 결과 trainstruct = 전체 멀티턴 대화 누적(학습 SFT 분포), 실제 deploy = 키프레임 이미지 FIFO 단일 user 메시지(텍스트 누적 없음). 두 계약이 다르며 zero-shot에 trainstruct를 쓰면 "모델이 자기 이전 텍스트를 스크롤백"해 회상이 trivialize된다.
load_api_key(file, candidates): Label: value/NAME=value 파싱, 값 절대 비노출, 라벨 대소문자·공백 무시OpenAICompatStructuredPredictor: openai SDK + base_url (Letsur gateway). 실사용 경로GeminiStructuredPredictor: google-genai native (AIza 키용)SCENE_MEM_FORMAT_GUIDANCE: system suffix — NL imperative verb/object/fixture 어휘 가이드(GT 비포함), 반복금지_to_jpeg_bytes(obj): 파일경로 str AND PIL/ndarray 둘 다 → JPEG bytes (gt_score용 live PIL 프레임 지원)| 단계 | 설정 | parse_ok | m1 final | 문제·원인 |
|---|---|---|---|---|
| smoke1 | 128 tok, 형식가이드 X | 15/31 | 0%(아티팩트) | gemini-2.5-flash = thinking 모델, 추론 토큰이 128 예산 소진 → JSON 절단 |
| smoke2 | 2048 tok, 형식가이드 X | 31/31 | 0%(형식발산) | snake_case 코드체 출력, move_pot_to_sink×4 자기반복 붕괴 |
| smoke3 | 2048 tok, GUIDANCE ON | 31/31 | 100%(1/1) | 형식어댑터가 scorer 3축(verb-class/object/fixture) 정렬 |
사용자 지적: trainstruct는 전체 대화 누적 → zero-shot이 자기 이전 subtask 텍스트를 스크롤백해 회상이 trivialize. memer_eval/deploy.py MemERDeploymentPolicy는 매 스텝 단일 user 메시지(system + memory keyframe 이미지 + recent 이미지)만 전달.
eval_scene_mem_benchmark.py run_gt_score에 --predictor openai|gemini 분기 — MemERDeploymentPolicy(api_predictor, config) 직접 구성. EpisodicMemory FIFO·채점 전부 불변 = 진짜 MemER 메커니즘.
--gt-per-segment-instruction: subtasks.json segments[].{frame_start,frame_end,instruction}로 timestep→세그먼트 매핑, 매 스텝 현재 task instruction. 최종 스텝만 recall query. MemERDeploymentPolicy.step(*obs, instruction=...)가 per-step 교체를 이미 지원(seam 깨끗). methodology=memer_keyframe_fifo_deployment_perseg_instr 기록.
scripts/render_b1_eval_video.py에 final-query endcard 추가(EPISODE COMPLETE → MEMORY RECALL QUERY 배너 + memory FIFO 확대 + 큰 CORRECT/WRONG, ~6.5s). scripts/render_scene_mem_video.py에 per-step instruction 표시 + 최종 스텝 "MEMORY RECALL QUERY" 마커. scripts/reconstruct_gtscore_steps.py 신규 — per_seg 자동감지, Path-2(저장된 필드) 우선.
| 계약 | m1 final | m2 turn | parse | 소요 | 특이사항 |
|---|---|---|---|---|---|
| trainstruct (전체 대화 누적) | 50% (1/2) | 38% (23/60) | 62/62 | ~607s | steak✅ bowl❌(cross-task 간섭) |
| 키프레임-FIFO (회상질의 고정) | 0% (0/2) | 0% | 87/89·88/89 | ~2271s | 89 step/test, stride 100 |
| 키프레임-FIFO + perseg (최충실) | 0% (0/2) | 5% (3/60) | 88/89·88/89 | ~2128s | 중간 스텝 현재 task 추종 정상 |
| sample | trainstruct pred | 키프레임-FIFO+perseg pred | GT |
|---|---|---|---|
| MoveFridgeToFreezer (steak) | Place the steak in the freezer | Place the steak in the pan on the stove | …on a shelf in the freezer |
| RestockBowls (bowl) | Place the bowl in the sink | Place the bowl on the plate | Place a bowl in the cabinet |
키프레임-FIFO 영상(eval_outputs/b1_gtscore_*_n2/videos/*.mp4, 8806 frame @20fps, ~19MB): 두 샘플 모두 최종 memory FIFO = [8099~8569] / [7699~8759] 전부 에피소드 후반. steak 배치(초반 ~0-700 frame) 키프레임이 메모리에 한 번도 안 남음 → 0/2 실패의 메커니즘이 시각적으로 입증. perseg v2 영상: 스텝별 task 전환(MoveFridge→Transit→RestockBowls→…→최종 회상질의) 정확 표시.
사용자가 "trainstruct는 텍스트 누적이라 zero-shot 모델이 자기 텍스트를 스크롤백한다"고 지적했고, 키프레임-FIFO + perseg를 구현해 데이터로 입증했다. architecture-faithful 두 변형 모두 0/2. trainstruct 50%는 측정 계약의 아티팩트이지 실제 MemER 메모리 회상 능력이 아니다.
이것은 "우리 작업의 실패"가 아니라 측정 정확성의 성공: MemER LoRA는 학습 분포(trainstruct, 88.36%)에서 뚜렷한 성능, zero-shot API는 architecture-faithful 설정에서 0/2 — 두 숫자가 공존하면서 서로 다른 의미를 가짐.
n=2·동일 시나리오라 모집단 주장 불가. 이번 분석의 결론 = "파이프라인 검증 완료 + 계약별 특성 규명 + 방법론적으로 올바른 측정 체계 확보".
형식어댑터(SCENE_MEM_FORMAT_GUIDANCE) — GT 누출 없이 scorer 3축(verb-class/object/fixture)에 맞춘 NL 어휘 가이드 — 가 zero-shot API eval의 핵심 enabler.
--api-model claude-3-5-sonnet-20241022 등 Letsur 타 모델 동일 코드로 즉시 가능(--api-model만 변경).api_predictor.py / eval_scene_mem_benchmark.py gt_score 분기 / render 보강 / reconstruct — 사용자 커밋 지시 대기.