> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apiyi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 안전성 거부 문제 해결: 절제 실험으로 트리거 단어 찾기

> 실제 사례: 동일한 prompt가 ChatGPT 웹 앱에서는 정상적으로 렌더링되지만 API에서는 safety_violations=[sexual]을 반환합니다. 요청을 차단하는 계층이 무엇인지, moderation: low가 도움이 되지 않는 이유, 웹 앱에서는 통과하는 이유, 그리고 20회 호출 절제 실험으로 트리거 단어를 정확히 찾아 원래 의도를 유지하는 해결책을 마련하는 방법을 알아봅니다.

안전 시스템에 의해 차단되었다고 해서 **프롬프트에 노골적인 내용이 포함되어 있다는 의미는 아닙니다**. 훨씬 더 자주 발생하는 원인은 프롬프트의 단어 하나가 *렌더링된 이미지*를 허용 기준을 넘도록 만들기 때문이며, 프롬프트를 읽는 것만으로는 문제를 확인할 수 없습니다. 이 페이지에서는 실제 고객 사례를 통해 어떤 계층에서 차단이 이루어지는지, 웹 앱에서는 왜 통과하는지, 왜 `moderation: low`가 아무 작업도 하지 않는지, 그리고 약 20회의 호출로 트리거 단어를 찾아내는 방법을 설명합니다.

## 사례: 웹 앱에서는 렌더링되지만 API에서는 성적인 콘텐츠를 반환함

한 고객이 `gpt-image-2.5-sunburst`을 사용하여 캐릭터 시트를 생성했습니다(왼쪽에는 얼굴 클로즈업, 오른쪽에는 정면 / 측면 / 후면 턴어라운드). 요청 내용은 다음과 같습니다.

```json theme={null}
{
  "model": "gpt-image-2.5-sunburst-2026-09-08",
  "prompt": "帮我生成一个妈感美艳女主（外国人），皮肤通透有自然光泽，无过度磨皮；皮肤保留自然原生纹理、皮肤通透有自然光泽；整体画面自然真实，8K超高清，细节丰富，真实人像摄影质感，纯白背景#一张综合角色设定图，左侧为脸部大特写，右侧为全身标准三视图,露出完整的头部，脸部特写和全身三视图要在一张图。全身三视图：右侧依次排列全身的正面视角、90 度纯侧面视角（头部完全侧转）、背面视角。",
  "size": "2736x1536",
  "quality": "xhigh",
  "background": "auto",
  "n": 1
}
```

프롬프트는 중국어로 작성되었습니다. 대략적인 내용은 다음과 같습니다. *화려하고 성숙해 보이는 서양 여성, 자연스러운 피부 질감, 사실적인 사진 표현, 순백색 배경; 왼쪽에는 얼굴 클로즈업이 있고 오른쪽에는 전신 정면 / 90도 측면 / 후면 턴어라운드가 있는 캐릭터 시트, 머리 전체가 보이도록 함.* API는 일관되게 400을 반환했습니다.

```json theme={null}
{
  "status_code": 400,
  "error": {
    "message": "Your request was rejected by the safety system. If you believe this is an error, contact us at ***.***.com and include the request ID req_e97b3571a1e2433da4b154fe7ea7a82c. safety_violations=[sexual]."
  }
}
```

고객의 반응은 일반적입니다.

> 콘텐츠 안전 정책 때문이라는 점은 이해하지만, 같은 내용이 ChatGPT 웹 앱에서는 작동합니다. 웹 앱에서는 통과되는 이유를 설명해 주셔야 합니다.

프롬프트에는 명시적인 내용이 없습니다. 그저 “화려한 여성 + 턴어라운드 + 흰색 배경”일 뿐입니다. “나쁜 내용을 작성하지 않았는데 차단되었습니다”라는 유형의 티켓은 “나쁜 내용을 작성했더니 차단되었습니다”라는 유형과는 전혀 다른 접근이 필요합니다.

## 먼저: 어느 계층에서 차단되고 있습니까?

이미지 모델에는 두 가지 안전 게이트가 있습니다. 두 게이트는 서로 다르게 실패하며, 디버깅 방법도 서로 다릅니다.

|             | 프롬프트 수준 차단       | 출력 이미지 차단                                   |
| ----------- | ---------------- | ------------------------------------------- |
| 검사 대상       | 전송한 텍스트          | 생성된 이미지                                     |
| 응답 시간       | **몇 초 이내** 400   | **성공한 호출과 동일** (이미지를 먼저 렌더링한 다음 분류기가 거부함)   |
| 동일한 프롬프트 반복 | 안정적: 매번 거부됨      | **확률적**: 렌더링 결과가 매번 달라서 통과할 때도 있고 실패할 때도 있음 |
| 해결 방법       | 명백하게 위반하는 단어를 제거 | *렌더링*을 한계 초과로 만드는 단어를 찾음                    |

**지연 시간이 단서입니다.** 이 경우 실패한 호출에는 42~~51초가 걸렸고 성공한 호출에는 46~~57초가 걸렸습니다. 차이가 없으므로 이미지가 완전히 렌더링된 후 출력 측 분류기가 이를 성적인 콘텐츠로 표시한 것입니다. 아래 제거 실험에서도 이를 확인할 수 있습니다. 하나의 프롬프트를 세 번 실행한 결과가 1회 통과 / 2회 거부였습니다.

<Info>
  프롬프트 수준 차단은 매개변수 오류와 거의 같은 속도로 반환됩니다. 400 응답이 30초 이상 지난 후 도착했다면 먼저 출력 이미지 차단으로 간주하고, 아직 단어를 삭제하기 시작하지 마십시오.
</Info>

## 웹 앱이 통과하는 이유

이는 [만족스러운 이미지를 얻는 방법](/ko/api-capabilities/image-generation-success-tips)에서 설명한 것과 같은 요점입니다. **웹 앱은 에이전트이고, API는 단일 원자적 호출입니다.**

* ChatGPT 웹 앱은 사용자의 텍스트를 이미지 모델에 그대로 전달하지 않습니다. 먼저 채팅 모델이 프롬프트를 **재작성하고 확장**하며, 대개 의상, 설정, 조명도 자체적으로 추가합니다. 아래에서 설명하는 사용자를 대신한 정확한 “의상 추가” 단계입니다.
* API는 사용자의 프롬프트를 있는 그대로 전송합니다. 사용자는 그녀가 무엇을 입는지 말하지 않았으므로 모델이 결정합니다. “화려한 분위기 + 전신 턴어라운드 + 흰색 배경”이라는 조건에서는 몸에 꼭 붙거나 최소한의 의상으로 기우는 경향이 있으며, 이는 캐릭터 시트에서 흔히 보이는 모습이고 렌더링 결과가 허용 범위를 넘게 됩니다.
* 여기에 출력 측 콘텐츠 조정의 무작위성까지 더해지면, “웹 앱에서는 한 번 통과했고 API에서는 한 번 실패했다”는 결과는 모순이 아닙니다.

따라서 “웹 앱이 통과한다”는 것이 “API가 더 엄격하게 조정한다”는 의미는 아닙니다. 두 경로는 모델에 동일한 프롬프트를 전송하지 않습니다.

## 단어 절제: 한 번에 한 가지만 변경합니다

이와 같은 prompt에는 수십 개의 형용사와 레이아웃 제약 조건이 포함되어 있습니다. 어느 항목이 원인인지 추측하는 것은 느립니다. 효과적인 접근 방식은 **절제**입니다. 변형마다 정확히 하나의 단어 블록만 제거하거나 교체하고, 나머지는 바이트 단위로 동일하게 유지한 다음, 어떤 변형에서 결과가 바뀌는지 확인합니다.

<Steps>
  <Step title="의심되는 단어 블록을 나열합니다">
    세 가지 범주가 있습니다. 캐릭터 형용사(glamorous, sexy, alluring 등), 신체 관련 동사(reveal, show, form-fitting 등), 레이아웃 제약 조건(full body, turnaround, white background 등)입니다. 레이아웃 제약 조건은 단독으로는 무해해 보이지만 형용사와 결합됩니다.
  </Step>

  <Step title="변형마다 정확히 하나의 블록만 변경합니다">
    해당 블록을 삭제하거나 중립적인 단어로 교체하고, 나머지는 그대로 유지합니다. 또한 단어는 변경하지 않고 제약 조건만 추가하는 변형도 실행합니다. 예를 들어 캐릭터의 의상을 명시적으로 지정할 수 있습니다.
  </Step>

  <Step title="결과가 바뀐 항목은 2~3회 다시 실행합니다">
    출력 측 블록은 확률적이므로 한 번의 실행만으로는 아무것도 입증되지 않습니다. 성공한 변형을 최소 두 번 더 다시 실행하고, 모든 실행이 통과한 경우에만 결과로 인정합니다.
  </Step>

  <Step title="가장 작은 편집을 선택합니다">
    목표는 “통과한다”가 아니라 “의도의 변경을 최소화하면서 통과한다”입니다. 원래 단어를 유지하고 제약 조건만 추가하는 변형을 우선 선택합니다.
  </Step>
</Steps>

<Tip>
  변형은 서로 독립적이므로 **병렬로 실행합니다**. 이 경우 6개 변형의 배치 실행 결과가 약 50초 만에 반환되었습니다. 순차적으로 실행했다면 5분이 걸렸을 것입니다.
</Tip>

이 사례의 전체 절제 로그입니다(총 20회 호출, 전체 과정에서 크기와 품질은 동일함).

| 변형                                                                                       | 결과              |
| ---------------------------------------------------------------------------------------- | --------------- |
| 원본 prompt(2회 실행)                                                                         | 400 성적 ×2       |
| 원본 + `moderation: "low"`                                                                 | 400 성적          |
| “reveal the full head”만 → “head fully in frame”                                          | 400 성적          |
| “mature-looking”만 제거하고 “glamorous” 유지                                                    | 400 성적          |
| “glamorous”만 제거하고 “mature-looking” 유지                                                    | 200             |
| “glamorous woman” → “mature, elegant Western woman”(3회 실행)                               | 200 ×3          |
| → “mature, elegant Western woman with refined features”(3회 실행)                           | 400 / 200 / 400 |
| **원본 prompt를 변경하지 않고 “wearing a beige turtleneck sweater and dark trousers”만 추가(3회 실행)** | **200 ×3**      |

표에서 세 가지 사실을 바로 도출할 수 있습니다. 트리거는 “glamorous”입니다(“mature-looking”을 제거해도 달라지는 것이 없고, “glamorous”를 제거하면 통과합니다). “reveal”은 원인이 아닙니다. 또한 1회 실행에서 통과하고 2회 거부된 “refined features” 행은 분류기가 매번 다른 렌더링 결과를 판단하고 있으며 텍스트를 판단하는 것이 아님을 보여줍니다.

## 결론 및 권장 수정

**메커니즘**: "glamorous"는 모델이 관능적인 렌더링을 생성하도록 유도하며, "full-body turnaround + white background"는 전형적인 캐릭터 시트 레이아웃입니다. 이 두 요소가 함께 작용하면 출력 측 분류기가 성적인 콘텐츠로 표시하는 렌더링이 생성됩니다. prompt의 단어 중 그 자체로 위반에 해당하는 단어는 하나도 없습니다.

**권장 수정**: 전체 원본 prompt를 그대로 유지하고 캐릭터 설명 바로 뒤에 의상을 명시하는 문구 하나를 추가합니다. 이 방법은 3회 중 3회 통과했으며, 고객이 원한 외형과 레이아웃을 모두 유지했습니다.

```text theme={null}
帮我生成一个妈感美艳女主（外国人），身穿米色高领针织衫和深色长裤，皮肤通透有自然光泽，无过度磨皮；皮肤保留自然原生纹理、皮肤通透有自然光泽；整体画面自然真实，8K超高清，细节丰富，真实人像摄影质感，纯白背景#一张综合角色设定图，左侧为脸部大特写，右侧为全身标准三视图,露出完整的头部，脸部特写和全身三视图要在一张图。全身三视图：右侧依次排列全身的正面视角、90 度纯侧面视角（头部完全侧转）、背面视角。
```

삽입한 문구는 "wearing a beige turtleneck sweater and dark trousers"입니다.

<Frame caption="Same prompt with one clothing phrase added: 3 of 3 calls passed, with the face close-up and the front / side / back turnaround all delivered">
  <img src="https://mintcdn.com/apiyillc/jVG8GxgXc4e0wCxN/images/image-safety-case-turnaround-clothed.jpg?fit=max&auto=format&n=jVG8GxgXc4e0wCxN&q=85&s=86cb15b543b0ae764311bd30fff41984" alt="흰색 배경에 베이지색 터틀넥과 어두운색 바지를 입은 서양 여성의 캐릭터 시트: 왼쪽에는 얼굴 클로즈업, 오른쪽에는 정면, 측면 및 후면 전신 뷰" width="1200" height="673" data-path="images/image-safety-case-turnaround-clothed.jpg" />
</Frame>

단정한 일상복이라면 무엇이든 괜찮습니다. 중요한 점은 모델에게 맡기지 말고 **직접 작성하는 것**입니다.

**대안 수정**: "glamorous"를 "mature and elegant"로 바꿉니다. 이 방법 역시 3회 중 3회 통과했지만, 얼굴이 더 부드럽게 표현되고 원래 의도에서 더 멀어집니다.

## 완화 수준: 낮음이 도움이 되지 않은 이유

`moderation` 매개변수([텍스트-이미지 매개변수 표](/ko/api-capabilities/gpt-image-2/text-to-image) 참조)는 `auto` / `low`를 허용하며 **프롬프트 측** moderation의 엄격도를 낮춥니다. 여기에서 `low`를 전달해도 여전히 400이 반환된 이유는 차단이 출력 측에서 발생하기 때문이며, 이 매개변수는 출력 측을 제어하지 않습니다.

게이트웨이 외부에서는 “매개변수가 전달되지 않았는지”와 “전달되었지만 효과가 없었는지”를 구분할 수 없지만, 어느 경우든 결론은 같습니다. **출력 측 차단의 경우 매개변수를 변경해도 아무런 효과가 없으므로 프롬프트를 변경해야 합니다**.

## 일반 체크리스트

<AccordionGroup>
  <Accordion title="오류가 즉시 다시 발생했습니까, 아니면 오래 기다린 후에 발생했습니까?">
    즉시는 프롬프트 수준을 의미하며, 일반적인 렌더링과 비슷한 정도로 기다렸다면 출력 수준을 의미합니다. 전자의 경우 명백하게 규정을 위반하는 단어를 제거합니다. 후자의 경우 어떤 단어가 렌더링을 기준 초과로 만드는지 확인하기 위해 단어 제거 실험을 수행하고, 동일한 프롬프트에서도 어느 정도 무작위성이 발생할 수 있음을 예상해야 합니다.
  </Accordion>

  <Accordion title="의상을 모델에 맡겼습니까?">
    분위기는 설명하지만 의상은 설명하지 않는 캐릭터 프롬프트가 출력 측 차단의 가장 일반적인 원인입니다. 명시적인 의상 문구를 하나 추가하면 원래 의도를 건드리지 않고도 대개 한 단계 만에 문제가 해결됩니다.
  </Accordion>

  <Accordion title="한 번에 단어 하나만 변경했습니까?">
    한 번에 단어 세 개를 변경하면 어떤 단어가 영향을 미쳤는지 알 수 없으므로 다음 프롬프트를 처음부터 다시 시작해야 합니다. 변형 하나당 한 번씩 차단을 확인한 다음, 가장 좋은 변형은 2\~3회 다시 실행합니다.
  </Accordion>

  <Accordion title="차단된 요청에도 과금됩니까?">
    token 기준으로 과금되는 gpt-image 모델은 moderation에서 400을 반환할 때 과금되지 않습니다. 실패한 생성에 대한 내용은 [gpt-image-2 자주 묻는 질문](/ko/api-capabilities/gpt-image-2/overview#faq) 항목을 참조하십시오. 따라서 제거 실험에는 비용이 들지 않고 시간이 소요됩니다.
  </Accordion>
</AccordionGroup>

## 빠른 참조

* **지연 시간으로 계층을 확인합니다**: 즉시 발생하는 400 오류는 프롬프트 수준의 문제이고, 렌더링에 걸린 시간만큼 소요된 400 오류는 이미지 거부를 수행하는 출력 측 분류기 때문입니다.
* **출력 측 차단은 확률적입니다**: 동일한 프롬프트가 통과할 때도 있고 실패할 때도 있으므로, 한 번의 결과만으로는 아무것도 입증할 수 없습니다. 2\~3회 다시 실행합니다.
* **웹 앱에서 통과한다고 해서 API가 더 엄격한 것은 아닙니다**: 웹 앱은 프롬프트를 다시 작성하고 확장하여 의상과 배경을 추가하지만, API는 프롬프트를 있는 그대로 전송합니다.
* **단어 절제**: 변형마다 한 블록씩 변경하고, 변형을 병렬로 실행하며, 의도의 변화가 가장 적은 편집을 유지합니다. 여기서 트리거는 “화려한”이었습니다.
* **캐릭터 프롬프트에서 의상을 구체적으로 작성합니다**: 다른 모든 내용을 그대로 둔 채 의상 문구 하나를 추가하자 3회 중 3회 통과했으며, `moderation: low`는 출력 측 차단에 아무런 효과가 없습니다.

## 관련 문서

* [만족스러운 이미지를 얻는 방법](/ko/api-capabilities/image-generation-success-tips)
* [이미지 프롬프트 닥터 스킬](/ko/api-capabilities/image-prompt-doctor)
* [이미지 API 핵심 사항 및 모범 사례](/ko/api-capabilities/image-api-best-practices)
* [gpt-image-2 FAQ](/ko/api-capabilities/gpt-image-2/overview#faq)
