ChatGPT에 질문을 던지면 몇 초 만에 자연스러운 문장이 돌아옵니다. 그 안에서 실제로 일어나는 일은 생각보다 단순한 동작의 반복입니다. 지금까지 나온 글을 보고, 다음에 올 조각 하나를 고른다. 이 글에서는 대형 언어 모델(LLM)이 문장을 토큰으로 쪼개고, 숫자 벡터인 임베딩으로 바꾼 뒤, 트랜스포머의 어텐션으로 문맥을 읽어 다음 토큰의 확률을 계산하는 과정을 단계별로 정리합니다. 이어서 이 원리로 보면 왜 그럴듯한 거짓말, 이른바 '환각'이 생기는지, 컨텍스트 창과 temperature 같은 설정이 결과에 어떤 영향을 주는지도 살펴봅니다.
문장을 잘게 쪼개기: 토큰
컴퓨터는 글자를 그대로 이해하지 못합니다. 그래서 LLM이 가장 먼저 하는 일은 입력 문장을 토큰(token)이라는 작은 단위로 자르는 것입니다.
토큰은 단어와 비슷하지만 꼭 같지는 않습니다. 자주 쓰이는 단어는 통째로 하나의 토큰이 되고, 드문 단어나 긴 단어는 여러 조각으로 나뉩니다. 머릿속에 이런 그림을 그려 보면 쉽습니다.
- 원문: "고양이가 창밖을 본다"
- 토큰화 결과(예시): [고양이] [가] [창] [밖을] [본다]
실제로 어떻게 잘리는지는 모델마다 쓰는 토크나이저에 따라 다릅니다. 핵심은 모델이 미리 정해 둔 '토큰 사전'이 있고, 각 토큰마다 고유한 번호가 붙어 있다는 점입니다. 문장은 결국 번호의 나열로 바뀝니다.
이 단계가 왜 중요할까요? 모델이 한 번에 읽고 쓰는 단위가 글자도 단어도 아닌 토큰이기 때문입니다. 글자 수를 정확히 세거나 단어를 거꾸로 뒤집는 작업을 LLM이 의외로 자주 틀리는 이유 중 하나가 여기에 있습니다. 모델 입장에서는 '글자'가 아니라 '조각'을 보고 있으니까요. 또 같은 내용이라도 언어에 따라 필요한 토큰 수가 달라질 수 있어서, 사용량이나 처리 한도가 토큰 단위로 계산되는 서비스가 많습니다.
번호에 의미를 입히기: 임베딩
토큰 번호 자체는 아무 의미가 없습니다. 100번과 101번이 비슷한 뜻이라는 보장이 없지요. 그래서 모델은 각 토큰을 임베딩(embedding)이라는 긴 숫자 목록, 즉 벡터로 바꿉니다.
임베딩을 이해하는 가장 쉬운 비유는 지도 위의 좌표입니다. 서울과 인천이 지도에서 가깝듯, 의미가 비슷한 토큰은 임베딩 공간에서도 가까운 곳에 놓입니다. '고양이'와 '강아지'는 서로 가깝고, '고양이'와 '세금'은 멀리 떨어져 있는 식입니다.
다만 실제 임베딩 공간은 2차원 지도가 아니라 수백에서 수천 개의 축을 가진 공간입니다. 사람이 직접 그릴 수는 없지만, 원리는 같습니다. 각 축이 무엇을 뜻하는지 사람이 정해 주는 것이 아니라, 모델이 방대한 글을 학습하면서 스스로 쓸모 있는 배치를 찾아냅니다. 그 결과 '방향'에도 의미가 담기는 경우가 있습니다. 예를 들어 어떤 방향으로 이동하면 성별이, 다른 방향으로 이동하면 단수와 복수가 바뀌는 것처럼 보이는 현상이 관찰되기도 합니다.
여기까지 오면 문장은 '좌표들의 줄'이 됩니다. 하지만 아직 문제가 하나 남습니다. 같은 단어라도 문맥에 따라 뜻이 달라진다는 점입니다.
문맥을 읽는 눈: 트랜스포머와 어텐션
'배'라는 단어를 떠올려 보세요. "배가 고프다"의 배, "배를 타다"의 배, "배가 달다"의 배는 모두 다릅니다. 처음 임베딩 단계에서 '배'는 하나의 좌표를 받지만, 문장을 제대로 이해하려면 주변 단어를 보고 그 좌표를 고쳐야 합니다. 이 일을 하는 것이 트랜스포머(Transformer) 구조의 핵심인 어텐션(attention)입니다.
어텐션은 이렇게 비유할 수 있습니다. 회의실에 문장 속 토큰들이 한 명씩 앉아 있다고 상상해 봅시다. 각 토큰은 세 가지를 들고 있습니다.
- 질문(Query): "나를 이해하려면 어떤 정보가 필요하지?"
- 이름표(Key): "나는 이런 정보를 갖고 있어."
- 전달할 내용(Value): "내가 실제로 건네줄 정보는 이거야."
'배'는 자기 질문을 들고 다른 토큰들의 이름표를 하나씩 확인합니다. "고프다"의 이름표가 질문과 잘 맞으면 그쪽에 더 많은 주의를 기울이고, 그 토큰이 건네주는 내용을 많이 받아들입니다. 그렇게 해서 '배'의 좌표는 '음식, 신체'와 관련된 쪽으로 조금 이동합니다. 이 과정이 모든 토큰에서 동시에 일어납니다.
트랜스포머는 이런 어텐션을 여러 갈래로 나눠(멀티헤드 어텐션) 서로 다른 관점의 관계를 동시에 살피고, 그 사이에 정보를 가공하는 층을 끼워 넣은 블록을 여러 겹 쌓습니다. 층을 지날수록 각 토큰의 벡터에는 단어 자체의 뜻뿐 아니라 문장 전체의 맥락이 점점 더 녹아듭니다. 단어 순서 정보도 별도로 더해 주기 때문에 "개가 사람을 물었다"와 "사람이 개를 물었다"를 구별할 수 있습니다.
텍스트를 생성하는 모델에서는 한 가지 규칙이 더 있습니다. 각 토큰은 자기보다 앞에 있는 토큰만 볼 수 있습니다. 미래의 단어를 미리 엿보면 '다음 단어 맞히기' 연습이 의미가 없어지기 때문입니다.
이 부분은 말로만 들으면 추상적으로 느껴지기 쉽습니다. 수학 개념을 시각적으로 풀어내는 3Blue1Brown 채널의 한국어 영상을 함께 보면 감을 잡는 데 도움이 됩니다. 제목에서 알 수 있듯 ChatGPT의 기반인 트랜스포머를 다루는 편이니, 위의 비유를 떠올리며 보면 좋겠습니다.
다음 토큰 하나 고르기: 확률과 temperature
여러 층을 통과하고 나면, 마지막 토큰의 벡터에는 "지금까지의 글 전체"가 압축되어 담깁니다. 모델은 이 벡터를 토큰 사전 전체에 대한 점수로 바꾸고, 다시 확률 분포로 변환합니다. 예를 들어 "오늘 날씨가 정말" 다음에 올 토큰으로 [좋다]에 높은 확률, [덥다]에 그보다 조금 낮은 확률, [파랗다]에는 아주 낮은 확률이 매겨지는 식입니다.
그다음 이 분포에서 토큰 하나를 고르고, 그 토큰을 문장 끝에 붙인 뒤, 다시 처음부터 같은 과정을 반복합니다. 우리가 보는 긴 답변은 이렇게 한 토큰씩 이어 붙인 결과입니다. 화면에 글자가 조금씩 흘러나오는 것도 이 방식과 관련이 있습니다.
여기서 temperature라는 설정이 등장합니다. 확률 분포를 얼마나 '뾰족하게' 혹은 '평평하게' 만들지 조절하는 값입니다.
- 낮은 temperature: 확률이 가장 높은 토큰 쪽으로 쏠립니다. 답이 안정적이고 반복 가능하지만, 표현이 단조로워질 수 있습니다. 요약, 정보 추출, 코드 작성처럼 정확성이 중요한 작업에 어울립니다.
- 높은 temperature: 낮은 확률의 토큰도 뽑힐 기회가 늘어납니다. 표현이 다양하고 창의적으로 보이지만, 엉뚱한 방향으로 흐를 위험도 커집니다. 아이디어 내기나 글짓기에 쓰기 좋습니다.
같은 질문에 매번 조금씩 다른 답이 나오는 이유도 여기에 있습니다. 모델이 '정답 하나'를 꺼내는 것이 아니라 확률에 따라 토큰을 뽑기 때문입니다.
환각은 왜 생길까: 그럴듯함과 사실은 다르다
지금까지의 과정을 다시 보면 중요한 사실이 하나 드러납니다. 모델이 매 순간 계산하는 것은 "이 문맥 다음에 그럴듯한 토큰은 무엇인가"이지, "이 내용이 사실인가"가 아닙니다.
그래서 다음과 같은 상황에서 환각이 생기기 쉽습니다.
- 학습 데이터에 정보가 부족할 때: 잘 알려지지 않은 인물이나 최신 사건을 물으면, 모델은 비슷한 패턴의 문장을 이어 붙여 그럴듯한 답을 만들어 냅니다.
- 형식이 내용을 끌고 갈 때: "출처를 알려 줘"라고 하면 논문 제목, 저자, 연도처럼 보이는 형식을 자연스럽게 생성하지만, 그 논문이 실제로 존재하는지는 별개의 문제입니다.
- 앞에서 한 실수를 따라갈 때: 한 번 잘못된 토큰이 선택되면, 이후 토큰은 그 잘못된 내용을 '문맥'으로 삼아 일관되게 이어 갑니다. 틀린 말을 매끄럽게 정당화하는 모습이 나오는 이유입니다.
유창함은 정확함의 증거가 아니다.
LLM을 쓸 때 기억해 둘 만한 원칙입니다. 특히 건강, 법률, 금융처럼 결과가 중요한 분야에서는 모델의 답을 출발점으로만 삼고, 원문 자료를 확인하거나 해당 분야 전문가와 상담하는 것이 안전합니다.
컨텍스트 창이라는 작업대
모델이 한 번에 볼 수 있는 토큰의 양에는 한계가 있는데, 이를 컨텍스트 창(context window)이라고 합니다. 책상 넓이에 비유할 수 있습니다. 책상 위에 펼쳐 둔 자료만 참고할 수 있고, 책상 밖으로 밀려난 내용은 볼 수 없습니다.
대화가 아주 길어지거나 긴 문서를 통째로 넣으면, 서비스 방식에 따라 앞부분이 잘리거나 요약되어 초반에 정한 조건을 모델이 놓치는 일이 생깁니다. 반대로 질문과 관련된 자료를 컨텍스트 창 안에 직접 넣어 주면, 모델은 기억에 의존하는 대신 눈앞의 자료를 근거로 답할 수 있어 환각이 줄어드는 경향이 있습니다. 검색 결과를 함께 넣어 주는 방식이 널리 쓰이는 이유입니다.
원리를 알면 달라지는 사용법
토큰, 임베딩, 어텐션, 확률이라는 네 단계를 이해하면 LLM을 다루는 요령도 자연스럽게 따라옵니다.
- 문맥을 충분히 주세요. 어텐션은 주어진 문맥에서만 단서를 찾습니다. 목적, 독자, 형식, 제약 조건을 구체적으로 적을수록 다음 토큰의 확률이 원하는 방향으로 모입니다.
- 근거 자료를 함께 넣으세요. 사실 확인이 필요한 작업이라면 관련 문서를 붙여 넣고 "이 자료 안에서만 답해 줘"라고 요청하는 편이 낫습니다.
- 작업에 맞게 무작위성을 조절하세요. 설정을 바꿀 수 있는 도구라면 정확성이 필요할 때 temperature를 낮추고, 아이디어가 필요할 때 높여 보세요.
- 긴 대화는 중간에 정리하세요. 핵심 조건을 다시 적어 주거나 새 대화로 옮기면 컨텍스트 창 한계로 인한 누락을 줄일 수 있습니다.
- 검증할 수 있는 형태로 받으세요. 출처, 계산 과정, 단계별 근거를 함께 요청하면 틀린 부분을 찾아내기가 훨씬 쉬워집니다.
ChatGPT가 보여 주는 놀라운 문장력은 결국 "다음 토큰 하나"를 고르는 일을 엄청난 규모로, 아주 정교하게 반복한 결과입니다. 그 구조를 알고 나면 모델이 잘하는 일과 조심해야 할 일이 선명하게 갈립니다. 다음에 답변이 한 글자씩 흘러나오는 화면을 보게 되면, 그 뒤에서 수많은 토큰이 서로를 바라보며 확률을 다투고 있는 장면을 한번 떠올려 보세요.






