GN⁺: OpenAI, API에서 구조화된 출력 지원
(openai.com)- API에 "Structured Outputs" 도입
- 개발자가 제공한 JSON 스키마에 맞춰 모델 출력이 정확히 일치하도록 하는 새로운 기능
- 작년 DevDay에서 JSON 모드를 소개했으나, 특정 스키마에 맞는 응답을 보장하지는 않음
- 구조화된 출력은 개발자가 제공한 스키마에 맞춰 모델 출력을 제한하고, 복잡한 스키마를 더 잘 이해하도록 모델을 훈련함
- 구조화된 출력의 필요성
- 비구조화된 입력에서 구조화된 데이터를 생성하는 것은 AI의 핵심 사용 사례 중 하나
- OpenAI API를 사용해 데이터 검색, 질문 응답, 데이터 추출, 다단계 작업 흐름 구축 등 다양한 작업 수행 가능
- 기존에는 오픈 소스 도구, 프롬프트, 재시도 등을 통해 모델 출력을 시스템과 상호 운용 가능한 형식으로 맞추려는 노력이 필요했음
- 구조화된 출력은 이러한 문제를 해결하여 개발자가 제공한 스키마에 맞춰 모델 출력을 제한함
- 성능 평가
- 복잡한 JSON 스키마를 따르는 평가에서 gpt-4o-2024-08-06 모델은 100% 점수를 기록
- gpt-4-0613 모델은 40% 미만의 점수를 기록
- 구조화된 출력 사용 방법
- 함수 호출을 통한 구조화된 출력: 함수 정의 내에서
strict: true
설정- 모든 도구를 지원하는 모델에서 사용 가능
- 함수 호출을 통한 구조화된 출력: 함수 정의 내에서
- 안전한 구조화된 출력
- OpenAI의 기존 안전 정책을 준수
- 모델이 안전하지 않은 요청을 거부할 수 있음
- API 응답에 거부 문자열 값이 포함되어 있어 모델이 거부를 생성했는지 프로그래밍적으로 감지 가능
- 네이티브 SDK 지원
- Python 및 Node SDK가 구조화된 출력을 네이티브로 지원
- Pydantic 또는 Zod 객체를 제공하여 JSON 스키마로 변환하고, JSON 응답을 자동으로 직렬화 및 구문 분석
- 제약 사항
- JSON 스키마의 일부만 지원
- 새로운 스키마로 첫 번째 API 응답 시 추가 지연 발생
- 모델이 안전하지 않은 요청을 거부할 수 있음
- 병렬 함수 호출과 호환되지 않음
- 구조화된 출력은 Zero Data Retention(ZDR) 대상이 아님
- 이용 가능 여부
- 구조화된 출력은 API에서 일반적으로 사용 가능
- 함수 호출을 통한 구조화된 출력은 모든 함수 호출을 지원하는 모델에서 사용 가능
- 응답 형식 옵션은 최신 모델에서 사용 가능
GN⁺의 정리
- OpenAI의 새로운 기능인 구조화된 출력은 JSON 스키마에 맞춰 모델 출력을 정확히 일치시키는 기능을 제공함
- 개발자는 이를 통해 데이터 검색, 질문 응답, 데이터 추출 등 다양한 작업을 더 신뢰성 있게 수행할 수 있음
- Python 및 Node SDK에서 네이티브로 지원되어 개발이 용이해짐
- 비구조화된 데이터에서 구조화된 데이터를 추출하는 등 다양한 추가 사용 사례가 있음
- 제약된 디코딩 기술을 사용하여 모델 출력을 제약하고, 유효한 JSON만 생성하도록 함
Hacker News 의견
-
GPT-4o를 사용하여 동적 UI와 코드를 구축함
- JSON 모드를 사용하여 안정적으로 작동함
- GPT-4o-mini에서는 형식 문제를 해결하는 데 도움이 될 것임
- 함수 호출 모드에서는 JSON 모드보다 성공률이 낮음
- 이 기능에 대해 기대가 큼
-
gpt-4o-2024-08-06의 주요 변경 사항
- 출력 토큰이 4k에서 16k로 증가함
- 입력 비용 50%, 출력 비용 33% 감소
- API 사용자에게 중요한 변화임
-
vLLM의 Outlines Structured Output 사용 경험
- OpenAI의 Structured Output보다 더 발전된 기능 제공
- 제한된 필드 타입 지원
- OpenAI는 String, Number, Boolean 등 기본 타입만 지원함
- Outlines는 정규 표현식 패턴을 정의할 수 있음
- 높은 스키마 설정 비용과 지연 시간
- vLLM과 Outlines는 거의 비용이 들지 않음
- OpenAI는 문맥 없는 문법 생성에 시간이 걸림
- OpenAI의 첫 단계로 좋은 출발이지만, 더 발전할 필요가 있음
-
AI 성능에 대한 의견
- AI가 출력 형식을 지정하는 것은 오래된 문제 해결 방식임
- 자연어 처리와 문제 해결 능력은 놀라운 발전임
- 그러나 이 결과를 얻기 위해 엄청난 계산이 필요함
-
OpenAI의 접근 방식에 대한 의견
- 구조화된 출력에 대한 미세 조정 접근 방식 포기
- llama.cpp는 이미 1.5년 전에 이 기능을 구현함
-
"strict: true" 옵션에 대한 혼란
- 항상 원하는 동작이므로 기본값이어야 함
- 제한된 디코딩 기술에 대해 배움
- 신뢰성을 높이고 지연 시간을 줄일 수 있음
-
JSON을 모델에 하드코딩하는 것이 AGI 목표와 반대 방향이라는 의견
-
OpenAI 기능 사용 시 잠금 효과에 대한 우려
- 다른 LLM으로 쉽게 이동할 수 없음
- 텍스트 프롬프트가 충분하지 않을 때만 사용 권장
-
JSON 형식 오류에 대한 지적
- {“val{“:2}는 유효한 JSON임
-
최상위 레벨이 객체여야 하는 이유에 대한 의문
- 배열을 객체로 감싸야 하는 불편함이 있음