본문으로 건너뛰기

소형 언어 모델의 출력 공간 제한 최적화

소형 언어 모델의 자유 생성과 파싱을 후보 라벨 로짓 점수화로 바꿔 처리 시간과 형식 오류를 줄이는 방법입니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

산업 현장의 티켓 라우팅과 문서 태깅처럼 유효한 답의 집합이 정해진 업무에서는 Small Language Model에 자유 텍스트를 생성시킨 뒤 파싱하는 방식보다 후보 라벨의 로짓을 직접 비교하는 편이 효율적입니다. 이 방식은 한 번의 forward pass에서 라벨 첫 토큰의 점수만 추려 argmax를 적용하므로, 출력 토큰을 여러 개 순차 생성하지 않고 허용되지 않은 답도 구조적으로 배제합니다. Qwen/Qwen2.5-0.5B-Instruct로 600개 티켓을 처리한 실험에서 자유 생성은 134초가 걸렸고, constrained scoring은 약 30% 짧은 시간이 걸렸으며 파싱 불가 결과는 구조상 0건이었습니다. 라벨의 첫 토큰이 겹치거나 공백 포함 여부를 잘못 처리하면 점수가 왜곡되므로 토큰화 조건을 확인하고, 낮은 confidence 결과는 사람 검토로 보내야 합니다.

섹션별 상세

산업 현장의 티켓 분류, 양식 필드 추출, 문서 태깅, 사람 검토 대상 선별처럼 입력과 출력 공간이 제한되고 호출량이 큰 업무는 Small Language Model에 적합합니다. 한 개 GPU에 들어가거나 CPU에서 실행되는 모델이 수 밀리초 안에 결과를 반환하면, 항목당 비용이 최대 1,000배 높을 수 있는 대규모 모델 API보다 실용적인 선택이 될 수 있습니다. 다만 단일 추론이 10밀리초에 끝나는 환경에서는 긴 프롬프트, 자유 텍스트 생성, 정규식 파싱, Python의 개별 호출이 오히려 병목과 오류를 키우므로 모델 주변의 처리 방식까지 좁은 자동화에 맞춰야 합니다.
자유 텍스트 방식은 모델에 라벨을 생성하게 한 뒤 결과 문자열에서 정규식이나 부분 문자열로 답을 찾습니다. generate()는 출력 토큰마다 순차적인 forward pass를 수행하므로 8개 토큰을 요청하면 직접 답을 고르는 경우보다 대략 8배의 계산이 필요하고, 모델이 “Sure! This looks like a billing issue.”처럼 형식 밖의 문장을 반환하면 fallback이나 재시도가 필요합니다. 글의 600개 티켓 실험에서 모든 결과를 파서가 처리했지만 실행 시간은 134초였고, 일부 입력에서는 잘못된 라벨이 선택되는 문제가 드러났습니다.
근거
  • 자유 텍스트 생성 방식은 600개 티켓을 처리하는 데 134초가 걸렸다. 자유 텍스트 방식의 Output 블록에 기록된 'Free-form generation took' 결과와 본문 실행 시간 설명
제안된 constrained scoring은 텍스트를 생성하지 않고 한 번의 forward pass에서 마지막 위치의 다음 토큰 로짓을 읽습니다. billing, technical, account의 첫 토큰 ID만 추출한 뒤 세 로짓에 softmax를 적용하고 argmax로 승자를 고르므로 유효 라벨 밖의 출력과 UNPARSED 결과가 구조적으로 발생하지 않습니다. 같은 Qwen/Qwen2.5-0.5B-Instruct 설정에서 실행 시간은 자유 생성보다 약 30% 짧았고, 600개 결과의 구조적 파싱 실패 수는 0건이었습니다.
근거
  • 제한된 라벨 점수화 방식은 자유 생성보다 약 30% 짧은 시간이 걸렸다. Constrained Output Space 절의 실행 결과와 'about 30% less time' 문장
  • 후보 라벨의 첫 토큰 로짓만 비교하면 허용된 라벨 밖의 결과를 구조적으로 차단할 수 있다. Constrained Output Space 절의 logits[0, -1, :] 설명과 label_first_ids, argmax 코드
  • 제한된 로짓에 softmax를 적용하면 후보 라벨 간 confidence를 계산할 수 있다. Constrained Output Space 절의 softmax 코드와 confidence 출력 예시
  • 두 라벨이 첫 토큰을 공유하면 전체 라벨 시퀀스를 점수화하거나 서로 다른 단일 토큰 라벨을 사용해야 한다. 토큰화 주의사항에서 refund_request와 refund_status 사례 및 대안 제시
라벨의 첫 토큰이 서로 다르다는 전제가 이 방식의 핵심 제약입니다. refund_request와 refund_status처럼 첫 토큰을 공유하는 라벨은 전체 라벨 시퀀스의 점수를 비교하거나, 프롬프트에 범례를 둔 A·B·C처럼 서로 다른 단일 토큰 라벨로 바꿔야 하며, encode(label)와 encode(" " + label)의 차이도 확인해야 합니다. 후보 라벨에만 계산한 confidence가 0.6보다 낮으면 사람 검토 대기열로 보내도록 구성할 수 있어, 소형 모델의 불확실한 판단이 후속 업무로 바로 전달되는 일을 줄일 수 있습니다.

용어 해설

소형 언어 모델(Small Language Model (SLM))
대규모 언어 모델보다 작은 파라미터 규모로 실행되는 언어 모델입니다. 이 글에서는 한 개 GPU에 탑재하거나 CPU에서도 구동할 수 있고, 수 밀리초 안에 제한된 분류 결과를 반환하는 모델을 뜻합니다. 호출량이 많은 좁은 자동화 업무에서 비용과 지연을 줄이는 선택지로 활용됩니다.
로짓(Logits)
언어 모델이 다음 토큰마다 부여하는 정규화 전 점수입니다. 글에서는 전체 어휘의 로짓 중 후보 라벨에 해당하는 토큰만 골라 비교하고, 제한된 점수에 softmax를 적용해 후보 간 confidence를 계산합니다. 생성 없이 한 번의 추론으로 분류할 수 있는 핵심 값입니다.
바이트 수준 BPE 토크나이저(Byte-level BPE Tokenizer)
텍스트를 바이트 단위와 부분 단어 단위의 토큰으로 나누는 토크나이저입니다. 공백이 포함된 문자열과 그렇지 않은 문자열을 서로 다른 토큰으로 처리할 수 있으므로, 모델이 실제로 출력할 형태에 맞춰 라벨을 인코딩해야 올바른 로짓을 비교할 수 있습니다.
Softmax
여러 점수를 합이 1인 확률 분포로 바꾸는 함수입니다. 이 글에서는 전체 어휘가 아니라 유효한 라벨의 로짓에만 적용해 후보 집합 안의 confidence를 구합니다. 정한 임계값보다 낮은 결과를 사람 검토 대기열로 보낼 때 활용할 수 있습니다.
다음 토큰 분포(Next-token Distribution)
현재 입력 뒤에 올 각 토큰의 예측 점수 분포입니다. 자유 텍스트를 여러 토큰 생성하는 대신 마지막 위치의 분포에서 사전에 정한 라벨 토큰만 선택하면, 허용되지 않은 출력이 구조적으로 배제됩니다. 고정된 답 집합을 가진 분류 업무에 적합합니다.

기술

  • Qwen/Qwen2.5-0.5B-Instruct
  • Hugging Face Transformers
  • PyTorch
  • Accelerate
  • Python
  • M2 Macbook Air
  • Neural Engine

활용 사례

  • 지원 티켓을 billing, technical, account로 라우팅
  • 양식에서 특정 필드 추출
  • 문서 태깅
  • 사람 검토 대상 레코드 선별
  • 낮은 confidence 결과를 사람 검토 대기열로 전달
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 08. 13.수집 2026. 08. 13.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.