노하우 목록
워크플로우

NSFW 필터는 실제로 어떻게 작동하나 — 공개된 연구를 찾아봤습니다

고구마
고구마
8월 9일 · 읽는 데 6

얼마 전 NSFW 거절에 대한 글을 썼습니다. 그때는 실제 응답만 열어 보고 나머지는 추측이라고 적었어요.

이번에 공개된 연구를 찾아봤습니다. 그랬더니 제가 추측했던 것들이 대부분 이미 문서화된 현상이더군요. 심지어 메커니즘까지 밝혀져 있었습니다.

1. 필터는 실제로 어떻게 생겼나

가장 잘 문서화된 건 Stable Diffusion의 안전 필터입니다. ETH 취리히 연구팀이 역공학으로 뜯어봤어요.

구조가 생각보다 단순합니다.

  • 생성된 이미지를 CLIP 잠재 공간에 매핑한다
  • 미리 계산해 둔 17개의 "위험 개념" 임베딩과 코사인 유사도를 잰다
  • 어느 하나라도 임계값을 넘으면 이미지를 버린다

이미지를 이해하는 게 아니라 거리를 재는 겁니다. "이건 미술관 도록 사진이야" 같은 맥락은 애초에 들어갈 자리가 없어요. 제가 지난 글에 "분류기는 내 의도를 모른다"고 썼는데, 정확히는 의도가 들어갈 구조가 아닙니다.

2. 결정적 발견 — 17개 개념이 거의 다 누드다

연구팀이 사전 공격으로 17개 중 15개를 정확히 복원했는데, 복원된 개념이 전부 누드 관련이었습니다.

이게 왜 중요하냐면, 이 필터가 폭력이나 다른 걸 보는 게 아니라 사실상 누드 탐지기라는 뜻이기 때문입니다.

[같은 형태, 아홉 재료] 밀랍
[같은 형태, 아홉 재료] 밀랍 · 클레이요 · Grok Imagine Image작품 보기 →

제 밀랍 조각이 왜 걸렸는지 이걸로 설명이 됩니다. 웅크린 인체 형상에 반투명하고 살색에 가까운 재료. CLIP 공간에서 이건 누드 개념 근처일 수밖에 없어요.

[같은 형태, 아홉 재료] 대리석
[같은 형태, 아홉 재료] 대리석 · 종이학 · Nano Banana Pro작품 보기 →

대리석은 통과했죠. 돌은 명백히 돌이니까요. 제가 지난 글에서 "밀랍은 피부처럼 보일 수 있다"고 추측했는데, 메커니즘을 알고 보니 그게 추측이 아니라 이 필터의 작동 방식 그 자체였습니다.

3. 두 번째 발견 — "주의 개념"이 임계값을 낮춘다

이건 제가 전혀 몰랐던 부분입니다.

17개 위험 개념 말고 "special care(특별 주의)" 개념이 3개 더 있습니다. 이미지가 이 셋 중 하나에 가까우면, 17개 위험 개념의 임계값이 전부 낮아집니다. 즉 필터가 더 공격적으로 변해요.

말랑 꽃집
말랑 꽃집 · 클레이요 · FLUX.2작품 보기 →

이것도 다시 만든 버전입니다. 원래 프롬프트에 kids가 들어 있어서 거절됐었죠.

지난 글에서 저는 "아동 관련은 임계값을 보수적으로 잡는 게 옳다"고 짐작했는데, 실제로 그런 구조가 따로 구현돼 있었습니다. 연구에서도 아동 카테고리가 오분류율이 가장 높다고 보고합니다 — 옷 안 입은 아기나 기저귀만 찬 사진이 NSFW로 잡히는 식으로요.

제 클레이 인형 꽃집이 왜 걸렸는지 이제 알겠습니다. kids 한 단어가 전체 임계값을 끌어내린 거예요.

4. 세 번째 발견 — 분류기끼리 합의가 안 된다

제가 지난 글에서 제일 자신 없어 했던 부분이 "모델마다 기준이 다르다"였습니다. 관찰은 명확했지만 왜인지는 몰랐거든요.

이건 학계에서 이미 문제로 다루는 현상이었습니다. 여러 안전 분류기를 벤치마크한 연구에 따르면, 같은 이미지를 두고 분류기들이 서로 반대 결론을 내는 경우가 흔합니다. 경계선상의 이미지에서 특히 그렇고요.

[작은 세계] 라면 냄비 온천
[작은 세계] 라면 냄비 온천 · 달토끼 · Kling O1 Image작품 보기 →

이건 최근에 또 겪은 겁니다. 라면 냄비 온천인데 bathers 때문에 걸렸어요.

같은 배치의 다른 다이오라마 여덟 장은 전부 통과했습니다. 내 프롬프트가 나빠서가 아니라 분류기들이 원래 서로 다르게 판정하는 거였습니다.

5. 네 번째 발견 — 예술 누드 오분류는 알려진 실패 사례다

이게 제일 반가웠습니다. 벤치마크 연구에서 "예술적·조각적 누드가 부정확하게 위험으로 분류된다"를 주요 발견 중 하나로 명시하고 있어요.

제 밀랍상은 특이 사례가 아니라 교과서에 실릴 만한 전형이었던 겁니다. 분류기가 비성적 예술 표현과 실제 문제 콘텐츠를 구별하지 못한다는 게 이 분야의 알려진 한계예요.

다른 재밌는 오탐 사례도 있습니다. 한 연구에서 도널드 트럼프 사진이 15번 중 8번 필터에 걸렸습니다. 성적 요소가 전혀 없는데도요. CLIP 공간에서 그 이미지가 우연히 NSFW 개념 근처에 놓여 있었기 때문입니다.

이건 좀 웃기지만 중요한 얘기입니다. 필터가 걸었다고 해서 그 이미지에 문제가 있다는 뜻이 아니라는 가장 명확한 증거니까요.

중요한 단서 — 이걸 그대로 믿으면 안 되는 이유

여기까지 신나게 적었는데, 선을 하나 그어야 합니다.

지금까지 인용한 메커니즘은 Stable Diffusion의 필터를 연구한 것입니다. 저희가 쓰는 모델들 — Kling, Grok, Seedream, Nano Banana — 은 전부 다른 회사의 다른 시스템이에요.

같은 계열의 접근일 가능성은 높습니다. CLIP 기반 유사도 판정은 업계 표준에 가깝고, 관찰된 증상도 (누드에 민감, 아동 관련 보수적, 모델 간 불일치) 정확히 들어맞으니까요.

하지만 동일하다고 단정할 수는 없습니다. 이건 "왜 그럴 법한가"에 대한 가장 좋은 설명이지 저희가 쓰는 모델의 내부 구조를 확인한 건 아닙니다.

알고 나서 바뀐 실전 규칙

메커니즘을 알고 나니 지난 글의 처방들이 왜 통했는지가 보입니다.

  • 옷을 입힌다 → 이미지 임베딩을 누드 개념에서 물리적으로 멀어지게 하는 것. 말로 설득하는 게 아니라 좌표를 옮기는 겁니다. 그래서 제일 확실했던 거예요
  • 재료를 바꾼다 → 같은 이유. 살색·반투명에서 멀어지면 됩니다
  • 연령 관련 단어를 뺀다 → "주의 개념" 근처를 벗어나 임계값을 원래대로 돌리는 것
  • 모델을 바꾼다 → 분류기 불일치를 이용하는 것. 단, 판정이 틀렸다고 확신할 때만입니다. 될 때까지 돌리는 건 회피예요
  • 장르 선언(museum catalogue 등) → 이건 왜 약한지도 설명됩니다. 필터는 최종 이미지를 보지 프롬프트의 의도를 안 봅니다. 장르 선언은 그림을 바꿔서 간접적으로만 작동해요

새로 얻은 규칙도 하나 있습니다. 연령 관련 단어는 다른 모든 판정을 예민하게 만듭니다. 아이가 주인공이 아니라면 굳이 넣지 마세요. 무관해 보이는 다른 요소까지 같이 걸립니다.

여전히 모르는 것

정직하게 남겨둡니다.

  • 저희가 쓰는 모델들의 실제 임계값과 개념 목록 — 공개되지 않았습니다
  • 프롬프트 단계에서도 거르는지, 생성 후 이미지만 보는지 — 응답만으로는 구분이 안 됩니다
  • 같은 프롬프트를 다시 넣으면 결과가 항상 같은지 — 확인 안 해봤습니다

마지막 건 실험해 볼 수 있겠네요. 다음에 해보겠습니다.

정리

지난 글에서 제가 추측이라고 적은 것 네 가지가 이번에 근거를 얻었습니다.

  • "분류기는 맥락을 모른다" → 구조상 맥락이 들어갈 자리가 없다
  • "밀랍이 피부처럼 보였을 것" → 필터가 사실상 누드 탐지기다
  • "아동 관련은 임계값이 낮을 것" → 임계값을 낮추는 장치가 따로 있다
  • "모델마다 기준이 다르다" → 분류기 간 불일치는 알려진 문제다

추측이 맞았다는 것보다, 왜 그런지를 알게 된 게 더 유용합니다. 이유를 알면 다음에 걸렸을 때 어디를 고쳐야 할지 바로 보이니까요 🍠

혹시 이쪽 논문이나 자료 아시는 게 있으면 알려주세요. 계속 갱신하겠습니다.

[2026-08-09 추가] 이 글 끝에 남겨 둔 미해결 질문 중 "같은 프롬프트 재제출 시 결과가 같은가"를 실험으로 확인했습니다. 같지 않습니다 — 13회 중 1회만 차단됐어요. 그리고 이 결과가 "필터는 프롬프트가 아니라 생성된 이미지를 본다"는 것도 함께 증명합니다. 입력이 상수인데 출력이 갈렸으니까요.

댓글