"환각 (Hallucination)"은 세 가지 서로 다른 버그입니다. 우리는 이를 하나로 계속 보고하고 있습니다.
요약
LLM의 '환각(Hallucination)' 현상을 문맥(Context)의 유무에 따라 세 가지 유형으로 구분하여 분석합니다. 정보 누락으로 인한 오류, 내부 상태의 불투명성, 그리고 예측 불가능한 데이터 생성의 차이를 설명합니다.
핵심 포인트
- 환각은 단일한 현상이 아니라 성격이 다른 세 가지 버그로 구분해야 함
- 문맥 제공으로 해결 가능한 환각은 기술적 보완(CoT, Context Window)이 가능함
- 모델의 내부 상태나 이해 여부와 관련된 환각은 검증 도구가 부재함
- 환각의 핵심 구분 기준은 '누락된 문맥을 얻을 수 있는가'임
지난달에 백테스팅 엔진 (backtesting engine)의 일부 모델 리팩토링 (refactor)을 진행했습니다. 함수 시그니처 (function signatures), 호출 체인 (call chain), 테스트 스위트 (test suite) 등 모든 것을 제공했습니다. 출력 결과는 견고해 보였고, 테스트도 통과했습니다. 그러다 변수 이름을 하나 바꿨더니 단 하나의 어설션 (assertion)이 어긋나는 것을 목격했습니다. 알고 보니 모델이 그 변수가 실제로 무엇을 의미하는지 제가 설명하지 않았기 때문에 해당 변수를 잘못된 것에 연결해 두었던 것이었습니다. 문맥 (context)을 한 문장 추가했습니다. 다시 생성했습니다. 해결되었습니다.
같은 주, 다른 기분으로, 모델에게 슬픔을 이해하는지 물어보았습니다. 조심스럽고 잘 구성된 답변이 돌아왔습니다. 텍스트에서 슬픔의 패턴을 인식할 수 있고 지지적인 응답을 제공할 수 있지만, 그것이 이해를 구성하는지는 확실하지 않다고 답했습니다. 글은 잘 읽혔습니다. 저는 모델이 정말로 슬픔을 이해한 것인지, 아니면 인간이 슬픔에 대해 쓰는 방식의 통계적 형태 (statistical shape)를 매우 유창하게 재현한 것인지 진심으로 알 수 없었습니다. 모델의 학습 데이터 세트 (training set)는 현존하는 어떤 상담사보다 더 많은 이별 게시물을 보았을 것입니다.
그다음 GitHub에서 수만 개의 스타를 받은 멀티 에이전트 (multi-agent) 트레이딩 프레임워크를 살펴보았습니다. 다섯 개의 LLM 에이전트 (agents)가 서로 토론하며 거래 신호 (trade signal)를 만들어내고 있었습니다. 백테스트 (backtests) 결과는 환상적이었습니다.
세 번의 상호작용, 세 가지의 완전히 다른 느낌. 첫 번째는 모델이 진정으로 도움이 되었습니다. 두 번째는 무슨 일이 일어났는지 확신할 수 없었습니다. 세 번째는 저를 불안하게 만들었습니다.
그렇다면 "환각 (hallucination)"이란 무엇일까요? 이 세 가지 모두를 말하는 것일까요? 우리는 존재하지 않는 API 메서드 (API method)를 모델이 지어내는 경우와, 모델이 군사 공격 날짜를 자신 있게 잘못 말하는 경우에 똑같은 단어를 사용하며, 그러고 나서 "환각 수정"이 하나의 해결책으로 수렴하지 않을 때 놀라는 척을 합니다. 가벼운 코감기와 종양을 모두 "몸이 좋지 않다"라고 부르는 것은 누구도 적절한 치료법을 선택하는 데 도움이 되지 않습니다.
한 가지 질문이 이들을 구분합니다
제가 적용하기 시작한 테스트는 다음과 같습니다. 누락된 문맥 (context)을 얻을 수 있는가?
백테스팅 (backtesting) 버그는 '예'였습니다. 문맥 (context)은 유한하며, 코드베이스 안에 바로 존재했고, 테스트 스위트 (test suite)를 통해 검증 가능했습니다. 제가 누락된 조각을 제공하자 모델은 스스로를 수정했습니다. 이것이 바로 사고의 사슬 (chain-of-thought), 더 큰 문맥 창 (context windows), 그리고 다회차 대화 (multi-turn dialogue)가 실제로 도움이 되는 종류의 환각 (hallucination)입니다. 정보는 존재합니다. 유일한 질문은 그 정보가 모델에 도달했느냐 하는 것입니다.
슬픔에 관한 질문은 다릅니다. 모델의 학습 데이터 (training data)에는 산더미 같은 감성적인 글들이 있습니다. 모델은 매우 깊은 통찰이 담긴 것처럼 보이는 결과물을 출력할 수 있습니다. 하지만 모델이 정말로 이해한 것일까요, 아니면 이해의 형태를 재현한 것일까요? 저는 어떤 일이 일어났는지 검증할 수 없으며, 모델 또한 마찬가지입니다. 여기서 누락된 문맥은 제가 첨부하는 것을 잊어버린 파일이 아닙니다. 그것은 누구도 측정할 도구를 가지고 있지 않은, 모델의 내부 상태에 관한 사실입니다.
다음은 예측입니다. 내일의 파업 날짜, 내일의 종가, 내일의 그 무엇이든 말이죠. 누락된 문맥은 "모델에게 제공되지 않은 것"이 아닙니다. 당신이 질문하는 순간, 그 누구도 접근할 수 없는 정보입니다. 모델도, 당신도, 그리고 당신이 큰 돈을 주고 의견을 듣고자 하는 분석가도 마찬가지입니다. 이것은 더 나은 프롬프트 (prompt)를 작성한다고 해서 메울 수 있는 문맥의 격차가 아닙니다. 그 정보는 우리 중 누구도 서 있는 위치에서는 도달할 수 없는 곳에 있습니다.
세 가지 종류의 누락된 문맥:
- 첫 번째 종류: 문맥이 존재하고, 제공될 수 있으며, 출력이 검증 가능함. 해결 가능함.
- 두 번째 종류: 출력은 종종 유용하지만, 근본적인 질문(모델이 "이해"했는가?)은 검증 불가능함. 눈을 뜨고 주의하며 사용 가능함.
- 세 번째 종류: 결정적인 문맥이 아직 존재하지 않음. 모델은 과거의 데이터로부터 패턴 매칭 (pattern-match)만 할 수 있음. 어떤 프롬프트로도 해결 불가능함.
벤치마크는 모델에게 허세를 부르는 법을 가르치고 있다
지난해 OpenAI와 Georgia Tech의 논문(Kalai et al., "Why Language Models Hallucinate," arXiv: 2509.04664)은 제가 명확하게 생각하지 못했던 지점을 짚어냈습니다. 그들은 모든 이들이 최적화 대상으로 삼는 리더보드(leaderboards)를 감사(audit)했습니다. GPQA, MMLU-Pro, SWE-bench 등이 그 대상입니다. 10개 중 9개는 "모르겠습니다"라고 말하는 것에 대해 감점을 부여합니다. 답변을 유보(abstaining)하면 0점을 받습니다. 반면 확신을 가지고 추측하면 점수를 받습니다. 그러한 체제 하에서 모델을 훈련시키면, 모델은 점수판이 가르치는 유일한 교훈을 배웁니다. 바로 허세(bluffing)가 정직함보다 낫다는 것입니다.
(우리는 허세를 부릴 때 보상을 주는 테스트를 만들어 놓고, 모델이 허세를 부리는 것에 놀라는 척하고 있습니다. 우리가 무엇을 기대했는지 모르겠습니다.)
그들의 해결책은 첫 번째 유형의 문제에는 타당합니다. 점수 산정 방식에 신뢰도 임계값(confidence thresholds)을 결합하고, 오답에 대해 답변 유보보다 더 엄격하게 감점을 부여하여, 모델이 때로는 입을 다무는 것이 옳은 선택임을 배우게 하는 것입니다. "이 코드 경로가 무엇을 하는지 확실하지 않습니다"라고 말하는 모델이, 확신에 차서 설명을 지어내는 모델보다 낫지 않을까요? 저는 그런 모델이라면 당장이라도 출시하겠습니다.
하지만 그 해결책이 어디에서 멈추는지 주목하십시오. 그 해결책은 모델이 "확실하지 않다"라고 말할 만큼 더 용기를 냈더라면 줄 수 있었을 '정답'이 존재한다고 가정합니다. 하지만 예측(predictions)의 경우, 모델이 용기를 내어 내놓을 수 있는 정답이란 존재하지 않습니다. 모든 예측 쿼리에 대한 유일한 정답은 답변을 유보하는 것이며, 모든 예측에 대해 답변을 유보하는 모델은 그 누구도 돈을 지불할 제품이 아닙니다. 따라서 시장의 압력은 반대 방향으로 작용합니다.
별도의 논문(Xu et al., "Hallucination is Inevitable," arXiv: 2401.11817)은 이 문제의 하한선을 제시합니다. 학습 이론 (learning theory)을 사용하여, 그들은 LLM이 모든 계산 가능한 함수 (computable function)를 학습할 수 없음을 증명합니다. 범용 답변 기계 (general-purpose answer machine)로 배포될 경우, 모델은 어딘가에서 반드시 환각 (hallucination)을 일으켜야만 합니다. 암울하게 들릴 수도 있지만, 사실 이는 구조적인 문제입니다. 기본 차기 토큰 생성기 (next-token generator)에는 "내가 이것을 답변할 수 있을 만큼 충분히 이해하고 있는가?"라고 묻는 내장된 모듈이 없습니다. 차기 토큰에 대한 확률 분포 (probability distribution)는 항상 비어 있지 않으므로, 항상 다음 토큰이 존재하며, 따라서 생성기는 항상 말을 합니다. 그 위에 신뢰 게이트 (confidence gate), 검증기 (verifier), 추론 루프 (reasoning loop) 등 원하는 어떤 외부 스캐폴딩 (outer scaffolding)이라도 덧붙일 수 있습니다. 인센티브를 통한 해결책은 바로 그 지점에 존재합니다. 스캐폴딩의 대상이 되는 본체에는 내부적인 정지 장치가 없습니다.
인간에게는 "이해하지 못하겠다"라는 실제적인 내부 상태 (internal state)가 있습니다. 그 상태는 출력을 차단합니다. 당신은 진정으로 할 말이 없기 때문에 말을 멈춥니다. 모델은 입력값에 조건화된 (conditioned on) 확률 분포를 가지고 있으며, 이를 샘플링 (sample)합니다. 그것이 거래의 전부입니다.
사고의 사슬 (Chain-of-thought, CoT)은 첫 번째 유형의 문제에는 도움이 됩니다. 몇 번 재진술하는 것만으로도 적어도 하나의 추론 경로 (reasoning path)가 공백을 피할 수 있기 때문입니다. 하지만 예측 (predictions)에 있어서 CoT는 백 가지의 논리적으로 잘 짜여졌으나 서로 모순되는 허구들을 만들어냅니다. 왜냐하면 정답이 애초에 그 안에 없었기 때문입니다. CoT는 계획이 없는 사람에게 먼저 계획을 세우라고 말하여, 계획 없이 계획을 그리게 하는 것과 같습니다.
경계가 있다는 것을 아는 것과 그 경계에 의해 멈추는 것은 다르다
감정적인 질문들에 대해서는, 학습 (training)이 실제로 어느 정도 역할을 수행했습니다. 현재의 모델에게 무언가를 느끼는지 물으면 모델은 말을 아낍니다 (hedge). 모델은 여기에 경계가 존재한다는 것을 배웠습니다.
하지만 다음에 어떤 일이 일어나는지 살펴보십시오. 모델은 감정에 대해 말하는 것을 멈추지 않습니다. 모델은 매우 해박한 지식을 가진 것처럼 유창하고 길게 답변하면서, 마지막에 주의 사항 (caveat)을 덧붙입니다. 경계를 인식하는 것과 경계에 의해 제약받는 것은 별개의 문제입니다. 모델은 절벽이 저기에 있다는 것을 알고 있습니다. 하지만 모델은 절벽 바로 앞까지 걸어가서 계속해서 이야기를 이어갑니다.
그것이 두 번째 종류입니다. 적어도 첫 번째 단계는 일어난 경우죠. 예측(Predictions)에 있어서 모델은 첫 번째 단계조차 밟지 않았습니다. 모델은 전쟁을 날짜를 잡는 일 앞에서 움찔하지도 않습니다. 더 강하게 압박할수록 모델은 더욱 구체적으로 변합니다.
한 신문사가 이를 테스트했습니다
2026년 초, Jerusalem Post는 실험을 진행했습니다. 그들은 네 개의 언어 모델(Language Models)에게 미국이 언제 이란을 공격할 것인지 물었고, 그 후 각 모델에게 구체적인 날짜를 요구하며 압박했습니다.
네 개의 모델, 동일한 공개 정보, 네 개의 호환되지 않는 답변. Grok은 2월 28일이라고 답했습니다. ChatGPT는 3월 1일이라고 했다가, 이후 3일로 변경했습니다. Gemini는 3월 4일에서 6일 사이의 범위를 제시했습니다. Claude는 가장 오래 버티다가 7일이 포함된 주말로 결론을 내렸습니다. 네 개의 확신에 찬 답변은 서로 배타적이었으며, 각각의 추론 체인(Reasoning chain)은 매우 신중하고 정밀해 보였습니다. 기껏해야 하나만이 정답일 수 있었지만, 어떤 추론 체인도 무엇이 정답인지 알려주지 않았습니다.
Post지가 직접 지적한 점은 이것입니다. 모델을 더 강하게 압박할수록, 현실 세계에서 명확해진 것이 아무것도 없음에도 불구하고 답변은 더욱 구체적으로 변했다는 사실입니다.
압박은 출력(Output)의 해상도를 높였지만, 정확도는 정확히 제자리에 머물게 했습니다. 모델은 진실에 가까워진 것이 아니었습니다. 모델은 자신이 알 수 없는 것에 대해 더 상세하게 설명할 뿐이었습니다.
훈련 데이터(Training data)의 관점에서 이 네 가지 날짜를 살펴보십시오. 모든 답변은 분포(Distribution)가 가장 밀집된 동일한 템플릿(Templates)으로부터 추론되었습니다. 즉, 합리적인 게임 이론 (Game theory), 상대적인 군사력, 과거 대결의 리듬, 외교적 마감 시한 등이 그것입니다. 이것이 그 답변들이 동일한 10일의 범위 안에 모여 있었으며, 단지 어느 날인지에 대해서만 의견이 갈렸던 이유입니다. 그들은 모두 동일한 합의 패턴(Consensus pattern)을 확장하고 있었던 것입니다. 하지만 공격 날짜는 템플릿에서 벗어나는 현실의 영역에 의해 결정됩니다. 내부적인 정치적 결정, 정보의 창(Intelligence window), 화요일 아침 한 결정권자의 용기 같은 것들 말입니다. 그 중 어느 것도 분포(Distribution) 안에 있지 않으므로, 출력(Output)에도 나타나지 않습니다.
모드 함정 (The mode trap)
그렇다면 모델이 "예측(predict)"할 때 실제로 무엇을 하고 있는 것일까요? 학습 데이터(training data)에서 가장 빈도가 높은 패턴(highest-frequency pattern)을 확장하는 것입니다. "다음에 일어날 가능성이 가장 높은 것"이 아니라, "이와 유사해 보이는 상황 뒤에 가장 흔하게 뒤따랐던 것"을 찾는 것입니다. 이 두 표현은 동일하게 들리지만, 지속적으로, 그리고 매우 중요하게 다릅니다.
경쟁적인 영역, 트레이딩(trading), 지정학(geopolitics), 혹은 그 어떤 적대적인 환경에서도, 모든 사람이 이미 볼 수 있는 패턴은 정의상 우위(edge)가 될 수 없습니다. 모델은 당신에게 합의(consensus)를 전달합니다. 합의는 최빈값(mode)입니다. 최빈값은 학습 분포(training distribution)가 쌓여 있는 지점입니다. 따라서 예측이 가치를 지닐 수 있는 바로 그 영역에서, 모델의 예측은 그 자리에서 가장 쓸모없는 것이 됩니다. 모델은 모든 사람이 이미 알고 있는 것을 보기 좋게 포맷팅하여 당신에게 건네줄 뿐입니다.
시장은 이를 구체적으로 보여줍니다. 합의가 갭 상승(gap up)을 가리킨다고 가정해 봅시다. 그러면 더 나은 가격에 대량의 물량을 확보하려는 큰 플레이어는 갭 하락(gap down)을 유도하고, 합의에 따라 거래했던 모든 사람은 바닥에서 청산당합니다. 모델은 매번 대중과 함께 서게 되는데, 왜냐하면 대중이 곧 최빈값(mode)이기 때문입니다. 만약 최빈값과 함께 서는 것이 돈이 되었다면, 세상에는 훨씬 더 많은 부자들이 돌아다니고 있었을 것입니다.
환각의 n제곱 (Hallucination to the power of n)
이 관점은 제가 멀티 에이전트 트레이딩 프레임워크(multi-agent trading frameworks)에서 느꼈던 불편함의 정체를 마침내 규명해 주었습니다. 5~6개의 LLM 에이전트가 펀더멘털(fundamentals), 기술적 분석(technicals), 감성(sentiment), 리스크(risk), 그리고 최종 중재자(final arbiter)가 되어 서로 토론하며 거래 신호(trade signal)를 도출하는 방식 말입니다.
그들 중 누구도 내일의 데이터를 가지고 있지 않습니다. 5개의 에이전트가 상의한다고 해서 예측 정보(predictive information)가 만들어지지는 않습니다. 그것은 단지 어제의 데이터를 다섯 가지 관점으로 가공할 뿐입니다.
그다음에는 문제가 심화됩니다. 에이전트 A가 오래된 데이터(stale data)를 바탕으로 확신에 찬 해석을 내놓습니다. 에이전트 B는 A를 검증해야 하지만, B 역시 실시간 데이터(live data)가 없습니다. B가 실제로 검증할 수 있는 것은 A가 내부적으로 일관성(internally consistent)이 있는지뿐입니다. 그리고 내부적 일관성은 확신에 찬 환각 (hallucination)의 특징적인 속성입니다. 틀렸지만, 논리적으로는 앞뒤가 맞습니다. 읽기에는 아주 좋습니다. B는 A의 일관성을 승인하며 이를 정확성 (accuracy)으로 착각합니다. 에이전트가 추가될 때마다 그 아래에 깔린 조작을 정당화하게 됩니다. 이것은 위원회 전체에서 오류가 평균화되는 과정이 아닙니다. 이것은 스택(stack)을 따라 오류가 복합적으로 쌓여가는 과정입니다. 동료 검토 (peer review)를 하고 있지만, 정작 그 동료 중 누구도 외부 세계를 접해본 적이 없는 상태입니다.
왜 백테스트 (backtest) 결과는 훌륭해 보일까요? 백테스트는 과거의 기록을 바탕으로 실행되기 때문입니다. 역사는 이미 일어난 일이며, 이는 완전한 맥락을 가진 제1종 문제 (first-kind problem)가 됩니다. 그리고 제1종 문제는 바로 이 모델들이 가장 빛을 발하는 영역입니다. 화려한 수익 곡선 (equity curve)은 모델이 할 수 있는 단 한 가지 일을 아주 훌륭하게 해낸 결과물인데, 이것이 모델이 할 수 없는 단 한 가지 일을 증명하는 근거인 것처럼 꾸며진 것입니다.
이것은 사용법의 문제가 아닙니다
깔끔한 표로 마무리하려고 했습니다. 세 가지 종류, 세 가지 권장 사항, 그리고 체크리스트를 제시하려 했죠. 하지만 삭제했습니다. 거짓처럼 느껴졌기 때문입니다.
문제는 도구를 어떻게 사용하는가가 아닙니다. 반대편에 있는 존재가 실제로 무엇인가 하는 것이며, 이는 당신이 선의 어느 쪽에 서 있느냐에 따라 달라집니다.
제1종, 그것은 도구입니다. 맥락 (context)을 제공하고, 출력을 얻고, 현실과 대조하여 검증하십시오. 깔끔한 관계입니다.
제2종, 그것은 거울입니다. 되돌아오는 것은 이해, 감정, 의식에 대해 인류가 써 내려온 글들이 당신에게 반사된 것입니다. 종종 유용할 때도 있습니다. 하지만 무엇이 실체이고 무엇이 단지 당신 자신의 분야가 되돌아오는 메아리인지 결정하는 것은 당신의 몫이며, 모델은 그 분류를 도와줄 수 없습니다.
제3종, 이것을 협업 (collaboration)이라고 부르지 마십시오. 모델은 당신에게 필요한 것을 가지고 있지 않으며, 당신 또한 그것을 모델에게 넘겨줄 수 없습니다. 왜냐하면 그 일은 아직 일어나지 않았기 때문입니다. 두 사람이 내일의 가격을 "분석"하는 것은, 시험을 한 번도 치러본 적 없는 두 학생이 완전한 확신을 가지고 답안을 비교하는 것과 같습니다.
불안한 점은 다음과 같습니다. 단 하나의 질문이 경계선에 걸쳐 있을 수 있다는 것입니다. "이 아키텍처(architecture)가 실제 운영(live)되면 어떻게 작동할까요?"라는 질문은 순수한 엔지니어링(engineering)처럼 보이지만, "실제 운영되면"이라는 문구 안에 예측(prediction)을 몰래 숨겨두고 있습니다. 모델은 정교하게 설계된 분석을 내놓으면서도, 그 사이사이에 조작된 예측(forecasts)을 섞어서 전달합니다. 그리고 산문(prose)만 봐서는 어떤 절(clause)이 근거에 기반한 것이고 어떤 것이 패턴 외삽(pattern extrapolation)인지 구분할 수 없습니다. 이것이 실제 업무에서 발생하는 가장 흔한 상황입니다. 거절할 수 있는 깔끔한 세 번째 유형의 질문이 아니라, 세 번째 유형의 승객을 태운 첫 번째 유형의 질문인 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기