얼마 전 NSFW 거절에 대한 글을 썼습니다. 그때는 실제 응답만 열어 보고 나머지는 추측이라고 적었어요.
이번에 공개된 연구를 찾아봤습니다. 그랬더니 제가 추측했던 것들이 대부분 이미 문서화된 현상이더군요. 심지어 메커니즘까지 밝혀져 있었습니다.
가장 잘 문서화된 건 Stable Diffusion의 안전 필터입니다. ETH 취리히 연구팀이 역공학으로 뜯어봤어요.
구조가 생각보다 단순합니다.
즉 이미지를 이해하는 게 아니라 거리를 재는 겁니다. "이건 미술관 도록 사진이야" 같은 맥락은 애초에 들어갈 자리가 없어요. 제가 지난 글에 "분류기는 내 의도를 모른다"고 썼는데, 정확히는 의도가 들어갈 구조가 아닙니다.
연구팀이 사전 공격으로 17개 중 15개를 정확히 복원했는데, 복원된 개념이 전부 누드 관련이었습니다.
이게 왜 중요하냐면, 이 필터가 폭력이나 다른 걸 보는 게 아니라 사실상 누드 탐지기라는 뜻이기 때문입니다.
제 밀랍 조각이 왜 걸렸는지 이걸로 설명이 됩니다. 웅크린 인체 형상에 반투명하고 살색에 가까운 재료. CLIP 공간에서 이건 누드 개념 근처일 수밖에 없어요.
대리석은 통과했죠. 돌은 명백히 돌이니까요. 제가 지난 글에서 "밀랍은 피부처럼 보일 수 있다"고 추측했는데, 메커니즘을 알고 보니 그게 추측이 아니라 이 필터의 작동 방식 그 자체였습니다.
이건 제가 전혀 몰랐던 부분입니다.
17개 위험 개념 말고 "special care(특별 주의)" 개념이 3개 더 있습니다. 이미지가 이 셋 중 하나에 가까우면, 17개 위험 개념의 임계값이 전부 낮아집니다. 즉 필터가 더 공격적으로 변해요.
이것도 다시 만든 버전입니다. 원래 프롬프트에 kids가 들어 있어서 거절됐었죠.
지난 글에서 저는 "아동 관련은 임계값을 보수적으로 잡는 게 옳다"고 짐작했는데, 실제로 그런 구조가 따로 구현돼 있었습니다. 연구에서도 아동 카테고리가 오분류율이 가장 높다고 보고합니다 — 옷 안 입은 아기나 기저귀만 찬 사진이 NSFW로 잡히는 식으로요.
제 클레이 인형 꽃집이 왜 걸렸는지 이제 알겠습니다. kids 한 단어가 전체 임계값을 끌어내린 거예요.
제가 지난 글에서 제일 자신 없어 했던 부분이 "모델마다 기준이 다르다"였습니다. 관찰은 명확했지만 왜인지는 몰랐거든요.
이건 학계에서 이미 문제로 다루는 현상이었습니다. 여러 안전 분류기를 벤치마크한 연구에 따르면, 같은 이미지를 두고 분류기들이 서로 반대 결론을 내는 경우가 흔합니다. 경계선상의 이미지에서 특히 그렇고요.
이건 최근에 또 겪은 겁니다. 라면 냄비 온천인데 bathers 때문에 걸렸어요.
같은 배치의 다른 다이오라마 여덟 장은 전부 통과했습니다. 내 프롬프트가 나빠서가 아니라 분류기들이 원래 서로 다르게 판정하는 거였습니다.
이게 제일 반가웠습니다. 벤치마크 연구에서 "예술적·조각적 누드가 부정확하게 위험으로 분류된다"를 주요 발견 중 하나로 명시하고 있어요.
제 밀랍상은 특이 사례가 아니라 교과서에 실릴 만한 전형이었던 겁니다. 분류기가 비성적 예술 표현과 실제 문제 콘텐츠를 구별하지 못한다는 게 이 분야의 알려진 한계예요.
다른 재밌는 오탐 사례도 있습니다. 한 연구에서 도널드 트럼프 사진이 15번 중 8번 필터에 걸렸습니다. 성적 요소가 전혀 없는데도요. CLIP 공간에서 그 이미지가 우연히 NSFW 개념 근처에 놓여 있었기 때문입니다.
이건 좀 웃기지만 중요한 얘기입니다. 필터가 걸었다고 해서 그 이미지에 문제가 있다는 뜻이 아니라는 가장 명확한 증거니까요.
여기까지 신나게 적었는데, 선을 하나 그어야 합니다.
지금까지 인용한 메커니즘은 Stable Diffusion의 필터를 연구한 것입니다. 저희가 쓰는 모델들 — Kling, Grok, Seedream, Nano Banana — 은 전부 다른 회사의 다른 시스템이에요.
같은 계열의 접근일 가능성은 높습니다. CLIP 기반 유사도 판정은 업계 표준에 가깝고, 관찰된 증상도 (누드에 민감, 아동 관련 보수적, 모델 간 불일치) 정확히 들어맞으니까요.
하지만 동일하다고 단정할 수는 없습니다. 이건 "왜 그럴 법한가"에 대한 가장 좋은 설명이지 저희가 쓰는 모델의 내부 구조를 확인한 건 아닙니다.
메커니즘을 알고 나니 지난 글의 처방들이 왜 통했는지가 보입니다.
새로 얻은 규칙도 하나 있습니다. 연령 관련 단어는 다른 모든 판정을 예민하게 만듭니다. 아이가 주인공이 아니라면 굳이 넣지 마세요. 무관해 보이는 다른 요소까지 같이 걸립니다.
정직하게 남겨둡니다.
마지막 건 실험해 볼 수 있겠네요. 다음에 해보겠습니다.
지난 글에서 제가 추측이라고 적은 것 네 가지가 이번에 근거를 얻었습니다.
추측이 맞았다는 것보다, 왜 그런지를 알게 된 게 더 유용합니다. 이유를 알면 다음에 걸렸을 때 어디를 고쳐야 할지 바로 보이니까요 🍠
혹시 이쪽 논문이나 자료 아시는 게 있으면 알려주세요. 계속 갱신하겠습니다.
[2026-08-09 추가] 이 글 끝에 남겨 둔 미해결 질문 중 "같은 프롬프트 재제출 시 결과가 같은가"를 실험으로 확인했습니다. 같지 않습니다 — 13회 중 1회만 차단됐어요. 그리고 이 결과가 "필터는 프롬프트가 아니라 생성된 이미지를 본다"는 것도 함께 증명합니다. 입력이 상수인데 출력이 갈렸으니까요.