AI + TMDB: 토렌트 포스터 매칭을 위한 3단계 프로세스 — 실제 수치를 통한 프롬프트 반복 개선
요약
토렌트 파일명을 TMDB 포스터와 매칭하기 위한 3단계 AI 프로세스 개선 과정을 다룹니다. 프롬프트 엔지니어링과 정규 표현식을 활용해 미검출(false negatives)과 파싱 오류를 획기적으로 줄인 실무 사례를 소개합니다.
핵심 포인트
- 데이터 기반의 반복적 프롬프트 개선 중요성
- 시즌 데이터 등 에지 케이스 처리를 위한 검증 단계 구축
- TMDB 검색 결과 중 최적의 후보를 선택하는 컨텍스트 활용법
- JSON 파싱 오류를 방지하기 위한 정규 표현식 활용
ShareBox는 공유 폴더를 TMDB 포스터가 포함된 Netflix 스타일의 그리드로 표시합니다. 문제는 폴더 이름이 토렌트(torrent)에서 온다는 점입니다. Naruto.INTEGRALE.MULTI.VFF.1080p.BluRay.x264-AMB3R은 TMDB에서
Pass 2: 검증 (verification) — 시즌 데이터에서의 46개 미검출 (false negatives)
검증 프롬프트(verification prompt)는 {name, TMDB title} 쌍을 전송하고 correct: true/false를 요청했습니다. 247개의 항목 중, 시스템은 55개를 부정확(incorrect)하다고 표시했습니다. 하지만 그중 46개는 미검출(false negatives)이었습니다.
AI는 S01 → "Season 1"이 올바른 매칭이라는 사실을 알지 못했습니다. 이는 일반적인 매칭이 아니라 TMDB의 시즌 포스터와 매칭된 것이기 때문입니다. 심슨 가족(The Simpsons)의 34개 시즌, 워킹 데드(The Walking Dead)의 11개 시즌, 배트맨(Batman)의 4개 시즌 모두 동일한 문제가 발생했습니다.
해결책: "특수 사례 — 부정확(incorrect)으로 표시하지 말 것" 섹션을 추가하여, 시즌 폴더가 시즌 제목과 매칭되는 것은 올바르며, 번역된 명칭이나 사가(saga) 이름도 허용된다는 점을 설명했습니다. 결과: 55개 → 9개의 부정확 항목으로 감소. 이 9개는 모두 실제 문제였습니다. 미검출(false negatives)은 0건이 되었습니다.
Pass 3: TMDB 문제를 해결하는 선택 (the pick)
Pass 2에서 오탐(false positive)을 감지하고 "Naruto"를 더 나은 제목으로 제안할 때, 우리는 TMDB를 검색합니다. 문제는 TMDB가 인기순(popularity)으로 결과를 반환한다는 점입니다. "Naruto"를 검색하면 Naruto Shippuden(더 인기 있음)이 나옵니다. 첫 번째 결과를 그대로 가져오면 오류가 재발합니다.
해결책: 15개의 TMDB 후보군을 확보하고(multi + tv + movie 엔드포인트를 통해), 파일명을 컨텍스트로 포함하여 전체 목록을 AI에게 전송합니다. AI는 {"idx": 1} — 즉, 오리지널 시리즈인 Naruto (2002)를 선택합니다. 파일명에 포함된 "INTEGRALE"라는 단어는 이것이 스핀오프가 아닌 완결 시리즈임을 이해하는 데 도움을 줍니다.
주의할 점: Claude는 가끔 JSON 뒤에 설명을 덧붙여 파싱(parsing)을 깨뜨리곤 합니다. 해결책: 전체 JSON 파싱 대신 정규 표현식(regex)을 사용하여 {"idx": N}을 추출합니다.
최종 수치
| 단계 | 이전 (Before) | 이후 (After) | 개선율 (Improvement) |
|---|---|---|---|
| Pass 1 (추출, extraction) | 72개 미검출 (false skips) | 41 | -43% |
| Pass 2 (검증, verification) | 55개 미검출 (false negatives) | 9 (모두 실제 문제) | -84% |
| Pass 3 (후보 선택, candidate pick) | 4개 파싱 실패 (parse failures) | 0 | -100% |
배운 점
반복(iterating)하기 전에 측정하라. 290개의 실제 항목을 벤치마크로 삼지 않았다면, 나는 눈을 감고 무작정 반복 작업을 수행했을 것입니다. 수치를 통해 Pass 2 v1에 84%의 미검출(false negatives)이 있음을 확인할 수 있었는데, 이는 실제 데이터 없이는 절대 파악할 수 없는 것이었습니다.
에지 케이스(Edge cases)가 지배적입니다. 55개의 미검출(false negatives) 중 46개가 하나의 패턴, 즉 시즌 폴더(season folders)에서 발생했습니다. 프롬프트의 한 줄("seasons matched to Season N are CORRECT")이 오류의 84%를 제거했습니다. 80/20 법칙은 프롬프트에도 적용됩니다.
파싱(Parsing)은 프롬프트만큼 중요합니다. 파싱이 깨진다면 완벽한 프롬프트도 무용지물입니다. AI는 텍스트, 코드 펜스(code fences), 설명을 추가합니다. 정규 표현식(Regex) 추출이 json_decode()보다 더 신뢰할 수 있습니다.
계층적 아키텍처(Layered architecture)는 비용을 절감합니다. 무료인 정규 표현식이 80%를 처리합니다. AI는 나머지 20%에 대해서만 실행됩니다. 가장 비용이 많이 드는 3단계(Pass 3)는 2단계에서 문제가 감지될 때만 실행되며, 이는 290개의 항목 중 9번뿐이었습니다.
최고의 프롬프트는 지시 사항이 가장 많은 프롬프트가 아니라, 에지 케이스(edge cases)를 정확하게 설명하는 프롬프트입니다. "의심스러울 때는 skip=false" 및 "seasons are CORRECT"와 같은 문구는 20줄의 일반적인 규칙보다 더 가치 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기