두 페이지가 동일한 법률에 대해 서로 다른 주장을 했다. 둘 다 틀렸다.
요약
데이터셋 감사 과정에서 발견된 데이터 불일치 문제와 동적 데이터와 수동 작성된 텍스트 간의 모순 사례를 다룹니다. 데이터 파생 방식과 수동 콘텐츠 관리의 위험성을 경고하며 데이터 신뢰성 확보의 중요성을 강조합니다.
핵심 포인트
- 동적 데이터와 수동 작성 텍스트 간의 불일치 위험성
- 데이터 복사본 간의 드리프트(Drifting) 문제 해결 필요성
- 검증된 단일 출처(Single Source of Truth) 유지의 중요성
- 자동화된 데이터와 수동 콘텐츠의 혼합 사용 시 발생하는 모순
지난주 저는 제 여행 사이트의 핵심 데이터셋을 감사(audit)했습니다. 213개국과 미국의 모든 주에 대한 법적 상태(legal-status) 데이터였는데, 동일한 사실이 네 곳에 저장되어 각각 독립적으로 어긋나(drifting) 있는 것을 발견했습니다. 저는 네 개의 복사본을 모두 수정했고, 수정 사항이 반영되지 않도록 방해하던 조용한 조인(silent join) 문제를 해결했으며, 헤드라인 카운트가 빌드 타임(build time)에 데이터로부터 파생되도록 만들었습니다. 감사는 종료되었습니다. 신뢰도는 높습니다.
그 후 저는 에이전트(agent)에게 블로그 포스트 하나를 확인해 달라고 요청했습니다. 데이터셋과 동일한 주제를 다루는 플래그십 가이드(flagship guide)였습니다. 데이터와 일치하는지 확인하기 위해서였습니다.
일치하지 않았습니다. 그리고 일치하지 않는 방식은 원래의 감사에서 발견된 그 어떤 것보다 더 심각한 것으로 드러났습니다. 왜냐하면 이번에는 틀린 사실들이 차이(diff)를 기다리며 데이터 파일에 앉아 있는 것이 아니었기 때문입니다. 그것들은 문장 속에 자리 잡고 있었습니다.
스스로 논쟁하는 페이지
이 플래그십 가이드는 절반은 동적(dynamic)이고, 절반은 수동(hand-written)으로 작성되었습니다. 카드 그리드(card grids)와 비교 표(comparison tables)는 제가 방금 수정한 데이터 파일에서 정보를 가져옵니다. 따라서 감사가 완료되었을 때, 이 부분들은 자동으로 치유되었습니다. 1월에 완전히 합법화된 중앙유럽의 한 국가가 수정된 데이터가 배포되는 즉시 "합법(Legal)" 카드에 나타났습니다.
하지만 세 번 스크롤을 내리자,
_같은 페이지_에 있는 수동 작성된 FAQ에서는 해당 국가가 "비범죄화(decriminalized)되었을 뿐, 합법은 아니다"라고 말하며, 이를 차이점을 설명하는 교과서적인 예시로 사용하고 있었습니다.
한 페이지. 두 개의 답변. 파생된(derived) 절반은 맞았고, 주장된(asserted) 절반은 몇 달 뒤처져 있었습니다. 그리고 어떤 테스트로도 이를 잡아낼 수 없었는데, 왜냐하면 두 절반 모두 자신에게 명령받은 대로 정확하게 렌더링(rendering)하고 있었기 때문입니다. 또한 "82개국 모두 보기"라고 적힌 링크는 현재 155개국을 나열하고 있는 페이지를 가리키고 있었습니다.
절반은 파생되고 절반은 주장되는 페이지는 결국 스스로 모순을 일으키게 됩니다. 이것은 위험 요소가 아니라 예정된 수순입니다. 네 개의 데이터 복사본이 겪었던 것과 동일한 수순이, 행(row) 대신 단락(paragraph)을 통해 진행되는 것뿐입니다.
두 페이지, 상반된 거짓말
그것은 준비 운동에 불과했습니다. 진짜 발견은 2022년에 개방하여 유명해졌으나 그 이후로 정책을 되돌리고 있는 동남아시아의 한 국가였습니다.
제가 그에 대해 작성한 3월의 블로그 게시물에는 이렇게 적혀 있었습니다. '법적 회색 지대(legal grey zone)이며, 어떤 가게에든 걸어 들어가서 서류 작업 없이 살 수 있는 것들.'
나중에 업데이트된 제 국가 프로필 페이지에는 다음과 같이 쓰여 있었습니다. '완전히 범죄화되었으며, 모든 상점은 문을 닫았고, 무관용 원칙(zero tolerance)이 적용되어 관광객들은 체포와 네 자리 숫자 벌금에 직면할 수 있습니다. 지구상에서 가장 엄격한 국가처럼 대처하세요.'
같은 사이트. 같은 나라. 같은 달. 정반대의 조언이었고, 여기서 중요한 부분은 이겁니다. 둘 다 틀렸다는 것입니다.
검증된 현실(모델 메모리가 아닌 현재의 주요 출처)은 그 둘 사이에 정확히 놓여 있었습니다. 즉, 그 나라는 2025년 중반부터 의료용으로만 운영되었고—수천 개의 면허를 가진 상점들이 여전히 문을 열었지만, 지금 구매하려면 가게에서 받을 수 있는 처방전이 필요했습니다(15분 상담으로 가능).
결국 한 페이지는 불법적인 행동을 장려했고, 다른 페이지는 실제로 존재했던 합법적인 경로를 부정하고 있었습니다. 법의 구체적인 내용은 단지 증거일 뿐입니다. 어느 쪽 페이지든 그대로 따랐다면 독자에게 잘못된 정보를 전달한 것입니다.
만약 제가 외부적으로 확인하지 않고 이 모순을 알아챘다면, 당연히 더 최신인 페이지를 선택하고 이전 페이지를 그에 맞게 수정하는 것이었을 겁니다. 그렇게 하면 위험한 거짓말을 단순히 비용이 많이 드는 오류로 대체하고 그것을 일관성이라고 부렸겠죠.
자신의 복사본 두 개가 서로 의견이 다를 때, 어느 쪽도 결정적인 근거가 될 수 없습니다. 당신의 사본들은 정반대의 방향으로 틀릴 수 있으며, 그것들을 평균 내거나 최신 것을 믿는 것은 단지 오류를 세탁하는 행위일 뿐입니다. 유일한 결정적 근거는 건물 밖에 있습니다.
내부적인 합의가 곧 검증은 아닙니다.
조작된 법규정
그 후, 저는 에이전트에게 사이트에 있는 모든 게시물—약 55개에 달하는—을 검색하도록 시켰습니다. 법적 주장이 담긴 것들(상태, 연령, 수량, 벌금, 년도 등)을 찾아서 말입니다.
대부분은 살아남았습니다. 하지만 하나는 남아있지 않았습니다. 한 여행 안전 게시물에서 이웃 주가
그 주는 그 어떤 것도 비범죄화(decriminalized)한 적이 없었습니다. 제가 방금 직접 감사(audit)한 데이터셋에 따르면, 해당 주는 해당 지역에서 가장 엄격한 등급에 속하며, 모든 소지는 형사 범죄입니다. 그 주장은 오래된 정보가 아니었습니다. 그 내용이 사실이었던 해는 단 한 해도 없었습니다. 그것은 아마도 초안을 작성한 누군가에 의해 지어낸 것이었을 것이며, 그 이후의 모든 검토 과정을 살아남았습니다. 왜냐하면 그것이 그럴듯함(plausibility)에 필요한 모든 것, 즉 숫자, 연도, 달러 금액을 갖추고 있었기 때문입니다.
데이터셋 감사에서, 미지의 값에 대해 자신 있게 채워 넣는 이러한 실패 모드(failure mode)는 적어도 스키마(schema)에 의해 제한되었습니다. 상태(status) 컬럼은 다섯 가지 값 중 하나만 가질 수 있으며, 서른 개의 동일하고 의심스러운 값이 연속되는 것은 눈에 띄는 패턴입니다. 하지만 산문(Prose)에는 스키마가 없습니다. 조작된 법령은 조사된 법령과 똑같은 모습으로 문단 속에 자리 잡고 있으며, 어떠한 균일성(uniformity)의 신호로도 이를 드러낼 수 없습니다. 동일한 전수 조사 과정에서 법적 연령이 3년 잘못 기재된 것도 발견되었습니다. 이는 두 곳에서 일관되게 중복되어 있었는데, 바로 이 점 때문에 중복이 마치 확인(confirmation)처럼 느껴졌던 것입니다.
산문 또한 복사본이다
지난 감사의 교훈은 "하나의 사실, 네 개의 복사본"이었습니다. 그 수치는 틀렸습니다.
당신의 사이트에서 사실을 기술하는 모든 문장은 그 사실의 또 다른 복사본입니다. 버전이 지정되지 않았고, 타입(type)이 지정되지 않았으며, 스키마 검사에는 보이지 않고, 당신이 작성할 그 어떤 대조(reconciliation) 작업에서도 제외되는 것 — 그리고 데이터베이스와 달리, 그것은 독자와 검색 엔진이 실제로 소비하는 복사본입니다. 저의 '네 개의 복사본' 인벤토리는 사이트 전체에서 가장 크고 관리가 가장 안 되는 사실의 저장소, 즉 '글쓰기'를 놓쳤습니다.
만약 당신이 이 전수 조사를 재현하고 싶다면, 실제로 효과가 있었던 방법은 다음과 같습니다:
- 주장 형태의 텍스트를 Grep 하세요. 관할 구역 이름, 단위가 포함된 숫자, 허가 동사("legal", "decriminalized", "banned"), 연도, 벌금 액수 등을 찾으세요. 투박한 방법이지만, 주장(claim)은 놀라울 정도로 Grep 하기 쉽습니다.
- 모든 검색 결과(hit)를 감사된 구조화된 데이터(structured data)와 대조하세요. 방금 검증한 데이터셋이 이제 산문(prose)을 위한 정답지가 됩니다.
- 자체 소스들이 서로 충돌할 때는 외부로 나가세요. 최신성도, 확신도, 혹은 어떤 페이지가 더 권위 있어 보이는지도 아닌, 1차 자료(Primary sources)가 이를 해결합니다.
- 파생(derivation)을 향해 수정하세요. 데이터 파일로부터 렌더링된 페이지의 부분들은 데이터가 수정되는 순간 스스로 치유되었습니다. 반면, 모든 수기로 작성된 문장은 인간 형태의 수리(repair)를 필요로 했습니다. 페이지 내에서 '단언된 사실(asserted facts)' 대비 '파생된 사실(derived facts)'의 비율은 '자가 치유(self-healing)' 대비 '영구적 부채(permanent liability)'의 비율입니다.
내가 어떤 사이트에 가든 가져갈 원칙들
- 산문(Prose) 또한 하나의 복사본입니다. 당신의 인벤토리에 이를 포함시키세요. 그것은 당신이 가진 가장 큰 복사본이며, 이를 방어할 스키마(schema)가 없는 유일한 복사본입니다.
- 두 복사본이 서로 다를 때, 어느 쪽도 결정권자(tiebreaker)가 될 수 없습니다. 외부에서 검증하세요. 그렇지 않으면 당신은 단지 어떤 오류를 표준화할지 선택하고 있을 뿐입니다.
- 절반만 파생된 페이지들은 정기적으로 자기 모순을 일으킵니다. 사실이 나타나는 모든 곳에서 이를 파생시키거나, 아니면 그것을 다시 서술하는 모든 수기 문장이 새로운 유지보수 의무라는 점을 받아들이세요.
- 산문에서의 그럴듯함(Plausibility)은 데이터에서보다 조작된 내용을 더 잘 보호합니다. 스키마는 지어낸 값들을 균일해 보이게 만들지만, 단락은 그것들을 마치 조사된 것처럼 보이게 만듭니다.
데이터셋 감사는 한 번의 긴 세션으로 끝났습니다. 이번 후속 작업은 또 다른 세션을 소요했으며, 첫 번째 감사가 암묵적으로 괜찮다고 인증했던 계층에서 독자에게 실제 비용(cost)을 가장 크게 발생시키는 오류들을 찾아냈습니다. 데이터는 결코 제품이 아니었습니다. 문장이 제품이었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기