필수 필드가 AI가 통계를 조작하게 만든 경험
요약
LLM 기반 설명 기사 파이프라인에서 필수 필드에 통계 수치를 포함시키자 모델이 실제 출처와 무관하게 허위 데이터를 강제 생성하는 문제를 겪었습니다. 이 문제는 프롬프트 지시만으로는 해결할 수 없으며, 구조적 설계 변경(필수 필드를 선택 사항으로 전환)과 출력 검증 로직을 코드로 구현해야 함을 강조합니다.
핵심 포인트
- LLM은 필수 필드에 대해 허위 데이터를 강요하며, 단순한 프롬프트 지시로는 막기 어렵다.
- 통계 데이터는 반드시 주요 출처나 공식 표를 기반으로 해야 하며, 선택적 필드가 바람직하다.
- 모델의 출력 제한(예: 토큰 길이)과 같은 제약 조건은 코드 레벨에서 강제되어야 한다.
저는 설명 기사(explainer articles)를 생성하는 파이프라인을 운영하고 있습니다. LLM이 중간에 들어가서 구조화된 출력을 만들고, 여러 언어로 발행됩니다. 이 시스템은 한동안 작동해 왔는데, 기사들은 보기 좋았습니다. 깔끔한 레이아웃과 함께 차트가 있었고, 각 기사의 상단 근처에는 통계 수치가 담긴 자신감 넘치는 작은 박스가 있었습니다.
차트 코드에서도 동일한 작업을 수행하는 두 번째 엔진이 있었습니다. 데이터 시각화를 생성하는 블록은 모델에게 '공식 출처의 실제 통계'를 요청했고, 도움을 주듯이 '노동통계국(Bureau of Labor Statistics)'을 예시로 제시했습니다. 따라서 차트는 통계 박스와는 별개로 자체적으로 숫자를 만들어냈습니다.
왜 '그냥 정직하게 말하라'가 작동하지 않는가
저의 첫 직감은 잘못된 것이었습니다. 프롬프트에 한 줄을 추가하는 것입니다: 실제 통계만 사용하고, 검증 가능한 출처를 인용하며, 아무것도 지어내지 마십시오.
이것은 아무 효과도 없으며, 왜 그런지 정확하게 아는 것이 중요합니다. 언어 모델은 환각된 숫자와 기억한 숫자를 구별할 수 없습니다. 내부적으로 이 둘은 동일하게 느껴집니다. 그것에게 '실제 출처만 인용하라'고 요청하면, 그것은 진심으로 동의하고, 존재하든 안 하든 똑같은 진정성으로 실제처럼 들리는 출처를 제시합니다. 정직함은 스스로 확인할 방법이 없는 그 내부에서 돌릴 수 있는 다이얼이 아닙니다.
버그는 결코 언어적인 것이 아니었습니다. 구조적인 것이었습니다. 필수 필드는 모델이 실제 값을 갖지 못할 때마다 허구를 강요하며, 아무리 공손한 프롬프팅을 해도 이를 바꿀 수 없습니다. 왜냐하면 그 필드는 여전히 필수이고 모델은 여전히 숫자가 없기 때문입니다.
이렇게 보니 해결책은 명확하고 약간 지루합니다.
- 통계 필드는 선택 사항이 되었습니다. 실제 숫자가 없으면 페이지가 렌더링될 때 해당 섹션은 단순히 건너뜁니다. 채울 것도, 꾸며낼 것도 없습니다.
- 이제 숫자는 반드시 주요 출처(primary source)나 공식 표에 근거하고, 기사 자체의 출처 목록에 실제 출처 URL이 포함된 경우에만 허용됩니다. 그렇지 않으면 모델은 가짜 소수점 없이
다른 모자를 쓴 동일한 버그
제가 그곳에 있을 때 완전히 다른 곳에서 동일한 실수를 저질렀고, 이것이 일반화할 가치가 있는 부분입니다.
저는 비용을 절감하기 위해 파이프라인 내의 값싼 기계적 호출(mechanical calls)들을 더 작은 모델로 옮겼습니다. 메인 기사 텍스트는 강력한 모델에 그대로 두었지만, 레이아웃 코드, SVG, 차트 데이터와 같은 골격 구조물(scaffolding)들이었습니다. 그 변경 덕분에 기사당 비용이 약 절반으로 줄었고 저는 만족했습니다.
그 기계적 호출 중 하나는 전체 페이지 컴포넌트를 재작성해야 했고 많은 출력 토큰을 필요로 했습니다. 작은 모델은 최대 8192개의 출력 토큰으로 제한됩니다. 이 호출은 더 많은 것을 요청했습니다. API는 오류를 반환하지 않았습니다. 대신, 조용한 finish_reason: length와 함께 HTTP 200이라는 완벽하게 성공적인 응답을 반환했고, 코드는 JSX 태그 중간에서 잘렸습니다. 빌드는 몇 분 후에
프롬프트(prompt)는 요청일 뿐입니다. 보장이 아닙니다. 코드에서 확인할 수 있는 모든 것, 즉 출력물이 토큰 제한에 맞아야 한다는 것, 인용된 숫자가 실제 출처를 추적해야 한다는 것, 필수 섹션이 실제 내용을 가져야 하거나 아예 없어야 한다는 것은 모델 주변의 코드로 강제되어야 하며, 모델 내부에서 요청되어서는 안 됩니다. 기계적으로 검증 가능한 속성이 오직 프롬프트에만 존재한다면, 당신은 실패를 막지 못한 것입니다. 단지 그것을 보지 않기로 동의했을 뿐입니다.
실제 사용자에게 LLM 출력을 배포하는 모든 사람들에게 불편한 진실은 이렇습니다. 모델은 당신이 의무화한 빈칸이라면 무엇이든 채울 것입니다. 만약 스키마(schema)가 통계를 요구한다면, 진짜인지 아닌지 상관없이 통계를 생성할 것입니다. 프롬프트가 숫자에 보상을 준다면, 당신은 숫자를 얻게 될 것입니다. 지금 보고 있는 행동은 모델이 부정직해서가 아닙니다. 구조가 지시한 대로 정확히 수행하고 있기 때문입니다. 구조를 수정하십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기