TL;DR: OpenAI API에서 커스텀 출력 형식을 설정하려면 시스템 프롬프트, JSON 모드, 함수 호출(Function Calling), 그리고 최신 Structured Outputs 기능을 활용하면 됩니다.
왜 커스텀 출력 형식이 중요한가?
AI 애플리케이션을 개발할 때 가장 흔히 겪는 문제 중 하나는 예측 불가능한 출력 형식입니다. GPT 모델은 기본적으로 자유로운 텍스트를 생성하기 때문에, 이를 그대로 애플리케이션에 통합하면 파싱 오류나 데이터 불일치가 발생할 수 있습니다. 커스텀 출력 형식을 설정하면 다음과 같은 이점을 누릴 수 있습니다.
• 데이터베이스나 API와의 원활한 통합
• 일관된 데이터 구조 보장
• 후처리 작업의 간소화
• 애플리케이션 안정성 향상
2024년 현재, OpenAI는 개발자들이 출력 형식을 제어할 수 있는 여러 가지 강력한 도구를 제공하고 있습니다. 이 가이드에서는 각 방법을 실제 코드 예제와 함께 자세히 살펴보겠습니다.
방법 1: 시스템 프롬프트를 활용한 형식 제어
가장 기본적인 방법은 시스템 프롬프트(System Prompt)에서 원하는 출력 형식을 명확하게 지시하는 것입니다. 이 방법은 추가적인 API 설정 없이도 사용할 수 있어 빠르게 적용할 수 있습니다.
효과적인 시스템 프롬프트 작성법
시스템 프롬프트에서 출력 형식을 지정할 때는 구체적이고 명확하게 작성해야 합니다. 예를 들어, "항상 JSON 형식으로 응답하세요"라고 명시하거나, 원하는 출력 구조의 예시를 직접 제공하는 것이 효과적입니다. 단, 이 방법만으로는 100% 일관된 형식을 보장하기 어렵습니다. 모델이 지시를 따르지 않는 경우도 있기 때문입니다. 따라서 더 안정적인 방법과 함께 사용하는 것을 권장합니다.
방법 2: JSON 모드(JSON Mode) 활성화
OpenAI API는 JSON 모드를 제공하여 모델이 항상 유효한 JSON 형식으로 응답하도록 강제할 수 있습니다. 이 기능은 `response_format` 파라미터를 통해 활성화할 수 있습니다.
import openai
client = openai.OpenAI(api_key="your-api-key")
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": "당신은 제품 정보를 JSON 형식으로 반환하는 어시스턴트입니다. 항상 name, price, description 필드를 포함하세요."
},
{
"role": "user",
"content": "아이폰 15 프로에 대한 정보를 알려주세요."
}
],
response_format={"type": "json_object"}
)
result = response.choices[0].message.content
print(result)
# 출력 예시:
# {
# "name": "아이폰 15 프로",
# "price": "1,550,000원",
# "description": "Apple의 최신 프리미엄 스마트폰..."
# }
JSON 모드 사용 시 주의사항
JSON 모드를 사용할 때는 반드시 시스템 프롬프트나 사용자 메시지에서 JSON 형식으로 응답하라는 지시를 포함해야 합니다. 그렇지 않으면 API 오류가 발생할 수 있습니다. 또한 JSON 모드는 유효한 JSON 구조는 보장하지만, 특정 필드나 스키마를 강제하지는 않습니다. 이를 위해서는 다음에 소개할 Structured Outputs를 사용해야 합니다.
방법 3: Structured Outputs로 스키마 강제 적용
2024년에 출시된 Structured Outputs 기능은 OpenAI API의 출력 형식 제어에서 가장 강력한 도구입니다. JSON Schema를 사용하여 출력의 정확한 구조를 정의할 수 있으며, 모델은 반드시 해당 스키마를 준수한 응답을 생성합니다.
from openai import OpenAI
from pydantic import BaseModel
from typing import List
client = OpenAI(api_key="your-api-key")
# Pydantic 모델로 스키마 정의
class ProductReview(BaseModel):
product_name: str
rating: int
pros: List[str]
cons: List[str]
summary: str
recommend: bool
# Structured Outputs 사용
response = client.beta.chat.completions.parse(
model="gpt-4o-2024-08-06",
messages=[
{
"role": "system",
"content": "제품 리뷰를 분석하고 구조화된 형식으로 반환하세요."
},
{
"role": "user",
"content": "맥북 프로 M3 리뷰: 성능이 뛰어나고 배터리가 오래가지만 가격이 비싸고 포트가 부족합니다."
}
],
response_format=ProductReview
)
review = response.choices[0].message.parsed
print(f"제품명: {review.product_name}")
print(f"평점: {review.rating}")
print(f"추천 여부: {review.recommend}")
Structured Outputs의 핵심 장점
Structured Outputs는 단순한 JSON 형식 보장을 넘어서 타입 안전성까지 제공합니다. Pydantic 모델을 활용하면 Python 코드에서 바로 객체로 사용할 수 있어 개발 생산성이 크게 향상됩니다. 또한 중첩된 객체, 배열, 열거형(Enum) 등 복잡한 데이터 구조도 정확하게 처리할 수 있습니다.
방법 4: Function Calling을 통한 고급 형식 제어
Function Calling(함수 호출)은 모델이 특정 함수를 호출하는 형태로 구조화된 데이터를 반환하도록 하는 방법입니다. 이 방법은 특히 외부 API 연동이나 복잡한 워크플로우에서 유용합니다.
함수 호출을 설정할 때는 `tools` 파라미터에 함수의 이름, 설명, 그리고 파라미터 스키마를 JSON Schema 형식으로 정의합니다. 모델은 사용자의 요청에 따라 적절한 함수를 선택하고, 해당 함수에 맞는 인수를 JSON 형식으로 반환합니다. 이를 통해 자연어 입력을 구조화된 함수 호출로 변환하는 강력한 인터페이스를 구현할 수 있습니다.
실제 활용 사례
예를 들어, 사용자가 "서울에서 부산까지 내일 오전 10시 KTX 표를 예매해줘"라고 입력하면, 함수 호출을 통해 `{"departure": "서울", "destination": "부산", "date": "2024-12-15", "time": "10:00", "type": "KTX"}`와 같은 구조화된 데이터를 추출할 수 있습니다. 이를 실제 예매 시스템 API에 바로 전달할 수 있어 매우 효율적입니다.
Anakin.ai로 더 쉽게 커스텀 출력 형식 관리하기
직접 코드를 작성하지 않고도 OpenAI API의 커스텀 출력 형식을 활용하고 싶다면, Anakin.ai를 사용해보세요. Anakin.ai는 직관적인 인터페이스를 통해 다양한 AI 모델을 활용한 애플리케이션을 빠르게 구축할 수 있는 플랫폼입니다. JSON 출력 형식 설정, 프롬프트 템플릿 관리, API 연동 등을 코딩 없이도 손쉽게 처리할 수 있어 개발자뿐만 아니라 비기술 사용자도 강력한 AI 워크플로우를 구현할 수 있습니다. 특히 반복적인 데이터 처리 작업이나 구조화된 콘텐츠 생성에 매우 유용합니다.
출력 형식 선택 가이드
어떤 방법을 선택해야 할지 고민된다면 다음 기준을 참고하세요.
• 빠른 프로토타입 개발: 시스템 프롬프트 방식
• 기본적인 JSON 출력 보장: JSON 모드
• 엄격한 스키마 준수 필요: Structured Outputs
• 외부 시스템 연동 및 복잡한 워크플로우: Function Calling
• 코드 없이 빠른 구현: Anakin.ai 플랫폼 활용
프로덕션 환경에서는 Structured Outputs를 기본으로 사용하고, 필요에 따라 Function Calling을 조합하는 것을 권장합니다. 또한 항상 출력 결과에 대한 유효성 검사 로직을 추가하여 예외 상황에 대비하는 것이 좋습니다.
자주 묻는 질문 (FAQ)
Q: JSON 모드와 Structured Outputs의 차이점은 무엇인가요?
JSON 모드는 유효한 JSON 형식의 응답을 보장하지만, 특정 필드나 데이터 타입을 강제하지 않습니다. 반면 Structured Outputs는 개발자가 정의한 JSON Schema를 100% 준수하는 응답을 생성하며, Pydantic 모델과 통합하여 타입 안전성까지 보장합니다. 정확한 스키마가 필요한 프로덕션 환경에서는 Structured Outputs를 사용하는 것이 더 안전합니다.
Q: Structured Outputs를 지원하는 모델은 어떤 것들이 있나요?
현재 Structured Outputs는 gpt-4o-2024-08-06 이상의 모델에서 지원됩니다. gpt-4o-mini도 Structured Outputs를 지원합니다. 이전 버전의 모델(예: gpt-4-turbo)에서는 JSON 모드 또는 Function Calling을 사용해야 합니다. 모델 선택 시 OpenAI 공식 문서에서 최신 지원 현황을 확인하는 것을 권장합니다.
Q: 출력 형식 설정 시 토큰 비용이 증가하나요?
Structured Outputs나 Function Calling을 사용하면 스키마 정의를 위한 추가 토큰이 소비될 수 있습니다. 특히 복잡한 JSON Schema를 사용할 경우 입력 토큰이 증가합니다. 그러나 OpenAI는 동일한 스키마를 반복 사용할 때 캐싱을 적용하여 비용을 최적화합니다. 비용 효율성을 위해 스키마를 최대한 간결하게 유지하고, 동일한 스키마를 재사용하는 것이 좋습니다.