← 블로그로 돌아가기
EngineeringBuild in PublicVideo

LLM에 이름 오타를 고쳐달라고 했더니, 제품 이름을 바꿔버렸다

내 AI 클리퍼는 자막 속 고유명사를 교정한다. 그런데 한 영상에서 처음 보는 모델 이름을 실제 경쟁사 이름으로 바꿔버렸다. 원인과 코드 수정 방법.

2026년 9월 28일

LLM에 이름 오타를 고쳐달라고 했더니, 제품 이름을 바꿔버렸다

작성: 2026년 9월 28일 · 수정: 2026년 9월 28일

Katto는 AI 영상 클리퍼다. 긴 영상을 넣으면 괜찮은 구간을 잘라 세로형 쇼츠로 만들고, 자막까지 써준다. 나는 이걸 혼자서, 공개적으로 만들고 있다. 이 글은 내가 가격 페이지에 내세우는 기능 하나가 제 역할과 정반대의 일을 조용히 하고 있던 걸 발견한 이야기다.

내가 풀려던 문제

음성 인식은 단어에는 아주 강하고 이름에는 아주 약하다. Whisper는 처음 보는 브랜드를 들으면 소리 나는 대로 적는다. "Trump"는 "trompe"가 되고, "Suárez"는 "Suares"가 되고, "ChatGPT"는 "chatgépété"가 된다. 어떤 프랑스 축구 영상에서는 한 개의 자막 안에서 이런 걸 아흔여덟 개 센 적도 있다.

이름이 뭉개진 자막은 성의 없어 보이는데, 자막은 클립에서 가장 잘 보이는 요소다. 그래서 교정 단계를 추가했다. 전사가 끝나면 텍스트를 작은 언어 모델에 넘기고 지시는 하나만 준다. 소리 나는 대로 적힌 고유명사를 찾아 철자를 고쳐라. 영상당 비용은 1센트 정도다. 그 아흔여덟 개를 다 고쳐줬다.

실제로 나간 결과물

지난주에 한 사용자가 대형 언어 모델에 관한 프랑스어 영상을 클리핑했다. 발표자는 JEV라는 모델을 계속 언급했다. Whisper는 그걸 듣고 "Jev"라고 적었는데, 충분히 비슷해서 아무도 이상하게 여기지 않았을 수준이다.

그런데 나온 클립들의 제목은 "Jamba가 과대평가된 이유", "Jamba: 혁명이자 동시에 과대평가"였다. 자막에도 Jamba라고 적혀 있었다. 설명문에도 Jamba였다.

Jamba는 AI21이 만든 실제 대형 언어 모델이다. 다만 그 영상에 나온 모델이 아닐 뿐이다.

파이프라인이 저장해둔 걸 들여다봤다. 보관된 전사본에는 "Jev"가 두 번 있었고 "Jamba"는 0번이었다. 그 이후의 모든 단계에는 "Jamba"만 있고 "Jev"는 하나도 없었다. 점수가 매겨진 후보들, 클립 메타데이터, 클립 풀까지 총 스물네 번. 전사는 맞았다. 그걸 보호하려고 내가 추가한 게 그걸 망가뜨린 것이다.

모델이 그렇게 한 이유

도움이 되려는 어시스턴트라면 할 법한 그대로 했다. 영상은 언어 모델에 관한 것이다. "Jev"는 모델이 모르는 이름이다. "Jamba"는 아는 모델이고, 눈을 가늘게 뜨고 보면 둘이 아주 멀지도 않다. 맥락상 하나를 다른 하나로 바꾸는 건 창작이 아니라 교정처럼 보인다.

이런 종류의 작업에서 아무도 경고해주지 않는 실패 방식이 바로 이거다. 맞춤법 검사기는 모르는 단어를 만나면 그냥 둔다. 언어 모델은 모르는 단어를 만나면 아는 단어 중 가장 가까운 걸 집어온다. 그리고 도메인 지식이 많을수록 그 손짓은 더 자신만만해지고 더 틀린다. 내 교정기는 흔한 이름을 잘 다뤘기 때문에 정확히 그만큼 드문 이름에 취약했다.

특히 뼈아팠던 부분

나는 이걸 이미 생각해뒀었다. 프롬프트에는 대문자로 이렇게 적혀 있었다.

철자와 대소문자만 고칠 것. 이름을 다른 이름으로 절대 바꾸지 말 것. 그럴듯하지만 틀린 이름을 지어내는 것은 낯선 이름을 그대로 두는 것보다 나쁘다. […] 맥락을 보고 더 유명한 이름을 추측하지 말 것.

세 문장, 모호할 데 없이, 바로 그 일을 막으려고 쓴 문장이었다. 모델은 그걸 읽고도 제품 이름을 바꿨다.

프롬프트 문구가 나빴다고 생각하지 않고, 더 나은 문구였다면 달랐을 거라고도 이제 생각하지 않는다. 모델이 하고 싶어 하는 걸 하지 말라고 하는 건 요청이지 제약이 아니다. 대부분의 경우 지켜지는데, 그게 한 번도 안 지켜지는 것보다 나쁘다. 확인을 안 하게 되기 때문이다.

대신 한 일

규칙을 프롬프트에서 코드로 옮겼다. 모델은 여전히 교정안을 제안하고, 이제 함수 하나가 각 제안이 철자 수정인지 이름 교체인지 판단해 교체는 조용히 버린다.

판정 방식은 일부러 거칠게 짰다. 두 문자열에서 대소문자와 악센트를 제거한 뒤, 원본이 대체 문자열에 얼마나 남아 있는지를 잰다. 0.6 초과면 같은 이름의 다른 표기다. 그 아래면 다른 이름이다.

내 테스트 세트의 교정은 전부 살아남았다. 정당한 교정 중 일부는 살아남지 못한다. 다섯 번째 줄이 실제 사례다. 프랑스어 화자가 "Nguyen"이라고 말하면 "nouillène"으로 들리고, 악센트를 제거하고 나면 두 문자열은 공통점이 거의 없어서, 가드는 이제 그 교정을 버린다. 로마자로 표기된 일본어 이름이나 다른 언어에서 글자 하나씩 읽은 약어에도 같은 일이 일어날 것이다.

그게 내가 고른 쪽이다. 이상한 이름이 그대로 남으면 눈에 보이고, 독자가 무슨 뜻이었는지 유추할 수 있다. 틀린 이름은 눈에 보이지 않고, 아무도 유추할 수 없다. 거부된 교정은 두 문자열과 함께 로그로 남긴다. 거부 한 건은 모델이 방금 뭔가의 이름을 바꾸려 했다는 뜻이고, 그건 볼 가치가 있기 때문이다.

교훈

모델이 무시할 수 있는 규칙은 규칙이 아니다. 제약이 중요하다면 그건 모델이 읽는 문단이 아니라 모델 뒤에서 실행되는 코드에 있어야 한다. 프롬프트는 의도를 표현한다. 강제하지는 않는다.

수정이 있었는지만 보지 말고 방향을 보라. 이 단계에 지표는 있었다. 영상당 몇 건을 교정했는가. 아흔여덟이라는 숫자는 건강해 보였다. 그런데 어떤 교정이 텍스트를 진실에 가깝게 만들었는지 멀어지게 만들었는지는 아무것도 재지 않았다. 총량만 세면 나쁜 교정과 좋은 교정은 구분되지 않는다.

입력을 저장하고 출력을 내보내는 파이프라인은 두 번 거짓말할 수 있다. 보관된 전사본에는 "Jev"가, 실제로 나간 모든 클립에는 "Jamba"가 있었다. 보관본만 읽었다면 파이프라인에 문제가 없다고 결론지었을 것이다. 중요한 검사는 밖으로 나간 결과물에 대한 검사다.

확신은 이 실패의 특징 중 하나다. 모르는 이름을 그대로 두는 교정기는 눈에 띄지만 무해한 어색함을 만든다. 그걸 바꿔버리는 교정기는 깔끔하고 매끄럽고 틀린 텍스트를 만드는데, 아무도 의심하지 않는다. 나도 포함해서. 영상을 만든 사람이 자기 자막을 읽기 전까지는.

가드는 같은 날 배포했다. 생소한 주제의 영상을 클리핑했는데 Katto가 낯선 이름을 들린 그대로 남겨뒀다면, 그건 이제 의도된 것이다.

관련 글

영상을 바이럴 클립으로 만들 준비가 되셨나요?

Katto는 긴 영상을 자동으로 자르고 자막을 넣고 리프레임해 숏폼 콘텐츠로 만들어 줍니다.

Katto 무료로 사용해보기 →