Qwen이나 Gemma 같은 일반적인 오픈 소스 모델을 파인튜닝하여 특정 도메인이나 작업에 특화된 모델은, 여러 도메인과 일반적인 애플리케이션을 위해 구축된 어휘를 물려받게 됩니다.
저희가 프로덕션 환경에서 운영하는 에세이 채점기에서 이러한 어휘는 모델이 작성하는 텍스트의 대부분을 많은 토큰으로 분할합니다. 이 글에서는 곧 발표할 VocabX 논문의 일부 결과를 미리 보여드립니다: 즉, 빈도수가 아닌 각 토큰의 비용을 중심으로 어휘를 전문화하여 기본 모델을 변경하지 않고 측정된 추론 비용을 77% 절감한 방법입니다.
토크나이저는 보통 기본 모델의 고정 속성으로 취급되어 물려받고 그대로 유지됩니다. 단일 도메인에 특화된 모델에게 있어, 이는 가장 큰 비용 절감 레버 중 하나가 될 수 있으며, 어떠한 훈련 단계보다도 이전에 설정됩니다.
저희가 프로덕션에서 운영하는 시스템 중 하나는 Qwen3-4B를 기반으로 구축된 포르투갈어 에세이 자동 채점기입니다. 이 시스템은 에세이, 프롬프트, 지원 텍스트를 입력받아 각 역량별로 등급과 코멘트를 포함한 JSON 평가 결과를 반환합니다.
모델 자체는 이미 40억 개의 파라미터로 작았고 해당 작업에 대해 이미 훈련되었습니다. 하지만 그 토크나이저는 여전히 여러 언어와 다양한 종류의 텍스트를 위해 구축된 원래의 Qwen3-4B 토크나이저였습니다. 이 채점기에서는 단일 언어인 포르투갈어와 단일 응답 형식에 사용되었는데, 여기에는 두 가지 비용이 있었습니다: 첫째, 채점기가 매 요청마다 작성하는 텍스트가 필요 이상으로 많은 토큰을 사용했고, 둘째, 생성되는 모든 토큰에서 모델은 이 작업에서는 거의 사용되지 않는 많은 항목을 포함하여 151,669개의 어휘를 점수화했습니다.
저희는 동일한 기본 모델, 동일한 데이터, 그리고 동일한 훈련 레시피를 유지하면서 VocabX라고 부르는 방법으로 해당 어휘를 재구축했습니다. 이 글의 수치는 아직 검토 중인 논문의 현재 버안에서 가져온 것이므로, 출판 전에 변경될 수 있습니다.
주요 언어 모델들은 토큰 단위로 읽고 쓰며, 이 때 텍스트가 어떻게 토큰이 되는지를 결정하는 것이 토크나이저(tokenizer)입니다. 주요 범용 모델들의 토크나이저는 소스 코드부터 계약서, 중국어에 이르기까지 다양한 도메인과 언어의 방대한 텍스트 컬렉션으로 학습됩니다. 일반적인 목적의 모델에게는 이러한 선택이 타당합니다.
하지만 단일 도메인에서 사용되는 모델에게는 동시에 두 가지 종류의 비효율성을 초래합니다.
첫 번째는 파편화(fragmentation)입니다. 토크나이저는 해당 도메인이 가장 많이 반복하는 내용으로 여러 조각으로 분할됩니다. 채점기(grader)의 경우, 모든 응답은 동일한 JSON 엔벨로프, 동일한 역량 이름, 동일한 평가 구문으로 시작합니다. 계약서에서는 정형화된 조항(boilerplate clauses)이 그렇습니다. 코드에서는 식별자(identifiers)가 그렇습니다. 이러한 각 시퀀스는 원래 필요했던 토큰 수보다 많은 비용을 발생시키며, 모델은 모든 요청마다 이 모든 것에 대해 비용을 지불합니다.
두 번째는 과잉(excess)입니다. 어휘집(vocabulary)에는 해당 도메인에서 절대 사용하지 않는 수만 개의 항목이 포함되어 있으며, 모델은 토큰을 생성할 때마다 이 모든 항목에 대한 점수를 계산합니다. 미국 학교 생물학 시험 채점에 맞춰 조정된 모델이라도 중국어로 글을 쓸 일은 거의 없지만, 여전히 매 단계마다 모든 중국어 토큰의 확률을 계산합니다. 즉, 어휘집은 해당 도메인이 가장 많이 반복하는 내용으로 여러 조각에 분할되고, 해당 도메인에서 사용하지 않는 항목들을 담고 있는 것입니다.
자연스러운 반응은 토큰 수를 세고 그 수를 줄이려고 노력하는 것입니다. 하지만 이 '수'가 곧 '비용(bill)'을 의미하지는 않습니다.
생성된 토큰 하나가 왜 더 많은 비용을 발생시키는지 이해하려면, 추론(inference)이 어떻게 작동하는지 살펴보는 것이 도움이 됩니다. 추론은 두 단계로 나뉩니다. 프리필(prefill) 단계에서는 모델이 전체 입력을 네트워크를 통해 한 번에 처리합니다. GPU 메모리에서 읽어온 모든 가중치(weight)는 모든 입력 토큰에 재사용되며, 이때의 병목(limit)은 컴퓨팅 능력입니다. 반면, 디코드(decode) 단계에서는 모델이 응답을 토큰 단위로 하나씩 생성하며, 각 토큰마다 전체 패스(full pass)가 필요합니다. 읽어온 모든 가중치는 몇 번만 사용되며, GPU는 메모리에서 데이터가 도착하기를 기다리는 데 대부분의 시간을 소비하게 되므로, 이때 병목은 메모리 대역폭(memory bandwidth)이 됩니다.
이 효과는 우리가 실제로 운영하는 환경, 즉 적당한 배치 크기로 서비스되는 소형 모델에서 가장 강력하게 나타납니다. 요청을 배칭(Batching)하면 가중치 읽기(weight reads)를 여러 요청에 걸쳐 분산시켜 문제를 완화하지만, 근본적으로 해결하지는 못합니다. 디코딩(decode) 단계마다 모델은 이미 처리된 컨텍스트를 담고 함께 증가하는 어텐션 메모리인 KV 캐시(KV cache), 즉 키-값(Key-Value) 쌍을 읽어옵니다. 저희가 측정했던 경우, 생성된 토큰 하나는 토큰 읽기 비용의 7.4배에 달하지만, 이 비율은 하드웨어, 문제 유형, 배치 크기, 컨텍스트 길이 등 여러 요인에 따라 달라지며 그보다 클 수도 있습니다. 일반적으로 방향성은 동일합니다. 즉, 생성(generating)하는 것이 읽기(reading)하는 것보다 비용이 더 많이 듭니다.
어떤 배송 회사가 상자 개수당 요금을 부과하는데, 들어오는 상자는 물론 나가는 상자에 대해서는 그보다 일곱 배나 많은 요금을 받는다고 생각해 보세요. 총 상자 개수를 줄이는 것이 도움이 됩니다. 하지만 나가는 상자 개수를 줄이는 것이 일곱 배 더 큰 도움을 줍니다. 입력과 출력을 동일하게 압축하는 방법으로는 가능한 절감액의 대부분을 놓치게 됩니다.
청구서의 세 번째 구성 요소는 어휘(vocabulary) 자체입니다. 모델의 마지막 레이어인 LM 헤드(LM head)는 내부 상태를 모든 가능한 토큰에 대한 점수(score)로 변환합니다. 이를 위해 각 어휘 항목당 하나의 매개변수 행(row of parameters)을 보유합니다. Qwen3-4B 크기의 모델에서, 이 행렬은 전체 매개변수의 거의 10%를 차지합니다. 이는 대형 모델이 알아차리지 않고 흡수하는 공유 비용이지만, 소형 모델에게는 부담으로 작용합니다.
그리고 비용은 한 번만 지불되는 것이 아닙니다. 입력 레이어는 읽히는 토큰의 행(row)만 조회하지만, LM 헤드는 생성되는 모든 토큰에 대해 전체 행렬을 읽고 곱합니다. 디코딩 과정 자체가 이미 메모리 바운드(memory-bound)이기 때문에, 추가적인 행이 하나씩 이동해야 하는 더 많은 데이터를 의미합니다. 도메인에서 절대 사용하지 않는 항목이라도 자주 사용하는 항목과 정확히 같은 비용이 발생합니다. 이것이 바로 토큰을 추가하는 것이 개수를 줄이는 동시에 청구서를 올릴 수 있는 이유입니다. VocabX는 이 용어를 선택 기준에 포함하지 않지만, 두 단계로 어휘 크기를 제어합니다. 서브워드 병합(sub-word merge)은 기본 어휘를 더 작고 도메인 특화된 것으로 대체하고, 매크로는 고정 예산 하에 추가됩니다. 평가기에서 출력 레이어는 약 152,000개 행에서 약 65,000개 행으로 줄었습니다.
모델의 어휘를 조정하는 것은 새로운 아이디어가 아닙니다. 문헌상의 참조 방법들, 예를 들어 빠른 어휘 전이(fast vocabulary transfer, FVT), 다중 단어 토큰화(multi-word tokenization, MWT) 및 Liquid AI의 제자리 토크나이저 확장(in-place tokenizer expansion, in-place BPE)은 이미 파편화를 줄여왔습니다. 저희가 이들을 저희 문제에 적용해 보았을 때 두 가지 한계를 발견했습니다.
그들은 비용이 아닌 빈도에 따라 토큰을 선택합니다. 입력에서 자주 나타나는 표현이 응답에서 덜 나타나더라도, 만약 그 후자가 서비스하는 데 더 비싼 경우에도 그것보다 가치가 높다고 판단합니다.
그들은 단일 레이어에서 작동합니다. 단어들이 조각으로 잘리는 방식을 조정하거나, 전체 구(phrase)를 하나의 토큰으로 병합할 뿐입니다. 이 세 가지 방법 중 어느 것도 동일한 기준으로 두 가지 모두를 수행하지 못했습니다. 그리고 평가기의 가장 큰 낭비는 바로 JSON 엔벨로프와 같은 길고 반복되는 구간에 있었는데, 서브워드 방식은 각 부분을 하나씩 병합해야만 도달할 수 있었습니다.
VocabX는 이 두 가지 한계뿐만 아니라, 첫 번째 문제를 해결하는 명백한 경로에서 나타나는 세 번째 문제까지도 다룹니다.
첫째, 질문을 바꿨습니다. 후보가 몇 개의 토큰을 절약하는지 묻는 대신, 얼마나 많은 비용과 시간을 절약하는지를 물었습니다. 제거된 각 토큰은 해당 필드(시스템 프롬프트, 사용자 메시지 또는 모델 응답)의 가격에 곱해집니다. 저희가 측정했던 사례에서, 평가자(grader)에게서 절약된 토큰은 입력에서 절약된 토큰보다 7.4배 가치가 있으며, 어휘도 이에 맞춰 구축됩니다.
둘째, 두 계층을 동시에 작업합니다. 배송 회사로 돌아가 봅시다. 각 항목을 더 잘 포장하여 상자를 줄이거나, 매주 동일한 12개 품목 키트가 발송된다는 것을 인식하고 이 키트를 단일 상자로 보내어 상자를 줄일 수 있습니다. VocabX는 이 두 가지를 모두 수행합니다. 서브워드(sub-word) 계층에서는 도메인 용어가 조각으로 잘리는 방식을 재구축합니다. 다중 단어(multi-word) 계층에서는 짧은 표현부터 전체 줄, JSON 엔벨로프에 이르기까지 반복되는 전체 구간을 찾아내고, 이를 하나의 토큰으로 만드는데, 저희는 이것을 매크로 토큰(macro token)이라고 부릅니다. 두 계층 모두 동일한 비용 기준 하에 선택되며, 각각 자체 예산이 있습니다.
이러한 구간들을 찾기 위해 다섯 개의 마이너(miners)를 사용합니다. 이는 코퍼스 전체에서 반복되는 구간을 자동으로 검색하는 것으로, 각자 한 가지 종류의 반복에 특화되어 있습니다: 긴 단어, 전체 줄, 표현, 완전한 문장, 그리고 JSON이나 태그와 같은 구두점을 포함하는 구조입니다. 여덟 개의 코퍼스를 평균했을 때, 마지막 코퍼스가 가장 많은 기여를 했으며, 코드만으로도 17.5점의 점수를 차지했습니다. 다섯 개 모두가 없었다면, 평가자에서의 토큰 감소는 55.6점 하락했을 것입니다.
셋째, 샘플이 볼 수 없는 것을 추정합니다. 비용에 따라 토큰을 선택하려면, 이미 선택된 것들 이후에도 각 후보가 얼마나 많은 절약을 하는지 알아야 합니다. 이를 정확하게 측정하려면 매번 선택할 때마다 전체 코퍼스를 재처리해야 하며, 이는 수만 번의 작업이 필요합니다. 대규모로 처리하는 일반적인 방법은 문서 샘플에 대해 측정하고, 따라서 샘플에 없는 후보는 0의 이득을 얻게 됩니다.
5만 건의 문서에서 37번 나타나는 표현이 400개 문서 샘플에서는 약 26%의 빈도로만 나타납니다. 계약서 코퍼스(contracts corpus)의 경우, 후보어 중 단지 16.6%만이 400개 문서 샘플에 등장하며, 나머지는 평가되지 않습니다.
후보어가 가지는 이득은 두 부분으로 나뉩니다. 하나는 전체 코퍼스에서 절약되는 양이며, 이는 샘플 없이 정확하게 계산할 수 있습니다. 다른 하나는 그 절약분 중 아직 선택된 토큰으로는 커버되지 않은 부분이며, 오직 이 부분만 추정해야 합니다. 샘플이 볼 수 없는 후보어의 경우, 0으로 처리하는 대신 샘플에서 관찰 가능한 후보어들의 행동을 기반으로 통계적 추정치를 사용합니다. 따라서 샘플에서는 희귀하지만 코퍼스 전체에서는 빈번한 후보어도 다시 고려 대상에 오르게 됩니다.
이러한 변화만으로도 동일한 샘플과 예산 하에서 계약서 코퍼스의 토큰 감소율을 44.7%에서 52.8%로 끌어올렸습니다.
실제 효과를 측정하기 위해, 우리는 동일한 기본 모델(base model), 데이터, 레시피(recipe), 시드(seed)를 사용하여 일곱 가지 버전의 그레이더(grader)를 훈련했습니다. 이들 간의 유일한 차이점은 토크나이저(tokenizer)입니다. 모든 버전은 RTX 5090 GPU와 vLLM 추론 서버가 장착된 동일한 테스트 머신에서 동일한 500개의 요청을 실행했으며, 비용은 측정된 실행 시간으로부터 계산되었습니다.
모델의 응답 토큰 수는 평균 350개에서 101개로 감소했습니다. 비용은 77.0% 하락했습니다. 그리고 채점 정확도와 주제 이탈 또는 규칙 위반 에세이 선별 정확도를 결합하여 측정된 품질(bench score)은 0.703에서 0.810으로 상승했습니다.
이 지점에 도달하기 위해서는 방향 수정(course correction)이 필요했습니다. 첫 번째 버전의 어휘는 각 역량의 등급을 주변 JSON과 하나의 거대 토큰(macro token)으로 융합했습니다. 이는 가장 간결한 옵션이었지만, 품질이 떨어졌습니다. 그 벤치 점수(bench score)는 0.689로, 프로덕션 평가기(production grader)의 0.703보다 낮았습니다. 등급을 매크로 안에 넣었기 때문에, 등급과 구조의 모든 조합이 동일 토큰의 다른 변형이 되었고, 모델은 단일 단계에서 이 둘 모두를 선택했습니다. 등급에 별도의 토큰을 할당하는 것은 응답당 2개의 추가 토큰 비용이 들었지만, 벤치 점수를 0.810으로 높였고, 측정 결과에서는 훨씬 저렴했습니다. 융합 버전 대비 77.0% 감소를 보인 반면, 융합 버전은 73.3% 감소에 그쳤습니다.
이 교훈은 평가기(grader)를 넘어 적용됩니다. 압축된 범위가 모델이 존재해야 하는 핵심 결정 사항을 담고 있을 때, 압축에는 비용이 따릅니다. 목표는 가장 저렴한 어휘를 만드는 것이 아니라, 중요한 토큰들을 보존하는 가장 저렴한 어휘를 만드는 것입니다.
우리가 얻은 이 이득이 우리 사례에만 국한된 것인지 알아보기 위해, VocabX를 5가지 공개 도메인(계약서, 의료 논문, 과학 논문, 뉴스, Python 코드)과 3가지 모델 계열(Qwen3, Llama-3.1, Gemma-3)의 벤치마크에서 3가지 참조 방법론과 비교했습니다. 모든 방법은 동일한 마이닝 및 테스트 문서를 사용했으며, 동일한 어휘 상한선(vocabulary ceiling)을 적용했습니다.
VocabX는 15가지 조합 모두에서 가장 강력한 참조 방법보다 1.2점에서 최대 9.3점까지 더 많은 압축률을 보여주었습니다. 추정 추론 비용 측면에서도, 가지치기된(pruned) VocabX 버전이 15가지 경우 모두 선두를 차지했으며, Qwen3에서 평균 마진은 10.2점, Llama-3.1에서 7.5점, Gemma-3에서 13.6점에 달했습니다. 계약서 도메인에서는 가지치기된 버전이 113,426개의 어휘 항목으로 62.6%의 토큰 감소율을 기록했는데, 이는 207,803개를 사용하는 최고의 인플레이스 BPE 구성(in-place BPE configuration)의 61.8%와 비교됩니다.
VocabX가 모델을 더 똑똑하게 만드는 것은 아닙니다. 이 모델이 필요하지 않은 텍스트를 조각조각 지어 비용을 지불하는 것을 멈추게 하고, 결코 사용하지 않을 어휘에 점수를 매기는 것을 멈추게 합니다. 우리의 평가기에서 그 절감액은 동일한 기본 모델과 동일한 학습 레시피를 사용하여 추론 비용을 77%까지 줄였습니다.
전문화(Specialization)는 보통 데이터와 가중치(weights)에서 시작됩니다. 하지만 어휘(vocabulary)에서 한 단계 더 앞서서 시작할 수도 있습니다.
전체 방법론, 모든 실험에 대한 표, 그리고 폐기된 개입(interventions)들은 곧 발표할 VocabX 논문에 담길 예정입니다.