고전 ML(TF-IDF+LinearSVC)로 LLM이 쓴 웹소설 탐지하기
Detecting LLM-Generated Texts with “Classical” Machine Learning
TL;DR Highlight
TF-IDF+LinearSVC 7개 투표로 LLM 문장을 문장당 약 85% 정확도로 가려냈다
Who Should Read
LLM 생성 텍스트 탐지기를 직접 만들거나 'AI 판별 도구'가 어떻게 동작하는지 궁금한 백엔드·ML 응용 개발자
Core Mechanics
- 고전 ML로도 AI 문장이 잡힌다
- 2026년 초 주요 LLM 글은 통계적 패턴이 강해서 전통 ML 모델로 사람 글과 구분된다고 한다.
- 저자는 시중의 'AI 표절 검사기'도 이런 방식일 것이라고 의심한다.
- 데이터는 요약→재생성으로 만들었다
- 2010~2022년(ChatGPT 이전) 사람 글 약 1만 편을 샘플링했다.
- LLM으로 챕터 요약을 만들고, 그 요약으로 전체 글을 다시 쓰게 해 7개 모델별 AI 샘플을 얻었다.
- 문장 단위 TF-IDF+LinearSVC로 85% 안팎
- 글을 문장으로 쪼개고 TF-IDF → LinearSVC로 학습했다.
- 모델별 문장 정확도는 0.8436~0.8940, 웹용으로 줄인 뒤에도 평균 약 1%p만 떨어졌다.
- 7개 이진 분류기 투표가 8클래스보다 낫다
- 사람+7개 AI를 한 번에 분류하면 정확도가 약 50%였다.
- 모델별 이진 분류기 7개를 두고 2개 이상이 AI로 보면 그 문장을 AI로 표시했다.
- 처음 보는 모델에도 어느 정도 통한다
- 학습에 없던 Claude Sonnet 4.6은 71.9%, GPT 5.2는 73.3%로 탐지됐다.
- 학습에 쓴 Deepseek V3.2는 78.4%, Doubao Seed Code는 93.0%였다.
Community Reactions
- 탐지 자체가 헛수고라는 의견
- 텍스트는 정보 밀도가 낮아서 출처 신호를 안정적으로 뽑기 어렵고, 지금의 특징만 잡는 것은 타로 점 수준이라는 의견이 있었다.
- 이미지와 달리 글은 탐지 불가 수준에 와 있다고 주장했다.
- 탐지기가 곧 학습 신호가 된다는 의견
- 탐지기를 공개하면 LLM이 그 신호를 최적화할 수 있고, 싼 패턴은 재학습에 쓰일 것이라는 의견이 있었다.
- 반대로 연구실이 모델이 분류되기 쉬운 글을 내게 RL한다는 가설도 나왔다.
- Pangram 쪽 직접 경험 공유
- Pangram 소속으로 보이는 댓글러가 이 글의 요약 기반 합성 데이터 방식이 자기 회사와 같다고 밝혔다.
- 2022년 perplexity가 SOTA였던 건 오픈 모델 위주로 평가했기 때문이고, 많은 논문이 덜 학습된 RoBERTa를 약한 기준선으로 썼다고 했다.
- 작은 인코더 모델과 영어 적용에 대한 반응
- 작은 encoder-only 트랜스포머로 만든 iOS 온디바이스 앱이 RAID-bench에서 AUROC 99.81을 냈다는 경험이 있었다.
- 영어용 분류기를 브라우저 확장으로 붙여 문단마다 돌려 보고 싶다는 의견도 있었다.
- 오탐의 피해와 대안 의견
- 학위 논문이 오탐으로 거절되면 치명적이라 오탐은 허용하기 어렵다는 의견이 있었다.
- 누가 썼는지보다 글에 들인 노력이나 proof of work를 측정하는 쪽이 낫다는 의견도 있었다.
How to Apply
- 내 도메인 글로 이진 분류기 베이스라인 만들기
- 사람이 쓴 글 수백 편을 모아 LLM으로 요약→재생성한 샘플과 짝지어 라벨링한다.
- 문장 단위로 쪼개 TF-IDF → LinearSVC를 돌리고 정확도·F1부터 확인한다.
- LLM 한 종류가 아닌 모델별 분류기 투표 쓰기
- 쓸 만한 LLM마다 생성 샘플로 이진 분류기를 따로 학습한다.
- 2개 이상이 AI로 보면 AI 문장으로 표시하고, AI 문장 글자 비율을 점수로 쓴다.
- 임계값은 사람 글 대량 샘플로 오탐률 기준 정하기
- 서버 없이 브라우저에서 돌리려면 모델을 JSON으로 내보내기
- 어휘 가중치만 JSON에 담아 JS로 TF-IDF+SVM을 구현하면 서버 없이 추론한다.
- 특징 수는 줄일수록 오탐이 흔들리니 정확도뿐 아니라 사람 글 탐지율 변화도 확인한다.
Try It
# 셸에서 실행 (pip install scikit-learn). 논문 방법의 간이 버전: 문장 단위 TF-IDF→LinearSVC
# human.txt, ai.txt: 한 줄에 한 문장씩 담은 파일을 준비한다
import re
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.metrics import accuracy_score, f1_score
def load(p):
return [l.strip() for l in open(p, encoding='utf-8') if len(l.strip()) > 5]
h, a = load('human.txt'), load('ai.txt')
X = h + a
y = [0]*len(h) + [1]*len(a)
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.2, random_state=0, stratify=y)
clf = make_pipeline(TfidfVectorizer(analyzer='char_wb', ngram_range=(1, 3), max_features=500000), LinearSVC(C=1.0))
clf.fit(Xtr, ytr)
pred = clf.predict(Xte)
print('acc', accuracy_score(yte, pred), 'f1', f1_score(yte, pred))
# 이어서 해 볼 것: 모델 여러 개로 분류기를 따로 만들어 2표 이상이면 AI로 판정해 보기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배 빨라졌다