로컬 LLM 벤치마킹 시 발생하는 CP949 오류 해결 및 자동 모델 추천 시스템 구축
요약
로컬 LLM 벤치마킹 과정에서 발생하는 CP949 인코딩 오류의 원인을 분석하고, UTF-8 명시적 설정을 통해 해결하는 방법을 다룹니다. 또한 자동 모델 추천 및 벤치마킹 시스템 구축 경험을 공유합니다.
핵심 포인트
- Windows 환경의 CP949 인코딩 오류 원인 및 해결법
- 로컬 LLM 워커의 파일 저장 시 UTF-8 인코딩 적용 필요성
- 자동 모델 다운로드 및 벤치마킹 루프 시스템 구축
- Gemma2:2b 모델의 한국어 처리 성능 우수성 확인
로컬 LLM (Large Language Model)을 벤치마킹할 때 CP949 인코딩 오류를 겪어보거나, 모델 관리 기능의 부족으로 답답함을 느낀 적이 있나요? 이 포스트에서는 CP949 인코딩 문제를 극복하고, 로컬 모델 연구 및 관리 역량을 강화하기 위해 자동 모델 추천 시스템을 구축한 경험을 공유하고자 합니다.
시도와 함정
처음에는 관리자 페이지에 로컬 모델을 전환하고 벤치마킹할 수 있는 간단한 기능을 만들고 싶었습니다. 또한 한국어로 된 더 다양한 벤치마킹 질문 세트도 준비했습니다.
// riel_agent/src/app/admin/tabs/LocalModelLabTab.tsx (발췌)
import { Button, Select, Input } from '@mantine/core';
...
모델을 전환하고 질문을 확장하는 것은 비교적 간단했습니다. 문제는 벤치마킹을 실행할 때, 특히 한국어 데이터를 사용할 때 빈번하게 발생하는 CP949 인코딩 오류였습니다.
UnicodeEncodeError: 'cp949' codec can't encode characters in position 1-3: illegal multibyte sequence
이 에러 메시지를 보고 처음에는 단순히 한국어 문자열 처리 문제라고 생각했습니다. 그래서 Python 파일의 인코딩 설정을 변경하거나 문자열을 utf-8로 명시적으로 인코딩/디코딩하려고 시도했습니다. 하지만 몇 시간 동안 씨름한 후에도 문제는 지속되었습니다.
# riel_backend/api/local_llm.py (초기 시도 중 일부)
import json
...
원인
몇 시간 동안의 디버깅 끝에 마침내 근본 원인을 찾아냈습니다. 이는 단순히 Python 스크립트 자체의 인코딩 문제가 아니었습니다. 로컬 LLM 워커 (worker)가 모델 응답을 처리하고 저장하는 과정에서, 특정 환경(특히 Windows)의 기본 인코딩인 CP949로 데이터를 강제 변환하려고 시도하고 있었습니다.
# tools/local_llm_worker/worker.py (실패 의심 지점)
def save_output(output_data: dict):
...
json.dump 함수를 ensure_ascii=False 옵션과 함께 사용하면 유니코드 (Unicode) 문자가 있는 그대로 출력됩니다. 하지만 파일을 저장할 때 encoding='cp949'를 지정하면, 해당 인코딩으로 변환을 시도하는 과정에서 오류가 발생했습니다.
해결 방법
해결 방법은 간단했습니다. 로컬 LLM 워커 (local LLM worker)가 파일을 저장할 때 명시적으로 utf-8 인코딩을 사용하도록 수정했습니다.
# tools/local_llm_worker/worker.py (수정 후)
import json
...
이와 더불어, 모델을 자동으로 다운로드하고, 벤치마킹(benchmarking)하며, 더 나은 모델을 추천하는 시스템을 구축했습니다.
# tools/local_llm_bench/auto_bench.py (자동 벤치마크 루프)
import os
...
이 과정에서 Gemma2:2b 모델이 이전에 사용하던 EXAONE 모델보다 성능이 현저히 뛰어나다는 것을 발견했습니다. 저는 이 발견을 문서화하여 공유했습니다.
## Gemma2:2b 모델 성능 분석 (2026년 6월 15일 기준)
최근 저는 자동화된 로컬 모델 벤치마킹 시스템을 사용하여 다양한 모델의 성능을 분석하고 있습니다. 특히, **Gemma2:2b** 모델이 이전에 사용하던 **EXAONE** 모델에 비해 한국어 처리 능력 및 전반적인 응답 품질 측면에서 상당한 우위를 보임을 확인했습니다.
...
결과
- 로컬 모델에 대한 연구, 관리 및 벤치마킹 능력이 크게 향상되었습니다.
- 벤치마크 실행 중 발생하던
CP949인코딩 오류가 완전히 해결되어 시스템 안정성이 개선되었습니다. - Gemma2:2b 모델이 EXAONE보다 성능이 뛰어나다는 점을 객관적으로 확인하고 문서화했습니다.
요약 — 동일한 함정을 피하기 위해
- 로컬 환경에서 파일 I/O (File I/O)를 수행할 때, 운영 체제의 기본 인코딩 (Windows의 경우
CP949)에 의존하지 마세요. 항상 명시적으로utf-8을 사용해야 합니다. - Python의
json.dump를 사용할 때, 파일 쓰기 과정에서encoding='utf-8'을 지정하고ensure_ascii=False옵션을 함께 사용하여 한국어 글자 깨짐(garbling) 및 인코딩 오류를 방지하세요. - 모델 성능을 개선하고 효율적인 운영을 보장하기 위해, 로컬 LLM 모델 관리 및 벤치마킹 (Benchmarking)을 위한 자동화 스크립트를 구축하세요.
- 다양한 모델을 정기적으로 벤치마킹하고, 성능이 뛰어난 모델을 발견하면 즉시 문서화하여 시스템에 반영하세요.
-
UnicodeEncodeError: 'cp949' codec can't encode characters...와 같은 오류가 발생하면, 코드 자체의 인코딩 문제뿐만 아니라 전체 시스템 환경과 파일 I/O 로직을 모두 조사하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기