최근 Preferred Networks에서 개발한, 번역에 특화된 LLM 모델인 PLaMo 3 Translate가 화제가 되고 있습니다.
이 모델을 사용하면 외부로 정보를 전송하지 않고도 빠르고 고정밀하게 번역할 수 있다고 하여, VSCode의 소스 코드 내 주석이나 메서드에 커서를 올렸을 때 나타나는 호버 문서(hovered document)를 감지하여 실시간으로 번역해주는 확장 기능을 만들어 보았습니다.
그 이름은 Interlinear입니다!
직업 프로그래머임에도 영어가 서툰 저는, 늘 문서를 복사해서 Google 번역기에 붙여넣는 작업을 하곤 했기 때문에, 커서만 올리면 번역문이 나오는 것이 매우 편리했습니다.
소스 코드의 주석을 번역해주는 확장 기능 자체는 이미 많이 있습니다.
하지만 이들 대부분은 Google 번역 같은 외부 API에 데이터를 전송해야 했거나, 로컬 모델을 이용할 수 있는 경우라도 Ollama 등을 사용해서 직접 번역 서버를 구축해야 하는 등 다소 번거로웠습니다.
이번에 제가 만든 Interlinear는 VSCode에 설치하고 안내에 따라 초기 설정을 진행하는 것만으로도 간단하게 로컬 머신에서 PLaMo 3 Translate를 구동하여 처리를 수행합니다.
내부적으로는 llama.cpp를 실행하여 모델을 구동하는 형태이며, 이 확장 기능 자체는 단순한 클라이언트입니다.
다만, 번역에 특화된 모델인 PLaMo 3 Translate에 적합한 형태로 프롬프트를 구조화하여 전달하기 때문에, 범용 LLM이 필요한 기존의 확장 기능과 비교했을 때, 모델 본연의 성능을 최대한 끌어내어 고정밀하게 번역하는 것이 가능해졌습니다!
기존 확장 기능 + 범용 모델과 Interlinear의 성능 비교를 Claude에게 요청해 보았습니다.
물론 제 환경에서 동작시킨 비교입니다.
이를 보장하는 것은 아니므로 참고 정도로 읽어주시기 바랍니다.
- 다음은 영어 그대로 남겨두는 것이 올바릅니다.
untranslated
에 하지 않습니다: 식별자, 인라인 코드, {@link X}, @param/@since/@return 등의 태그명과 그 타입/인수명, 코드 예시, URL, 버전 번호 - 줄바꿈 위치의 차이는 평가하지 않습니다 (원문이 줄마다 번역되어도, 단락을 모아서 번역해도 무방합니다)
- 상체인지 경체인지는 평가하지 않습니다
- 원문이 이미 불완전한 문장(메모 등)이라면, 비슷한 정도의 간결함으로 채워도 만점 처리할 수 있습니다.
| 방식 | 모델 크기 | 정확도 | 자연스러움 | 정확도 2점 이하 | 최고로 선택된 개수 | 시간 (중앙값 / 90% / 최대) | 합계 |
|---|
| Interlinear+PLaMo 2B | 1.8 GB | 4.82 | 4.80 | 0 | 39 (단독 17) | 1.8 / 5.5 / 10.4 초 | 118 초 |
| 기존 확장 기능+Gemma 4 E4B | 5.0 GB | 4.38 | 4.20 | 4 | 23 (단독 4) | 6.0 / 15.9 / 29.0 초 | 359 초 |
| 기존 확장 기능+Qwen3.5 4B | 2.7 GB | 3.87 | 3.82 | 8 | 15 (단독 2) | 4.7 / 13.3 / 24.8 초 | 307 초 |
| 기존 확장 기능+Qwen3.5 2B | 1.3 GB | 2.49 | 2.42 | 25 | 3 (단독 0) | 3.7 / 8.6 / 14.5 초 | 192 초 |
- 정확도와 자연스러움은 5점 만점의 평균입니다. 채점 담당자는 파일마다 1명씩, 총 3명의 별도 에이전트가 평가했습니다.
- 시간은 모델과의 상호작용에 걸린 시간의 합계입니다. 네 가지 방식 모두 모델에게 문의한 44건을 비교했습니다. 캐시로 처리된 1건은 제외했습니다.
채점 담당자가 부여한 문제 유형 및 건수:
| 방식 | 오역 | 누락 | 불필요한 추가 | 영어 그대로 | 타 언어 (중국어) | 코드/태그 손상 | 형식의 무너짐 |
|---|
| Interlinear+PLaMo 2B | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
| ... | | | | | | | |
기존 확장 기능은 TextMate 문법으로 주석의 범위를 정하고, 한 줄씩 기호를 제거한 후, 개행으로 연결하여 한 번에 번역처로 전달합니다. 번역처의 확장에는 원문과 언어(from/to)만 전달되며, 파일명이나 코드는 전달되지 않습니다. | | | | | | | |
Interlinear는 이 모든 것을 번역하지 않거나, 올바른 단위로 번역하고 있습니다.
- Qwen3.5 2B는 45건 중 10건을 중국어로 반환했습니다. 지시문이 'to Japanese'가 아니라 언어 코드가 'to ja'인 것도 영향을 준 것으로 보입니다 (기존 확장 기능의 기본 지시문 문제).
- Qwen3.5 2B는 번역하지 않고 영어 원문을 그대로 반환하는 경우가 있었습니다.
- 동사를 명사로 읽는 오류가 있었습니다 (skip을 '스킵 옵션'으로 처리함. 3개 모델 모두 해당).
- 의미를 반대로 해석하는 오류가 있었습니다 (stdout과 stderr. Gemma).
- 원문에 없는 따옴표나 큰따옴표가 붙는 경우가 있었습니다.
PLaMo 3 Translate의 GGUF에는 채팅 템플릿이 포함되어 있습니다. 이 템플릿은 마지막 사용자 발언을 그대로 원문으로 간주하여 PFML3에 구성합니다. 기존 확장 기능의 지시문을 그대로 보내면, 다음과 같이 지시문 전체가 번역됩니다.
"다음 문장을 ja로 번역해 주세요. 해설이나 불필요한 문장은 포함하지 말고, 번역된 내용만 반환해 주세요.\n\n입력: "프로세스 핸들은 유지하고, 스레드 핸들은 닫는다""
원문만 보내면 올바르게 번역할 수 있습니다. 다만 기존의 번역 전용 확장 기능들은 모두 지시문을 붙여서 보내기 때문에 이 조합은 사용할 수 없습니다. 또한, 번역 대상에게 문맥(파일 이름이나 관련 코드)을 전달할 수도 없습니다.
-
비슷한 크기의 범용 모델보다 Interlinear + PLaMo 2B가 번역이 더 명확하고 정확하며 빠릅니다.
-
2.7배 큰 Gemma 4 E4B와 비교해도, 번역은 Interlinear가 더 좋았고 시간은 약 3분의 1 수준이었습니다.
-
차이의 원인은 두 가지입니다.
- 기존 확장 기능의 주석 추출 방식 문제. Gemma의 낮은 점수를 받은 4건 중 3건이 이 때문입니다.
- 범용 모델의 오역
-
PLaMo를 기존 확장 기능 뒤에 연결할 수는 없습니다. 기존 번역 전용 확장 기능들은 지시문과 원문을 하나의 메시지로 보내기 때문에, PLaMo는 지시문까지 함께 번역해 버립니다.
리포지토리는 여기입니다:
사실 처음으로 마켓플레이스에 공개했지만, 자신이 만든 확장 기능이 검색되는 것을 보니 기분이 좋네요.
이 확장 기능 자체는 MIT 라이선스이지만, 내부에서 사용하는 PLaMo 3 Translate는 상업적 이용에 조건이 있는 라이선스이므로, 업무 개발 작업에 사용할 때는 조건을 확인해 주시기 바랍니다.