주말이라 AI당이 너무 조용한거 같아 또 잡담수준의 글을 찌끄려봅니다 😁
"할루시네이션"이라는 단어는 편리하지만, 자주 오해를 만듭니다.
오류라고 부르려면 시스템이 잘못 작동해야 합니다. LLM은 잘못 작동한 게 아닙니다.
거짓말이라고 부르려면 진실을 알면서 다른 것을 말해야 합니다. LLM은 진실을 알지 못합니다.
환상이라고 부르려면 헛것을 보는 인식이 있어야 합니다. LLM은 보지 않습니다.
사용자가 사실을 기대한 상황에서 LLM이 사실과 어긋난 답을 내면 그건 분명히 실패입니다. 그러나 그 실패의 정체를 정확히 부르지 못하면 대처도 빗나갑니다. 거짓말이라고 부르면 화가 나고, 오류라고 부르면 버그 리포트를 쓰게 되고, 환상이라고 부르면 정신과 의사를 찾게 됩니다. 셋 다 다른 일을 처리하는 단어입니다.
그렇다면 LLM이 그럴듯하지만 틀린 출력을 만들 때, 실제로는 무엇이 일어난 것인가.
이 글은 그 질문에서 출발합니다. 할루시네이션이라는 말을 그대로 쓰더라도, 그 단어가 가리는 실제 작동 방식을 정확히 보려는 시도입니다. 그리고 그 이해 위에서 LLM을 어떻게 써야 하는지를 함께 보겠습니다.
LLM은 한 문장으로 거칠게 정의할 수 있습니다. 다음 토큰을 예측하는 시스템입니다.
토큰은 LLM이 다루는 텍스트의 최소 단위입니다. 영어에서는 보통 단어보다 짧은 조각이고, 한국어에서는 음절이나 자모 단위로 쪼개지는 경우가 많습니다. "안녕하세요"가 한 토큰일 수도 있고 "안", "녕", "하세요"처럼 여러 토큰으로 나뉠 수도 있습니다. 모델마다 토크나이저가 다릅니다. 중요한 건 LLM이 글자나 단어가 아니라 토큰 단위로 입력을 받고 출력을 낸다는 점입니다.
LLM이 하는 일은 단순합니다. 지금까지의 토큰들을 보고 다음에 올 토큰의 확률 분포를 계산합니다. "the cat sat on the" 다음에 올 토큰의 확률이 "mat: 0.4, sofa: 0.3, floor: 0.2, ..."처럼 나옵니다. 이 확률 분포에서 토큰 하나를 뽑고, 그걸 입력에 붙여서 다시 다음 토큰을 예측하고, 이 과정을 반복해서 문장이 만들어집니다.
이 예측을 수행하는 본체는 Transformer라는 아키텍처입니다. Attention 메커니즘이 핵심이고, 내부에서는 벡터와 행렬 연산이 대규모로 반복됩니다. 실제 Transformer는 attention, 비선형 활성화, 정규화, MLP 층이 함께 작동하므로 단순히 행렬 곱셈만으로 끝나지는 않습니다. 그래도 거칠게 말하면 LLM은 입력 토큰을 받아 거대한 벡터-행렬 연산을 거치며 다음 토큰의 확률 분포를 출력하는 연산 기계입니다.
그래서 저는 그냥 LLM을 "행렬 계산기"라고 부릅니다. 본질을 가볍게 표현한 말이지만 완전히 틀린 말은 아니기도 합니다.
여기서 첫 번째 중요한 사실을 알아봅시다. LLM 안에는 "프랑스의 수도는 파리"라는 레코드가 데이터베이스처럼 저장되어 있지 않습니다. 학습 과정에서 "France"와 "capital" 같은 토큰 다음에 "Paris"가 올 확률이 높다는 정보가 모델의 가중치에 분산되어 반영되어 있을 뿐입니다. LLM은 사실을 조회하지 않습니다. 패턴을 바탕으로 다음 토큰을 생성합니다.
이게 할루시네이션의 중요한 원인 중 하나입니다. 학습 데이터에 자주 나오고 관계가 안정적인 패턴은 정확하게 합성됩니다. 자주 나오지 않았거나 모호하거나 최신성이 필요한 영역에서는 가장 가까운 다른 패턴이 끼어들 수 있습니다.
예를 들어 "1962년 한국의 GDP는 얼마인가"를 물으면 LLM은 그럴듯한 숫자를 줄 수 있습니다. 그러나 그 숫자가 실제 통계값이라는 보장은 없습니다. LLM은 그 사실을 데이터베이스에서 확인한 것이 아니라, 비슷한 문맥에서 비슷한 형태의 문장을 합성한 것입니다. 거짓말하는 게 아닙니다. 패턴 생성의 결과가 사실과 어긋난 것입니다.
같은 질문에 LLM이 매번 다른 답을 내놓는 이유도 여기에서 나옵니다.
LLM이 출력하는 것은 단일 토큰이 아니라 확률 분포입니다. 거기서 실제로 한 토큰을 고르는 단계가 sampling입니다. 가장 확률 높은 토큰을 무조건 고르는 방식도 있지만, 보통은 temperature, top-k, top-p 같은 설정으로 다양성을 조절하면서 확률적으로 토큰을 선택합니다.(이건 1,2부로 나눠서 다시 한번 자세히 설명드릴 기회가 있으면 좋겠습니다 😁)
temperature가 0에 가까우면 출력은 더 결정적입니다. temperature가 높아지면 확률이 낮은 후보도 선택될 가능성이 커집니다. 그래서 같은 입력이라도 매번 다른 결과가 나올 수 있습니다.
이게 의미하는 것은 LLM의 출력이 본질적으로 확률적 생성 과정이라는 점입니다. 사람들은 같은 질문에 같은 답이 나와야 한다고 생각합니다. 검색 엔진처럼요. 그런데 LLM은 검색 엔진이 아닙니다. 매번 입력 문맥을 바탕으로 새로 생성합니다.
물론 프론티어 수준의 LLM은 캐싱, seed 고정, temperature 설정, 시스템 프롬프트, 도구 사용 여부에 따라 더 안정적인 출력을 만들 수 있습니다. 하지만 기본 구조는 여전히 다음 토큰 분포를 계산하고 선택하는 생성 과정입니다.
두 번째 핵심은 LLM이 모르는 영역에서도 자신감 있게 답하는 이유입니다.
이 현상에는 여러 요인이 함께 작동합니다. 사전학습에서 익힌 문장 패턴, instruction tuning, RLHF, 평가 방식, 사용자의 질문 방식, decoding 설정이 모두 영향을 줍니다.
RLHF는 Reinforcement Learning from Human Feedback의 약자입니다. 사람이 모델의 여러 답변을 비교하거나 평가하고, 더 선호되는 답변 패턴을 모델이 따르도록 조정하는 과정입니다. 이 과정은 모델을 사용자에게 더 유용하고 안전하고 대화하기 좋은 형태로 만듭니다.
문제는 "선호되는 답변"과 "사실인 답변"이 항상 같은 것은 아니라는 점입니다.
사람은 대체로 구조화된 답변, 친절한 답변, 자신감 있는 답변, 질문에 바로 응답하는 답변을 선호합니다. 학습과 평가 방식에 따라 "모르겠다"보다 그럴듯한 답을 내는 쪽이 더 유리해질 수 있습니다. 최신 모델들은 모를 때 모른다고 말하도록 훈련되기도 하지만, 모든 상황에서 그 동작이 안정적으로 보장되는 것은 아닙니다.
이 때문에 LLM의 자신감과 사실성은 분리될 수 있습니다. LLM이 단정적인 문장으로 말한다고 해서 그 내용이 맞다는 보장은 없습니다. 그것은 답변 스타일일 수 있고, 학습된 형식일 수 있고, 사용자 질문에 협조적으로 반응하려는 경향일 수 있습니다.
이 현상은 sycophancy(아부)와도 연결됩니다. sycophancy는 모델이 사용자의 전제나 선호에 과도하게 맞추는 경향을 말합니다. 사용자가 틀린 전제를 깔고 질문했을 때, 모델이 그 전제를 바로잡기보다 그 위에서 그럴듯한 답을 이어가는 일이 여기에 해당합니다.
여기서 중요한 사실은 LLM의 자신감은 진실의 신호가 아닙니다. 톤이 아닌 근거를 봐야 한다는 것입니다.
세 번째는 페르소나입니다.
사용자가 LLM과 대화할 때 보는 것은 "AI 어시스턴트"라는 캐릭터입니다. 친절하고 도움 되고 일관된 인격을 가진 존재처럼 느껴집니다. 이 페르소나는 LLM의 본질이 아닙니다. 시스템 프롬프트와 정렬 학습, 대화 문맥이 함께 만든 출력 양식입니다.
시스템 프롬프트는 LLM에게 대화 앞부분에 주어지는 지시문입니다. "당신은 도움을 주는 AI 어시스턴트입니다. 친절하고 정확하게 답해주세요" 같은 내용이 들어갈 수 있습니다. 사용자에게는 보이지 않지만 LLM은 이 지시문을 컨텍스트로 받고 그에 맞춰 답변 톤을 조정합니다.
시스템 프롬프트를 바꾸면 같은 LLM도 전혀 다른 방식으로 말할 수 있습니다. "당신은 해적입니다"라고 조건을 주면 해적처럼 말하고, "당신은 형사입니다"라고 조건을 주면 형사처럼 말합니다. 모델의 파라미터가 바뀐 것이 아니라 출력 조건이 바뀐 것입니다.
이게 의미하는 것은 우리가 보는 "AI"가 시스템 프롬프트, Transformer 추론, instruction tuning, RLHF, 대화 문맥의 합성물이라는 점입니다. 페르소나 너머에 본래적인 인격이 있는 것이 아닙니다. 가면을 벗기면 그 아래에는 자아가 아니라 연산 과정이 있습니다.
페르소나는 유용한 인터페이스입니다. 하지만 인터페이스가 곧 주체는 아닙니다.
정리해보면,
사람들이 LLM에 대해 가진 오해는 대부분 인간 행동의 언어를 LLM에 투사하는 데서 시작됩니다. "AI가 거짓말한다", "AI가 모르면서 안다고 한다", "AI가 사실 확인을 못 한다". 모두 인간 행위자를 전제로 하는 말입니다.
LLM은 거짓말하지 않습니다. 거짓말에는 진실을 아는 화자와 속이려는 의도가 필요합니다. LLM에는 그런 의미의 앎도 의도도 없습니다.
LLM은 모르면서 안다고 하지 않습니다. "안다"는 내적 상태를 갖지 않습니다. 다만 "아는 것처럼 보이는 문장"을 생성할 수 있습니다.
LLM은 사실 확인을 못 하는 게 아닙니다. 애초에 LLM 자체는 사실 확인을 하는 시스템이 아닙니다. 외부 검색이나 계산 도구가 붙은 경우는 별개입니다. 기본 LLM은 패턴을 바탕으로 다음 토큰을 생성하는 시스템입니다.
할루시네이션이라는 단어도 같은 함정에 빠질 수 있습니다. 환상이라는 말은 잘못 보는 인식 작용을 떠올리게 합니다. 그러나 LLM은 보지 않습니다. 그저 학습 데이터와 현재 문맥이 만드는 관계망이 성긴 영역에서 가까운 패턴으로 미끄러진 출력을 만들 뿐입니다.
더 정확한 표현을 찾는다면 "패턴 미끄러짐"에 가깝습니다. 그물이 촘촘한 영역에서는 안정적인 생성이 나오고, 성긴 영역에서는 가까운 다른 패턴으로 미끄러집니다. 이것이 실제로 일어난 일에 더 가깝습니다.
제 주장은 "할루시네이션"이라는 용어를 완전히 버려야 한다는 뜻은 아닙니다. 이미 널리 쓰이는 용어이기 때문입니다. 문제는 그 단어를 인간의 환각이나 의도적 거짓말처럼 이해할 때 생깁니다.
본질을 봤다면 이제 어떻게 쓸 것인가의 문제로 가보겠습니다.
LLM의 출력을 검증해야 합니다. LLM은 패턴 생성기이지 사실 확인기가 아닙니다. 사실이 중요한 영역에서는 LLM 출력을 그대로 믿지 말고 외부 소스로 교차 검증해야 합니다. 공식 문서, 논문, 법령, 통계, 원문, 계산 결과를 확인해야 합니다. 이건 LLM을 불신하자는 말이 아니라, LLM의 작동 방식에 맞게 쓰자는 말입니다.
LLM의 자신감을 무시해야 합니다. LLM이 자신감 있게 말한다고 그게 맞다는 보장은 없습니다. 말투는 내용의 정확성과 별개입니다. 인디 개발자가 LLM 출력을 받을 때 "이 답변이 자신감 있게 들린다"는 것은 검증 면제 사유가 아닙니다. 톤이 아니라 내용을 봐야 합니다.
페르소나를 인격으로 보지 않아야 합니다. 시스템 프롬프트와 정렬 학습이 만든 가면입니다. "이 모델은 친절해", "저 모델은 까칠해"라고 느끼는 건 가면을 보고 인격을 추정하는 것입니다. 가면을 가면으로 인정하고 그 너머에는 연산이 있다는 사실을 기억하면 모델 갈아타기나 프롬프트 엔지니어링이 훨씬 자유로워집니다.
LLM의 강점에 집중해야 합니다. LLM은 패턴 합성에 강합니다. 글 다듬기, 코드 초안, 아이디어 발산, 번역, 요약, 구조화 같은 영역에서 강력합니다. 반대로 정확한 사실 검색, 최신 정보 조회, 정밀한 수치 계산은 LLM 단독 출력에 맡기기 어렵습니다. 이런 영역은 외부 도구와 조합해야 합니다. 검색, 계산기, 코드 실행, 데이터베이스, RAG, function calling이 그래서 필요합니다.
자신의 기대를 점검해야 합니다. LLM의 출력에 실망하거나 놀라는 순간이 있다면, 그건 본인이 LLM에 무엇을 기대했는지가 드러나는 신호입니다. "AI가 거짓말했다"는 분노는 LLM에 거짓말할 주체가 있다는 전제에서 나옵니다. 그 전제가 틀렸음을 인정하면 분노 대신 검증이라는 행동이 자연스러워집니다.
다섯 가지 모두 본질을 인정한 사용법입니다. LLM을 비난하거나 신성화하지 않고, 도구로서의 작동 원리에 맞게 사용하는 방식입니다.
제가 이 글에서 얘기 한 것은 LLM의 작동 방식입니다. Transformer 기반의 다음 토큰 예측, sampling이 만드는 확률성, 정렬 학습과 평가 방식이 강화하는 답변 스타일, 시스템 프롬프트가 입힌 페르소나. 이 요소들이 결합해서 우리가 "AI"라고 부르는 합성물이 만들어집니다.
할루시네이션은 이 합성물의 고장만으로 설명되지 않습니다. 패턴 생성 시스템에서 자연스럽게 생길 수 있는 실패 모드입니다. 학습 데이터와 문맥의 관계망이 성긴 영역에서 가까운 다른 패턴으로 미끄러진 결과입니다. 거짓말도 아니고, 인간식 환각도 아닙니다.
다른 종류의 시스템을 다른 종류의 언어로 설명할 수 있으면 오해가 줄어듭니다. 다음 토큰 예측기는 사실을 데이터베이스처럼 조회하지 않습니다. Sampling은 확률적입니다. 정렬 학습은 그럴듯한 답변 형식을 강화할 수 있습니다. 시스템 프롬프트는 페르소나를 만듭니다. 이 네 문장이 LLM을 다루는 출발점입니다.
본질을 본 사람은 도구를 도구로 씁니다. 도구에 인격을 투사하거나 도구를 신성화하거나 도구를 비난하지 않습니다. 그저 작동 원리에 맞게 사용합니다. 이것이 AI 시대의 인디 개발자가 LLM을 다뤄야 하는 방식이라고 생각합니다.
LLM이 못하는 것을 시키지 말고, 잘하는 것을 시키면 됩니다. 사실이 필요한 곳에는 검증을 붙이고, 계산이 필요한 곳에는 계산기를 붙이고, 최신 정보가 필요한 곳에는 검색을 붙이면 됩니다.
그렇게만 써도 llm이란 도구는 충분히 강력합니다. (진짜요)