번역 프롬프트 엔지니어링의 한계 — 모델 천장

AI 인프라3분조회

영상 자막을 번역해 주는 브라우저 확장을 직접 만들어 쓰고 있습니다. 시중에도 번역 확장은 많지만, 쓸수록 비용이 들고 원하는 대로 손보기가 어려워서 직접 만들었습니다.

번역은 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 결과가 안 섞이게 했습니다.

프롬프트로 되는 것과 모델을 바꿔야 하는 것

프롬프트 엔지니어링으로 할 수 있는 것과 없는 것이 갈렸습니다.

  • 된다 — 체계적 오류 교정(용어·관용구·번역투). 일반 원칙으로 주면.
  • 안 된다 — 예시를 고정으로 주면 그대로 복사됨. 원칙으로 줘야 함.
  • 모델을 바꿔야 한다 — 문장의 기본 매끄러움 같은 생성력 천장.

작은 모델을 프롬프트로 다듬는 건 가성비가 좋지만, 규칙으로 잡히는 건 규칙으로 잡고, 그 위는 모델 교체로 올린다는 경계를 아는 게 중요했습니다. 프롬프트에 모든 걸 욱여넣으려 하면, 고정 예시가 새어 나오는 것처럼 오히려 부작용이 생깁니다.

  1. 불러오는 중