"이 캠페인 분석해서 카테고리·우선순위·메모로 정리해줘"라고 LLM에게 부탁하면, 어떤 날엔 마크다운 표로 답하고, 다른 날엔 자유 산문으로 답합니다. 자동화 파이프라인 입장에서는 매번 답 형식이 달라져 파서가 깨집니다. structured output은 이 문제를 해결합니다 — JSON Schema로 출력 형식을 박아두면 모델이 그 schema를 만족하는 JSON만 뱉습니다. 마케터가 LLM을 운영 자동화에 끼워 넣을 때 가장 먼저 쥐어야 할 도구입니다.
마케터가 이 글을 읽어야 하는 이유: 카피 양산·캠페인 분류·KPI 추출 같은 작업이 자동화되면, 매일 수백 번 LLM이 호출됩니다. 출력 한 줄이 다른 형식이면 파이프라인 한 단계가 통째로 멈춥니다. structured output은 그 안정성을 보장하는 가장 단순하고 강력한 장치이고, 마케터가 schema 한 줄만 잘 적어도 자동화의 운영 사고가 절반 이상 사라집니다.

자유 텍스트의 풍성함을 잃는 대신 운영 안정성이 폭증한다 — 자동화에 들어갈 LLM은 거의 항상 이쪽.
1. 왜 자유 텍스트가 운영에서 깨지는가
LLM의 기본 출력 모드는 자유 텍스트입니다. 같은 프롬프트에 같은 모델이라도 응답 형식이 매번 흔들립니다.
| 호출 | 모델 응답 형식 |
|---|---|
| 1회차 | "카테고리는 검색 광고이고, 우선순위는 높음입니다. 메모로는…" |
| 2회차 | "[카테고리] 검색 광고 / [우선순위] 높음" (마크다운 굵게 사용) |
| 3회차 | "검색 광고 - 우선순위 상 - 메모: 시즌 종료 임박" |
| 4회차 |
{ category: '검색', priority: 'high', memo: ... } (따옴표 누락) |
자동화 파이프라인은 이 변동을 감당하기 어렵습니다. 정규식·텍스트 파싱으로 잡으려고 하면 새로운 형식이 나올 때마다 깨지고, 그때마다 파이프라인이 멈춥니다.
📌 이 글의 전제
독자가 LLM API를 한 번이라도 들어봤고, "JSON"이라는 형식이 어떻게 생겼는지는 안다고 가정합니다. JSON Schema가 정확히 뭔지 모르더라도 글 안에서 풀어 설명합니다.
2. JSON Schema의 한 줄 직관
JSON Schema는 JSON이 만족해야 할 형식을 적은 메타 문서입니다.
출력에 어떤 키가 있어야 하고, 각 키의 타입·허용 값이 무엇인지를 미리 박아둔 계약서.
마케팅 자리의 예시:
| 항목 | 타입 | 제약 |
|---|---|---|
category |
string | enum: ["search", "display", "video", "social"]
|
priority |
string | enum: ["low", "mid", "high"]
|
memo |
string | 최대 200자 |
tags |
array of string | 최대 5개 |
이 schema를 LLM에 함께 넘기면, 모델은 자유 텍스트가 아닌 schema를 만족하는 JSON만 출력합니다. 4개 키 모두 있고, category는 4개 enum 값 중 하나이고, tags는 5개 이내입니다. 자동화 파이프라인이 안정적으로 받습니다.
3. Strict mode — 문법 보장과 의미 보장
JSON Schema에는 두 단계 보장이 있습니다.
3-1. 문법 보장 — JSON으로 파싱 가능한가
가장 약한 단계입니다. 따옴표·괄호·콤마가 깨지지 않은 valid JSON인지만 검사합니다. OpenAI의 response_format={"type": "json_object"}나 Anthropic의 JSON mode가 이 단계입니다.
3-2. 의미 보장 — schema와 정확히 일치하는가
OpenAI의 response_format={"type": "json_schema", "schema": ..., "strict": true} 또는 Anthropic의 tool use를 활용한 schema enforcement가 이 단계입니다. 키 이름, 타입, enum 값까지 schema와 정확히 일치하는 JSON만 통과합니다.
운영에서는 거의 항상 두 번째 단계를 씁니다. 문법만 맞고 키가 빠지거나 enum 외 값이 들어오면 다음 단계가 깨지기 때문입니다.
⚠️ strict mode가 자유도를 죽이는 자리
strict mode를 쓰면 모델이 schema에 없는 정보를 답에 포함시키지 못합니다. 캠페인 분석 같은 자유 서술이 필요한 자리에 strict를 박아두면 답이 평면적으로 변합니다. 분류·추출·라벨링은 strict, 산문 생성은 비-strict가 일반 룰입니다.
4. 마케팅 자동화에서 자주 만나는 자리 4가지
4-1. 캠페인 분류·라벨링
수백 개의 캠페인 메모를 카테고리·우선순위·플랫폼으로 라벨링하는 작업. 입력은 자유 텍스트, 출력은 정형화된 JSON. structured output의 가장 흔한 자리.
4-2. 카피 풀에서 메타데이터 추출
100개 광고 카피에서 "타겟 페르소나", "감정 톤", "CTA 종류"를 추출하는 작업. 한 카피에 여러 라벨이 동시에 붙는 경우 array of enum 활용.
4-3. 보고서 자동 생성의 데이터 단
LLM이 보고서를 작성하기 전에, 데이터 요약을 schema로 먼저 받습니다. "이번 주 ROAS 상위 캠페인 3개와 그 변화율"을 schema로 받고, 그 데이터를 바탕으로 자유 산문 보고서를 작성하는 두 단계 흐름. 산문 단계는 non-strict, 데이터 단은 strict.
4-4. 사용자 의도 분류
챗봇에 들어오는 질문을 "데이터 조회 vs 일반 질문 vs 액션 요청"으로 분류해 다른 도구로 보내는 라우팅 단계. 의도 분류가 깨지면 모든 후속 단계가 깨지므로 strict 필수.
| 자리 | strict 필요? | schema 깊이 |
|---|---|---|
| 분류·라벨링 | 강제 | 얕음 (1-2 level) |
| 메타데이터 추출 | 강제 | 중간 (array of object) |
| 보고서 데이터 단 | 강제 | 깊음 (nested object) |
| 의도 분류 | 강제 | 매우 얕음 (single enum) |
| 자유 답변 | 비-strict | — |
5. 코드 한 묶음 — strict mode 호출
이게 글에 박는 유일한 코드입니다. OpenAI의 strict mode로 캠페인 분류 자동화를 보여줍니다.
python
Top comments (0)