메뉴 닫기

Amazon Bedrock 사용자 정의 모델에 구조화 출력 기능 추가

아마존 베드락(Amazon Bedrock) 사용자 정의 모델에 구조화 출력 기능 도입

소개

생성형 AI 기술의 발전과 더불어, 기업 환경에서는 더욱 정확하고 예측 가능한 출력이 요구되고 있습니다. 고객 서비스 챗봇이나 문서 자동화 시스템처럼 정형화된 결과가 필요한 경우, 생성 모델의 자유로운 텍스트 응답은 오히려 불확실성과 오류의 주요 원인이 됩니다. 이를 해결하기 위해 AWS는 Amazon Bedrock의 Custom Model Import 기능에 구조화 출력(Structured Output)을 추가했습니다. 이제 사용자 정의 모델에서 실시간으로 JSON 같은 형식화된 스키마를 기반으로 응답을 생성할 수 있습니다.

이 글에서는 구조화 출력이 어떤 원리로 작동하는지, 어떻게 API에 적용하는지, 실제 활용 사례에서 어떻게 자동화와 신뢰성을 확보하는지 자세히 살펴보겠습니다.

구조화 출력(Structured Output)의 이해

구조화 출력은 모델의 추론 결과가 사전에 정의된 스키마에 실시간으로 부합되도록 제약(Constrained Decoding)을 설정하는 과정입니다. 예를 들어 유효한 JSON 구조만을 허용하며, 스키마를 벗어나는 응답은 생성 중 즉시 거부되어 구조적 일관성을 유지합니다. 일반적인 “JSON으로 응답해 주세요” 같은 프롬프트로는 출력의 정확성을 보장하기 어렵지만, 구조화 출력은 추론 단계 그 자체에서 형식을 제어하므로 높은 신뢰도를 제공합니다.

정확하고 일관된 필드명이 적용된 출력은 데이터베이스 자동반영, API 호출, 워크플로우 자동화 등에 이상적입니다. 예를 들어 고객 지원 분류 시스템에서는 다음과 같은 출력이 가능합니다.

{
"category": "billing",
"priority": "high",
"sentiment": "negative"
}

이처럼 기계가 이해할 수 있는 형식으로 모델의 결과를 만드는 것은 AI를 실제 기업 시스템에 널리 도입하기 위한 핵심 요건입니다.

구조화 출력의 장점

  1. 성능 향상 및 비용 절감
    군더더기 없는 출력은 토큰 사용량을 줄이고 응답 속도를 높여 전체 라티시(latency)를 낮춥니다.

  2. 보안 강화
    스키마에 없는 내용은 응답에 포함되지 않으므로 프롬프트 인젝션 공격을 방지할 수 있습니다.

  3. 정책 및 규제 준수
    사전 허용된 필드값만 허용함으로써 유해성 콘텐츠, 정책 위반 위험을 방지할 수 있습니다.

Amazon Bedrock에서의 구조화 출력 구현 방법

이제 Amazon Bedrock의 Custom Model Import 기능을 사용해 구조화 출력을 설정하는 과정을 단계별로 알아보겠습니다.

1단계: 사전 준비

  • Amazon Bedrock 액세스가 있는 활성 AWS 계정
  • Custom Model Import를 통해 생성된 맞춤형 모델
  • Bedrock Runtime 호출이 가능한 IAM 권한

2단계: 환경 준비

Python에서 Hugging Face 모델과 Bedrock Runtime 클라이언트를 초기화합니다.

import boto3
from transformers import AutoTokenizer
from botocore.config import Config

# 사용자 정의 모델 정보
hf_model_id = "<<huggingface_model_id>>"
model_arn = "arn:aws:bedrock:<<region>>:<<account-id>>:imported-model/your-model-id"
region = "<<region>>"

tokenizer = AutoTokenizer.from_pretrained(hf_model_id)
bedrock_runtime = boto3.client(service_name="bedrock-runtime", region_name=region)

3단계: 데이터 구조 정의

Pydantic을 이용해 필요한 정보의 JSON 스키마를 생성합니다.

from pydantic import BaseModel, Field

class Address(BaseModel):
    street_number: str = Field(description="Street number")
    street_name: str = Field(description="Street name including type")
    city: str = Field(description="City name")
    state: str = Field(description="Two-letter state abbreviation")
    zip_code: str = Field(description="5-digit ZIP code")

schema = Address.model_json_schema()
address_schema = {
    "name": "Address",
    "schema": schema
}

4단계: 입력 프롬프트 구성 및 템플릿 적용

messages = [{
    "role": "user",
    "content": "Extract the address: 456 Tech Boulevard, San Francisco, CA 94105"
}]

prompt = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

5단계: 요청 데이터 구성

request_body = {
    'prompt': prompt,
    'temperature': 0.1,
    'max_gen_len': 1000,
    'top_p': 0.9,
    'response_format': {
        "type": "json_schema",
        "json_schema": address_schema
    }
}

6단계: 모델 호출 및 응답 파싱

response = bedrock_runtime.invoke_model(
    modelId=model_arn,
    body=json.dumps(request_body),
    accept="application/json",
    contentType="application/json"
)

result = json.loads(response['body'].read().decode('utf-8'))
raw_output = result['choices'][0]['text']
print(raw_output)

예상 결과는 다음과 같은 유효 JSON입니다.

{
"street_number": "456",
"street_name": "Tech Boulevard",
"city": "San Francisco",
"state": "CA",
"zip_code": "94105"
}

이 접근법을 통해 후처리 과정 없이 직접 데이터를 시스템에 연동할 수 있습니다.

Amazon Bedrock에서 구조화 출력이 구축되는 아키텍처 다이어그램

결론

Amazon Bedrock의 구조화 출력 기능은 이제 단순한 대화형 경험을 넘어, 기업 시스템과 직접 연결 가능한 신뢰성 있는 AI 추론 결과를 제공합니다. 사내 API, 데이터베이스, RPA 연동 같은 자동화 활용에 매우 적합하며, 정확성과 보안성 측면에서도 강점을 갖습니다.

복잡한 파싱 로직을 최소화하고 응답 포맷의 일관성을 확보하고 싶다면, 지금 바로 Custom Model Import에 구조화 출력을 적용해 보세요. 의료 문서 구조화, 계약서 정보 추출, 금융 데이터 분류 등 다양한 분야에서 생산 준비가 된 AI 결과를 구현할 수 있습니다.

https://aws.amazon.com/blogs/machine-learning/introducing-structured-output-for-custom-model-import-in-amazon-bedrock/

AI, Cloud 관련한 문의는 아래 연락처로 연락주세요!

(주)에이클라우드
이메일 : acloud@a-cloud.co.kr
회사 번호 : 02-538-3988
회사 홈페이지 : https://www.a-cloud.co.kr/
문의하기


AI, Cloud 도입 상담 배너