의료광고법 검수에서 가장 위험한 사각지대는 긴 글의 뒷부분입니다. 블로그 장문은 3천~5천 자에 이르는데, 검수 단계에서 앞부분만 보고 통과시키면 후반부에 숨은 위반이 그대로 발행됩니다. 이 글은 장문 검수에서 후반부 위반을 놓치지 않기 위해 어떤 설계를 했는지 정리한 것입니다.
장문 검수에서 뒷부분을 놓치는 이유
문제의 출발은 단순한 자르기입니다. 많은 검수 구현이 입력이 너무 길면 앞에서 일정 길이만 잘라(예: 앞 4천 자) 모델에 넘깁니다. 이렇게 하면 그 뒤에 있는 문장은 아예 검수 대상에서 빠집니다. 블로그 후반의 결론부에 "반드시 좋아진다" 같은 단정 표현이 있어도, 앞부분만 본 검수는 통과로 판정합니다.
즉 장문 검수에서 후반부를 놓치는 건 모델의 실수가 아니라 입력을 자른 설계의 결과입니다. 그래서 해법도 모델이 아니라 입력 처리에서 찾아야 합니다.
문장 경계로 청크를 나눈다
이 시스템은 긴 글을 통째로 자르지 않고, 문장 경계를 지키며 작은 청크로 나눠 각 청크를 모두 검수합니다. 핵심은 자르는 위치입니다. 고정 길이(예: 500자마다)로 기계적으로 자르면, 위반 표현이 청크 경계에 걸쳐 반씩 나뉘어 어느 쪽에서도 안 잡힐 수 있습니다.
그래서 마침표·물음표·느낌표·줄바꿈 같은 문장 끝에서만 자릅니다. 한 문장은 절대 두 청크로 쪼개지지 않으므로, 위반 표현 하나가 경계에서 잘려 사라지는 일이 없습니다.
- 긴 글을 문장 단위로 모아 최대 길이(약 500자) 이하의 청크로 묶습니다.
- 각 청크를 개별적으로 검수합니다.
- 판정은 가장 나쁜 결과 우선으로 합칩니다(차단 > 플래그 > 통과).
- 위험도도 가장 높은 값으로 합치고, 위반은 카테고리·표현 기준으로 중복을 제거합니다.
이렇게 하면 열 개 청크 중 아홉이 통과여도, 마지막 청크 하나가 차단이면 전체가 차단됩니다. 후반부 한 문장의 위반도 전체 판정에 반영됩니다.
검수가 실패하면 통과가 아니라 차단
두 번째 원칙은 fail-closed입니다. 검수는 외부 모델 호출이라 언제든 실패할 수 있습니다. 네트워크가 끊기거나, 응답이 깨지거나, 형식이 바뀔 수 있습니다. 이때 "일단 통과시키자"고 하면(fail-open) 검수가 죽은 순간 위반 콘텐츠가 그대로 나갑니다.
이 시스템은 반대로 갑니다. 검수 응답에 명확한 통과 판정이 없으면 오류로 처리하고 통과시키지 않습니다. 판정이 없는 상태를 통과로 해석하는 경로 자체를 막았습니다. 안전을 속도보다 우선한다는 원칙을, 예외 상황의 기본값으로 못 박은 것입니다.
이 두 원칙(문장 경계 청크 + fail-closed)은 의료광고법 검수의 신뢰성을 떠받칩니다. 검수의 다섯 유형과 이중 검수 구조는 의료광고법 자동 검수란?에서, 전체 시스템은 의료 마케팅 자동화 OS 사례에서 볼 수 있습니다.
원문은 재조립하지 않는다
한 가지 더. 검수를 위해 글을 청크로 나눴다고 해서, 발행되는 원문을 청크에서 다시 이어 붙이지는 않습니다. 순화가 필요하면 순화문을 별도로 관리하고, 통과된 원문은 원래 형태 그대로 둡니다. 청킹은 검수의 도구일 뿐, 콘텐츠를 변형하는 수단이 아니기 때문입니다. 검수 결과는 로그에 남을 때도 위반 표현 원문 대신 개수·카테고리 같은 최소 정보만 기록해, 민감한 내용이 로그로 새지 않게 합니다.
청크가 겹칠 때 위반이 중복 집계되지 않게
문장 경계로 나누다 보면, 문맥 유지를 위해 인접 청크가 일부 겹치도록 설계하는 경우가 있습니다. 이때 같은 위반 표현이 두 청크에 걸쳐 두 번 잡힐 수 있습니다. 그대로 두면 위반이 실제보다 부풀려져, 위험도 판정이 왜곡됩니다. 그래서 청크별 위반을 합칠 때 카테고리와 표현을 기준으로 중복을 제거합니다. 같은 위반은 한 번만 세되, 서로 다른 위반은 하나도 빠뜨리지 않는 것이 목표입니다.
이 균형이 중요한 이유는, 감사 로그가 나중에 소명 자료가 되기 때문입니다. 위반을 빠뜨리면 검수가 뚫린 것이고, 같은 위반을 여러 번 세면 어떤 표현이 실제 문제였는지 흐려집니다. 그래서 검수 로그에는 병합된 위반의 서로 다른 카테고리와 규칙 ID를 정렬해 남겨, "무엇이 왜 걸렸는가"가 정확히 한 번씩 기록되도록 했습니다.
자주 묻는 질문
장문 콘텐츠의 후반부 위반을 왜 놓치나요?
검수가 입력이 길면 앞부분만 잘라 모델에 넘기기 때문입니다. 잘려 나간 뒷부분은 검수 대상에서 빠져, 후반 결론부의 단정 표현 같은 위반이 그대로 통과됩니다. 해법은 입력을 자르지 않고 전체를 나눠 검수하는 것입니다.
왜 고정 길이가 아니라 문장 경계로 자르나요?
고정 길이로 자르면 위반 표현이 청크 경계에 걸쳐 반씩 나뉘어 어느 쪽에서도 안 잡힐 수 있습니다. 문장 끝에서만 자르면 한 문장이 두 청크로 쪼개지지 않아, 위반 표현이 경계에서 사라지지 않습니다.
fail-closed가 무슨 뜻인가요?
검수가 확실히 통과라고 판정하지 않으면 통과시키지 않는다는 뜻입니다. 네트워크 오류나 깨진 응답처럼 판정이 없는 상황을 통과로 해석하지 않고 차단·보류로 처리해, 검수가 실패한 순간 위반 콘텐츠가 나가는 것을 막습니다.
청크로 나누면 원문이 바뀌나요?
바뀌지 않습니다. 청킹은 검수를 위한 분할일 뿐, 발행 원문을 청크에서 재조립하지 않습니다. 통과된 원문은 원래 형태 그대로 유지되고, 순화가 필요하면 순화문을 따로 관리합니다.
청크가 겹치면 같은 위반이 두 번 잡히지 않나요?
문맥 유지를 위해 인접 청크를 조금 겹치게 두면 같은 위반이 두 청크에 걸쳐 두 번 잡힐 수 있습니다. 그래서 청크별 위반을 합칠 때 카테고리와 표현을 기준으로 중복을 제거해, 같은 위반은 한 번만 세되 서로 다른 위반은 하나도 빠뜨리지 않도록 했습니다.