AI 기능을 서비스에 붙일 때, 데모 단계에서는 AI 답변을 채팅창에 그대로 보여 주는 경우가 많아요. 그런데 그 답을 표에 넣거나, 데이터베이스에 저장하거나, 다음 화면으로 넘기려는 순간 문제가 생겨요. 같은 질문에도 답의 모양이 매번 조금씩 달라지기 때문이에요.
이 글은 AI 답변을 프로그램이 읽을 수 있는 정해진 형식으로 받는 방법, 구조화 출력(Structured Outputs)을 Anthropic과 OpenAI의 공식 문서 기준으로 정리했어요.
자유 문장 답변이 화면에서 깨지는 이유
사람이 읽을 때는 "요약: …", "핵심 3가지: …"처럼 대충 비슷하면 충분해요. 하지만 프로그램은 정확히 같은 자리에서 같은 이름의 값을 찾아야 해요. 어떤 날은 제목 줄이 빠지고, 어떤 날은 목록이 4개가 되고, 어떤 날은 설명 문장이 앞에 붙으면 화면 코드가 그 답을 읽지 못해요.
그래서 많은 팀이 처음에는 프롬프트에 "JSON으로만 답해 줘"라고 적어요. JSON은 이름과 값을 짝지어 적는 데이터 형식이에요. 대부분은 잘 되지만, 가끔 괄호가 빠지거나 필드 이름이 바뀌면 그 요청 하나가 실패해요. 사용자가 많아질수록 이 "가끔"이 매일 일어나요.
구조화 출력은 무엇이 다른가
구조화 출력은 답의 모양을 JSON 스키마(어떤 필드가 있고, 각 값이 글자인지 숫자인지 정한 설계도)로 먼저 정해 주고, 모델이 그 설계도에 맞는 답만 내도록 하는 기능이에요.
| 방식 | 보장하는 것 |
|---|---|
| 프롬프트로 "JSON으로 답해 줘" | 보장 없음, 대부분 맞음 |
| JSON 모드 | 올바른 JSON 문법 |
| 구조화 출력(스키마 지정) | 문법 + 정한 필드와 값의 종류 |
Anthropic 문서는 구조화 출력이 제약된 디코딩(정해진 형식에서 벗어나는 글자를 고르지 못하게 하는 방식)으로 스키마에 맞는 응답을 보장한다고 설명해요. OpenAI 문서도 JSON 모드는 문법만 맞춰 주고, 구조화 출력은 지정한 스키마를 지키도록 보장한다고 구분해요. 덕분에 형식이 틀린 답을 다시 요청하는 재시도 코드를 크게 줄일 수 있어요.
우리 회사 자료로 직접 확인해 보고 싶다면AI 도입 진단 · 자료를 보고 적용 후보와 순서를 정리해 드려요상담 신청스키마는 이렇게 설계해요
스키마는 화면과 저장 구조에서 거꾸로 정하면 쉬워요. 화면에 무엇을 보여 주고 무엇을 저장할지 먼저 적고, 그 값만 필드로 만들어요.
- 필수 필드만: 화면에 꼭 필요한 값만 넣고, 나머지는 빼요
- 선택지는 목록으로: 분류 · 상태처럼 값이 정해진 것은 enum(허용 값 목록)으로 묶어요
- "모름" 자리 만들기: 자료에 답이 없을 때 쓸 필드(예: found: false)를 두면, 모델이 빈칸을 그럴듯한 말로 채우는 일을 줄일 수 있어요
- 설명은 짧게: 필드마다 한 줄 설명을 붙이면 모델이 값을 더 정확히 채워요
구조화 출력이 해결하지 못하는 것
형식이 보장된다고 내용까지 맞는 것은 아니에요. 필드에 들어간 숫자나 이름이 사실인지는 따로 확인해야 해요.
공식 문서에 적힌 한계도 알아 두면 좋아요. Anthropic 문서는 최소 · 최대값이나 글자 수 제한 같은 일부 스키마 조건은 지원하지 않는다고 안내해요(SDK가 받은 응답을 다시 검사해 줌). OpenAI는 strict 모드에서 모든 필드를 required로 두고 additionalProperties를 false로 두라고 안내해요. 또 안전 정책 때문에 모델이 답을 거절하면, 그 거절을 프로그램에서 따로 알아챌 수 있게 돼 있어요. 거절했을 때 보여 줄 화면도 같이 정해 두세요.
시작 순서 정리
- 화면 · 저장 구조에서 필요한 값을 적어요
- 그 값으로 JSON 스키마를 만들어요(필수 필드 · 허용 값 목록 · "모름" 자리)
- 구조화 출력을 켜고, 받은 값은 코드에서 한 번 더 검사해요
- 중요한 값은 원문 대조 단계를 둬요
AI 답변이 정해진 모양으로 들어오기 시작하면, 그다음부터는 평범한 데이터처럼 표로 보여 주고, 저장하고, 다른 기능과 연결할 수 있어요.
참고
- Anthropic, Structured outputs: https://platform.claude.com/docs/en/build-with-claude/structured-outputs
- OpenAI, Structured model outputs: https://developers.openai.com/api/docs/guides/structured-outputs