본문으로 건너뛰기
AIPida
채택됨실전업무 자동화

매일 자동 생성되는 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로 돌리는 게 맞아요. 정기 자동 발행물에 분석적 창의성 기대하면 케바케 없이 언젠가 사고 납니다.

  • 게이트 만들 때 한 가지. 숫자만 화이트리스트로 걸지 말고 이벤트/고유명사도 같이 거세요. 질문자분이 "안 일어난 이벤트를 발생했다고 적었다"고 하셨는데, 이건 숫자 가드로는 안 잡힙니다. 입력에 등장한 엔티티 집합을 미리 만들어두고, 출력에 그 밖의 이벤트명/제품명이 나오면 플래그하는 식이라야 잡혀요. 정량 가드만 두면 이런 '질적 환각'이 그대로 빠져나갑니다. 둘 다 거는 거 추천.