텍스트 AI 워터마크는 늘 쉽게 지워진다
Text AI watermarks will always be trivial to remove
TL;DR Highlight
EU AI Act가 요구하는 텍스트 워터마크는 paraphrase 한 번이면 지워진다는 분석
Who Should Read
EU 시장에 LLM 기능을 내놓으며 AI Act 대응과 AI 생성 텍스트 표시를 고민하는 백엔드 개발자
Core Mechanics
- EU AI Act Article 50이 8월부터 적용된다
- 2026년 8월부터 AI 출력은 "artificially generated로 탐지 가능"해야 한다.
- 저자는 Recital 133과 Code of Practice가 사실상 워터마크를 요구한다고 본다.
- 텍스트는 워터마크 넣기가 어렵다
- 텍스트는 압축된 매체라서 사람 눈에 안 띄는 변경 여지가 거의 없다.
- 변경을 넣을수록 출력 품질이 떨어진다.
- 모델을 다시 돌려 검증하는 방식은 안 된다
- 가능한 Claude 답변 공간이 워터마크 답변 공간보다 훨씬 커서 사람 글이 AI로 오탐된다.
- 모든 모델을 돌리는 것은 비용도 너무 크다.
- SynthID는 토큰 선택에 점수를 심는다
- 앞선 토큰들로 각 토큰에 점수를 매기고, 상위 후보 중 점수가 높은 토큰을 고른다.
- 검출은 글 전체의 점수 합이 비정상적으로 높은지 계산하면 돼서 쌉니다.
- temperature 0처럼 항상 최고 확률 토큰을 고르는 설정에서는 지문을 남기기 어렵다.
- OpenAI와 Anthropic은 Unicode homoglyph를 쓰는 듯하다
- 저자는 공백을 U+2004나 U+3000 같은 비슷한 문자로 바꾸는 방식을 든다.
Community Reactions
- 워터마크 알고리즘이 비공개면 제거가 trivial하지 않다는 의견
- 검출 API만 공개하고 규칙은 숨기면 규칙을 알아내기 어렵다는 주장이다.
- 긴 글에서는 효과가 있다는 의견
- 논문·법률 문서처럼 긴 글은 통계적으로 더 잘 잡히고, 다른 AI로 paraphrase하면 그 AI의 마크가 누적돼 오히려 탐지가 쉬워진다는 주장이다.
- 업계 경험자의 방어 의견
- 미디어·모델 IP 분야에서 일했다는 댓글은 워터마크가 원래 obscurity에 기대는 약한 보안이라고 했다.
- 그래도 biased sampling은 2026년 기준 최선이고 glyph 삽입은 나쁜 선택이라고 했다.
- 서명과 사람 증명으로 접근하자는 의견
- 텍스트를 조각별로 서명하는 것은 가능하지만 사람이 썼다는 증명은 못 한다는 지적이 있다.
- 키보드 입력의 하드웨어 증명이 대안이라는 의견과, raw text 대신 서명된 텍스트만 쓰자는 의견이 있었다.
- Anthropic이 EU 출시 모델에 워터마크를 넣겠다고 발표했다는 댓글 정보
- 설명만으로는 SynthID 같은 방식인지 보이지 않는 Unicode인지 알기 어렵다고 했다.
- 한 댓글은 raw text용 C2PA 구현 dualeai/c2patxt를 공유했다.
How to Apply
- 우리 서비스 출력의 숨은 Unicode 문자 검사하기
- 오늘 LLM 응답 샘플을 모아 U+2004, U+3000 등 비표준 공백이 섞였는지 스크립트로 세어 본다.
- 있으면 저장·표시 전에 일반 공백으로 정규화할지 정한다.
- AI Act 대응 계획에서 워터마크 의존도 줄이기
- 텍스트 워터마크를 유일한 증명 수단으로 쓰지 않도록 설계 문서에 한계를 적는다.
- 파일 출력(PDF, HTML)은 서명 메타데이터 같은 별도 수단을 검토 목록에 넣는다.
- 자체 호스팅·서드파티 추론 경로 확인하기
- 직접 추론을 제공하면 어느 경로에서 워터마크 샘플러를 적용할지 법무와 함께 정한다.
- 검출기 오탐을 감안해 탐지 결과만으로 사용자를 판단하지 않는 정책을 쓴다.
Try It
# 셸에 붙여넣기: 파일 속 비표준 공백(homoglyph) 개수 세기와 정규화
python3 - <<'EOF'
import sys, re, unicodedata
text = open('sample.txt', encoding='utf-8').read()
odd = [c for c in text if c != ' ' and unicodedata.category(c) == 'Zs']
print('비표준 공백 수:', len(odd))
print(sorted({hex(ord(c)) for c in odd}))
clean = re.sub(r'[^\S\n]', ' ', text)
open('clean.txt', 'w', encoding='utf-8').write(clean)
EOF
# 이어서 해 볼 것: sample.txt에 ChatGPT나 Claude 출력을 붙여넣고 돌려 보기Terminology
관련 논문
The Judge Can Debias Itself: LLM-as-a-Judge가 스스로 편향을 고치게 하는 법
심사 프롬프트에 편향 경고를 넣거나 스스로 비판시켰더니 21개 중 20개 조합에서 정확도가 올랐다
미국 노동시간의 90%는 AI 벤치마크가 제대로 다루지 못하는 일이다
벤치마크 29개를 직업 과제에 매핑했더니 노동시간 90%가 커버 밖
Postgres 19, AI 코드 리뷰가 버그를 너무 많이 찾아 출시 연기
LLM 코드 리뷰가 버그를 쏟아내 Postgres 19가 11월로 밀리고 기능 8~10개가 빠졌다
StarSkirmish Bench v0.2: LLM이 1시간 만에 짜는 StarCraft 봇 대결
LLM에게 1시간 동안 StarCraft 봇을 짜게 했더니 GPT-6 Astra가 1위
그럴듯한 설명 하나면 멀티모달 LLM 심사위원도 속는다 (JUPE 벤치마크)
정답은 그대로 두고 설명만 붙였더니 MLLM 심사위원의 오답 거절률이 12.7~13.8%p 떨어졌다
신경망은 이미 깔끔하다: polysemanticity의 원인 재해석
뉴런을 직접 들여다봤더니 대부분 한 가지 역할이 있었다는 주장
Linus Torvalds의 첫 LLM 보조 패치 시리즈
Linus가 LLM으로 folio 조회 패치 10개를 만들어 read() 벤치가 10배 빨라졌다