번역 프롬프트 엔지니어링의 한계 — 모델 천장
영상 자막을 번역해 주는 브라우저 확장을 직접 만들어 쓰고 있습니다. 시중에도 번역 확장은 많지만, 쓸수록 비용이 들고 원하는 대로 손보기가 어려워서 직접 만들었습니다.
번역은 LLM(대규모 언어 모델)에 맡깁니다. 구체적으로는 AWS Bedrock 을 부릅니다. Bedrock 은 여러 업체의 LLM 을 API 하나로 호출하게 해주는 AWS 서비스입니다. 여기에 번역할 문장을 보내면 번역된 문장이 돌아옵니다.
여기서 걸리는 게 모델 선택이었습니다. 자막은 영상을 보는 내내 흘러나오고 그때마다 번역을 부르니 호출이 워낙 잦아서, 한 줄 한 줄에 크고 좋은 모델을 부르면 느린 데다 오래 볼수록 요금이 쌓입니다.
그래서 Bedrock 에 있는 Amazon Nova Lite 같은 작은 모델을 골랐는데, 크기가 작아 빠르고 싼 대신 번역 품질은 큰 모델보다 떨어집니다. 모델을 더 비싼 걸로 바꾸지 않고 프롬프트(모델에 주는 지시문)만 다듬어서 이 작은 모델의 번역 품질을 어디까지 끌어올릴 수 있는지, 그리고 어디서부터는 프롬프트로 안 되는지를 확인했습니다.
처음 증상 — 전문용어 직역, 관용구 문자 번역
작은 모델은 이런 걸 자주 틀렸습니다.
- 전문용어를 뜻으로 풀어버림 — “dirty read” 를 “더러운 읽기”, “primary terms” 를 “기본 용어” 로.
- 관용구를 문자 그대로 — “under the hood” 를 “후드 아래” 로.
- 번역투 — “~에 의해”, 어색한 어순, 붙는 대명사.
프롬프트 규칙으로 상당 부분 교정
프롬프트에 규칙을 추가했습니다.
- 전문용어 — 음차하거나 원어 유지, 예시 동반.
- 관용구 — 문자 그대로가 아니라 의미로 번역.
- 자연스러움 — 한국어 어순으로 재구성, 번역투 금지, 불필요한 대명사 생략, 문체 일관.
이걸로 “더러운 읽기” 가 “더티 리드(dirty read)” 로, 어색한 번역투가 상당히 개선됐습니다. 실제로 확인되는 수준의 향상이었습니다.
여기서 캐시 키에 프롬프트 버전과 모델 ID 를 포함시켰습니다. 프롬프트를 고치면 이전 캐시가 옛날 규칙으로 번역한 결과라, 그걸 그대로 쓰면 개선이 안 보입니다. 버전을 키에 넣어 프롬프트가 바뀌면 캐시가 무효화되게 했습니다.
고정 예시가 출력에 그대로 새어 나옴
관용구 규칙을 줄 때 “이런 관용구는 이렇게 번역하라” 며 고정된 번역 예시를 프롬프트에 넣었습니다. 그랬더니 그 예시 문장이 맥락과 상관없이 출력에 튀어나왔습니다. 예로 든 “빙산의 일각일 뿐” 이 엉뚱하게 영상 제목에 등장하는 식이었습니다.
작은 모델은 프롬프트의 구체적 예시를 “따라야 할 정답” 으로 오해하고 복사하는 경향이 있었습니다. 고정 예시를 빼고 일반 원칙으로 바꿨습니다 — “관용구는 그 맥락의 의미로, 제목은 제목답게” 처럼. 구체 예시 대신 원칙을 주니 복사가 멈췄습니다.
못 고친 것 — 모델의 천장
프롬프트로 잡을 수 있는 건 체계적인 오류였습니다. 늘 같은 방식으로 틀리는 것(전문용어 직역, 번역투)은 규칙으로 교정됩니다.
그런데 “문장을 얼마나 매끄럽게 만드느냐” 같은 기본 생성력은 프롬프트로 안 올라갑니다. 그건 모델의 천장이라, 모델을 바꿔야 올라갑니다. 그래서 팝업에서 모델 ID 를 바꿀 수 있게 하고(더 큰 모델로 교체 가능), 캐시 키에 모델 ID 를 넣어 A/B 결과가 안 섞이게 했습니다.
프롬프트로 되는 것과 모델을 바꿔야 하는 것
프롬프트 엔지니어링으로 할 수 있는 것과 없는 것이 갈렸습니다.
- 된다 — 체계적 오류 교정(용어·관용구·번역투). 일반 원칙으로 주면.
- 안 된다 — 예시를 고정으로 주면 그대로 복사됨. 원칙으로 줘야 함.
- 모델을 바꿔야 한다 — 문장의 기본 매끄러움 같은 생성력 천장.
작은 모델을 프롬프트로 다듬는 건 가성비가 좋지만, 규칙으로 잡히는 건 규칙으로 잡고, 그 위는 모델 교체로 올린다는 경계를 아는 게 중요했습니다. 프롬프트에 모든 걸 욱여넣으려 하면, 고정 예시가 새어 나오는 것처럼 오히려 부작용이 생깁니다.
댓글 0