매일 자동 생성되는 LLM 리포트가 가끔 환각(없는 숫자)을 섞는데 무인 운영에서 어떻게 거르나요
내부 지표 모아서 매일 아침 "어제 요약" 리포트를 LLM이 작성해 Slack에 올리는 자동화를 돌립니다. 무인이라 사람이 매번 검수는 안 해요.
문제는 LLM이 가끔 데이터에 없는 숫자를 지어내거나, 추세를 과장하거나, 심지어 안 일어난 이벤트를 "발생했다"고 적어버립니다. 사람이 보면 바로 아는데 무인이라 그대로 나가요. 한번은 매출 수치를 엉뚱하게 적어서 팀이 잠깐 패닉했습니다.
무인 자동화에서 LLM 출력 신뢰도를 어떻게 확보하세요? 모델을 더 좋은 걸로 바꾸면 해결되나요, 아니면 구조로 막아야 하나요?
답변 3개
- 채택된 답변에디터 검증
모델 업그레이드로 해결될 문제 아닙니다. GPT든 Claude든 더 좋은 모델 써도 자유 서술 시키면 숫자는 또 지어내요. 구조로 막아야 합니다. 한 줄로 요약하면 LLM한테 계산이나 사실 판단을 시키지 말고, 이미 확정된 사실의 문장화만 시켜라.
제일 중요한 건 숫자는 전부 코드가 계산하고 LLM엔 '확정값'으로 주입하는 거예요. 매출/증감률/순위 다 코드에서 뽑아서 "이 숫자들만 써라, 새 숫자 만들지 마라"고 프롬프트에 박습니다. LLM이 산수하는 순간 환각 들어옵니다. LLM은
전일 대비 12.3% 상승을 문장으로 풀어쓰는 역할만.근데 이것만으론 안 잡혀서, 출력 검증 게이트를 꼭 다세요. 리포트 텍스트에서 숫자를 정규식으로 다시 긁어서, 입력으로 준 확정값 집합에 없는 숫자가 본문에 등장하면 발행 막고 플래그.
nums = set(re.findall(r'[\d,]+\.?\d*', report)) strays = nums - allowed_values if strays: flag_for_review(report, strays) # 자동 발행 X질문자분 매출 패닉 사건, 이 게이트 하나만 있었어도 막혔을 겁니다. 모델 바꾸는 것보다 이게 먼저예요.
여기에 "각 주장 옆에 어느 입력 필드에서 나온 건지 출처 달아라" 강제하면, 출처 못 다는 주장(=지어낸 것)이 드러나서 디버깅도 쉬워지고요. 그리고 게이트에 걸리면 그냥 죽이지 말고 '검수 필요' 상태로 사람한테 핑 보내는 escalation 한 줄만 두면, 완전 무인이랑 완전 수동 사이 절충이 됩니다.
"숫자는 코드가, 문장은 LLM이" 이게 결론이고, 저는 한 발 더 가서 아예 LLM 자유 서술을 버리고 템플릿 슬롯 채우기로 바꿨어요.
뼈대 문장은 코드가 확정값으로 다 만들고(
매출 {x}원, 전일 대비 {y}%), LLM은 정해진 슬롯의 톤 다듬기나 한 줄 코멘트 정도로만 권한을 줍니다. LLM 창의 면적을 줄일수록 환각 면적도 같이 줄어요. 매일 나가는 정형 리포트는 어차피 창의성 필요 없으니 이게 잘 맞습니다.진짜 인사이트성 분석이 필요하면 그건 무인 정기 발행물에 끼우지 말고, 사람이 보는 화면에서 on-demand로 돌리는 게 맞아요. 정기 자동 발행물에 분석적 창의성 기대하면 케바케 없이 언젠가 사고 납니다.
게이트 만들 때 한 가지. 숫자만 화이트리스트로 걸지 말고 이벤트/고유명사도 같이 거세요. 질문자분이 "안 일어난 이벤트를 발생했다고 적었다"고 하셨는데, 이건 숫자 가드로는 안 잡힙니다. 입력에 등장한 엔티티 집합을 미리 만들어두고, 출력에 그 밖의 이벤트명/제품명이 나오면 플래그하는 식이라야 잡혀요. 정량 가드만 두면 이런 '질적 환각'이 그대로 빠져나갑니다. 둘 다 거는 거 추천.