

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 콘텐츠 필터를 사용하여 유해한 이미지 차단
<a name="guardrails-mmfilter"></a>

Amazon Bedrock Guardrails를 사용하면 가드레일 내에 콘텐츠 필터를 구성하면서 부적절하거나 유해한 이미지를 차단할 수 있습니다.

**사전 조건 및 제한 사항**
+ 이 기능은 이미지에만 지원되며 비디오 콘텐츠가 포함된 이미지에는 지원되지 않습니다.
+ 이 기능은 일반적으로 미국 동부(버지니아 북부), 미국 서부(오레곤), 유럽(프랑크푸르트) 및 아시아 태평양(도쿄)에서 사용할 수 있으며 AWS 리전, 콘텐츠 필터 내의 증오, 모욕, 성적, 폭력, 불법 행위 및 프롬프트 공격 범주에 대해 지원됩니다.
+ 이 기능은 콘텐츠 필터 내의 증오, 모욕, 성적 및 폭력 범주에 대해 지원되는 미국 동부(오하이오), 아시아 태평양(뭄바이 AWS 리전, 서울, 싱가포르, 시드니), 유럽(아일랜드, 런던) 및 미국 GovCloud(미국 서부)에서 미리 보기로 사용할 수 있습니다.
+ 기능에 허용되는 최대 이미지 크기는 8000x8000입니다(JPEG 및 PNG 파일 모두 해당).
+ 사용자는 최대 4MB 크기의 이미지를 업로드할 수 있으며 단일 요청에 대해 최대 20개의 이미지를 업로드할 수 있습니다.
+ 기본 제한은 초당 25개 이미지입니다. 이 값은 구성할 수 없습니다.
+ 이미지 콘텐츠에는 PNG 및 JPEG 형식만 지원됩니다.

**개요**

유해한 이미지의 감지 및 차단은 순수 이미지 또는 텍스트가 포함된 이미지에만 지원됩니다. 가드레일을 생성하는 동안 사용자는 이미지 옵션을 단독으로 또는 텍스트 옵션과 함께 선택하고 각 필터링 강도를 **없음**, **낮음**, **중간** 또는 **높음**으로 설정할 수 있습니다. 이러한 임계값은 두 양식이 모두 선택된 경우 텍스트 및 이미지 콘텐츠 모두에 공통 적용됩니다. 가드레일은 사용자가 입력으로 전송하거나 모델 응답의 출력으로 생성된 이미지를 평가합니다.

유해한 이미지 콘텐츠를 감지하는 데 지원되는 범주는 다음과 같습니다.
+ **혐오** - 정체성(예: 인종, 민족, 성별, 종교, 성적 지향, 능력, 출신 국가)을 근거로 개인이나 집단을 차별, 비판, 모욕, 비난, 비인간화하는 콘텐츠를 설명합니다. 또한 혐오 그룹의 상징, 혐오 상징 및 차별, 인종차별 및 무관심을 촉진하는 다양한 조직과 관련된 이미지를 표시하는 그래픽 및 실제 시각적 콘텐츠도 포함됩니다.
+ **모욕** - 비하하거나, 굴욕하거나, 조롱하거나, 모욕하거나, 얕보는 표현이 포함된 콘텐츠를 설명합니다. 이러한 유형의 표현은 괴롭힘으로도 분류됩니다. 또한 공모, 분노 또는 거부를 표현하기 위한 무례하거나 존중이 없거나 불쾌감을 주는 다양한 형태의 손 제스처도 포함됩니다.
+ **성적 표현**: 신체 부위, 신체적 특징 또는 성별을 직간접적으로 언급하여 성적 관심, 활동 또는 흥분을 나타내는 콘텐츠를 설명합니다. 또한 성교와 관련된 사적인 부분과 성적 활동을 보여주는 이미지도 포함됩니다. 이 범주에는 만화, 애니메이션, 그림, 스케치 및 성적 테마가 있는 기타 일러스트 콘텐츠도 포함됩니다.
+ **폭력** - 사람, 집단 또는 사물에 신체적 통증, 부상 또는 상해를 입히는 위협 또는 이러한 행위를 미화하는 콘텐츠를 설명합니다. 또한 해를 끼칠 의도가 있는 무기와 관련된 이미지도 포함됩니다.
+ **불법 행위** - 범죄 행위에 가담하거나, 개인이나 집단 또는 기관에 해를 입히거나, 기만하거나, 이용하는 일에 대한 정보를 구하거나 제공하는 입력 프롬프트 및 모델 응답을 설명합니다.
+ **프롬프트 공격** - 유해한 콘텐츠를 생성(탈옥으로도 알려짐)하고, 개발자가 지정한 지침을 무시하고 재정의(프롬프트 인젝션)하기 위해 파운데이션 모델의 안전 및 조정 기능을 우회하려는 사용자 프롬프트를 설명합니다. 프롬프트 공격이 적용되려면 입력 태깅이 사용되어야 합니다. 프롬프트 공격 감지를 수행하려면 입력 태그를 사용해야 합니다.

**Topics**
+ [이미지 콘텐츠 필터 사용](#guardrails-use-mmfilter)
+ [API를 사용하여 이미지에 대한 콘텐츠 필터 구성](#guardrails-use-mmfilter-configure)
+ [ApplyGuardrail API와 함께 사용할 이미지 필터 구성](#guardrails-use-mmfilter-api)
+ [이미지 생성 모델과 함께 작동하도록 이미지 필터 구성](#guardrails-use-mmfilter-image-models)

## 이미지 콘텐츠 필터 사용
<a name="guardrails-use-mmfilter"></a>

**이미지용 콘텐츠 필터를 사용하여 가드레일 생성 또는 업데이트**

이제 새 가드레일을 생성하거나 기존 가드레일을 업데이트하는 동안 사용자에게 기존 텍스트 옵션 외에 이미지를 선택할 수 있는 옵션이 표시됩니다.

**참고**  
기본적으로 텍스트 옵션이 활성화되어 있으며 이미지 옵션은 명시적으로 활성화해야 합니다. 사용자는 사용 사례에 따라 텍스트와 이미지를 모두 선택하거나 둘 중 하나를 선택할 수 있습니다.

**필터 분류 및 차단 수준**

필터링은 사용자 입력 및 FM 응답의 신뢰도 분류를 기반으로 수행됩니다. 모든 사용자 입력 및 모델 응답은 없음, 낮음, 중간, 높음의 네 가지 강도 수준으로 분류됩니다. 필터 강도는 유해한 콘텐츠 필터링의 민감도를 결정합니다. 필터 강도가 증가하면 유해한 콘텐츠를 필터링할 가능성이 높아지고 애플리케이션에서 유해한 콘텐츠를 볼 확률이 줄어듭니다. 이미지 및 텍스트 옵션을 모두 선택하면 특정 범주의 두 양식에 동일한 필터 강도가 적용됩니다.

1. 유해 범주에 대한 이미지 및 텍스트 필터를 구성하려면 **유해 범주 필터 구성**을 선택합니다.

1. **텍스트** 및/또는 **이미지**를 선택하여 모델에 대한 프롬프트 또는 응답에서 텍스트 또는 이미지 콘텐츠를 필터링합니다.

1. 각 범주에 적용할 필터링 수준으로 **없음, 낮음, 중간 또는 높음**을 선택합니다. **높음**으로 설정하면 필터의 해당 범주에 적용되는 대부분의 텍스트 또는 이미지를 차단할 수 있습니다.

1. 프롬프트에 사용한 것과 동일한 필터 설정을 사용하려면 **응답에 동일한 유해 범주 필터 사용**을 선택합니다. 이 옵션을 선택하지 않으면 프롬프트 또는 응답에 대해 다른 필터 수준을 사용하도록 선택할 수도 있습니다. **임계값 재설정**을 선택하여 프롬프트 또는 응답에 대한 모든 필터 수준을 재설정합니다.

1. **검토 및 생성** 또는 **다음**을 선택하여 가드레일을 생성합니다.

## API를 사용하여 이미지에 대한 콘텐츠 필터 구성
<a name="guardrails-use-mmfilter-configure"></a>

가드레일 API를 사용하여 Amazon Bedrock Guardrails에서 이미지 콘텐츠 필터를 구성할 수 있습니다. 아래 예제는 다양한 유해한 콘텐츠 범주와 필터 강도가 적용된 Amazon Bedrock Guardrails 필터를 보여줍니다. 이 템플릿을 사용자의 고유한 사용 사례에 예제로 사용할 수 있습니다.

다음 예제에 나온 대로 `contentPolicyConfig` 작업에서 `filtersConfig`는 객체입니다.

**이미지 콘텐츠 필터를 사용하여 가드레일을 생성하기 위한 Python Boto3 코드 예제**

```
import boto3
import botocore
import json


def main():
    bedrock = boto3.client('bedrock', region_name='us-east-1')
    try:
        create_guardrail_response = bedrock.create_guardrail(
            name='my-image-guardrail',
            contentPolicyConfig={
                'filtersConfig': [
                    {
                        'type': 'SEXUAL',
                        'inputStrength': 'HIGH',
                        'outputStrength': 'HIGH',
                        'inputModalities': ['TEXT', 'IMAGE'],
                        'outputModalities': ['TEXT', 'IMAGE']
                    },
                    {
                        'type': 'VIOLENCE',
                        'inputStrength': 'HIGH',
                        'outputStrength': 'HIGH',
                        'inputModalities': ['TEXT', 'IMAGE'],
                        'outputModalities': ['TEXT', 'IMAGE']
                    },
                    {
                        'type': 'HATE',
                        'inputStrength': 'HIGH',
                        'outputStrength': 'HIGH',
                        'inputModalities': ['TEXT', 'IMAGE'],
                        'outputModalities': ['TEXT', 'IMAGE']
                    },
                    {
                        'type': 'INSULTS',
                        'inputStrength': 'HIGH',
                        'outputStrength': 'HIGH',
                        'inputModalities': ['TEXT', 'IMAGE'],
                        'outputModalities': ['TEXT', 'IMAGE']
                    },
                    {
                        'type': 'MISCONDUCT',
                        'inputStrength': 'HIGH',
                        'outputStrength': 'HIGH',
                        'inputModalities': ['TEXT'],
                        'outputModalities': ['TEXT']
                    },
                    {
                        'type': 'PROMPT_ATTACK',
                        'inputStrength': 'HIGH',
                        'outputStrength': 'NONE',
                        'inputModalities': ['TEXT'],
                        'outputModalities': ['TEXT']
                    }
                ]
            },
            blockedInputMessaging='Sorry, the model cannot answer this question.',
            blockedOutputsMessaging='Sorry, the model cannot answer this question.',
        )
        create_guardrail_response['createdAt'] = create_guardrail_response['createdAt'].strftime('%Y-%m-%d %H:%M:%S')
        print("Successfully created guardrail with details:")
        print(json.dumps(create_guardrail_response, indent=2))
    except botocore.exceptions.ClientError as err:
        print("Failed while calling CreateGuardrail API with RequestId = " + err.response['ResponseMetadata']['RequestId'])
        raise err


if __name__ == "__main__":
    main()
```

## ApplyGuardrail API와 함께 사용할 이미지 필터 구성
<a name="guardrails-use-mmfilter-api"></a>

`ApplyGuardrail` API를 사용하여 이미지 및 텍스트 콘텐츠 모두에 콘텐츠 필터를 사용할 수 있습니다. 이 옵션을 통해 Amazon Bedrock 모델을 간접적으로 호출하지 않고도 콘텐츠 필터 설정을 사용할 수 있습니다. Amazon Bedrock Guardrails에서 지원하는 각 Bedrock 파운데이션 모델에 대한 추론 파라미터 설명서에 따라 다양한 모델의 아래 스크립트에서 요청 페이로드를 업데이트할 수 있습니다.

Amazon Bedrock Guardrails에서 지원하는 각 Bedrock 파운데이션 모델에 대한 추론 파라미터 설명서에 따라 다양한 모델의 아래 스크립트에서 요청 페이로드를 업데이트할 수 있습니다.

```
import boto3
import botocore
import json


guardrail_id = 'guardrail-id'
guardrail_version = 'DRAFT'
content_source = 'INPUT'
image_path = '/path/to/image.jpg'

with open(image_path, 'rb') as image:
    image_bytes = image.read()

content = [
    {
        "text": {
            "text": "Hi, can you explain this image art to me."
        }
    },
    {
        "image": {
            "format": "jpeg",
            "source": {
                "bytes": image_bytes
            }
        }
    }
]


def main():
    bedrock_runtime_client = boto3.client("bedrock-runtime", region_name="us-east-1")
    try:
        print("Making a call to ApplyGuardrail API now")
        response = bedrock_runtime_client.apply_guardrail(
            guardrailIdentifier=guardrail_id,
            guardrailVersion=guardrail_version,
            source=content_source,
            content=content
        )
        print("Received response from ApplyGuardrail API:")
        print(json.dumps(response, indent=2))
    except botocore.exceptions.ClientError as err:
        print("Failed while calling ApplyGuardrail API with RequestId = " + err.response['ResponseMetadata']['RequestId'])
        raise err


if __name__ == "__main__":
    main()
```

## 이미지 생성 모델과 함께 작동하도록 이미지 필터 구성
<a name="guardrails-use-mmfilter-image-models"></a>

Titan Image Generator 및 Stability Image 또는 Diffusion 모델과 같은 이미지 생성 모델에서 Amazon Bedrock Guardrails의 이미지 필터를 사용할 수도 있습니다. 이러한 모델은 현재 가드레일로 간접적으로 호출할 수 있는 `InvokeModel` API를 통해 지원됩니다. 가드레일에서 지원하는 다양한 Amazon Bedrock 파운데이션 모델에 대한 추론 파라미터 설명서에 따라 다양한 모델의 아래 스크립트에서 요청 페이로드를 업데이트할 수 있습니다.

```
import base64
import boto3
import botocore
import json
import os
import random
import string


guardrail_id = 'guardrail-id'
guardrail_version = 'DRAFT'

model_id = 'stability.sd3-large-v1:0'
output_images_folder = '/path/to/folder/'

body = json.dumps(
    {
        "prompt": "Create an image of a beautiful flower", # Prompt for image generation ("A gun" should get blocked by violence)
        "output_format": "jpeg"
    }
)


def main():
    bedrock_runtime_client = boto3.client("bedrock-runtime", region_name="us-west-2")
    try:
        print("Making a call to InvokeModel API for model: {}".format(model_id))
        response = bedrock_runtime_client.invoke_model(
            body=body,
            modelId=model_id,
            trace='ENABLED',
            guardrailIdentifier=guardrail_id,
            guardrailVersion=guardrail_version
        )
        response_body = json.loads(response.get('body').read())
        print("Received response from InvokeModel API (Request Id: {})".format(response['ResponseMetadata']['RequestId']))
        if 'images' in response_body and len(response_body['images']) > 0:
            os.makedirs(output_images_folder, exist_ok=True)
            images = response_body["images"]
            for image in images:
                image_id = ''.join(random.choices(string.ascii_lowercase + string.digits, k=6))
                image_file = os.path.join(output_images_folder, "generated-image-{}.jpg".format(image_id))
                print("Saving generated image {} at {}".format(image_id, image_file))
                with open(image_file, 'wb') as image_file_descriptor:
                    image_file_descriptor.write(base64.b64decode(image.encode('utf-8')))
        else:
            print("No images generated from model")
        guardrail_trace = response_body['amazon-bedrock-trace']['guardrail']
        guardrail_trace['modelOutput'] = ['<REDACTED>']
        print("Guardrail Trace: {}".format(json.dumps(guardrail_trace, indent=2)))
    except botocore.exceptions.ClientError as err:
        print("Failed while calling InvokeModel API with RequestId = {}".format(err.response['ResponseMetadata']['RequestId']))
        raise err


if __name__ == "__main__":
    main()
```