AI가 훌륭한 내용을 생성했지만 형식이 맞지 않아 개발팀이 파싱 코드를 따로 작성해야 했다는 경험, 익숙하지 않으신가요? 출력 형식 제어는 AI 응답의 내용뿐 아니라 구조까지 원하는 대로 설계하는 기술입니다. 이를 마스터하면 AI 산출물이 바로 시스템에 주입되거나 문서에 삽입될 수 있는 수준이 됩니다.
형식 없는 AI 출력이 만드는 비용
AI가 생성한 텍스트를 실제 시스템에 활용하려면 파싱, 정제, 변환 과정이 필요합니다. 이 후처리 작업은 개발자의 시간을 소비하고, 예외 케이스에서 버그를 만듭니다. 특히 AI 응답이 매번 약간씩 다른 형식으로 나오면 파싱 코드가 불안정해집니다. 형식 제어가 없는 AI 통합 프로젝트에서 후처리 코드 개발이 전체 작업의 30~40%를 차지하는 경우도 흔합니다.
반면 출력 형식을 정밀하게 제어하면 AI 응답이 곧바로 데이터베이스에 삽입되거나 API 응답으로 전달되거나 문서 템플릿에 주입될 수 있습니다. 개발자는 파싱 코드 대신 비즈니스 로직에 집중할 수 있습니다. 이 차이가 AI 통합 프로젝트의 개발 속도를 2~3배 가르는 핵심 변수입니다.
JSON 출력 제어의 기본 패턴
가장 널리 활용되는 출력 형식은 JSON입니다. AI에게 JSON을 요청할 때 가장 효과적인 방법은 스키마를 직접 제시하는 것입니다. "다음 스키마를 정확히 따르는 JSON을 반환하세요: { \"product_name\": string, \"price\": number, \"features\": string[], \"rating\": number }" 이렇게 필드명과 타입을 명시하면 AI는 해당 구조를 정확하게 준수합니다. TypeScript 인터페이스나 Python TypedDict를 그대로 붙여넣는 것도 효과적입니다.
주의할 점은 AI가 JSON 외에 설명 텍스트를 추가하는 것을 방지하는 것입니다. "JSON만 반환하고, 설명이나 마크다운 코드 블록 없이 순수 JSON 텍스트만 출력하세요"를 명시해야 합니다. 또한 중첩 구조가 복잡해질수록 AI의 스키마 준수율이 낮아지므로, 3단계 이상의 중첩은 분리된 여러 요청으로 나누는 것이 안전합니다.
마크다운·표·번호 목록 형식 제어
- 섹션 구조 지정: "## 헤딩을 사용하여 배경·분석·결론·권고안 4개 섹션으로 구성하세요"
- 표 형식 요청: "결과를 | 항목 | 현황 | 목표 | 차이 | 형식의 마크다운 표로 정리하세요"
- 번호 목록 제한: "우선순위 순으로 번호 목록 5개 이내로 요약하세요"
- 글자 수 제한: "각 항목의 설명은 50자 이내, 전체는 300자를 넘지 않게 작성하세요"
- 코드 블록 언어 지정: "예시 코드는 항상 ```python 코드 블록으로 감싸서 제공하세요"
형식 일관성을 높이는 Few-shot 예시
형식 지시어만으로는 AI가 미묘한 형식 요건을 완벽하게 준수하지 못하는 경우가 있습니다. 이때 Few-shot 예시가 강력한 보완책이 됩니다. "다음 형식을 따르세요. 예시: [입력 A] → [원하는 출력 형식 A], [입력 B] → [원하는 출력 형식 B]"를 함께 제공하면 AI는 설명만으로는 모호한 형식 규칙을 예시에서 패턴을 읽어 적용합니다. 특히 들여쓰기, 구두점, 줄바꿈 규칙 등 섬세한 형식 요건은 예시가 가장 정확합니다.
형식 검증과 재시도 로직
자동화 파이프라인에서 AI 출력 형식을 신뢰하는 것은 위험합니다. 항상 형식 검증 레이어를 추가해야 합니다. JSON이라면 json.loads()로 파싱 시도 후 실패 시 AI에게 재요청합니다. 재요청 시 "이전 응답이 유효한 JSON이 아니었습니다. 다음 오류를 참고하여 수정된 JSON을 반환하세요: [파싱 오류 메시지]"를 포함하면 AI가 정확히 무엇을 수정해야 하는지 파악하고 올바른 형식을 생성합니다. 최대 재시도 횟수를 3회로 제한하고 그 이후에는 에스컬레이션하는 설계를 권장합니다.
조건부 출력과 동적 스키마 설계
단일 고정 스키마가 모든 케이스를 커버하지 못하는 상황이 있습니다. 예를 들어 제품 분석 AI가 물리적 제품과 디지털 서비스를 모두 분석해야 한다면, 두 유형의 필드가 다릅니다. 이때 조건부 스키마가 필요합니다. "product_type이 physical이면 weight, dimensions 필드를 포함하고, digital이면 platform, subscription_model 필드를 포함하라"는 조건부 출력 지시어를 작성합니다. 이 패턴은 하나의 AI 엔드포인트가 여러 유형의 구조화된 출력을 생성해야 할 때 매우 유용합니다.
동적 스키마 설계의 또 다른 패턴은 출력 길이 조건입니다. "결과가 3개 미만이면 배열 대신 단일 객체로 반환하고, 3개 이상이면 results 배열로 감싸라"처럼 데이터 양에 따라 출력 구조가 달라지도록 설계할 수 있습니다. 파싱 코드에서 이 두 형식을 모두 처리하는 것은 복잡하므로, 가능하면 항상 배열 형식을 유지하되 단일 결과도 배열로 감싸는 것이 파싱 코드를 단순하게 유지하는 더 나은 접근입니다.
Key Takeaways
출력 형식 미제어 시 후처리 코드가 전체 AI 통합 개발의 30~40%를 차지할 수 있음
JSON 스키마를 필드명·타입 포함하여 직접 제시하는 것이 가장 효과적인 구조화 방법
미묘한 형식 규칙은 지시어보다 Few-shot 예시가 훨씬 정확하게 전달됨
자동화 파이프라인에서 형식 검증 + 재시도 로직은 안정성의 필수 요소
3단계 이상 중첩 JSON 구조는 여러 단계 요청으로 분해하는 것이 안전



