프롬프트 엔지니어링 · 구조화 출력

모델에서 JSON 데이터 출력하기

교사가 학생 정보를 입력하는 단계별 사례를 통해 프로그램에 구조화 데이터가 필요한 이유와 필드, 알 수 없는 값, JSON 검증 방법을 알아봅니다.

JSON이란 무엇인가?

JSON(JavaScript Object Notation, 자바스크립트 객체 표기법)은 널리 쓰이는 데이터 교환 형식입니다. 키와 값의 쌍으로 데이터를 구성해 사람이 읽기에도 편하고 프로그램이 파싱하기에도 좋습니다.

{
  "name": "John",
  "age": 30,
  "isStudent": false,
  "grades": [90, 85, 88],
  "address": {
    "city": "New York",
    "zipcode": "10001"
  }
}

이 예시는 한 사람의 이름, 나이, 학생 여부, 성적과 주소를 나타냅니다.

JSON의 값은 문자열, 숫자, 불리언, null, 배열 또는 객체일 수 있습니다. 주요 프로그래밍 언어 대부분이 JSON 처리 도구를 제공하므로 시스템 사이에서 데이터를 전송할 때 자주 쓰입니다.

그런데 모델에 JSON을 출력하게 해야 하는 이유는 무엇일까요?

예를 하나 살펴보겠습니다.

선생님의 고민

제가 초등학교 선생님이라고 가정해 봅시다. 개학 첫날, 반 아이들에게 자기소개를 쓰게 한 뒤 이 정보를 학생 관리 시스템에 입력하려고 합니다.

아이마다 쓰는 방식은 분명 다를 것입니다.

제 이름은 장산이고 아홉 살이며 행복 아파트에 살아요. 엄마는 선생님이고 아빠는 의사예요. 그림 그리기와 노래하기를 좋아해요.
저는 샤오메이이고 여덟 살이며 오동나무 정원에 살아요. 춤추기를 가장 좋아해요. 아빠는 매일 나쁜 사람을 잡고 엄마는 집에서 저를 돌봐요.

모델에 이름, 나이, 부모의 직업, 주소와 취미를 추출하게 할 수 있습니다.

장산의 글에는 부모의 직업이 명확히 적혀 있습니다. 샤오메이의 글에서는 “매일 나쁜 사람을 잡는다”는 말만으로 아버지가 반드시 경찰이라고 확신할 수 없고, “집에서 저를 돌본다”는 말만으로 어머니의 직업이 전업주부라고 단정할 수도 없습니다.

어떤 해석이 그럴듯하게 들린다는 이유만으로 추론을 사실로 기록해서는 안 됩니다.

따라서 더 신중한 결과라면 명확히 제공되지 않은 필드는 비워 두어야 합니다.

이름: 샤오메이
나이: 8세
아버지 직업: 제공되지 않음
어머니 직업: 제공되지 않음
집 주소: 오동나무 정원
취미: 춤추기

이렇게 보면 문제가 없어 보입니다.

그러나 이 데이터를 학생 관리 시스템에 입력해야 한다면 어떻게 해야 할까요?

학생이 두 명뿐이라면 직접 입력할 수 있습니다.

학생이 100명이라면요?

선생님이 녹초가 될 것입니다.

그래서 모델이 추출한 결과를 프로그램으로 일괄 가져오기로 합니다.

문제가 생겼습니다. 위의 결과는 여러 줄로 된 텍스트일 뿐입니다. 프로그램은 이름을 얻기 위해 첫째 줄을, 나이를 얻기 위해 둘째 줄을 읽을 수 있습니다.

이제 “성별” 필드를 추가한다고 가정해 봅시다.

이름: 샤오메이
성별: 여성
나이: 8세
아버지 직업: 제공되지 않음
어머니 직업: 제공되지 않음
집 주소: 오동나무 정원
취미: 춤추기

원래 둘째 줄이 나이였는데 이제 성별이 되었으므로 코드에서 오류가 날 수 있습니다.

어떤 학생은 줄 번호 대신 “나이:”라는 말을 직접 찾으면 되지 않겠느냐고 생각할 수 있습니다.

그렇다면 아버지와 어머니의 나이도 추가해야 할 때는 어떨까요?

이름: 샤오메이
나이: 8세
아버지 직업: 제공되지 않음
아버지 나이: 제공되지 않음
어머니 직업: 제공되지 않음
어머니 나이: 제공되지 않음
집 주소: 오동나무 정원
취미: 춤추기

필드가 늘어나면서 계층도 점점 복잡해집니다. 줄 번호와 문자열 잘라내기에 계속 의존하면 프로그램을 유지하기가 갈수록 어려워집니다.

근본적인 이유는 무엇일까요?

이 데이터에 안정적이고 명확한 구조가 없기 때문입니다.

JSON으로 계층 표현하기

같은 정보를 다음과 같이 쓸 수 있습니다.

{
  "name": "小美",
  "age": 8,
  "father": {
    "job": null,
    "age": null
  },
  "mother": {
    "job": null,
    "age": null
  },
  "address": "梧桐花园",
  "hobby": ["跳舞"]
}

이제 프로그램은 몇째 줄인지 추측하지 않고 name, age 또는 father.job을 직접 읽을 수 있습니다.

모든 작업에 JSON을 사용해야 하는 것은 아닙니다. 결과를 사람만 읽는다면 일반 텍스트나 Markdown이 더 자연스러운 경우가 많습니다. 결과를 프로그램이 이어서 처리해야 할 때 구조화 데이터가 특히 중요합니다.

모델에 JSON 출력을 요구하는 방법

<student></student>에서 학생 정보를 추출하고 JSON 객체 하나만 출력하세요.

필드:
- name: 문자열 또는 null
- age: 숫자 또는 null
- father_job: 문자열 또는 null
- mother_job: 문자열 또는 null
- address: 문자열 또는 null
- hobby: 문자열 배열

규칙:
- 원문에 명확히 제공된 정보만 추출합니다.
- 설명을 바탕으로 직업을 추측하지 않습니다.
- 제공되지 않은 단일 값 필드는 null로 씁니다.
- JSON 이외의 설명을 출력하지 않습니다.

<student>
{{학생 자기소개}}
</student>

여기서 가장 중요한 것은 단순히 “JSON을 반환하라”는 네 글자가 아닙니다.

필드, 유형, 누락값과 추론하면 안 되는 경계까지 설명했습니다.

모델이 “JSON입니다”라고 말하면 반드시 사용할 수 있을까요?

그렇지 않습니다.

설명을 덧붙이거나 필드를 누락하거나 잘못된 유형을 사용하거나 문법적으로 유효하지 않은 JSON을 만들 수 있습니다. 문법이 맞아도 내용이 업무 규칙에 맞지 않을 수 있습니다.

따라서 프로그램은 적어도 두 가지를 더 검사해야 합니다.

  1. 출력이 JSON parser(파서)로 해석되는가?
  2. 필드, 유형, 허용값과 업무 규칙이 올바른가?

플랫폼에서 Structured Outputs(구조화 출력)나 JSON Schema(JSON 스키마)를 지원한다면 플랫폼의 구조 제약 기능을 우선 사용할 수 있습니다. 다만 지원 범위는 바뀔 수 있으므로 실제 사용하는 인터페이스의 공식 문서를 기준으로 해야 합니다.

주의: 위의 학생 정보는 모두 가상의 예시입니다. 연습을 위해 실제 아동의 주소, 신분증 정보, 건강 정보 또는 그 밖의 민감한 데이터를 모델에 제출하지 마세요.

JSON은 결과를 프로그램에 더 쉽게 전달하게 해 주지만, 진정한 신뢰성은 필드를 명확히 정의하고, 알 수 없는 값을 추측하지 않고, 프로그램이 검증하며, 사람이 예외를 처리하는 데서 나옵니다.

이전 장: 구조화 Prompt 템플릿과 활용법

다음 장: XML 태그 제대로 활용하기

Luffy Liu
Luffy Liu

Independent product builder · AI, agents and real workflows.