LLM 응답이 파싱 오류 없이 정해진 형식으로 나오게 하는 도구
고객 이메일에서 긴급도를 뽑거나 제품 설명을 분류할 때, 모델이 엉뚱한 형식의 텍스트를 내뱉어 파싱 코드가 깨지는 상황을 겪어본 적 있을 것입니다. Outlines는 생성이 진행되는 동안 허용된 토큰만 선택하도록 제한하여, 요청한 구조의 데이터만 반환받게 합니다. Python의 타입 시스템처럼 원하는 출력 형식을 지정하면, 모델이 그 구조에 맞춰 답변을 생성합니다.
생성 단계에서 구조를 고정하는 방식
대부분의 기존 방식은 모델이 생성한 텍스트를 나중에 정규식이나 파서로 처리하여 구조를 맞춥니다. 하지만 이 방법은 모델이 예상치 못한 형식을 반환할 때 쉽게 실패합니다. Outlines는 생성이 진행되는 동안 허용된 토큰만 선택하도록 제한하여, 처음부터 올바른 구조의 데이터를 만들어냅니다. 덕분에 파싱 오류나 형식 불일치로 인한 코드 수정이 필요 없습니다. OpenAI, Ollama, vLLM 등 다양한 모델 제공자와 호환되어, 모델만 교체하면 동일한 코드로 실행할 수 있습니다.
Python 타입으로 정의하는 출력 형식
Outlines는 Python의 내장 타입과 Pydantic 모델을 활용하여 출력 구조를 정의합니다. 단순한 분류 작업에는 Literal을 사용해 허용된 값 목록을 지정하고, 숫자 추출에는 int를 사용합니다. 복잡한 객체가 필요할 때는 Pydantic 모델을 정의하여 필드와 타입을 명시하면 됩니다. 함수 시그니처를 직접 전달하면 Outlines가 필요한 파라미터 구조를 자동으로 추론하여 함수 호출을 위한 인자를 생성하기도 합니다. 이러한 방식은 개발자가 별도의 JSON 스키마 파일을 관리할 필요 없이, 코드 안에서 타입을 정의하는 것만으로 구조를 제어할 수 있게 합니다.
실무에서 활용되는 시나리오
고객 지원 티켓을 처리할 때, 이메일 내용에서 우선순위, 카테고리, 매니저 승인 필요 여부 등을 구조화된 데이터로 추출하여 라우팅에 사용할 수 있습니다. 이커머스 환경에서는 제품 설명을 분석하여 주요 카테고리, 하위 카테고리, 속성 목록을 추출해 재고 관리 시스템에 반영합니다. 회의 일정 조율 시에는 자연어 요청에서 날짜, 시간, 참석자 목록을 추출하여 해당 함수를 자동으로 호출하는 방식도 지원합니다. 정보 부족으로 구조화된 데이터를 생성할 수 없는 경우, '모름'과 같은 특정 문자열을 반환하도록 Union 타입을 설정하여 예외 처리를 유연하게 할 수 있습니다.
도입 전 확인해야 할 사항
Outlines는 Python 환경에서 pip install outlines로 설치하며, transformers, OpenAI, VLLM 등 다양한 모델 통합을 지원합니다. 현재 .txt API는 초기 접근 단계에 있으며, XML이나 FHIR와 같은 특수 스키마나 문법 지원이 필요하면 파트너십을 통해 협의해야 합니다. 이 도구는 생성 과정의 구조적 무결성을 보장하지만, 모델 자체의 내용 정확성이나 사실성까지 보장하지는 않습니다. 따라서 중요한 의사결정에 사용되기 전, 추출된 데이터의 내용적 정확성을 검증하는 로직을 별도로 마련해야 합니다.