같은 내용인데 LLM이 다른 단어로 추출하는 이유
글3·4에서 성장 응원 항목 미스매치를 추적하는 동안, 그와 별개로 파이프라인 자체가 흔들리고 있었다. BSL의 14번째 분류 항목 — 시놉시스에서 장르·패턴 라벨을 뽑는 작업이 실행할 때마다 다른 결과를 냈다. 프롬프트를 다듬고, 결과가 더 일정하게 나오도록 설정도 조이고, 예시도 더 넣었다. 그래도 두 번 돌리면 두 가지 다른 라벨 묶음이 나왔다. 59.4%라는 숫자를 직접 측정하고 나서야 그 이유를 알았다.
LLM이 라벨을 알아서 붙이면 정확도가 막히는 이유
LLM에게 “이 시놉시스에서 라벨을 뽑아라”고 시키면, LLM은 라벨을 알아서 붙인다. 이런 방식을 쓰면 정확도에 구조적 한계가 생긴다.
이 문제의 원인은 무작위 출력이 아니다. 출력이 들쭉날쭉하지 않도록 설정을 아무리 조여도 사라지지 않는다. 원인은 과제 구조 자체다.
LLM은 ‘어린 시절 상처’와 ‘유년기 트라우마’처럼 뜻은 같은데 표기만 다른 라벨을 만들어낸다. 내가 정답을 직접 매겨둔 기준표(진실표)와 대조할 때, LLM이 같은 개념을 다른 단어로 표현한 순간 그 항목은 틀린 것으로 잡힌다.
LLM이 라벨을 알아서 붙이게 하면 정확도가 구조적으로 낮아진다는 건 학계에서 이미 확인된 패턴이다. 이 항목의 실측치가 그 패턴 위에 올라앉아 있었다.
50편 검증 데이터를 돌렸더니 라벨이 148종 나왔다. 그 중 133개(90%)가 한 번만 등장했다. 같은 개념이 매번 다른 이름으로 나오는 것이다. 이 상태에서는 시간에 따라 어떤 패턴이 늘고 주는지 추이를 그릴 수 없다. 라벨 자체가 매 실행마다 달라지니 무엇을 집계할지가 성립하지 않는다.
이런 구조 자체가 같은 결과를 다시 낼 수 없게 가로막고 있었다.
59.4%로 한계를 직접 확인하고 방식을 바꿨다
50편을 따로 떼어 검증 데이터를 만들고, 직접 라벨을 붙여 진실표를 만들었다. LLM 추출 결과와 1:1로 대조했더니 59.4%만 맞혔다. 합격선은 80%였다.
단순히 못 미치는 게 아니었다. 추출 한계를 계산해봤더니 아무리 잘 회수해도 66%가 한계였다 — 틀린 10건을 전부 회수해도 80%에 도달하지 못하는 구조였다. 기준을 낮추는 게 아니라 방식 자체를 바꾸는 게 맞는 응답이었다. LLM이 라벨을 직접 만들게 하던 구조에서, 미리 정한 목록에서 고르는 방식으로.
처음에는 참고할 기준 예시(시드)가 없어서 LLM이 엉뚱한 라벨을 붙이는 거라는 가설을 세웠다. 틀린 38편을 직접 펼쳐봤더니 결과는 달랐다.
| 오답 원인 | 편수 | 비율 | |
| 프롬프트 문제 | 16편 | 42% | |
| 정의 모호 | 10편 | 26% | |
| 복합 원인 | 5편 | 13% | |
| 진실표 의심 | 4편 | 11% | |
| 라벨 범위 문제 | 3편 | 8% | |
| 시드 없음 단독 | 0편 | 0% | |
| 비교 항목 | LLM이 직접 만드는 방식 (기존) | 고정 목록 방식 (전환 후) | |
| 정확도 구조적 한계 | 60~75% | 80%+ 가능 | |
| 같은 개념 다른 단어 문제 | 필연적 | 없어짐 | |
| 결과 재현 | 어려움 | 쉬워짐 |
하이브리드 방식도 검토했다 — 자유롭게 뽑은 뒤 고정 목록으로 정리하는 방식. 기각했다. LLM이 직접 만드는 방식은 모델이 학습 데이터의 편향을 더 크게 반영해서 내놓는 구조다. 직접 만들게 한 뒤 사람이 검토해도 87%가 버려진다는 실측치가 있었다. 정리 단계를 끼워도 버리는 비용만 늘고 편향을 차단하는 효과는 없다.
다만 전환 후에도 남은 과제가 있다. 프롬프트 문제(42%)와 정의 모호(26%)는 방식을 바꿔도 사라지지 않는다. 라벨 목록의 경계를 어디까지 그을지, AniList 태그가 팬덤 해석에 기반한다는 한계를 어떻게 다룰지 — 이 작업들이 남아있다. 고정 목록이 만능은 아니다. 다만 구조적 한계 자체가 달라진다.
→글6(공유 원자: ADR-021 §라벨집합설계절차)
내 파이프라인에서 LLM이 라벨을 알아서 붙이게 두고 있다면, 그것이 정확도를 60~75% 구간에 묶어두는 구조다. 방식을 바꾸는 게 프롬프트를 다듬는 것보다 먼저다.
→글12