LLM 텍스트 워터마킹의 원리와 한계
출처: https://www.youtube.com/watch?v=PZzAxqF0KCI · 코딩애플 · 5:09 · 2026-08-25
요지
- LLM 텍스트 워터마킹은 보이지 않는 문자를 삽입하는 대신, 생성 과정에서 특정 토큰이 통계적으로 더 자주 선택되도록 편향을 넣는 방식으로 구현할 수 있다.
- 검출기는 비밀 키와 앞서 나온 토큰으로 후보 토큰 집합을 재현하고, 워터마크 대상 토큰이 우연보다 유의미하게 많이 등장하는지 검사한다.
- 비슷한 생성 확률을 가진 후보 사이에서만 선택을 조정하면 문장 품질에 미치는 영향을 줄일 수 있지만, 정확한 사실·코드처럼 선택지가 좁은 출력에는 적용하기 어렵다.
- 워터마크 검출은 확률적 판정이므로 짧은 글에서는 증거가 부족하고, 인간의 글을 AI 글로 오인하거나 AI 글을 놓칠 가능성도 있다.
- 번역, 의역, 동의어 치환 같은 후처리는 신호를 약화할 수 있으나 의미, 문체, 정확도도 함께 훼손할 수 있어 신뢰할 만한 제거법이라고 단정할 수 없다.
- 워터마크 판정만으로 작성 주체나 부정행위를 확정하지 말고, 생성 도구 공개와 작성 과정 기록 등 다른 근거와 함께 사용해야 한다.
개요
이 영상은 EU의 AI 생성물 표시 요구를 배경으로, Claude 같은 LLM이 만든 글에 텍스트 워터마크를 넣는다면 어떤 원리로 작동할 수 있는지를 설명한다. 핵심은 최종 문자열에 특수 문자를 붙이는 것이 아니라, 모델이 다음 토큰을 고르는 확률적 과정에 비밀스러운 규칙을 적용해 특정 패턴을 남기는 것이다.
이 방식은 사람이 읽을 때는 자연스러운 글을 유지하면서도 검출 권한을 가진 서비스가 통계적 흔적을 찾게 하는 데 목적이 있다. 다만 영상에서 소개하는 세부 알고리즘 일부는 공개된 연구와 힌트를 바탕으로 한 설명이며, 특정 기업의 실제 비공개 구현과 완전히 같다고 볼 수는 없다.
배경 / 사전 지식
LLM은 문장을 한꺼번에 완성하지 않는다. 지금까지 입력되거나 생성된 토큰을 바탕으로 다음에 올 수 있는 각 토큰의 점수 또는 확률을 계산하고, 그 분포에서 하나를 선택하는 과정을 반복한다. 토큰은 단어 하나일 수도 있고 단어의 일부, 문장부호 또는 공백과 결합된 조각일 수도 있다.
항상 가장 확률이 높은 토큰만 고르면 출력이 지나치게 고정될 수 있다. 그래서 실제 생성에는 온도 조절, 상위 확률 후보 제한, 확률적 샘플링 같은 방법이 사용된다. 난수 생성기는 초기값인 시드에 따라 재현 가능한 수열을 만들 수 있지만, 실제 워터마킹에서는 단순히 하나의 고정 시드만 사용하는 것보다 비밀 키와 직전 문맥을 해시해 매 위치의 규칙을 정하는 방식이 더 적합하다.
워터마크는 크게 두 접근으로 구분할 수 있다.
- 문자 삽입형: 제로 폭 문자처럼 눈에 잘 보이지 않는 문자를 완성된 글에 삽입한다. 구현은 쉽지만 정규화나 복사·붙여넣기 과정에서 탐지·제거되기 쉽다.
- 생성 분포형: 모델이 토큰을 선택할 때 비밀 규칙이 지정한 후보의 확률을 조금 높인다. 표면에 별도 문자가 없으므로 단순 검색으로 찾기 어렵다.
핵심 개념
토큰 확률 분포
모델은 매 생성 단계에서 후보 토큰별 확률을 만든다. 워터마킹은 원래 확률을 완전히 무시하지 않고, 자연스러운 후보들 가운데 특정 집합에 작은 가산점을 주는 방식으로 신호를 심을 수 있다. 확률이 매우 낮은 단어를 억지로 선택하면 글이 어색해지므로 품질과 검출력 사이의 균형이 필요하다.
그린리스트와 레드리스트
설명을 단순화하면 전체 어휘를 워터마크 대상인 그린리스트와 나머지 레드리스트로 나눌 수 있다. 생성기가 그린리스트 토큰을 평소보다 조금 더 자주 선택하면, 긴 출력에는 우연만으로 설명하기 어려운 편향이 누적된다.
고정된 목록을 모든 위치에 사용하면 규칙을 추정하기 쉽다. 따라서 비밀 키와 이전 토큰 또는 이전 문맥을 결합해 위치마다 목록을 새로 만드는 방식이 쓰일 수 있다. 같은 키를 가진 검출기만 당시의 그린리스트를 재구성할 수 있다.
키 기반 의사난수
의사난수는 완전한 무작위가 아니라 시드가 같으면 같은 결과를 재현하는 계산이다. 워터마킹에서는 비밀 키와 문맥을 해시한 값을 시드처럼 사용해 다음 위치의 후보 분할이나 샘플링 규칙을 결정할 수 있다. 영상의 ‘조작된 시드’ 설명은 이 아이디어를 직관적으로 풀어낸 것으로 이해하면 된다.
비밀 키가 노출되면 공격자가 신호를 회피하거나 위조할 수 있으므로 키 관리와 교체 정책이 알고리즘만큼 중요하다.
통계적 검출
검출기는 글의 각 토큰이 해당 위치에서 그린리스트였는지 센다. 워터마크가 없다면 관측 비율은 그린리스트의 기본 비율 주변에 머물 것으로 기대된다. 관측값이 기대값보다 얼마나 큰지 z-score 같은 통계량으로 계산하고 임계값을 넘으면 워터마크 가능성이 높다고 판단한다.
이 결과는 ‘AI가 작성했다’는 절대적 증명이 아니라 특정 생성 규칙과 통계적으로 잘 맞는다는 판정이다. 임계값을 낮추면 더 잘 찾아내는 대신 오탐이 늘고, 높이면 오탐은 줄지만 워터마크가 있는 글을 놓칠 수 있다.
SynthID와 기업별 구현
영상은 Google의 SynthID와 Anthropic이 검토하거나 발표한 텍스트 워터마킹을 사례로 든다. 실제 제품은 단순한 어휘 절반 분할보다 정교한 샘플링과 검출 방식을 사용할 수 있다. 공개 설명만으로 비공개 키, 토큰 분할 방식, 판정 임계값을 확정해서는 안 된다.
작동 원리
생성 분포 기반 워터마킹을 단순화하면 다음 순서로 작동한다.
- 모델이 현재 문맥으로부터 다음 토큰의 기본 확률 분포를 계산한다.
- 생성기는 비밀 키와 직전 문맥을 해시해 해당 위치의 결정적 난수 값을 만든다.
- 그 값으로 전체 후보 가운데 일부를 그린리스트로 지정한다.
- 자연스러움을 크게 해치지 않는 범위에서 그린리스트 후보의 점수에 작은 보너스를 준다.
- 조정된 확률 분포에서 다음 토큰을 샘플링한다.
- 선택한 토큰을 문맥에 추가하고 같은 과정을 반복한다.
- 검출기는 동일한 키와 글의 앞선 토큰을 사용해 각 위치의 그린리스트를 재현한다.
- 실제 토큰이 그린리스트에 포함된 횟수와 워터마크가 없을 때의 기대 횟수를 비교한다.
- 통계 점수가 사전에 정한 임계값을 넘으면 워터마크 신호가 있다고 판정한다.
출력이 길수록 여러 위치에서 신호가 누적되므로 검출하기 쉬워진다. 반대로 짧은 답변은 표본이 적어 우연한 편차와 의도된 편향을 구별하기 어렵다. 코드, 수식, 고유명사, 정확한 인용처럼 허용 가능한 다음 토큰이 사실상 정해진 구간에서는 워터마크를 위해 다른 토큰을 선택하면 정답성이 훼손될 수 있다. 이런 구간은 편향을 적용하지 않거나 주석·설명처럼 자유도가 높은 부분에만 제한적으로 적용해야 한다.
코드 예시
다음 파이썬 예제는 실제 LLM이나 특정 회사의 구현이 아니라, 비밀 키와 이전 토큰으로 위치별 그린리스트를 재현하고 z-score를 계산하는 원리를 보여 주는 실행 가능한 모형이다.
import hashlib
import math
VOCAB = [
"AI", "모델은", "문장을", "글을", "생성한다", "작성한다",
"확률로", "토큰을", "선택한다", "고른다", "자연스럽게", "빠르게",
]
def is_green(previous: str, candidate: str, secret_key: str) -> bool:
payload = f"{secret_key}|{previous}|{candidate}".encode("utf-8")
digest = hashlib.sha256(payload).digest()
return digest[0] < 128 # 후보의 약 절반을 그린리스트로 지정
def detect(tokens: list[str], secret_key: str) -> tuple[int, float]:
if len(tokens) < 2:
raise ValueError("검출에는 최소 두 토큰이 필요합니다.")
green_count = sum(
is_green(previous, current, secret_key)
for previous, current in zip(tokens, tokens[1:])
)
sample_size = len(tokens) - 1
expected_ratio = 0.5
expected = sample_size * expected_ratio
variance = sample_size * expected_ratio * (1 - expected_ratio)
z_score = (green_count - expected) / math.sqrt(variance)
return green_count, z_score
if __name__ == "__main__":
sample = "AI 모델은 문장을 자연스럽게 생성한다".split()
count, score = detect(sample, secret_key="demo-secret")
print(f"그린 토큰: {count}/{len(sample) - 1}")
print(f"z-score: {score:.2f}")
is_green은 비밀 키, 이전 토큰, 현재 후보를 해시하므로 같은 입력과 키에서는 언제나 같은 판정을 반환한다. 검출기는 이 성질을 이용해 생성 당시의 목록을 재현한다. 예제의 그린리스트 비율은 50%이고 편향 없는 글의 기대 횟수는 전체 위치의 절반이다.
이 코드는 검출 원리만 다룬다. 실제 생성기는 모델의 후보 확률에 보너스를 적용하는 과정이 추가되어야 하며, 토크나이저, 문맥 길이, 반복 공격, 키 보안과 통계 보정도 고려해야 한다. 작은 표본에서 나온 점수로 실제 작성자를 판정해서는 안 된다.
함정·실수
- 워터마크를 눈에 보이지 않는 문자라고만 이해하면 생성 분포형 방식을 놓친다. 후자는 완성된 문자열이 아니라 토큰 선택의 통계에 신호를 남긴다.
- 시드를 알면 다음 단어를 항상 정확히 안다고 단정하면 안 된다. 실제 생성에는 모델 분포, 샘플링 설정, 구현 세부사항이 함께 작용하며 기업별 방식도 다를 수 있다.
- 검출 결과를 확정적 증거로 취급하면 오탐으로 인간 작성자를 부당하게 의심할 수 있다. 신뢰구간, 임계값, 글 길이와 다른 근거를 함께 제시해야 한다.
- 짧은 문장에 긴 문서와 같은 검출 기준을 적용하면 표본 부족으로 판정이 불안정해진다. 최소 토큰 수를 정하고 부족하면 ‘판정 불가’로 처리한다.
- 코드나 사실 문장에서 워터마크 강도를 무리하게 높이면 정확한 토큰 대신 다른 토큰이 선택될 수 있다. 자유도가 낮은 구간은 편향에서 제외한다.
- 번역하면 워터마크가 반드시 유지되거나 반드시 사라진다고 일반화할 수 없다. 번역에 사용한 모델도 자체 신호를 넣을 수 있고, 원래 신호는 약해질 수 있으므로 구현별 실험이 필요하다.
- 동의어 치환 도구를 무손실 제거기로 생각하면 안 된다. 워터마크 신호와 함께 뉘앙스, 논리, 전문용어와 사실 정확성도 바뀔 수 있다.
- 공개 연구의 예시를 특정 회사의 실제 알고리즘으로 단정하면 안 된다. 영상도 정확한 기업 내부 알고리즘은 비공개라고 설명한다.
- 비밀 키를 코드나 클라이언트에 노출하면 워터마크 회피와 위조가 쉬워질 수 있다. 검출과 키 관리는 신뢰할 수 있는 서버 환경에서 수행한다.
베스트 프랙티스
- 워터마크 판정은 단독 제재 근거가 아니라 출처 표기, 편집 이력, 초안, 인용 기록 등 작성 과정의 증거를 보조하는 신호로 사용한다.
- 검출 결과에는 점수만 제시하지 말고 분석한 토큰 수, 최소 길이, 임계값, 예상 오탐률과 ‘판정 불가’ 조건을 함께 제공한다.
- 실제 사용 언어와 문서 유형별로 품질 저하, 오탐률, 미탐률을 평가한다. 영어에서 정한 임계값을 한국어에 그대로 적용하지 않는다.
- 생성 품질과 검출력을 함께 측정하고, 원래 확률이 비슷한 후보가 충분한 위치에만 제한적으로 편향을 적용한다.
- 코드, 수식, 인용문, 법률 문구와 고유명사처럼 정확성이 중요한 구간에는 워터마크를 생략하거나 별도 정책을 둔다.
- 비밀 키는 서버에서 보호하고 주기적으로 교체한다. 키 버전을 안전하게 기록해 과거 문서도 올바른 키로 검사할 수 있게 한다.
- 번역, 요약, 일부 삭제, 문장 재배열, 동의어 치환과 여러 모델을 거친 재생성 등 현실적인 변형을 포함해 강건성을 시험한다.
- 생성 서비스는 가능한 경우 AI 사용 사실, 사용 모델, 사람의 편집 범위를 투명하게 표시한다. 기술적 워터마크는 명시적 공개를 대체하는 장치가 아니라 보완 수단으로 본다.
- 교육이나 채용에서 AI 사용 여부를 판단할 때는 허용 정책을 먼저 명확히 하고, 검출 결과에 이의를 제기하고 사람이 검토할 절차를 마련한다.
참고
- EU AI Act의 AI 생성물 표시 의무와 과징금에 관한 영상의 설명
- Google SynthID: 생성 콘텐츠에 워터마크를 삽입하고 검출하는 기술 사례
- Anthropic의 텍스트 워터마킹 도입 관련 영상의 설명
- 토큰을 두 집합으로 나누어 한쪽의 선택 확률을 높이는 연구 아이디어
- 비밀 키·문맥 기반 시드와 샘플링 함수를 이용한 워터마킹 아이디어
- GitHub에 공개된 동의어 치환 방식의 워터마크 제거 도구에 관한 언급
- 구체적인 논문명, Anthropic 발표문 URL, 제거 도구 저장소명은 영상 내 명시 없음