Was this page helpful?
구조화된 출력은 Claude의 응답을 특정 스키마를 따르도록 제한하여 다운스트림 처리를 위한 유효하고 파싱 가능한 출력을 보장합니다. 구조화된 출력은 두 가지 상호 보완적인 기능을 제공합니다:
output_config.format): Claude의 응답을 특정 JSON 형식으로 얻기strict: true): 도구 이름 및 입력에 대한 스키마 검증 보장이러한 기능을 독립적으로 사용하거나 동일한 요청에서 함께 사용할 수 있습니다.
구조화된 출력은 Claude API에서 Claude Mythos Preview, Claude Opus 4.7, Claude Opus 4.6, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Opus 4.5, Claude Haiku 4.5에서 일반적으로 사용 가능합니다. Amazon Bedrock에서는 구조화된 출력이 Claude Mythos Preview, Claude Opus 4.6, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Opus 4.5, Claude Haiku 4.5에서 일반적으로 사용 가능합니다. Claude Opus 4.7은 Amazon Bedrock 연구 미리보기를 통해 사용 가능합니다. 구조화된 출력은 Microsoft Foundry에서 베타 버전입니다. 구조화된 출력은 Google Cloud의 Vertex AI for Claude Mythos Preview에서 지원되지 않습니다.
This feature qualifies for Zero Data Retention (ZDR) with limited technical retention. See the Data retention section for details on what is retained and why.
베타에서 마이그레이션하시나요? output_format 매개변수가 output_config.format으로 이동했으며, 베타 헤더는 더 이상 필요하지 않습니다. 이전 베타 헤더(structured-outputs-2025-11-13)와 output_format 매개변수는 전환 기간 동안 계속 작동합니다. 업데이트된 API 형태는 아래의 코드 예제를 참조하세요.
구조화된 출력이 없으면 Claude는 형식이 잘못된 JSON 응답이나 애플리케이션을 손상시키는 유효하지 않은 도구 입력을 생성할 수 있습니다. 신중한 프롬프팅을 사용하더라도 다음과 같은 문제가 발생할 수 있습니다:
구조화된 출력은 제한된 디코딩을 통해 스키마 준수 응답을 보장합니다:
JSON.parse() 오류 없음JSON 출력은 Claude의 응답 형식을 제어하여 Claude가 스키마와 일치하는 유효한 JSON을 반환하도록 합니다. JSON 출력은 다음이 필요할 때 사용하세요:
응답 형식: response.content[0].text의 스키마와 일치하는 유효한 JSON
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}JSON 스키마 정의
Claude가 따를 구조를 설명하는 JSON 스키마를 만듭니다. 스키마는 표준 JSON Schema 형식을 사용하며 일부 제한 사항이 있습니다(JSON Schema 제한 사항 참조).
output_config.format 매개변수 추가
API 요청에 output_config.format 매개변수를 포함하고 type: "json_schema"와 스키마 정의를 포함합니다.
응답 파싱
Claude의 응답은 스키마와 일치하는 유효한 JSON이며 response.content[0].text에서 반환됩니다.
SDK는 스키마 변환, 자동 검증, 인기 있는 스키마 라이브러리와의 통합을 포함하여 JSON 출력 작업을 더 쉽게 해주는 헬퍼를 제공합니다.
Python SDK의 client.messages.parse()는 편의상 output_format을 계속 허용하며 내부적으로 output_config.format으로 변환합니다. 다른 SDK는 output_config을 직접 요구합니다. 아래 예제는 SDK 헬퍼 구문을 보여줍니다.
원본 JSON 스키마를 작성하는 대신 언어에 익숙한 스키마 정의 도구를 사용할 수 있습니다:
client.messages.parse()와 함께 Pydantic 모델zodOutputFormat() 또는 jsonSchemaOutputFormat()과 함께 입력된 JSON Schema 리터럴이 있는 Zod 스키마outputConfig(Class<T>)를 통한 자동 스키마 파생이 있는 일반 Java 클래스output_config: {format: Model}과 함께 Anthropic::BaseModel 클래스outputConfig: ['format' => MyClass::class]과 함께 StructuredOutputModel을 구현하는 클래스output_config을 통해 전달되는 원본 JSON 스키마각 SDK는 구조화된 출력 작업을 더 쉽게 해주는 헬퍼를 제공합니다. 전체 세부 사항은 개별 SDK 페이지를 참조하세요.
Python, TypeScript, Ruby 및 PHP SDK는 지원되지 않는 기능이 있는 스키마를 자동으로 변환합니다:
minimum, maximum, minLength, maxLength)additionalProperties: false 추가이는 Claude가 단순화된 스키마를 수신하지만 코드가 검증을 통해 모든 제약 조건을 계속 강제한다는 의미입니다.
예제: minimum: 100이 있는 Pydantic 필드는 전송된 스키마에서 일반 정수가 되지만, SDK는 설명을 "최소 100이어야 함"으로 업데이트하고 원본 제약 조건에 대해 응답을 검증합니다.
도구 입력에 대한 JSON Schema 준수를 문법 제약 샘플링으로 적용하려면 엄격한 도구 사용을 참조하세요.
JSON 출력과 엄격한 도구 사용은 서로 다른 문제를 해결하며 함께 작동합니다:
결합하면 Claude는 보장된 유효한 매개변수로 도구를 호출할 수 있고 구조화된 JSON 응답을 반환할 수 있습니다. 이는 신뢰할 수 있는 도구 호출과 구조화된 최종 출력이 모두 필요한 에이전트 워크플로우에 유용합니다.
구조화된 출력은 컴파일된 문법 아티팩트를 사용한 제약 샘플링을 사용합니다. 이는 인식해야 할 몇 가지 성능 특성을 도입합니다:
name 또는 description 필드만 변경하면 캐시가 무효화되지 않습니다구조화된 출력을 사용할 때 Claude는 자동으로 예상 출력 형식을 설명하는 추가 시스템 프롬프트를 받습니다. 이는 다음을 의미합니다:
output_config.format 매개변수를 변경하면 해당 대화 스레드에 대한 프롬프트 캐시가 무효화됩니다구조화된 출력은 몇 가지 제한사항이 있는 표준 JSON 스키마를 지원합니다. JSON 출력과 엄격한 도구 사용 모두 이러한 제한사항을 공유합니다.
Python, TypeScript, Ruby 및 PHP SDK는 지원되지 않는 기능을 제거하고 필드 설명에 제약을 추가하여 스키마를 자동으로 변환할 수 있습니다. 자세한 내용은 SDK 특정 방법을 참조하세요.
구조화된 출력을 사용할 때 객체의 속성은 스키마에서 정의된 순서를 유지하지만 한 가지 중요한 주의사항이 있습니다: 필수 속성이 먼저 나타나고 선택적 속성이 뒤따릅니다.
예를 들어 이 스키마가 주어진 경우:
{
"type": "object",
"properties": {
"notes": { "type": "string" },
"name": { "type": "string" },
"email": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "email"],
"additionalProperties": false
}출력은 속성을 다음과 같이 정렬합니다:
name (필수, 스키마 순서)email (필수, 스키마 순서)notes (선택적, 스키마 순서)age (선택적, 스키마 순서)이는 출력이 다음과 같이 보일 수 있음을 의미합니다:
{
"name": "John Smith",
"email": "[email protected]",
"notes": "Interested in enterprise plan",
"age": 35
}출력의 속성 순서가 애플리케이션에 중요한 경우 모든 속성을 필수로 표시하거나 구문 분석 로직에서 이 재정렬을 고려하세요.
구조화된 출력은 대부분의 경우 스키마 준수를 보장하지만 출력이 스키마와 일치하지 않을 수 있는 시나리오가 있습니다:
거부 (stop_reason: "refusal")
Claude는 구조화된 출력을 사용할 때도 안전성과 도움이 되는 속성을 유지합니다. Claude가 안전상의 이유로 요청을 거부하는 경우:
stop_reason: "refusal"이 있습니다토큰 제한 도달 (stop_reason: "max_tokens")
max_tokens 제한에 도달하여 응답이 중단된 경우:
stop_reason: "max_tokens"이 있습니다max_tokens 값으로 다시 시도하세요구조화된 출력은 JSON 스키마를 Claude의 출력을 제약하는 문법으로 컴파일하여 작동합니다. 더 복잡한 스키마는 컴파일하는 데 더 오래 걸리는 더 큰 문법을 생성합니다. 과도한 컴파일 시간으로부터 보호하기 위해 API는 여러 복잡도 제한을 적용합니다.
다음 제한은 output_config.format 또는 strict: true가 있는 모든 요청에 적용됩니다:
| 제한 | 값 | 설명 |
|---|---|---|
| 요청당 엄격한 도구 | 20 | strict: true가 있는 도구의 최대 개수입니다. 엄격하지 않은 도구는 이 제한에 포함되지 않습니다. |
| 선택적 매개변수 | 24 | 모든 엄격한 도구 스키마 및 JSON 출력 스키마 전체의 총 선택적 매개변수입니다. required에 나열되지 않은 각 매개변수는 이 제한에 포함됩니다. |
| 합집합 타입이 있는 매개변수 | 16 | 모든 엄격한 스키마 전체에서 anyOf 또는 타입 배열(예: "type": ["string", "null"])을 사용하는 총 매개변수입니다. 이들은 지수 컴파일 비용을 생성하기 때문에 특히 비용이 많이 듭니다. |
이러한 제한은 단일 요청의 모든 엄격한 스키마 전체의 합계에 적용됩니다. 예를 들어 각각 6개의 선택적 매개변수가 있는 4개의 엄격한 도구가 있는 경우 어떤 단일 도구도 복잡해 보이지 않더라도 24개 매개변수 제한에 도달합니다.
위의 명시적 제한 외에도 컴파일된 문법 크기에 대한 추가 내부 제한이 있습니다. 이러한 제한은 스키마 복잡도가 단일 차원으로 축소되지 않기 때문에 존재합니다: 선택적 매개변수, 합집합 타입, 중첩된 객체 및 도구 수와 같은 기능은 컴파일된 문법을 불균형적으로 크게 만들 수 있는 방식으로 서로 상호작용합니다.
이러한 제한을 초과하면 "Schema is too complex for compilation." 메시지와 함께 400 오류를 받게 됩니다. 이러한 오류는 스키마의 결합된 복잡도가 효율적으로 컴파일될 수 있는 것을 초과함을 의미합니다. 최종 안전장치로 API는 180초의 컴파일 타임아웃도 적용합니다. 모든 명시적 검사를 통과하지만 매우 큰 컴파일된 문법을 생성하는 스키마는 이 타임아웃에 도달할 수 있습니다.
복잡도 제한에 도달한 경우 다음 전략을 순서대로 시도하세요:
중요한 도구만 엄격하게 표시하세요. 많은 도구가 있는 경우 스키마 위반이 실제 문제를 일으키는 도구에 예약하고 더 간단한 도구의 경우 Claude의 자연스러운 준수에 의존하세요.
선택적 매개변수를 줄이세요. 가능한 경우 매개변수를 required로 만드세요. 각 선택적 매개변수는 문법의 상태 공간의 일부를 대략 두 배로 늘립니다. 매개변수가 항상 합리적인 기본값을 가지는 경우 필수로 만들고 Claude가 해당 기본값을 명시적으로 제공하도록 하는 것을 고려하세요.
중첩된 구조를 단순화하세요. 선택적 필드가 있는 깊게 중첩된 객체는 복잡도를 증가시킵니다. 가능한 경우 구조를 평탄화하세요.
여러 요청으로 분할하세요. 많은 엄격한 도구가 있는 경우 별도의 요청이나 하위 에이전트 전체에 분할하는 것을 고려하세요.
유효한 스키마의 지속적인 문제의 경우 스키마 정의와 함께 지원팀에 문의하세요.
구조화된 출력을 사용할 때 프롬프트와 응답은 ZDR로 처리됩니다. 그러나 JSON 스키마 자체는 최적화 목적으로 마지막 사용 이후 최대 24시간 동안 임시로 캐시됩니다. 프롬프트 또는 응답 데이터는 API 응답 이상으로 보존되지 않습니다.
구조화된 출력은 HIPAA 적격이지만 JSON 스키마 정의에 PHI를 포함하면 안 됩니다. API는 JSON 스키마를 메시지 콘텐츠와 별도로 캐시되는 문법으로 컴파일하며 이러한 캐시된 스키마는 프롬프트 및 응답과 동일한 PHI 보호를 받지 않습니다. 스키마 속성 이름, enum 값, const 값 또는 pattern 정규식에 PHI를 포함하지 마세요. PHI는 HIPAA 보호 조치에 따라 보호되는 메시지 콘텐츠(프롬프트 및 응답)에만 나타나야 합니다.
모든 기능에 걸친 ZDR 및 HIPAA 적격성은 API 및 데이터 보존을 참조하세요.
다음과 함께 작동합니다:
output_config.format)과 엄격한 도구 사용(strict: true)을 함께 사용호환되지 않음:
output_config.format으로 인용이 활성화되면 400 오류를 반환합니다.문법 범위: 문법은 Claude의 직접 출력에만 적용되며 도구 사용 호출, 도구 결과 또는 생각 태그(Extended Thinking 사용 시)에는 적용되지 않습니다. 문법 상태는 섹션 간에 재설정되어 Claude가 자유롭게 생각할 수 있으면서도 최종 응답에서 구조화된 출력을 생성할 수 있습니다.
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract the key information from this email: John Smith ([email protected]) is interested in our Enterprise plan and wants to schedule a demo for next Tuesday at 2pm.",
}
],
output_config={
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"email": {"type": "string"},
"plan_interest": {"type": "string"},
"demo_requested": {"type": "boolean"},
},
"required": ["name", "email", "plan_interest", "demo_requested"],
"additionalProperties": False,
},
}
},
)
print(response.content[0].text)from pydantic import BaseModel
from anthropic import Anthropic
class ContactInfo(BaseModel):
name: str
email: str
plan_interest: str
demo_requested: bool
client = Anthropic()
response = client.messages.parse(
model="claude-opus-4-7",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract the key information from this email: John Smith ([email protected]) is interested in our Enterprise plan and wants to schedule a demo for next Tuesday at 2pm.",
}
],
output_format=ContactInfo,
)
print(response.parsed_output)response = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Help me plan a trip to Paris departing May 15, 2026",
}
],
# JSON outputs: structured response format
output_config={
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"summary": {"type": "string"},
"next_steps": {"type": "array", "items": {"type": "string"}},
},
"required": ["summary", "next_steps"],
"additionalProperties": False,
},
}
},
# Strict tool use: guaranteed tool parameters
tools=[
{
"name": "search_flights",
"strict": True,
"input_schema": {
"type": "object",
"properties": {
"destination": {"type": "string"},
"date": {"type": "string", "format": "date"},
},
"required": ["destination", "date"],
"additionalProperties": False,
},
}
],
)
print(response)