30B 미만 오픈소스 모델로 사내 자동화를 돌릴 때 툴 콜링 오류가 터지는 이유
TuBrief Editorial
August 23, 2026
0
컴퓨터/소프트웨어Written with AI assistance from the source video. The video is the authority.
More from the community
Comments (0)
Log in to leave a comment
No posts yet
Written with AI assistance from the source video. The video is the authority.
Log in to leave a comment
No posts yet
벤치마크 점수만 보고 높은 정밀도의 모델을 올렸다가 낭패를 본 적이 있을 것이다. VRAM 용량을 넘어서는 순간 가중치 일부가 시스템 RAM으로 밀려나고, PCIe 버스 스와핑이 발생하면서 토큰 생성 속도가 초당 1개 미만으로 추락한다. RTX 4090 환경 기준으로 GGUF Q4_K_M 포맷을 쓰면 가중치 메모리는 18.3 GB를 먹고 8K 컨텍스트 기준 총 22.1 GB의 VRAM을 써서 겨우 안정적으로 돌아간다.
메모리 총량은 가중치 메모리, KV 캐시, 프레임워크 오버헤드를 다 더해서 계산해야 답이 나온다. 가중치는 파라미터 수에 양자화 실효 비트를 곱한 뒤 8로 나누면 나오는데, EXL2 4.0 bpw 포맷은 파라미터당 0.50 바이트를 먹는다. 여기에 컨텍스트 길이에 따라 불어나는 KV 캐시와 프레임워크 오버헤드 1.5 GB 이상을 더하면 최소 2 GB의 여유 공간이 있어야 OOM 에러를 피할 수 있다.
1단계로 본인 GPU의 VRAM 용량을 확인하고 가중치와 KV 캐시 점유율을 계산한다. 2단계로 GGUF Q4_K_M이나 EXL2 4.0 bpw 포맷의 모델 파일을 받아 로컬 환경에 붙인다. 3단계로 8K 이상의 프롬프트를 넣었을 때 토큰 생성 속도가 초당 30개 이상 유지되는지 30분 안에 직접 확인한다. 이 과정을 거치면 벤치마크 숫자에 휘둘리지 않고 내 장비에서 실제로 돌아가는 모델을 고를 수 있다.
30B 미만의 오픈소스 모델은 복잡한 JSON 구조를 만들라고 시키면 대괄호를 빼먹거나 마크다운 태그를 껴넣는 사고를 친다. 모델이 엉뚱한 대답을 내놓았다고 백엔드 파이프라인 전체가 멈춰버리면 밤에 잠을 잘 수가 없다. 토큰 생성 단계에서 아예 구문을 강제하고 애플리케이션 레벨에서 파싱 에러를 잡는 방어 코드를 같이 짜야 한다.
llama.cpp 환경에서는 GBNF 문법을 걸고 vLLM에서는 Guided Decoding을 써서 스키마에 안 맞는 토큰이 아예 생성되지 않도록 막아야 한다. Pydantic 라이브러리를 붙여서 모델 출력을 데이터 모델에 묶고, JSONDecodeError가 나면 에러 난 내용을 대화 이력에 집어넣어 스스로 고치게 유도하는 피드백 루프를 만든다. 무한 루프를 막으려면 시도 횟수를 3번으로 끊고, 그래도 안 되면 정적 안전 모드 객체를 뱉는 Fallback 아키텍처가 필수적이다.
1단계로 Pydantic을 써서 필수 필드와 데이터 타입이 박힌 검증 스키마 클래스를 만든다. 2단계로 정규식과 예외 처리 블록을 묶어서 모델의 원본 응답에서 진짜 JSON 문자열만 골라내고 파싱 에러를 실시간으로 잡는다. 3단계로 tenacity 라이브러리로 재시도 로직을 넣고, 마지막까지 실패하면 정적 Fallback 데이터를 리턴해 서비스 중단을 막는다. 이 구조를 박아두면 툴 콜링 스키마 준수율을 95% 이상으로 끌어올릴 수 있다.
웹 인터페이스 코드를 자동으로 뽑아내거나 거대한 트랜스크립트 파일에서 데이터를 긁어올 때, 30B 미만 모델은 중간 내용을 다 빼먹는 한계를 드러낸다. 모델이 쓸데없는 사과나 마크다운 주석을 주절주절 붙이지 못하게 만들고, 정확히 내가 원하는 구조로만 결과를 뱉도록 시스템 프롬프트에 족쇄를 채워야 한다.
시스템 프롬프트에 출력 스키마와 제약 조건을 박아넣어서 컴파일러처럼 일하게 만들어야 한다. 수십 페이지짜리 문서는 모델의 최대 안전 컨텍스트 길이에 맞춰 2,000 토큰 단위로 잘라내고, 경계선 데이터가 날아가는 걸 막으려고 이전 청크의 마지막 200 토큰을 다음 청크 맨 앞에 겹쳐서 넣어야 한다. 청크별로 데이터를 각각 뽑아내는 맵 단계를 거친 뒤 하나의 구조체로 합치는 리듀스 단계를 거쳐야 겨우 쓸만한 결과가 나온다.
1단계로 시스템 프롬프트 템플릿을 만들어 인사말 출력을 막고 Tailwind CSS 클래스 사용 같은 구체적인 제약 조건을 박는다. 2단계로 입력 문서를 10%의 중복 구간을 포함하는 슬라이딩 윈도우 방식으로 쪼갠다. 3단계로 Strategy Pattern을 적용한 LLMProviderInterface를 짜서 필요할 때 모델 엔진을 쉽게 갈아끼울 수 있는 추상화 계층을 완성한다. 이 프로세스를 적용하면 불필요한 디버깅 시간을 주당 5시간 이상 아낄 수 있다.