로컬 LLM 출력이 유효한 JSON 스키마를 위반하는 원인은 무엇인가요?

에바 왕기술 작가 그리고 이자 ZimaSpace의 상주 장인입니다. 평생을 기술에 열정을 가진 사람으로서 홈랩과 오픈소스 소프트웨어에 열정을 가지고 있으며,복잡한 기술 개념을 쉽게 이해할 수 있는 실습 가이드로 번역하는 데 전문성을 가지고 있습니다.에바는 셀프 호스팅이 어렵지 않고 재미있어야 한다고 믿습니다. 그녀의 튜토리얼을 통해 커뮤니티가 하드웨어 설정의 신비를 풀도록돕고 있습니다. 첫 NAS 구축부터 Docker 컨테이너 마스터링까지.

로컬 LLM의 출력이 유효한 JSON 스키마를 위반하는 이유는 생성, 제약 처리, 중지 규칙, 검증이 동일한 계약을 적용하지 않기 때문입니다.

셀프 호스팅 워크플로에서 파일 메타데이터, 스마트 홈 작업, 문서 추출 또는 도구 인수를 위한 표준 준수 스키마를 제공하더라도 잘못되었거나 거부된 출력을 받을 수 있습니다. “유효한 스키마”라는 말은 스키마 문서가 유효하다는 뜻일 뿐, 전체 실행 경로가 유효하다는 뜻은 아닙니다. 모델은 작업을 이해해야 하고, 디코더는 관련 스키마 기능을 지원해야 하며, 중지 조건이 출력을 끊기 전에 생성이 완료되어야 합니다. 또한 파서는 완전한 JSON 값을 복원해야 하고, 애플리케이션 검증기는 예상되는 초안 및 강제 변환 규칙을 적용해야 합니다.

유효한 JSON과 스키마에 유효한 JSON은 서로 다른 결과입니다

객체가 성공적으로 파싱되더라도 필수 필드, 유형, 열거형, 배열 제한 또는 조건부 분기를 위반할 수 있습니다. 필드 이름은 올바르지만 스키마에서 금지한 속성이 추가될 수도 있습니다.

Python의 JSON 모듈은 JSON 문서 디코딩을 위한 구문 계층을 정의하지만, 파싱 자체가 별도의 JSON Schema 계약을 적용하지는 않습니다.

이 원인은 구문 오류 없이 출력이 로드되지만 스키마 검증 이후에만 실패할 때 확인할 수 있습니다. 중괄호 누락이나 뒤에 붙은 설명은 직렬화 실패이고, 정수가 필요한 곳에 문자열이 들어가는 것은 계약 실패입니다.

스키마 조합으로 충족하기 어려운 분기가 만들어질 수 있습니다

allOf, anyOf, oneOf, not과 같은 키워드는 제약 조건을 결합합니다. 각 분기는 독립적으로는 유효할 수 있지만, 결합된 객체가 허용된 대안 중 어느 것도 충족하지 못하거나 여러 대안을 동시에 충족할 수 있습니다.

JSON Schema 가이드에서는 스키마 조합 키워드가 하나 또는 여러 하위 스키마와 일치해야 하는지를 어떻게 바꾸는지 설명합니다.

로컬 모델은 중첩된 조건부 로직보다 평면적인 속성 목록을 더 안정적으로 처리하는 경우가 많습니다. 합집합이나 상호 배타적인 객체 형태에서 실패가 집중된다면, 주요 원인은 기본적인 JSON 구두점이 아니라 분기 선택에 대한 부담입니다.

제약 디코더가 스키마의 일부만 지원할 수 있습니다

구조화된 출력 엔진은 스키마를 토큰 제약, 문법, 정규식 또는 백엔드별 규칙으로 변환합니다. 모든 엔진이 모든 JSON Schema 초안이나 키워드를 구현하는 것은 아닙니다.

vLLM은 여러 구조화된 출력 백엔드를 제공하며, JSON 스키마, 문법, 정규식, 고정 선택지 제약이 서로 다른 실행 모드임을 보여줍니다.

표준 검증기에서는 같은 스키마가 올바르게 검증되지만 특정 추론 백엔드에서만 실패한다면 이 원인에 해당할 가능성이 큽니다. 지원되지 않는 재귀, 참조, 패턴 또는 조건부 키워드는 모델이 생성하기 전에 단순화되거나 무시되거나 거부될 수 있습니다.

프롬프트 지침이 스키마와 충돌할 수 있습니다

사용자 프롬프트는 해설, 인용, 설명, 선택적 필드 생략 또는 자연어로 표현한 불확실성을 요구하는 반면, 스키마는 고정된 필드만 포함하는 단일 객체를 요구할 수 있습니다.

그러면 모델에는 두 가지 상충하는 성공 기준이 생깁니다. 하나는 사용자에게 대화형으로 답하는 것이고, 다른 하나는 기계 계약상 허용되는 토큰만 출력하는 것입니다. 소형 로컬 모델은 두 지침을 조정하기보다 더 최근에 제시되었거나 더 두드러지는 지침을 따를 수 있습니다.

이러한 실패에서는 앞에 서문이 붙거나, 마크다운 코드 펜스가 추가되거나, 객체 뒤에 설명이 이어지거나, 선언된 열거형을 위반하지만 산문 요청에는 부합하는 값이 추가되는 경우가 많습니다. 스키마는 유효하지만 지침 계층이 일관되지 않은 것입니다.

잘림으로 인해 올바른 계획이 잘못된 출력이 될 수 있습니다

중첩된 배열과 객체는 모든 구조를 닫을 만큼 충분한 생성 토큰이 필요합니다. 토큰 제한, 중지 문자열, 취소된 요청 또는 중단된 스트림으로 인해 마지막 구분자가 도착하기 전에 응답이 끝날 수 있습니다.

Transformers는 생성 종료 시점을 결정하는 최대 토큰 및 중지 제어 기능을 제공합니다.

이 근본 원인은 특히 큰 배열이나 긴 문자열 필드에서 유효한 접두부가 갑자기 끊기는 형태로 나타납니다. 초반부터 유형 위반이 반복된다면 다른 원인을 의심해야 하며, 출력 제한 지점 근처에서 닫는 괄호가 누락된다면 생성이 완료되지 않았다는 뜻입니다.

검증기 의미론이 모델이 동등하다고 판단한 값을 거부할 수 있습니다

모델은 정수 대신 "3"을 출력하거나, 생략된 필드 대신 null을 사용하거나, 소문자 열거형을 출력하거나, 애플리케이션이 요구하는 형식과 다른 ISO 날짜를 출력할 수 있습니다.

Pydantic은 누락된 값, 잘못된 JSON, 열거형 불일치, 금지된 추가 필드 및 호환되지 않는 유형에 대해 서로 다른 검증 오류 범주를 문서화합니다.

모든 실패가 파싱은 가능하지만 거부된 값이 들어간 동일한 필드에서 발생한다면 무작위적인 스키마 오류가 아닙니다. 강제 변환, 엄격성, null 허용 여부, 대소문자 또는 애플리케이션 수준 형식에 대한 불일치입니다.

문법 제약은 구문을 보존하지만 비즈니스 의미까지 보장하지는 않습니다

문법은 잘못된 중괄호와 키를 차단할 수 있지만, 종료 날짜가 시작 날짜보다 빠르거나 존재하지 않는 파일 경로를 지정하는 등 의미상 불가능한 조합은 여전히 허용할 수 있습니다.

llama-cpp-python은 문법 제약 생성을 추론 제어 기능으로 제공하지만, 문법은 외부 사실이 아니라 허용되는 토큰 구조를 제어합니다.

필드 간 규칙으로 인해 발생한 스키마 실패는 두 번째 검증 계층에서만 나타날 수 있습니다. 출력은 구문 및 구조상 유효하더라도 홈 서버 워크플로에서 사용할 수 없을 수 있습니다.

후처리로 인해 원래 유효했던 모델 출력이 손상될 수 있습니다

애플리케이션은 때때로 마크다운을 제거하거나, 중괄호로 둘러싸인 첫 번째 블록을 추출하거나, 스트리밍 청크를 병합하거나, 쉼표를 복구하거나, 검증 전에 값을 변환합니다.

스트림 청크가 중복되거나, 유니코드가 잘못 디코딩되거나, 이스케이프 시퀀스가 제거되거나, 복구 함수가 중첩된 내용을 수정하면 유효한 모델 응답도 잘못된 응답으로 바뀔 수 있습니다. 반대로 복구 단계가 원시 모델 출력이 잘못되었다는 사실을 가릴 수도 있습니다.

ZimaSpace의 소형 로컬 모델이 JSON 출력 중 환각을 일으키는 이유에 대한 설명은 인접한 경계를 보여줍니다. 스키마 유효성과 사실적 정확성은 별도로 측정해야 하며, 애플리케이션 변환 전에 원시 응답을 보존해야 합니다.

FAQ

유효한 JSON이면 출력이 스키마와 일치한다는 뜻인가요?

아니요. JSON 파싱은 구문을 확인합니다. 스키마 검증은 필수 속성, 유형, 열거형, 분기, 제한 및 기타 선언된 제약 조건을 별도로 확인합니다.

온도를 0으로 설정하면 스키마 오류를 방지할 수 있나요?

아니요. 하나의 디코딩 경로를 더 반복 가능하게 만들 수는 있지만, 지원되지 않는 스키마 기능을 추가하거나 잘림을 방지하거나 충돌하는 지침을 해결하지는 못합니다.

제약 디코딩으로 사용 가능한 자동화 레코드를 보장할 수 있나요?

아니요. 지원되는 구조적 제약은 보장할 수 있지만, 비즈니스 규칙, 출처 근거, 파일 존재 여부, 권한 및 필드 간 일관성은 여전히 애플리케이션 검증이 필요합니다.

기술 및 AI 허브

더 읽어보기

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.