용바오의 연구실

JGI (Jaypyon General Intelligence)

한국형 언어모델 서비스의 제작: 언어모델의 토크나이저 조작

서론

언어모델은 다양한 언어를 이해하고 생성하는 데 큰 강점을 지니고 있지만, 특정 언어 환경에서 최적화가 필요할 때가 있다. Qwen2 72B Instruct 모델은 프롬프트 엔지니어링만으로도 한국어를 능숙하게 처리할 수 있지만, 일부 특정 키워드를 제대로 인식하지 못할 때가 있었다. 이 글에서는 한국형 언어모델 서비스 제작을 위해 토크나이저를 조작한 경험을 담았다.

문제점 발견

Qwen2 72B Instruct 모델은 대부분의 한국어를 잘 이해하지만, 특정한 단어들(예: '녕', '에헤헿')을 처리할 때 중국어나 일본어로 출력하는 문제가 발생했다. 이는 서비스 런칭을 앞둔 상황에서 심각한 문제로 대두되었다. 본부장(전무)께서는 간헐적으로 섞여 나오는 중국어가 서비스 품질을 저하시킨다고 지적하며 런칭을 막으셨다.

해결 방안 모색

이 문제를 해결하기 위해 여러 오픈소스 모델을 시험해보았다. 그러나 kiqu는 라이선스 문제로, llama3는 성능 문제로 적합하지 않았다. 따라서 기존 모델을 그대로 사용하되, 중국어 출력을 처리하기로 결정하고 토크나이저에 집중하기로 했다.

토크나이저 조작

아이디어

중국어 토큰을 한국어로 대치하고, 일본어 토큰을 한국어로 번역하면 문제가 해결될 것이라고 생각했다. 사내에서는 중국어나 일본어 번역 기능이 필요하지 않기 때문이다.

기술적 접근

우리는 aphrodite engine(vllm)을 배포 중에 사용하고 있었다. 이 엔진의 detokenize_incrementally 함수에서 모델의 출력인 List[int]를 디토크나이징하는 부분을 발견했다. 이 부분에서 새로운 함수를 클래스 내에 정의하여 중국어와 일본어 토큰을 한국어 토큰으로 변경했다.

구현 과정

  1. 중국어 토큰과 일본어 토큰을 전부 한국어로 대치하는 작업을 수행했다.
  2. 대치한 토큰의 수는 약 26,000개였고, Qwen 모델의 토크나이저 단어장이 총 15만 개 정도이므로 약 15~20%를 처리했다.
  3. 이를 통해 서비스 내 RAG에서는 중국어 단어들이 전혀 섞이지 않게 되었고, 일부러 고장 내려고 시도해도 한자를 보기 힘들게 되었다.

결과

추가적인 프롬프트 엔지니어링을 통해 모델을 일부러 고장 내기도 힘들게 만들었다. 그 결과, 서비스는 꽤나 쓸만한 상태가 되었고 런칭 준비를 완료할 수 있었다.

결론

언어모델의 토크나이저를 조작하여 특정 언어 환경에 최적화하는 과정은 도전적이지만, 그만큼 성과도 크다. Qwen2 72B Instruct 모델의 한국어 최적화 작업을 통해 더욱 높은 품질의 서비스를 제공할 수 있게 되었다. 이번 경험을 바탕으로 앞으로도 더 나은 서비스 최적화 방법을 모색해 나가겠다.