토큰이 아니라 한글 음절에 표시한다
한국어는 띄어쓰기가 틀려도 읽는 데 문제가 없지만, 공백이 바뀌면 토큰 분할이 통째로 달라집니다. 그래서 토큰 위에 찍은 기존 워터마크는 공백 수정 한 번에 약해지고, 검사하려면 그 모델의 토크나이저가 있어야 합니다.
키만으로 검출
모델, 토크나이저, 형태소 분석기가 필요 없습니다. 검출기 하나로 여러 회사 모델의 출력을 모두 확인할 수 있고, 글 1,000개를 0.1초 안에 검사합니다.
정의상 불변
서식 문자를 지우고 NFC로 정규화한 한글 음절열이 같으면 점수도 같습니다. 띄어쓰기 변경, ZWSP, 자모 분해, 재토큰화에 흔들리지 않습니다.
어느 모델에나
생성할 때 로짓만 조정하므로 추가 학습이 없습니다. HuggingFace transformers와 vLLM에 한 줄로 붙고, 생성 속도 저하가 거의 없습니다.
지금 브라우저에서 검사해 보세요
검출은 키만 있으면 되기 때문에 서버 없이 이 페이지 안에서 바로 돌아갑니다. 예시 글은 실험에서 EXAONE-3.5-7.8B가 공개 실험 키(h1, δ=3)로 쓴 출력의 일부입니다.
판정 기준은 z > 4(표준정규분포에서 우연히 나올 확률 약 0.003%)입니다. 키를 한 글자만 바꾸거나 변형을 생성 때와 다르게 고르면(예시 글은 h1) 워터마크 글의 z가 0 근처로 떨어집니다. 실제로 쓸 때는 공개된 실험 키 대신 자신만의 키를 쓰세요.
세 단계로 표시하고, 키로 찾는다
한글 음절만 남긴다
서식 문자(ZWSP 등)를 지우고 자모로 쪼개진 글자를 NFC로 합친 뒤, 완성형 한글 음절만 남깁니다. 공백·문장부호·영문은 판정에 들어가지 않습니다.
이웃 음절 쌍을 키로 판정
음절 11,172개로 만든 약 1억 2천만 쌍 각각을 비밀 키 해시로 초록(25%) 또는 빨강으로 나눕니다.
음절을 완성하는 토큰을 민다
모델이 다음 토큰을 고를 때, 그 토큰이 새로 완성하는 음절 쌍 중 초록의 비율만큼 점수 δ를 더합니다. 바이트 조각은 글자가 완성될 때 셉니다.
초록이 너무 많으면 워터마크
같은 쌍은 한 번만 세고, 초록 쌍이 25%보다 얼마나 많은지 z 점수로 잽니다. 필요한 것은 키 하나입니다.
설치하고 바로 쓰기
검출은 numpy만 있으면 됩니다. 생성 플러그인은 transformers 또는 vLLM이 필요합니다.
| 매개변수 | 기본값 | 설명 |
|---|---|---|
key | – | 비밀 키(정수). 생성과 검출에 같은 키를 씁니다. |
delta | 2.5 | 세기. 클수록 잘 잡히지만 글이 부자연스러워집니다. 7B 이상 모델에서 2~3을 권합니다. |
variant | h1 | h1(앞 1음절 문맥) · h2(앞 2음절) · h2r(h2 + 반복 문맥 제외: 반복 억제) |
threshold | 4.0 | 검출 z 임계값. 운영 환경에서는 같은 길이의 사람 글로 보정하세요. |
max_syllables | 없음 | 앞 N음절만 검사(논문은 200) |
공백을 지워도 그대로
4개 한국어 LLM, 프롬프트 500개, 앞 200음절, 사람 글로 정한 오탐률 약 1% 기준. 기존 기법은 공식 코드와 공식 검출기를 그대로 썼습니다.