멀티모달 임베딩 + 게임
POSTERDLE
영화 포스터 맞히기 게임 · 10번의 단서, 한 번의 선택.
Think Flow
비정형 데이터를, 비정형으로 찾을 수 있는 도구가 나왔습니다.
사진과 단어가 같은 공간에 있습니다.
우리는 이것을 이용하여 어떤 걸 만들 수 있을까요?
사람은 포스터를 보고 "비 오는 밤"이라고 말합니다.
AI는 같은 포스터를 768개의 숫자로 봅니다.
둘은 얼마나 가까울까요?
10번의 단서, 한 번의 선택.
How it works
어떻게 플레이하나요?
↺ 단서는 최대 10번. 막히면 원할 때 힌트를 열고, 최고 순위가 20위 안에 들면 남은 단서를 건너뛰고 바로 고를 수 있습니다
임베딩 모델의 계산 사용자의 선택
01 · 같은 공간
그림과 말을 그대로 비교합니다
- KOBIS 주간 박스오피스(2003년~)에서 흥행작을 고르고, TMDB에서 포스터를 받아 정답 후보 1,327편을 만들었습니다. 캐주얼 모드는 그중 주간 1위를 한 549편입니다.
- 포스터를 장르·색상 같은 태그로 바꾸지 않고 이미지 그대로 임베딩합니다. 사용자의 단서도 같은 모델로 같은 공간에 놓습니다.
- 수천 장 규모라 벡터 DB 없이 넘파이 배열 하나로 전수 비교합니다. 모델은 SigLIP 2와 비교한 뒤 다국어 EmbeddingGemma 2 (4.4억 파라미터)로 정했습니다.
(시네필 모드 기준)
(CPU, GPU 없음)
02 · 포스터 속 글자
모델이 글자를 읽는다는 걸 알게 됐습니다
- 원본 포스터에 영화 제목을 단서로 넣으면 78.7%가 바로 1위였습니다. 모델이 그림보다 포스터에 적힌 제목을 읽고 있었습니다.
- EasyOCR로 글자를 찾고 LaMa로 지운 포스터를 따로 임베딩하자 같은 비율이 17%로 내려갔습니다. 화면에는 계속 원본을 보여 줍니다.
- 두 벡터를 원본 0.42 + 글자 지움 0.58로 섞어 채점합니다. 비율은 GPT가 쓴 묘사 약 8만 개를 모두 채점해서 찾았습니다.
03 · 순위와 점수
유사도 대신 "몇 번째로 가까운가"를 보여 줍니다
예시 · 캐주얼 모드 549편 중 정답의 순위
점수는 로그 눈금유사도 원값은 좁은 구간에 몰려 차이가 느껴지지 않습니다. 그래서 순위를 100 × (1 − ln N / ln 풀 크기)로 바꿨습니다. 1위 100점, 5위 74점, 20위 52점(세로선)입니다.
단서는 하나씩 따로 채점시스템이 단서를 합치지 않습니다. 좁히고 싶으면 사용자가 직접 앞 단서를 이어 붙여 씁니다. 입력을 100자까지 넉넉히 받는 이유입니다.
순위와 점수는 점수 공식으로 계산한 예시입니다.
04 · 힌트
막히면 원할 때만 힌트를 엽니다
- 묘사 힌트는 VLM(GPT)이 포스터 1,349장을 직접 보고 미리 썼습니다. 제목·배우·감독 이름은 금지어로 걸러 냅니다.
- 힌트마다 같은 모델로 채점해 너무 강한 힌트와 여러 영화에 똑같이 쓰인 문장을 찾아냅니다. 전체 묘사는 평균 92점이라 확인 단계를 한 번 더 둡니다.
- 힌트에 점수 불이익은 없습니다. 연 힌트 수는 공유 텍스트에 💡로 남습니다.
05 · 선택
최고 순위 N장 중 한 장을 고릅니다
- 가장 좋았던 순위 N을 기준으로 최소 3장, 최대 10장을 섞어 보여 줍니다. 1위를 해도 3장 중에서 골라야 해서, 제목 한 번으로 끝나지 않습니다.
- 보기는 (문제 번호, 단서 목록)을 시드로 뽑아서 새로고침해도 바뀌지 않습니다.
- 고르기 전에 떠오른 제목을 받고, 맞으면 결과와 공유 텍스트에 🎯를 남깁니다. 공유 링크를 메신저에 붙이면 결과 카드가 미리보기로 뜹니다.
구성
오프라인 · 데이터 파이프라인
미리 계산해 두는 것
KOBIS 박스오피스 → TMDB 포스터 매칭 → 글자 지움(EasyOCR + LaMa) → 포스터 임베딩 → VLM 묘사 힌트와 채점표. 무거운 작업은 모두 여기서 끝냅니다.
온라인 · 게임 서버
단서 하나에 행렬곱 한 번
FastAPI 서버가 단서를 임베딩해 채점하고, Vite로 만든 화면을 내줍니다. 하루 한 문제의 진행 상태는 서버가 아니라 서명된 쿠키에 담아, 재시작해도 이어서 풉니다.
posterdle.jblee.app · 맥미니 + Cloudflare Tunnel로 운영합니다.