Azure OpenAI Content Safety 설정과 차단 모니터링¶
가드레일의 의미¶
가드레일은 생성 모델과 별도로 입력과 출력을 분류하고 정책에 따라 허용/차단하는 통제입니다. Azure OpenAI의 내장 content filtering은 Azure AI Content Safety로 지원됩니다. 이 필터는 정확성, 모든 prompt injection 방어, 모든 PII 제거를 보장하지 않습니다. system prompt만으로 safety filter를 대체할 수 없습니다.
Hate, Sexual, Violence, Self-harm은 safe/low/medium/high severity를 사용합니다. 기본 Medium 임계치는 Medium과 High를 차단하고 Low와 Safe는 차단하지 않습니다. Prompt와 Completion을 각각 설정해야 합니다.
이 데모의 정책¶
RAI policy는 demo-medium을 생성하고 모든 모델 deployment에 연결합니다.
4개 harm category 각각에 Prompt/Completion, enabled=true, blocking=true,
severityThreshold=Medium을 명시합니다.
기반 정책은 Microsoft.Default입니다.
Prompt Shields direct attacks, protected material 등 추가 기능은 기본 정책과 실제 서비스의
현재 지원을 확인합니다. 이 데모가 각 추가 필터를 별도로 설정/테스트했다고 주장하지 않습니다.
필터를 낮추거나 끄는 구성은 기본 시연 경로에 넣지 않습니다.
필터 일부/전체 비활성화에는 제품 정책과 승인 제약이 있을 수 있습니다.
포털 명칭/메뉴는 classic/new Foundry에 따라 다르므로 실제 리소스에 연결된 정책을 확인합니다.
업무에서 오탐이 발생하면 category/severity와 정상 입력 코호트부터 분석합니다. threshold를 완화하기 전에 입력 맥락, 사용 목적, 개인정보 처리, 사내 정책 승인을 검토합니다. 오탐 감소를 안전성 개선과 같은 것으로 취급하지 않습니다.
차단은 HTTP 오류만이 아닙니다¶
| 결과 | API 증거 | ledger outcome |
|---|---|---|
| 입력 차단 | HTTP 400, error.code=content_filter, innererror | input_blocked |
| 출력 차단 | HTTP 200, finish_reason=content_filter 또는 filtered=true annotation | output_blocked |
| 필터 서비스 실패 | content_filter_results.error | filter_unavailable |
| annotation 미반환 | filter 결과 항목 없음 | filterObserved=false, 안전 검증됨이라고 표시하지 않음 |
| rate limit | HTTP 429 | throttled, content block과 별개 |
| 권한/파라미터 오류 | HTTP 4xx, content_filter code 아님 | client_error |
SDK가 반환한 에러 메시지 전체에는 사용자 원문이 포함될 수 있습니다. 로그에는 에러 객체를 그대로 serialize하지 않고 필요한 상태와 annotation만 사용합니다. output이 잘려 반환되는 경우도 있으므로 응답 HTTP 성공을 안전 허용으로 간주하지 않습니다. 데모 CLI는 필터 실패/차단 또는 API 오류가 발생하면 nonzero exit code로 종료합니다. 응답 원문을 화면에도 출력하지 않습니다.
기존 Log Analytics에서 볼 수 있는 범위¶
Log Analytics를 이미 사용 중이라고 해서 모든 차단 detail이 수집된 것은 아닙니다. 진단 category 활성 여부, 대상 LAW, table mode, 지원 schema부터 확인하십시오.
진단 discovery KQL은 category별 수집 존재를 확인합니다.
이 데모는 기본 Audit + AllMetrics만 수집하며,
native diagnostic 로그가 모든 요청의 상세 safety annotation을 가진다고 전제하지 않습니다.
ContentFilterResults 같은 category/table이 항상 존재한다고 가정하지 않습니다.
상세한 input/output 차단 조회는 호출부에서 API 결과를 관측해
workspace-based App Insights의 AppDependencies.Properties에 적재합니다.
차단 KQL이 deployment, outcome, status,
filter category/severity, usage 존재와 추정 비용을 연결합니다.
Application Insights 리소스 query scope의 legacy dependencies/customDimensions와
LAW workspace scope의 AppDependencies/Properties를 혼동하지 않습니다.
안전한 시연¶
재현 가능한 9개 fixture를 모델별로 replay합니다.
category/severity JSON envelope와 무해한 고정 chunk만 사용하며 유해 텍스트가 없습니다.
demo.mode=fixture를 강제하고 실제 비용·live 운영 지표 및 경고에서 제외합니다.
입력 차단 fixture는 실제 Azure가 해당 입력을 차단했다는 증거가 아닙니다. 출력 차단/429/필터 실패도 실제 장애를 유발하지 않고 관측 파이프라인을 검증합니다. 고객 승인된 red-team 또는 사내 안전 코호트로 실제 모델 필터 정책을 평가하려면 별도 테스트 계획·취급 권한·원문 보관 정책을 적용하십시오.
운영에서 추가로 결정할 정책¶
- filter_unavailable일 때 사용자에게 결과를 표시할지 중단할지 명확히 결정합니다.
- streaming에는 일부 출력 이후 차단, annotation 지연과 UX를 함께 다룹니다.
- direct prompt attack과 외부 문서의 indirect attack 방어를 구분합니다.
- 차단율뿐 아니라 annotation coverage, 필터 서비스 실패, 정상 업무 오탐을 관측합니다.
- 별도 Content Safety API의 severity 체계를 OpenAI filter annotation과 무조건 동일하게 매핑하지 않습니다.
- 원문 열람이 필요한 조사에는 제한된 저장소, 승인, 보존 기한, 접근 감사가 필요합니다.