Index
2026-04-20 — Engineering

Hard QA 필터링 파이프라인 + Debug 인프라 구축

Graph-VLM | Description-proof 벤치마크 자동 선별 + Letsur 비디오 입력 가능 여부 확인

TL;DR

60%
하드율 (12/20)
10
최종 Hard QA
$0.047
파이프라인 비용
7
Letsur 포맷 실패

1 배경 / 목적

4/14 560-QA 전체 벤치마크 결과: Describe-once 80.7%, Frame-20 70.0%, Graph-VLM 67.9%. Graph가 Describe 대비 -12.8%p 열세. 하지만 이 벤치마크의 문제점은 560개 질문의 대부분이 description 텍스트만 읽어도 맞출 수 있다는 것 — Graph의 구조 retrieval 가치를 실제로 측정하지 못하고 있었다.

핵심 문제: 기존 벤치마크는 "description-proof" 질문이 없음. Graph 단독 정답 비율 3.6%(20개)로 극히 낮아, 그래프가 실제로 무엇을 잘 하는지/못 하는지 진단 불가.

이를 해결하기 위해 (1) native video 비교를 위한 Letsur gateway 가능 여부 확인, (2) description-proof 질문만 자동 선별하는 파이프라인 구축, (3) Graph 병목을 plan/retrieval 수준에서 드릴다운하는 debug 인프라 구축이 필요했다.

2 작업 내용

① Letsur Gateway 비디오 입력 프로빙

tmp/probe_video.py로 7가지 포맷을 순차 테스트:

포맷결과
video_url (data URI)조용히 드롭 (prompt_tokens=3, 텍스트만)
image_url + video/mp4 mime400 upstream_error
input_video500 upstream_error
file type400 upstream_error
video_url + YouTube URLURL 문자열만 텍스트 전달, Gemini "UNAVAILABLE"
video_url + HTTPS MP4 URL동일 (URL만 텍스트)
/v1beta/files (Gemini File API)404 Not Found
결론: Letsur는 strict OpenAI schema. 어떤 방식으로도 영상 바이트를 Gemini에 전달 불가. Google API key 발급은 연구실 승인 필요 → dense frame sampling으로 대체 확정.

② Circular Baseline 문제 발견 (V1 시도)

120-frame 균일 샘플로 10개 질문 생성 후 Frame-120으로 평가. Frame-120 결과 77.8%였지만 생성·평가가 같은 프레임 셋 사용 → circular baseline. Frame이 생성에 참여했으면 Frame이 평가에서도 유리하게 된다.

교훈: QA 생성과 baseline 평가에 같은 모달리티/프레임을 쓰면 안 됨. 생성에는 "상한선" 조건(더 많은 정보), 필터에는 "하한선" 조건 사용이 맞음.

③ V2 실패 (Description in Prompt)

300 frames + 전체 28-segment description을 함께 넣고 "visual info만으로 답 가능한 질문" 생성 시도. Negative constraint("description만으론 답 안 나와야")를 프롬프트에 명시했지만 VLM이 무시 → Describe-once 10/10(100%).

교훈: description이 context에 있으면 VLM은 description 기반 질문을 우선 생성. Negative prompt로는 제어 불가 → 생성 후 자동 필터가 유일한 해법.

④ V3 최종: 2-Stage Filtered Pipeline (gen_hard_qa_filtered.py)

파일: scripts/gen_hard_qa_filtered.py (신규) 파이프라인: 1. 300-frame (384px), description 제외 → 20개 후보 생성 비용: $0.014 2. 각 후보를 describe-only VLM으로 답변 시도 → Describe가 맞힌 것 drop (description-proof 아님) → 12/20 생존 (60% 하드율) 비용: $0.032 3. Category balance round-robin으로 10개 선정 (EM1×3, EM3×4, EM5×3 / L2×2, L3×6, L4×2) 총 비용: $0.047

⑤ Debug 인프라 정비

scripts/eval_qa.py --debug 플래그 추가: - query_nodes (id + attrs 전체) - query_edges - context_full (VLM에 실제 전달된 context) - vlm_raw_response - vlm_reasoning (REASONING: + ANSWER: 포맷 캡처) src/vqa_pipeline.py: - VQAPipeline(debug=True) 경로 - MCQ 프롬프트 → "REASONING:\n...\nANSWER: X" 포맷 - max_tokens 256 → 2048 (Gemini 2.5 Flash thinking 예산 잠식 대응) scripts/eval_describe_baseline.py: - /tmp/run_describe_baseline.py → scripts/ 승격 - --qa / --desc 인자 받도록 리팩토링

3 결과

최종 hardfilt10 초기 평가 (Graph V1 기준)

시스템정답정확도비용
Frame-3005/1050%$0.12
Graph-VLM (V1)1/1010%$0.04
Describe-once1/1010%$0.02
Frame-300이 상한선 50%. Graph = Describe = 10%로 Graph가 description 대비 추가 가치 0. 단 이 수치는 Graph V1(query plan 미개선 상태) 기준.

hardfilt10 질문 구성

CategoryDifficultyHardness Criteria
EM1×3, EM3×4, EM5×3L2×2, L3×6, L4×2VISUAL-LOCATION×3, SEQUENTIAL×5, MULTI-OBJECT×4, FINE-GRAINED-DURATION×3, TRANSIENT-STATE×1

Graph Plan 분포 (V1 기준 10개 중)

Plan 타입사용 횟수정답비고
{"query_type": "all"} fallback5/10074K chars 덤프, VLM 익사
participant(X)4/101Q0만 정답
participant(stove_burner)1/100그래프에 위치 정보 없음

4 Takeaway

진단 인프라 확립

gen_hard_qa_filtered.py로 이제부터 어떤 영상/도메인에도 description-proof hard QA를 자동 선별할 수 있다. 2-stage(dense-frame 생성 → describe-only 필터 → category balance)는 재현 가능한 파이프라인. 20개 후보 중 12개 하드(60%)는 충분한 하드율.

Graph 구조적 한계 최초 정량화: 쉬운 560개에서도 Describe 대비 -12.8%p, 하드 10개에서는 동점(10%). Graph의 부가가치는 쉬운 질문에서도 미미하고 하드에선 완전히 사라짐. 이는 그래프가 description의 lossy compression이기 때문.
Query plan 병목 3개 식별: (a) all fallback 과용 — 5/10이 74K 덤프에 익사, (b) single-seed entity linking — entity split 시 한쪽 miss, (c) 그래프 자체에 없는 정보 — visual position/count/enumeration.

5 Next Steps

즉시 (이어서 구현): Query plan 3-bug fix — _fuzzy_match_all(multi-seed), plan union, keyword-subgraph fallback(74K→~5K). → 260421-query_plan_v3_bugfix.html 참조

QA 품질 개선: Frame-agreement filter 추가 — 생성자 hallucination 잡기. hardfilt10 중 Q7(rice 없는 영상에서 rice 요리 주장), Q9("suggests washing" → fill ≠ wash) 같은 케이스 방지.

Tier 2 — 그래프 빌드 수정 (다음 세션):