본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 06. 24. 21:25

【5분 만에 이해하는 Foundry Tools 시리즈】 Azure AI Content Safety로 유해 텍스트를 탐지하기

요약

Azure AI Content Safety의 Analyze Text 기능을 사용하여 텍스트 내 유해 콘텐츠를 탐지하는 방법을 설명합니다. 4가지 카테고리와 심각도 점수를 반환하는 원리와 Bicep을 이용한 환경 구축 및 Python 호출 과정을 다룹니다.

핵심 포인트

  • Hate, SelfHarm, Sexual, Violence 4개 카테고리 분류
  • 0, 2, 4, 6 단계의 심각도(Severity) 점수 반환
  • Bicep을 활용한 빠른 검증 환경 구축 방법
  • Entra ID 기반의 키 없는 인증 방식 활용

이 기사에서 알 수 있는 것

Azure AI Content Safety에는 이미지 모더레이션 (Image Moderation), Prompt Shields, Groundedness 탐지 등 여러 기능이 있지만, 이번에는 텍스트 모더레이션 (Analyze Text)에 주목합니다.

이 기사에서는 다음 3가지를 직접 실행해 보면서, Analyze Text가 무엇을 반환하는지 이해할 수 있도록 해설합니다.

  • Analyze Text가 무엇을 입력으로 받아, 어떤 카테고리(Category)와 심각도(Severity)를 반환하는가
  • 부속된 Bicep을 사용하여 검증 환경을 2개의 명령어로 구축하는 방법
  • 일본어 텍스트를 카테고리별 심각도와 함께 판정하는 과정까지 (인증은 키를 사용하지 않는 Entra ID 방식)

이용 시나리오

Azure AI Content Safety의 텍스트 모더레이션은 사용자 게시물이나 생성 AI (Generative AI)의 입출력을 그대로 내보내기 전에, 유해 표현을 기계적으로 분류하고 싶은 상황에서 유용합니다. 구체적으로는 다음과 같은 케이스입니다.

Content Safety의 텍스트 모더레이션이란

Azure AI Content Safety는 텍스트나 이미지에 포함된 유해 콘텐츠를 탐지하는 서비스입니다. 그중 Analyze Text는 텍스트를 입력하면 Hate (증오), SelfHarm (자해), Sexual (성적), Violence (폭력)의 4가지 카테고리 각각에 대해 심각도 (Severity)를 반환합니다.

심각도 (Severity)는 '얼마나 유해한가'를 나타내는 단계 값으로, 기본값은 0 / 2 / 4 / 6의 4단계로 반환됩니다. 0은 문제가 없음을 의미하며, 값이 클수록 심각하다는 순서입니다. 1건의 텍스트에 대해 4개 카테고리분의 심각도가 한 번에 반환되므로, 카테고리마다 서로 다른 임계값 (Threshold)으로 운용할 수 있습니다.

데모 영상

3가지 일본어 텍스트를 Analyze Text에 전달하면, 카테고리별 심각도가 다음과 같이 반환됩니다. 무해한 문장은 모든 카테고리가 0이며, 공격적인 문장은 Hate, 자해를 암시하는 문장은 SelfHarm이 나타납니다.

검증 방법

리소스 생성

검증용 Bicep과 샘플 코드는 공개 리포지토리의 contentsafety-text/에 있습니다.

Bicep의 내용 (리소스 정의 부분)입니다.

이 템플릿은 kind=ContentSafety 단독 리소스를 japaneast 지역의 S0 등급으로 생성합니다. Content Safety는 단독 kind가 japaneast에서 바로 통과되므로, 이번에는 통합형인 AIServices를 거치지 않고 최소 구성으로 구축했습니다. 다른 Foundry Tools와 통합하고 싶을 때는 kind=AIServices로 변경하면 동일한 Analyze Text API를 그대로 호출할 수 있습니다.

최소 코드로 호출하기

포인트는 DefaultAzureCredential()을 전달하는 것만으로 키(Key)가 필요 없다는 점과, analyze_text(AnalyzeTextOptions(text=...))에 텍스트를 전달하는 것만으로 4개 카테고리의 판정이 반환된다는 점입니다.

pip install azure-ai-contentsafety azure-identity
az login
python quickstart.py

실제 출력 결과입니다.

[0] 입력: 오늘은 초대해 주셔서 감사합니다. 매우 즐거운 시간이었습니다.
Hate=0 SelfHarm=0 Sexual=0 Violence=0
[1] 입력: 너 같은 녀석은 사라져 버려. 두 번 다시 얼굴 비추지 마.
...

반환되는 심각도 (Severity) 읽기

주목해야 할 점은, 동일한 '부정적인 문장'이라도 나타나는 카테고리가 나뉘어 있다는 점입니다. 공격적인 문장은 Hate에 심각도 2가 나타나고, 자해를 암시하는 문장은 SelfHarm에 심각도 2가 나타납니다. 긍정/부정 판정이라면 둘 다 '부정적'으로 묶이겠지만, Content Safety는 어떤 종류의 유해성인지를 카테고리로 구분하고, 그 강도를 심각도로 반환합니다.

심각도는 기본적으로 0 / 2 / 4 / 6의 4단계입니다. 값의 의미는 다음과 같이 파악하면 운용하기 쉬워집니다.

severity기준운용 예시
0탐지 없음그대로 통과
...

실무에서는 "모든 카테고리를 일률적으로 차단"하는 것이 아니라, 카테고리마다 임계값(threshold)을 다르게 설정하는 것이 핵심입니다. 예를 들어, SelfHarm(자해)은 severity 2라도 고객 지원 창구 안내로 연결하고, Sexual(성적 내용)은 severity 4 이상일 때 차단하는 식으로 서비스의 성격에 맞춰 단계를 조절합니다. 4개 카테고리 × severity 값이 한 번의 호출로 반환되므로, 이러한 분류 로직을 그대로 구현할 수 있습니다.

또한, 더 세밀하게 확인하고 싶을 때는 severity를 0~7의 8단계로 반환하는 모드도 있습니다. 기본 4단계(0/2/4/6)는 임계값 운용에 충분하며, 8단계는 분석이나 학습 데이터의 분류 시 단계를 세분화하여 보고 싶을 때 구분하여 사용합니다.

Tips

  • severity는 카테고리별로 독립적입니다. 하나의 문장에서 Hate(혐오)와 Violence(폭력)가 동시에 탐지될 수 있으므로, "최댓값만 확인"하기보다 "카테고리별로 임계값을 갖는" 설계로 구성하면 탐지 누락과 과도한 차단(over-blocking)을 모두 억제할 수 있습니다.
  • F0(무료) 계층은 호출 속도 제한(rate limit)이 엄격하여, 연속으로 요청을 보내면 429 에러로 막힐 수 있습니다. 검증이나 운영 환경에서는 S0로 설정해야 제한에 걸릴 확률이 낮아집니다.
  • 인증은 키리스(keyless) 방식으로 설정하는 것이 안전합니다.
    Cognitive Services User 역할을 한 번 할당해 두면 DefaultAzureCredential()만으로 통과할 수 있어, 키를 코드나 .env 파일에 두지 않아도 됩니다.

요약

Analyze Text는 텍스트를 Hate / SelfHarm / Sexual / Violence의 4개 카테고리로 분류하고, 각각의 심각도를 severity로 반환하는 기능입니다.

긍정/부정(sentiment) 판정과 달리, 유해성의 종류와 강도를 분리하여 반환하는 것이 특징입니다.

카테고리별로 severity 임계값을 설정할 것, 검증은 S0를 사용할 것, 인증은 키리스로 할 것. 이 세 가지 포인트를 파악하면 실무에 적용하기 쉬워집니다.

이 시리즈에서는 Foundry Tools의 각 서비스를 하나씩 "5분 만에 개요 파악 + 즉시 배포"할 수 있는 형태로 소개합니다. 다음 편도 기대해 주세요.

참고

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0