5.2 Structured Output 만들기
OpenAI의 GPT 모델을 활용한 응답 출력은 대부분 자연어 문장 형태로 이뤄지지만, 실제 서비스 개발에서는 CSV, JSON, Markdown, XML, 혹은 특정 필드 기반의 구조화된 데이터를 받는 것이 필요한 경우가 많습니다. 예를 들어:
상품 정보를 요약해 JSON 형식으로 정리
대화 결과를 Markdown 테이블로 출력
사용자의 질문에 대해 코드 블록과 설명을 함께 묶어서 제공
도서 요약 결과를 "제목, 요약, 저자" 항목으로 구분
이러한 구조화된 출력(Structured Output)은 사용자 경험 향상 및 후처리 자동화를 위해서 필수적인 기술입니다.
이번 절에서는 GPT 모델을 활용하여 Structured Output을 생성하는 일련의 전략과 프롬프트 기법, Best Practice, 그리고 예제 코드를 소개합니다.
5.2.1 Structured Output의 필요성과 목적
GPT는 기본적으로 자유로운 텍스트 생성에 강점이 있으므로 다음과 같은 제한적인 출력 포맷을 요구할 때는 명시적이고 반복적인 지시가 필요합니다.
UI 출력 템플릿 생성
Markdown, HTML
데이터 후처리
JSON, CSV
다른 시스템과 연동
JSON-RPC, XML 등
Excel 시트 만들기
TSV, CSV
코드 실행
특정 함수 호출 형태
이러한 목적에 따라 Structured Output은 다음과 같은 효과를 제공합니다.
신뢰성 있는 데이터 파싱 (JSON, key-value 등)
포맷 일관성 유지로 후속 처리 간소화
사용자 프론트엔드와의 직결 사용 가능
자동화 파이프라인에 직접 연동 가능
5.2.2 출력 형식을 명확히 지시하기
GPT 모델은 범용적인 생성 능력이 뛰어나지만, 구조화된 출력 달성에는 프롬프트에 명확성이 가장 중요합니다. 다음은 효과적인 출력 지시를 위한 전략입니다.
형식을 직접 설명하기
의도한 출력 형식을 구체적으로 설명합니다.
키 이름, 자료형, 샘플 값을 포함하면 효과적입니다.
예시:
사용자가 입력한 글을 분석하여 다음 JSON 형식으로 출력해 주세요:
{
"title": (한 문장 요약 제목),
"summary": (3문장으로 요약된 내용),
"keywords": [키워드1, 키워드2, 키워드3]
}
아래 형식 그대로, 완전히 올바른 JSON만 출력해야 합니다.
이렇게 출력 포맷을 JSON 객체의 예시로 직접 제시하면 모델이 이를 패턴으로 인식하여 출력을 보다 정확하게 수행하도록 유도할 수 있습니다.
출력 포맷 주석부 삽입
명시적으로 출력해야 할 필드 설명을 //
형식으로 모델에게 전달하면, 이를 기반으로 Field 단위 출력을 유도할 수 있습니다.
예:
다음 형식으로 정보를 구성하세요:
{
"제품명": "", // 제품의 전체 이름
"가격": 0, // 숫자 정수 형식
"설명": "", // 한 문장의 요약 설명
"카테고리": "" // 제품 분류
}
구체적인 필드를 나열함으로써 GPT는 의도한 필드 범위를 벗어나지 않고 정보를 조율합니다.
role:system의 활용
Chat Completions API에서는 system 메시지를 이용해, 일관된 출력 포맷을 요구할 수 있습니다.
{
"role": "system",
"content": "당신은 사용자의 질문을 분석하여 반드시 JSON 형식으로 응답해야 합니다. 키는 'question', 'intent', 'entities' (배열)로만 구성되어야 하며, 반드시 응답은 JSON 전체 외에는 아무 것도 포함해서는 안 됩니다."
}
이러한 system role을 먼저 주입하면 이후의 user 메시지에 대해 지속적으로 형식 일관성을 유지할 수 있는 환경이 됩니다.
5.2.3 출력 구조 최적화 전략
JSON 형태 강제화
"반드시 JSON 외에는 아무것도 출력하지 마세요."
"출력은 { }로 시작하고 { }로 끝나는 하나의 JSON 객체여야 합니다."
“코드 블록 없이 JSON만 출력하세요" 같은 예외 패턴 방지는 필수입니다.
예시:
입력된 문장을 다음과 같은 키로 요약하세요:
- "summary": 핵심 요약 (1문장)
- "opinion": 감정 평가 ("긍정", "부정", "중립")
- "labels": 키워드 배열 (최대 3개)
아래 JSON 형식으로 출력만 전송하세요. 텍스트나 설명 없이, 코드 블록도 포함하지 마세요.
이러한 형태를 통해 GPT가 꼭 필요한 필드만 생성하도록 만들 수 있습니다.
JSON + Markdown 병행 (Preview + 구조)
일부 서비스에서는 사용자에게 먼저 사람이 읽을 수 있는 요약을 보여주고, 이후 API 용도로 JSON을 따로 추가로 출력받는 경우도 있습니다.
예시 프롬프트:
사용자의 입력 문장을 간략하게 요약한 뒤, 내용 분석을 JSON으로 함께 출력하세요. 최종 출력은 아래 포맷처럼 구성하세요:
[요약 문단]
```json
{
"summary": "...",
"labels": ["...", "..."],
"mood": "긍정|부정|중립"
}
주의: GPT는 code block(```json ... ```)을 자주 포함하는 경향이 있음을 고려하여, 필요 시 이 블록을 제거하는 후처리 로직이 필요할 수 있습니다.
### 5.2.4 실전 샘플: 뉴스 기사 요약기
프롬프트 예시:
```python
import openai
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "당신은 뉴스 요약 도우미입니다. 사용자의 뉴스 기사 내용을 입력받아 반드시 JSON 형식으로 요약해 주세요. 아래 구조를 따르세요:\n{\n \"headline\": (제목 요약),\n \"summary\": (전체 내용 요약, 3문장),\n \"topics\": [주요 주제들]\n}\n순수 JSON만 출력하고, 설명은 절대 포함하지 마세요."
},
{
"role": "user",
"content": "2024년 4월, 유럽 연합은 인공지능 규제법(AI Act)을 최종 통과시키며 세계 최초의 포괄적 AI 규제 프레임워크를 마련했다..."
}
],
temperature=0.3
)
print(response['choices'][0]['message']['content'])
출력 예시:
{
"headline": "EU, 세계 최초 AI 규제법 제정",
"summary": "유럽 연합은 2024년 인공지능 규제법(AI Act)을 최종 통과시켰다. 해당 법안은 고위험 AI 시스템을 구분하고 감시 메커니즘을 포함한다. 이는 글로벌 AI 윤리 기준 마련의 시발점이 될 것으로 보인다.",
"topics": ["AI Act", "유럽 연합", "AI 규제"]
}
5.2.5 올바른 출력 유도 Best Practice 요약
출력 타입 명시
JSON, CSV, Markdown 등의 형식을 명시적으로 기술
field 구체화
각 필드의 이름, 타입, 예시 값을 프롬프트에 포함
시스템 역할 활용
system 메시지를 통한 전체 대화 일관성 유지
출력 경계 조건 강조
“JSON 외엔 아무 것도 출력하지 마세요.” 등 출력 범위 명시
validation 루틴 연계
응답을 받은 후 JSON Parse, Key 검사 등 검증 루틴 실행
5.2.6 문제 상황과 대응
GPT 모델은 다음과 같은 문제 상황을 일으킬 수 있습니다.
JSON 앞뒤에 자연어 설명 포함
"다음은 분석입니다: { … }"
system prompt에서 "설명 없이 JSON만 출력" 명시
JSON 내부에 주석 추가
"// 설명…"
JSON은 주석을 허용하지 않으므로 model 온도 조정 또는 프롬프트 수정
JSON 문법 오류
마침표 누락, 중괄호 불일치
후처리에서 JSON 파서와 재프롬프트 체계를 추가
JSON code block 포함
json {…}
후처리시 정규표현식으로 감싼 block 제거
5.2.7 Structured Output의 확장 가능성
JSON Mode (GPT 모델의 실험적 기능, Chat API에서 곧 지원 예정)
Function Calling과 연결하여 강제 구조화 (7장에서 상세히 탐구)
자동화된 JSON 스키마 검증 및 정합성 유지
Embedding 벡터화 이전 단계의 전처리 데이터 수득
이 절에서 배운 내용들은 실제 API 서비스, 대화형 챗봇, 데이터 파이프라인 등에 필수적으로 활용됩니다. 잘 구조화된 출력 설계는 시스템 신뢰성, 유지 보수성, 확장성까지도 좌우하는 핵심 요소입니다. 다음 장에서는 이러한 구조화를 넘어 함수 호출과의 결합으로 더욱 정밀한 컨트롤을 가능하게 하는 Function Calling 기법으로 넘어갑니다.
Last updated