방법
- 정적 HTML·CSS·JavaScript로 AI에게 건넬 글을 만들고, 붙여 넣은 답을 수식과 규칙으로 검사한다. 페이지는 AI를 부르지 않는다.
- 탭 구성: 1 Automatic Metrics · 2 Hallucination Check · 3 LLM-as-a-Judge · 4 Benchmark Contamination.
- Automatic Metrics — 정규화(NFKC, 소문자, 유니코드 문장부호·기호 제거, 영어 관사 제거, 공백 정리) 뒤 EM, 토큰 F1(겹친 개수의 다중집합 교집합), ROUGE-L(LCS 동적 계획법, β=1). 정답이 여럿이면 최댓값.
- 한국어 토큰: 기본은 공백을 지운 글자 단위(KorQuAD 1.0 평가 스크립트의 글자 F1과 같은 방식), 선택하면 공백 기준 어절 단위. 형태소 분석기는 쓰지 않았다. 사전·모델 없이 브라우저에서 누구나 같은 값을 얻게 하고, 조사 차이(‘난간대는’·‘난간대가’)가 글자 단위에서는 대부분 겹침으로 남게 하기 위해서다. 어절 단위는 비교용으로 남겨 단위에 따라 점수가 달라지는 것을 보인다.
- 핵심값 검사 — 숫자+단위(센티미터·밀리미터·미터·킬로그램·도·단, 한·두·세 같은 수 관형사)를 뽑아 cm·kg·° 기준으로 바꾸고, 이상·이하(이내=이하)까지 비교한다. 낮은 점수 기준 θ는 0.60(정한 값, 0.30–0.90 조절).
- Hallucination Check — 줄바꿈과 문장 끝 부호 뒤 공백으로 문장을 나눈다(소수점 제외). 문장마다 숫자·단위·이상/이하, 조·항·호 번호, 핵심어(두 글자 이상 한글 어절에서 조사·어미 목록을 떼어 낸 줄기, 흔한 말 목록 제외)를 원문과 대조한다. 핵심어 기준 τ=70%(정한 값).
- LLM-as-a-Judge — 같은 쌍을 A·B와 B·A 순서로 만든 두 지시문. 판정 기호(1·2·동점)를 A·B 이름으로 되돌려 비교하고, 기록한 쌍에서 순서 따라 바뀐 비율과 자리 선호를 센다.
- Benchmark Contamination — 문항의 각 위치에서 법령 본문과 이어서 겹치는 최대 길이 Lᵢ(matching statistics)를 한 번 구하고, n=5–20 모두를 Lᵢ ≥ n으로 판정한다. 규칙은 ‘하나라도 겹침’(Brown et al. 2020)과 ‘70% 이상’(Chowdhery et al. 2022). 법령 본문은 탭을 열 때 불러온다.
- 붙여 넣기 파서 — “번호: 답” 줄, 번호 목록, 굵게 표시, 코드 블록, JSON 배열·객체, 번호 없는 10줄을 읽는다. 판정은 [[1]]·[[2]]·[[동점]], “판정:” 줄, JSON winner, “답 2가 더 낫다” 같은 문장을 읽고 마지막 판정을 쓴다.
- 학습: 없음. 서비스 내 LLM: 없음. 미리 만든 AI 답: 없음. 본문·코드 초안 작성 보조: Claude, 사람이 검수. KaTeX 0.16.9로 수식 표시.
데이터
- 국가법령정보센터: 산업안전보건기준에 관한 규칙. 시행 2026-03-02, 고용노동부령 제450호. 제13조·제14조는 지시문과 대조 원문으로, 본문 전체는 오염 체험의 비교 글 모음으로 쓴다. 법령 원문은 저작권법 제7조 제1호에 따라 보호 제외.
- 가공: 법령 PDF(168쪽)에서 pdftotext 24.02로 글자를 뽑아 제1편~제674조만 남기고(부칙·별표 제외) 쪽 머리·꼬리를 지웠다. PDF 줄바꿈은 붙인 어절이 본문 다른 곳에 나오면 붙이고, 앞뒤 어절이 따로 나오거나 앞 어절이 조사로 끝나면 띄웠다. 결과 202,851자, 669개 조. 생성 스크립트 data/build_corpus.py.
- 손으로 작성: 질문 10개와 정답·핵심값, 비교용 답 40개(문장형·숫자 틀림·말바꿈), 예시 요약 5문장과 변화 6개, 판정용 답 쌍 6개와 참고 답. 사전 생성한 모델 답은 없음.
- 사용자 입력 저장: 없음. 글씨 크기·테마만 localStorage 사용. 판정 기록은 창을 닫으면 사라지고, 상태 링크에 입력을 담는 것은 사용자가 선택.
검증
- ROUGE-L을 rouge-score 0.1.2(Python, 같은 토크나이저 지정)와 120개 경우(10문항 × 5개 답 × 글자·어절 + 추가 20개)에서 대조해 모두 일치했다(오차 1e-9 이내). EM·F1은 SQuAD v1.1 평가 스크립트 구조로 다시 짠 Python 구현과 같은 120개에서 일치했다.
- Lin(2004)의 예(police killed the gunman)에서 ROUGE-L 0.75·0.50, LCS 교과서 예(ABCBDAB, BDCABA)에서 길이 4를 재현했다. rouge-score 기본 토크나이저는 한국어 두 문장에 1.0을 낸다(숫자만 남음).
- n-gram 겹침: 무작위 글 60쌍에서 Lᵢ 방식과 n-gram 집합 전수 비교의 겹친 개수가 모든 n에서 같았다.
- 환각 규칙: 예시 요약 5문장은 모두 ‘근거 있음’. 숫자·조번호·이상/이하·없는 내용 4가지는 잡고, 말바꿈은 헛경보, 뜻 뒤집기는 놓친다(의도한 한계 시연). 추가 규칙 경우 11개 일치.
- 붙여 넣기 파서: 답 목록 형식 22가지와 판정 형식 20가지를 모두 읽고, 잘못된 입력 6가지는 거부했다. 핵심 계산 자동 확인 316건 통과.
- 실제 브라우저(Chromium)에서 390px·1280px, 4개 탭, 모든 조작, 영어판 수치 동일, 탭·절 주소 직접 열기를 확인했다.
범위
- 질문 10개, 정답 문항당 1–2개. 답 입력: 칸당 최대 20,000자. θ: 0.30–0.90.
- 요약 원문: 제13조·제14조 중 선택. 요약 문장 수 3·5·8. τ: 30–100%.
- 판정 쌍 6개, 기록 최대 200개.
- n: 5–20, 글자 또는 어절. 비교 글 모음: 법령 본문 202,851자.
출처
- Rajpurkar, Zhang, Lopyrev & Liang (2016). SQuAD: 100,000+ Questions for Machine Comprehension of Text. EMNLP.
- Lin (2004). ROUGE: A Package for Automatic Evaluation of Summaries. ACL Workshop.
- Papineni, Roukos, Ward & Zhu (2002). BLEU: a Method for Automatic Evaluation of Machine Translation. ACL.
- Lim, Kim & Lee (2019). KorQuAD1.0: Korean QA Dataset for Machine Reading Comprehension. arXiv.
- Maynez, Narayan, Bohnet & McDonald (2020). On Faithfulness and Factuality in Abstractive Summarization. ACL.
- Min et al. (2023). FActScore. EMNLP.
- Zheng et al. (2023). Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena. NeurIPS Datasets and Benchmarks.
- Wang et al. (2024). Large Language Models are not Fair Evaluators. ACL.
- Brown et al. (2020). Language Models are Few-Shot Learners. NeurIPS.
- Chowdhery et al. (2022). PaLM: Scaling Language Modeling with Pathways. arXiv.
- 국가법령정보센터 · 산업안전보건기준에 관한 규칙 · 시행 2026-03-02 · 고용노동부령 제450호.
- rouge-score 0.1.2 · Apache-2.0 · PyPI (검증에만 사용)
- KaTeX 0.16.9 · MIT · KaTeX
이력
- 2026-10-27 · v1.0 · 공개