자동완성
클로드 코드를 오토 모드에 놓고 여러 세션을 오가며 일하면서도 정작 그 기반인 LLM이 어떤 원리로 동작하는지 충분히 이해하지 못하고 있다는 사실이 늘 마음에 부담이었습니다. 그래서 다음 토큰을 맞추는 단순한 작업에서 시작해 트랜스포머의 수학, 현대 LLM이 나아가는 방향, 그리고 에이전트와 MCP가 이 모든 것을 실제 작동에 연결하는 원리까지 한 번에 정리해봤습니다.
집에서 작업할 때 클로드 코드를 띄워 두고 터미널 창 두세 개를 오가는 일이 이제 일상이 되었습니다. 한 창은 권한을 일일이 확인하지 않는 모드로 두고 다른 창은 아예 모든 동작을 알아서 진행하도록 풀어 둔 채로 한쪽이 테스트를 돌리는 동안 다른 쪽에 새 작업을 시키고 그 사이에 세 번째 창에서 문서를 정리시키는 식입니다. 회사 일도 크게 다르지 않아서 사양을 정리하거나 데이터를 다듬거나 오래된 코드를 읽어 내려갈 때 가장 먼저 여는 것이 이 기계가 되었습니다. 지난 '기계와 함께'에서 기계와 함께 일하는 것이 더이상 남의 이야기가 아니라고 적었는데 그 글을 쓴 다음 1년이 채 지나지 않은 지금은 함께 일하는 정도가 아니라 상당 부분을 통째로 맡기고 결과만 확인하는 쪽에 가까워졌습니다. 그런데 그렇게 점점 더 많은 일을 맡기면서도 정작 이 기계가 어떤 원리로 동작하는지 누가 처음부터 끝까지 설명해 보라고 하면 자신이 없었습니다.
제 밑천이라고는 오래전에 스티븐 울프람이 ChatGPT를 두고 쓴 길고 긴 글을 한 번 읽은 것이 거의 전부입니다[^What Is ChatGPT Doing … and Why Does It Work?]. 그 글이 좋았던 이유는 이 기계가 결국 무엇을 하는 물건인지를 한 문장으로 압축해 주었기 때문입니다. 울프람의 표현을 빌리면 ChatGPT는 "지금까지 주어진 텍스트에 대해 그럴듯한 이어쓰기를 만들어 내려고 한다"는 일을 한 번에 한 토막씩 끝없이 반복하는 물건입니다. 의존도가 이 정도로 커진 마당에 기반이 그 한 줄짜리 인상에 머물러 있다는 사실이 마음에 부담으로 자리하고 있었고 그래서 시간을 들여 이 기계의 안쪽을 한 번 처음부터 끝까지 따라가 보기로 했습니다. 어디서부터 시작해 어떤 수학 위에 서 있고 지금 어디로 가고 있으며 또 어떻게 제 터미널까지 와서 실제로 일을 하게 되었는지를 순서대로 정리해 보려 합니다.
따라가다 보면 의외로 단순한 사실 하나에 자꾸 되돌아오게 됩니다. 채팅 화면도 에이전트도 도구도 다 걷어 내고 가장 밑바닥까지 내려가면 거기에는 변변찮은 행동 하나만 남습니다. 지금까지의 텍스트가 주어졌을 때 다음에 올 한 조각을 맞추는 일입니다. 휴대폰 키보드가 다음 단어를 미리 띄워 주는 그 자동완성과 본질적으로 같은 행동입니다. 앞으로 살펴볼 거의 모든 것 — 트랜스포머라는 구조도, 수천억 개의 파라미터도, 사람의 피드백으로 다듬는 정렬 과정도, 추론하는 모델도, 제 터미널에서 파일을 고치는 에이전트도 — 은 이 한 가지 자동완성을 충분히 잘하게 만들거나 잘하게 된 그 자동완성 위에 무언가를 올리는 일입니다. 이 글은 그 변변찮은 자동완성이 어쩌다 제 일을 대신 하게 되었는가에 대한 이야기입니다.
자동완성이라는 발상 자체는 생각보다 훨씬 오래되었습니다. 1948년에 클로드 섀넌이 정보이론을 창시한 논문에서 이미 언어를 다음 기호를 확률적으로 예측하는 과정으로 다루었습니다[^A Mathematical Theory of Communication]. 섀넌은 어떤 정보원이 내놓는 메시지를 앞선 기호들로부터 다음 기호를 예측할 수 있는 확률 과정으로 모델링했고 정보의 양을 엔트로피라는 개념으로 정의했습니다. 3년 뒤에는 영어라는 언어 자체의 엔트로피를 사람에게 다음 글자를 맞추게 하는 실험으로 추정했습니다[^Prediction and Entropy of Printed English]. 영어 문장에서 다음 글자가 무엇일지 사람이 얼마나 잘 맞추는지를 측정해 보니 영어에는 상당한 양의 잉여가 있어서 다음 글자를 꽤 잘 예측할 수 있더라는 결과였습니다. 다음에 올 것을 맞추는 능력이 곧 그 대상을 얼마나 이해하고 있는지의 척도라는 생각, 그리고 잘 예측한다는 것은 곧 잘 압축한다는 것과 같다는 생각이 이미 이때 자리잡았습니다. 현대 LLM의 학습 목표가 정확히 이 다음 토큰 예측이라는 점을 생각하면 70년이 더 지난 지금의 기계도 섀넌이 깔아 둔 같은 바닥 위에 서 있는 셈입니다.
섀넌 이후로 오랫동안 이 예측을 담당한 것은 통계적인 n-그램 모델이었습니다. 직전 한두 단어를 보고 다음 단어의 확률을 빈도표에서 끌어오는 단순한 방식이었는데 음성인식이나 기계번역에서 2000년대까지도 주력으로 쓰였습니다. 한계는 분명했습니다. 직전 몇 단어만 보기 때문에 조금만 멀리 떨어진 맥락은 통째로 잊어버렸고 학습 데이터에서 한 번도 같이 등장하지 않은 단어 조합은 확률을 0으로 보아 버렸습니다. 단어를 그저 서로 다른 기호로만 다루었기 때문에 "고양이"와 "고양이들"이, 또는 "왕"과 "여왕"이 서로 가까운 사이라는 사실조차 표현할 방법이 없었습니다. 자동완성으로서 너무 근시안적이었던 셈입니다.
이 근시안을 처음 의미 있게 넘어선 것이 단어를 숫자 벡터로 옮기는 발상이었습니다. 2013년에 구글의 토마스 미콜로프 연구진이 발표한 word2vec은 수십억 단어 분량의 텍스트에서 각 단어를 수백 차원짜리 벡터로 학습하는 가볍고 효율적인 방법을 제시했습니다[^Efficient Estimation of Word Representations in Vector Space]. 핵심은 비슷한 맥락에서 등장하는 단어들이 벡터 공간에서 서로 가까운 자리에 모인다는 점, 그리고 단어 사이의 의미 관계가 벡터의 방향으로 드러난다는 점이었습니다. "왕"에서 "남자"를 빼고 "여자"를 더하면 "여왕"에 가까운 벡터가 나온다는 그 유명한 비유가 여기서 나왔습니다. 의미가 기하학이 된 것입니다. 거리는 의미의 유사도가 되고 특정 방향은 성별이나 복수형 같은 속성을 가리키게 되었습니다. 물론 이 깔끔한 비유는 어느 정도 이상화된 그림이고 실제 모델 안에서 벡터의 의미는 맥락에 따라 달라지지만 단어를 기호가 아니라 공간 위의 좌표로 다룬다는 이 생각은 이후 모든 모델의 출발점이 되었습니다.
다음 과제는 단어 하나가 아니라 단어들의 순서를 다루는 일이었습니다. 문장은 단어의 나열이고 다음 단어는 앞선 단어들의 순서에 의존하기 때문에 순서를 기억하는 신경망이 필요했습니다. 오랫동안 그 역할을 맡은 것이 순환신경망과 그 개량형인 LSTM이었습니다. LSTM은 1997년에 제안된 구조로 정보를 흘려보내거나 잊어버리는 문을 두어 긴 시간 간격을 가로질러 정보를 전달할 수 있게 한 셀이었습니다[^Long Short-Term Memory]. 2014년에는 구글 연구진이 이 LSTM 두 개를 이어 붙여 한쪽이 입력 문장을 하나의 벡터로 압축하고 다른 쪽이 그 벡터에서 출력 문장을 풀어내는 시퀀스 투 시퀀스 구조를 내놓았습니다[^Sequence to Sequence Learning with Neural Networks]. 기계번역이 한 단계 올라선 순간이었습니다. 다만 입력 문장 전체를 고정된 크기의 벡터 하나에 욱여넣는다는 점이 병목이었습니다. 문장이 길어질수록 앞부분의 정보가 뒤로 갈수록 희미해졌습니다.
그 병목을 푼 것이 어텐션이라는 메커니즘입니다. 2014년에 요슈아 벤지오 연구진이 제안한 이 방식은 출력의 한 단어를 만들 때 입력 문장의 한 벡터만 보는 것이 아니라 입력의 모든 위치를 훑어보며 지금 이 순간에 관련이 깊은 위치에 더 큰 가중치를 주어 정보를 가져오게 했습니다[^Neural Machine Translation by Jointly Learning to Align and Translate]. 번역할 때 사람이 원문의 어느 부분을 보고 있는지에 가까운 발상입니다. 고정된 벡터 하나에 모든 것을 압축할 필요가 사라졌고 멀리 떨어진 단어 사이의 관계도 직접 연결할 수 있게 되었습니다. 그리고 2017년에 구글 연구진은 한 걸음 더 나아가 순환 구조를 아예 버리고 어텐션만으로 신경망을 구성할 수 있다는 논문을 내놓았습니다. 제목이 그대로 결론이었습니다. 필요한 것은 어텐션뿐이라는 트랜스포머의 등장입니다[^Attention Is All You Need].
트랜스포머가 왜 그렇게 중요한지는 한 가지 실용적인 이유로 압축됩니다. 순환신경망은 단어를 하나씩 순서대로 처리해야 했기 때문에 본질적으로 병렬화가 어려웠습니다. 앞 단어의 계산이 끝나야 다음 단어를 계산할 수 있었습니다. 트랜스포머의 셀프 어텐션은 문장의 모든 위치를 한 번에 동시에 처리합니다. 이 병렬성 덕분에 같은 시간에 훨씬 큰 모델을 훨씬 많은 데이터로 학습시킬 수 있게 되었고 바로 이 점이 이후의 거대화를 가능하게 했습니다. 오늘날 제가 쓰는 거의 모든 모델이 이 구조 위에 서 있습니다. 트랜스포머는 자동완성을 잘하기 위한 도구로 처음 제안된 것은 아니었지만 결과적으로 자동완성을 위한 가장 좋은 그릇이 되었습니다.
그 그릇 위에서 거대화가 시작되었습니다. 2018년에 OpenAI는 트랜스포머의 디코더 부분만 떼어 내 대량의 책 텍스트로 다음 단어 예측을 미리 학습시킨 다음 개별 과제에 맞게 미세조정하는 GPT를 내놓았고[^Improving Language Understanding by Generative Pre-Training] 같은 해 구글은 문장의 양쪽 맥락을 동시에 보는 BERT로 여러 이해 과제의 기록을 갈아치웠습니다[^BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding]. 2019년의 GPT-2는 15억 개의 파라미터를 가졌는데 오용 우려를 이유로 큰 모델을 한동안 공개하지 않고 단계적으로만 푸는 결정으로도 화제가 되었습니다[^Better language models and their implications]. 그리고 2020년의 GPT-3은 1750억 개의 파라미터로 그 이전의 어떤 모델보다 한 자릿수 이상 컸는데[^Language Models are Few-Shot Learners] 여기서 흥미로운 일이 일어났습니다. 모델을 추가로 학습시키지 않고 프롬프트 안에 예시 몇 개만 주어도 새 과제를 수행하는 맥락 내 학습 능력이 나타난 것입니다. 가르치지 않은 일을 시키는 방식만 알려 주면 따라 하기 시작했습니다.
왜 그냥 크게 만들었느냐는 질문에는 당시에 이미 답이 있었습니다. 2020년 OpenAI의 연구진은 모델의 크기와 데이터의 양과 투입한 연산량이 커질수록 예측 오차가 매끄러운 거듭제곱 법칙을 따라 줄어든다는 사실을 여러 자릿수에 걸쳐 관찰했습니다[^Scaling Laws for Neural Language Models]. 더 키우면 더 좋아진다는 것이 경험적으로 예측 가능한 법칙이 된 셈입니다. 2022년에는 딥마인드가 이 법칙을 한 단계 정교하게 다듬었습니다. 그때까지의 모델들은 크기에 비해 학습 데이터가 부족한 상태로 멈춰 있었고 같은 연산량이라면 모델 크기와 학습 토큰 수를 비슷한 비율로 함께 늘리는 편이 낫다는 결론이었습니다[^Training Compute-Optimal Large Language Models]. 이 친칠라 논문이 제시한 700억 파라미터 모델은 같은 연산으로 학습한 2800억 파라미터 모델을 오히려 능가했습니다. 파라미터 수만 키우는 경쟁에서 데이터까지 함께 고려하는 쪽으로 방향이 한 번 꺾인 순간이었습니다.
여기까지가 자동완성을 잘하게 만드는 역사라면 이제 그 안에서 실제로 무슨 일이 일어나는지를 살펴볼 차례입니다. 제가 가장 알고 싶었던 부분이기도 합니다. 모델이 다음 토큰을 맞추기까지 안에서 벌어지는 일을 순서대로 따라가 보겠습니다.
가장 먼저 일어나는 일은 토큰화입니다. 모델은 글자나 단어를 직접 다루지 않고 토큰이라고 부르는 고정된 조각들의 목록 위에서만 동작합니다. 토큰은 자주 등장하는 텍스트 덩어리인데 흔한 단어는 통째로 한 토큰이 되고 드문 단어는 여러 조각으로 쪼개지며 영어 기준으로 대략 한 토큰이 네 글자 안팎에 해당합니다. 왜 이렇게 자르느냐 하면 단어 단위로 다루면 사전이 지나치게 커지는 데다 처음 보는 단어 앞에서 무력해지고 반대로 글자 단위로 다루면 문장이 너무 길어지기 때문입니다. 그 사이의 타협이 바이트 페어 인코딩이라는 방식인데 처음에는 텍스트를 가장 작은 단위로 두었다가 가장 자주 붙어 다니는 인접한 쌍을 반복해서 하나로 합쳐 나가며 사전을 만듭니다[^Neural Machine Translation of Rare Words with Subword Units]. 흔한 것은 큰 덩어리로, 드문 것은 작은 조각으로 표현되는 셈입니다. 모델이 보는 세계는 결국 이 토큰 ID들의 나열이고 우리가 입력한 문장은 가장 먼저 이 정수들의 열로 번역됩니다.
각 토큰 ID는 임베딩이라는 거대한 표에서 한 줄을 끌어옵니다. 그 한 줄이 수백에서 수천 개의 숫자로 이루어진 벡터이고 이것이 그 토큰의 의미 좌표가 됩니다. word2vec에서 보았던 그 발상이 여기서 다시 등장합니다. 비슷한 맥락의 토큰은 가까운 자리에, 의미의 차이는 방향으로 나타납니다. 다만 모델 안에서 이 좌표는 고정되어 있지 않습니다. 같은 "은행"이라는 토큰도 강가 맥락에서와 돈 맥락에서 층을 지나며 다른 방향으로 갈라집니다. 의미가 맥락에 따라 변하는 이 성질이 단어 하나에 고정된 벡터를 주던 옛 방식과 결정적으로 다른 점입니다.
그 다음이 핵심입니다. 모델의 학습 목표는 단 하나입니다. 지금까지의 토큰이 주어졌을 때 다음 토큰의 확률 분포를 사전 전체에 대해 내놓는 일입니다. 마지막 층은 사전의 모든 항목마다 점수를 하나씩 만들고 소프트맥스라는 함수가 그 점수들을 모두 양수로 바꾼 다음 합이 1이 되도록 정규화해 확률로 만듭니다. 학습은 이 확률 분포를 실제로 등장한 다음 토큰과 비교해 그 토큰에 더 높은 확률을 주도록 파라미터를 조금씩 조정하는 일입니다. 비교의 척도가 교차 엔트로피 손실인데 결국 실제 텍스트가 등장할 확률을 최대로 만드는 방향으로 모델을 미는 것과 같습니다. 여기에 사람이 붙인 정답표가 전혀 필요 없다는 점이 결정적입니다. 각 위치의 정답은 그저 원래 텍스트에서 다음에 실제로 온 토큰일 뿐이기 때문입니다. 데이터가 스스로 정답을 품고 있는 이 자기지도 학습이 거대화를 떠받친 토대입니다. 인터넷에 있는 거의 모든 텍스트가 그대로 학습 신호가 되니까요. 회의록을 두고 적었던 '회의를 녹음해 요약하려는 시도는 왜 멍청한가'에서 기계가 그럴듯한 요약을 내놓아도 그 안의 사실관계는 따로 검증해야 한다고 적은 적이 있는데 그 그럴듯함의 정체가 바로 이 확률 분포입니다. 모델은 그럴듯한 토큰을 고를 뿐 그것이 사실인지는 다른 문제입니다. 그 글을 쓸 때만 해도 기계가 만든 회의록은 그럴듯한 껍데기일 뿐 믿고 쓰기는 어렵다고 보았는데 지금은 생각이 완전히 바뀌었습니다. 회의의 배경과 앞선 논의 같은 맥락을 충분히 함께 넣어 주면 기계는 녹음을 그대로 회의록으로 쓸 만한 수준으로 만들어 냅니다. 달라진 것은 다음 토큰을 맞추는 자동완성 자체가 아니라 그 자동완성에 회의의 맥락을 같이 넣어 줄 수 있게 된 환경입니다.
그렇다면 모델은 다음 토큰의 확률을 어떻게 계산할까요. 그 심장이 셀프 어텐션입니다. 문장 안의 각 토큰은 다른 모든 토큰을 둘러보며 지금 자신에게 필요한 정보를 가져와야 합니다. "그것은"이라는 대명사가 앞의 어떤 명사를 가리키는지, 동사가 어떤 주어와 호응하는지 같은 관계를 풀려면 토큰끼리 서로를 볼 수 있어야 합니다. 어텐션은 이 일을 세 가지 벡터로 처리합니다. 각 토큰에서 학습된 변환으로 질의와 키와 값이라는 세 벡터를 만드는데 한 토큰의 질의를 모든 토큰의 키와 견주어 얼마나 관련이 깊은지 점수를 매기고 그 점수로 모든 토큰의 값을 가중평균해 가져옵니다. 검색에 빗대면 질의는 내가 찾는 것, 키는 각 문서에 붙은 표지, 값은 그 문서의 실제 내용에 해당합니다. 트랜스포머 논문이 제시한 식은 소프트맥스(QKᵀ/√d_k)V 한 줄로 요약되는데 질의와 키의 내적으로 관련도 점수를 만들고 키 차원의 제곱근으로 나누어 수치를 안정시킨 다음 소프트맥스로 가중치를 만들어 값에 곱하는 흐름입니다. 게다가 이 어텐션을 한 번만 하지 않고 여러 개의 머리로 동시에 수행해 어떤 머리는 문법 관계를, 어떤 머리는 멀리 떨어진 대명사 관계를 따로 담당하게 합니다. 여러 시선으로 한 문장을 동시에 읽는 셈입니다[^The Illustrated Transformer].
이 어텐션과 그 뒤에 붙는 작은 신경망 한 쌍이 트랜스포머의 한 블록을 이룹니다. 어텐션이 토큰들 사이로 정보를 옮기는 일을 한다면 그 뒤의 피드포워드 신경망은 각 토큰이 가져온 정보를 토큰별로 따로 가공하는 일을 합니다. 모델이 학습한 사실 지식의 상당 부분이 이 피드포워드 층에 들어 있다고 여겨집니다. 그리고 각 블록은 입력을 출력에 그대로 더해 주는 잔차 연결과 수치를 안정시키는 정규화로 감싸여 있습니다. 잔차 연결은 아주 깊은 신경망에서도 학습 신호가 막히지 않고 지나가도록 길을 터 주고 각 층이 표현을 통째로 바꾸기보다 조금씩 다듬어 나가도록 합니다. 이런 블록을 수십 개에서 백 개 넘게 쌓아 올리면 아래층에서는 표면적인 패턴을, 위층으로 갈수록 더 추상적인 표현을 다루게 됩니다. 생성에 쓰이는 모델은 디코더만으로 이루어져 있고 다음 토큰을 만들 때 미래의 토큰을 미리 보지 못하도록 뒤쪽을 가리는 마스크가 걸려 있습니다. 미래를 보지 않고 지금까지만으로 다음을 맞추는 자동완성의 규칙이 구조 안에 새겨져 있는 셈입니다.
한 가지 빠진 것이 순서입니다. 어텐션은 그 자체로는 토큰을 집합처럼 다루기 때문에 "개가 사람을 물었다"와 "사람이 개를 물었다"를 구분하지 못합니다. 그래서 위치 정보를 따로 넣어 주어야 합니다. 초기 트랜스포머는 서로 다른 주기의 사인과 코사인 값으로 각 위치에 고유한 무늬를 입혔습니다. 요즘 모델들이 널리 쓰는 방식은 회전 위치 임베딩인데 위치에 비례한 각도만큼 질의와 키 벡터를 회전시켜 두 토큰 사이의 어텐션이 그 둘의 상대적 거리에만 의존하도록 만듭니다[^RoFormer: Enhanced Transformer with Rotary Position Embedding]. 위치를 더하는 대신 돌려서 새기는 셈인데 긴 맥락을 더 부드럽게 다루는 성질 덕분에 표준에 가깝게 자리잡았습니다.
이 모든 구조 안의 숫자들 — 임베딩 표, 질의와 키와 값을 만드는 변환, 피드포워드의 가중치 — 을 다 합친 것이 그 유명한 파라미터입니다. 수십억에서 수천억 개에 이르는 이 숫자들의 값을 찾는 일이 곧 학습입니다. 학습은 텍스트 한 묶음에 대해 손실을 계산한 다음 역전파라는 방법으로 각 파라미터를 어느 방향으로 움직여야 손실이 줄어드는지를 구하고 그 방향의 반대로 모든 파라미터를 아주 조금씩 미는 일을 수조 개의 토큰에 걸쳐 반복하는 과정입니다. 이 막대한 연산이 어디로 가는가 하면 결국 학습 데이터에 들어 있던 지식을 파라미터라는 형태로 손실 압축하는 데로 갑니다. 다음 토큰을 잘 맞추려면 그 토큰을 만들어 낸 세계의 규칙을 어느 정도 안으로 들여놓을 수밖에 없기 때문입니다. 그리고 이렇게 자기지도로 미리 학습한 모델은 그 자체로는 아직 비서가 아닙니다. 그저 다음 토큰을 잘 맞추는 거대한 자동완성일 뿐입니다. 이것을 사람이 시키는 대로 답하는 조수로 바꾸는 일은 그 다음 단계의 몫입니다.
학습이 끝난 모델이 실제로 글을 만들어 내는 추론 과정은 다시 단순한 반복입니다. 프롬프트를 넣으면 다음 토큰의 확률 분포가 나오고 그 분포에서 토큰 하나를 골라 뒤에 붙인 다음 길어진 문장을 다시 넣어 그 다음 토큰을 고르는 일을 멈춤 신호가 나올 때까지 되풀이합니다. 한 번에 한 토막씩 이어 붙이는 이 자동완성 그대로입니다. 토큰을 고르는 방식에는 선택지가 있습니다. 매번 가장 확률이 높은 토큰만 고르면 결과가 단조롭고 반복적이 되기 쉽고 확률에 따라 무작위로 뽑으면 더 다양해집니다. 이때 온도라는 값으로 분포를 날카롭게 하거나 평평하게 조절하는데 울프람은 자기 글에서 온도 0.8쯤이 좋은 듯하다고 적으면서 "여기에 쓰인 이론 같은 것은 없고 그저 해보니 잘 되더라는 것일 뿐"이라고 솔직하게 덧붙였습니다. 누적 확률이 일정 비율을 넘는 가장 작은 후보 집합 안에서만 뽑는 뉴클리어스 샘플링이 자주 쓰이는데 확률이 낮은 꼬리를 잘라 내면 횡설수설이 줄어든다는 관찰에서 나온 방법입니다[^The Curious Case of Neural Text Degeneration].
추론에서 두 가지 실용적인 개념이 제 작업과 직접 닿아 있습니다. 하나는 컨텍스트 윈도라고 부르는 모델이 한 번에 볼 수 있는 토큰 수의 한계입니다. 프롬프트와 생성된 텍스트를 합쳐 이 한도를 넘으면 그 바깥의 토큰은 모델이 볼 수 없습니다. 초기 트랜스포머는 512 토큰이었지만 지금 주력 모델들은 십수만에서 백만 토큰 이상에 이릅니다. 다른 하나는 KV 캐시입니다. 토큰을 하나 만들 때마다 앞의 모든 토큰에 대한 어텐션을 처음부터 다시 계산하면 길이가 길어질수록 낭비가 제곱으로 늘어나는데 이미 계산해 둔 과거 토큰의 키와 값 벡터는 변하지 않으므로 이것을 저장해 두고 새 토큰의 것만 계산해 재사용합니다[^KV Caching Explained: Optimizing Transformer Inference Efficiency]. 생성을 훨씬 빠르게 해 주는 대신 캐시가 길이에 비례해 메모리를 차지하기 때문에 긴 맥락이 비싼 이유가 여기에 있습니다. 제가 한 세션에 너무 많은 파일을 풀어 놓으면 비용과 속도가 같이 나빠지는 체감의 정체가 이것입니다.
여기서 한 번 멈추고 짚어 볼 질문이 있습니다. 결국 다음 토큰을 맞추는 자동완성일 뿐인데 어떻게 이것이 코드를 고치고 논증을 이어 가고 번역을 하는 데까지 이르렀을까요. 이 부분은 사실로 단정하기보다 잘 받쳐진 해석으로 받아들이는 편이 정직합니다. 한 가지 설명은 압축의 논리입니다. 인류가 쓴 텍스트의 상당 부분에 대해 다음 토큰을 모든 영역에서 안정적으로 맞추려면 그 텍스트를 만들어 낸 세계의 규칙성을 안으로 들여놓는 것 외에 다른 길이 없다는 것입니다. 일리야 수츠케버는 한 인터뷰에서 이를 두고 "다음 토큰을 잘 예측한다는 것은 그 토큰을 만들어 낸 바탕의 현실을 이해한다는 뜻이며 그것은 통계가 아니다"라고 말했습니다. 통계를 압축하려면 그 통계를 만들어 낸 세계의 무언가를 이해해야 한다는 주장입니다[^Ilya Sutskever (OpenAI Chief Scientist) — Why next-token prediction could surpass human intelligence]. 울프람은 같은 현상을 두고 ChatGPT가 그럴듯한 이어쓰기를 한 토막씩 반복하는 것만으로 일관된 글이 나온다는 사실 자체가 인간의 언어가 우리 생각보다 훨씬 규칙적이고 계산 가능한 구조를 지녔다는 발견에 가깝다고 보았습니다.
다만 여기에는 신중할 대목이 있습니다. 모델이 크기의 어떤 문턱을 넘으면 없던 능력이 갑자기 나타난다는 창발이라는 이야기가 자주 회자되지만 그 창발의 상당 부분이 능력을 재는 잣대를 불연속적으로 두었기 때문에 생긴 착시라는 반론도 만만치 않습니다. 그래서 창발은 정설이 아니라 논쟁 중인 주제로 다루는 편이 안전합니다. 한 가지 분명히 해 둘 점은 "그저 다음 토큰 예측일 뿐"이라는 말과 "세계 모형 비슷한 것을 학습했다"는 말이 서로 부딪치지 않는다는 것입니다. 앞의 말은 학습의 목표를 가리키고, 뒤의 말은 그 목표를 잘 달성하기 위해 모델 안에 어떤 기계장치가 들어설 수밖에 없었는가에 대한 주장입니다. 그 기계장치를 이해라고 불러도 되는지는 아직 진짜로 열려 있는 논쟁이고 저는 어느 한쪽으로 단정하지 않는 편이 솔직하다고 생각합니다.
자동완성의 역사와 수학을 따라왔으니 이제 이 자동완성이 지금 어디로 가고 있는지를 살펴볼 차례입니다. 최근 몇 년의 발전 방향은 크게 몇 갈래로 갈립니다. 첫째 갈래는 정렬입니다. 앞서 적었듯 자기지도로 학습한 기본 모델은 그저 텍스트를 이어쓸 뿐 질문에 공손히 답하는 조수가 아닙니다. 이것을 조수로 바꾼 결정적 단계가 사람의 피드백을 이용한 강화학습입니다. 2022년의 인스트럭트GPT는 사람이 작성한 모범 답안으로 먼저 미세조정한 다음 사람이 여러 답안에 매긴 선호 순위로 보상 모형을 학습시키고 그 보상을 최대화하도록 모델을 다시 강화학습으로 다듬는 세 단계를 제시했습니다[^Training language models to follow instructions with human feedback]. 인상적이었던 결과는 13억 파라미터짜리 인스트럭트GPT의 답변을 사람들이 1750억 파라미터짜리 GPT-3보다 더 선호했다는 점입니다. 정렬이 때로는 순수한 크기보다 더 중요할 수 있다는 신호였고 이 흐름이 그대로 ChatGPT로 이어졌습니다. 이후로는 별도의 보상 모형 없이 선호 데이터로 바로 최적화하는 더 가벼운 방법도 나왔고[^Direct Preference Optimization: Your Language Model is Secretly a Reward Model] 사람 대신 글로 적은 원칙들로 모델이 스스로의 답을 비판하고 고치게 하는 방식도 등장했습니다[^Constitutional AI: Harmlessness from AI Feedback]. 제가 매일 쓰는 클로드가 바로 이 원칙 기반 정렬 위에 서 있습니다.
둘째 갈래는 추론입니다. 답을 곧장 내놓는 대신 중간 사고 과정을 먼저 풀어 놓게 하면 수학이나 논리 문제의 정답률이 크게 오른다는 사실이 2022년에 보고되었습니다[^Chain-of-Thought Prompting Elicits Reasoning in Large Language Models]. 생각의 사슬이라고 부르는 이 발상은 2024년에 한 단계 더 나아갔습니다. OpenAI의 o1은 답하기 전에 긴 사고 과정을 스스로 풀어내도록 강화학습으로 훈련된 첫 주류 추론 모델이었습니다[^Learning to reason with LLMs]. 2025년 초에는 딥시크가 R1을 공개하며 사람이 작성한 사고 과정 없이도 대규모 강화학습만으로 모델이 스스로 검산하고 되짚어 보는 행동을 익힐 수 있음을 입증했습니다[^DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning]. 가중치를 공개한 데다 학습 비용도 낮았다는 점이 시장에 적지 않은 충격을 주었습니다. 이 흐름의 바탕에는 학습 때 연산을 쏟아붓는 대신 추론할 때 연산을 더 쓰는 편이 때로 더 효율적이라는 발상의 전환이 있습니다[^Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling Model Parameters]. 더 큰 모델을 만드는 대신 같은 모델이 더 오래 생각하게 하는 쪽으로 무게가 옮겨 가고 있는 셈입니다.
셋째 갈래는 효율과 구조입니다. 모델 전체를 매번 다 쓰는 대신 토큰마다 일부 전문가 신경망만 골라 쓰는 전문가 혼합 방식이 널리 퍼졌습니다. 미스트랄의 믹스트랄은 470억 파라미터를 가졌지만 토큰당 130억 개 정도만 실제로 작동시켰고[^Mixtral of Experts] 딥시크 V3은 6710억 파라미터 가운데 토큰당 370억 개만 작동시키면서 14.8조 토큰을 비교적 적은 연산으로 학습했습니다[^DeepSeek-V3 Technical Report]. 어텐션을 아예 쓰지 않고 길이에 선형으로 비례하는 상태공간 모델로 트랜스포머를 대체하려는 시도도 있습니다[^Mamba: Linear-Time Sequence Modeling with Selective State Spaces]. 여기에 모델을 8비트나 4비트로 줄여 돌리는 양자화, 큰 모델의 행동을 작은 모델에 옮겨 담는 증류 같은 기법이 비용을 낮추는 표준 수단으로 쓰입니다. 넷째 갈래는 여러 형태의 입력을 함께 다루는 멀티모달입니다. 텍스트와 음성과 이미지를 하나의 신경망으로 함께 학습한 GPT-4o는 음성에 사람과 비슷한 속도로 반응했고[^Hello GPT-4o] 제미니 1.5는 백만 토큰에 이르는 맥락 안에서 영상과 음성과 긴 문서를 함께 다루었습니다[^Gemini 1.5: Unlocking multimodal understanding across millions of tokens of context]. 그리고 모델의 파라미터 안에 든 지식만으로는 최신 정보나 사적인 자료를 다룰 수 없으므로 외부 문서를 검색해 그 내용을 근거로 답하게 하는 검색 증강 생성이 산업 표준으로 자리잡았습니다[^Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks]. 환각을 줄이고 출처를 댈 수 있게 하려는 시도입니다.
이 갈래들 위로 한 가지 큰 논쟁이 걸려 있습니다. 그저 더 키우기만 하면 계속 좋아지던 시대가 끝나가는 것 아니냐는 물음입니다. 2024년 후반부터 고품질 인터넷 데이터가 사실상 유한하다는 점을 들어 사전학습만으로 얻던 향상이 둔화되고 있다는 관측이 나왔고 수츠케버는 이를 두고 스케일의 시대에서 연구의 시대로 넘어가고 있다고 표현했습니다. 다음 축은 추론과 추론 시점의 연산, 그리고 에이전트와 스스로 만들어 낸 데이터라는 것입니다. 다만 이것은 정설이 아니라 논쟁이고 o1과 R1이 추론이라는 새 축이 작동함을 입증했을 뿐 스케일이 끝났다는 주장 자체는 여전히 다툼의 대상입니다. 한계도 분명합니다. 환각은 사전학습의 통계적 성질에서 거의 필연적으로 나오는 데다 평가 기준이 모른다고 인정하는 것보다 자신 있게 찍는 쪽에 점수를 주기 때문에 좀처럼 사라지지 않는다는 분석이 있습니다[^Why Language Models Hallucinate]. 정렬을 아무리 해도 자동으로 찾아낸 적대적 입력으로 안전장치를 뚫는 탈옥이 가능하고 그 공격이 모델 사이를 옮겨 다닌다는 점도 보고되어 있습니다[^Universal and Transferable Adversarial Attacks on Aligned Language Models]. 능력이 워낙 들쭉날쭉해서 무엇을 잘하고 무엇을 못하는지 미리 가늠하기 어렵다는 점도 이 기계를 다룰 때 늘 염두에 두어야 하는 성질입니다.
이제 마지막으로 이 자동완성이 어떻게 제 터미널까지 와서 실제로 파일을 고치고 테스트를 돌리게 되었는지를 살펴볼 차례입니다. 여기서부터는 자동완성을 더 잘하게 만드는 이야기가 아니라 잘하게 된 자동완성에 손과 발을 달아 주는 이야기입니다. 출발점은 의외로 단순한 질문입니다. 텍스트만 내놓는 모델이 어떻게 바깥 세계에 영향을 주는가. 답은 모델이 직접 무언가를 하는 것이 아니라는 데 있습니다. 모델은 그저 "이 도구를 이런 인자로 불러 달라"는 구조화된 요청을 텍스트로 내놓고 그 요청을 실제로 실행하는 것은 바깥의 프로그램입니다. 실행 결과는 다시 모델의 맥락으로 들어가고 모델은 그것을 보고 다음 토큰을 이어 갑니다. OpenAI가 2023년에 함수 호출 기능을 API에 추가하면서 이 패턴이 표준이 되었는데[^Function calling and other API updates] 모델은 호출할 함수와 인자를 JSON으로 기술할 뿐 직접 실행하지는 않는다는 점이 핵심입니다. 모델이 "보스턴 날씨를 알려 달라"는 문장을 날씨 함수를 부르라는 구조화된 요청으로 바꿔 내놓으면 실제 날씨 API를 부르고 그 결과를 다시 모델에게 돌려주는 것은 우리 쪽 프로그램입니다.
이 구조화된 요청이 어떻게 나오는지 한 겹 더 들어가 보면 자동완성의 성질이 다시 드러납니다. 모델은 별도의 의지로 도구를 부르는 것이 아니라 도구를 부르는 형식까지 학습한 자동완성입니다. 쓸 수 있는 도구의 이름과 설명과 인자의 형식이 JSON 스키마로 모델의 맥락에 함께 들어가고 모델은 그 맥락 위에서 다음 토큰을 이어 가다가 도구를 부를 차례라고 판단하면 함수 이름과 인자를 담은 구조화된 호출을 한 토큰씩 생성합니다. 일반 문장을 쓸 때와 똑같은 디코더가 똑같은 방식으로 동작하되 출력의 모양만 평문이 아니라 정해진 형식의 호출이 되는 것뿐입니다. 이 출력이 형식에 어긋나지 않도록 어떤 시스템은 디코딩 단계에서 스키마에 맞는 토큰만 고를 수 있게 후보를 제한하기도 합니다. 다만 형식을 이렇게 보장해도 인자의 값까지 옳다고 보장되는 것은 아니라서 형식만 맞고 내용은 잘못된 호출이 나올 수 있다는 점은 그대로 남습니다.
이 요청과 실행과 관찰의 한 바퀴를 반복하면 에이전트가 됩니다. 2022년의 리액트라는 연구는 모델이 사고와 행동을 번갈아 내놓게 하는 방식을 제시했습니다[^ReAct: Synergizing Reasoning and Acting in Language Models]. 생각을 적어 계획을 세우고 갱신하고 예외를 처리하면서 행동으로 바깥에서 정보를 가져오는 일을 한 흐름 안에서 엮은 것입니다. 비슷한 시기에 모델이 어떤 도구를 언제 어떤 인자로 부를지를 스스로 배우게 하는 시도도 나왔습니다[^Toolformer: Language Models Can Teach Themselves to Use Tools]. 이렇게 모델을 도구와 기억과 목표가 있는 반복 안에 두면 한 번의 대답으로 끝나는 챗봇과는 다른 물건이 됩니다. 앤트로픽은 이 차이를 정해진 코드 경로를 따라 도구를 부르는 워크플로와 모델이 스스로 자기 과정과 도구 사용을 통제하는 에이전트로 구분합니다[^Building effective agents]. 에이전트가 매 단계 환경에서 도구 호출 결과 같은 실제 근거를 받아 가며 진행 상황을 스스로 가늠한다는 점이 정의의 핵심입니다. 제가 쓰는 클로드 코드가 바로 이런 코딩 에이전트인데 2025년 초에 연구용으로 처음 공개되어 봄에 일반에 풀렸습니다. 비슷한 무렵에 스스로를 첫 자율 소프트웨어 엔지니어라고 내세운 데빈 같은 도구들도 등장했습니다[^Introducing Devin, the first AI software engineer].
문제는 에이전트마다 도구를 연결하는 방식이 제각각이었다는 점입니다. 모델이 M개 있고 연결하고 싶은 도구와 데이터원이 N개 있으면 그 사이를 잇는 맞춤 연결이 M 곱하기 N개 필요했습니다. 이 곱셈을 덧셈으로 바꾸려는 표준이 모델 컨텍스트 프로토콜입니다. 앤트로픽이 2024년 11월에 공개하고 오픈소스로 푼 이 규약은[^Introducing the Model Context Protocol] 스스로를 AI를 위한 USB-C 단자에 비유합니다. USB-C가 기기를 연결하는 표준 방식을 제공하듯 한 가지 규약으로 어떤 AI 앱이든 어떤 도구나 데이터원에든 연결할 수 있게 한다는 발상입니다. 구조는 호스트와 클라이언트와 서버로 나뉘는데 클로드 코드 같은 호스트 안의 클라이언트가 각 서버에 연결을 맺고 서버는 도구와 리소스와 프롬프트라는 세 가지를 제공합니다[^Architecture overview]. 도구는 모델이 불러 실행하는 함수, 리소스는 맥락으로 넣어 줄 데이터, 프롬프트는 재사용할 수 있는 틀입니다. 통신은 JSON-RPC라는 표준 위에서 이루어지고 같은 기계 안의 프로세스끼리는 표준 입출력으로, 원격 서버와는 HTTP로 연결합니다. 연결을 맺을 때 클라이언트와 서버는 서로 무엇을 지원하는지 능력을 맞춰 보고 클라이언트가 서버에 도구 목록을 물으면 서버가 도구 이름과 설명과 인자 스키마를 돌려줍니다. 이렇게 받아 온 도구 설명이 다시 모델의 맥락에 들어가 모델이 어떤 도구를 부를지 정하는 근거가 되고 실제 호출은 정해진 메서드로 서버에 전달됩니다. 이 규약이 나온 지 얼마 되지 않아 2025년에 OpenAI와 구글이 차례로 자기 제품에 이 규약을 받아들이면서[^OpenAI adopts rival Anthropic's standard for connecting AI models to data][^Google to embrace Anthropic's standard for connecting AI models to data] 경쟁사가 만든 개방형 규약 위에 다 같이 모이는 흔치 않은 장면이 펼쳐졌습니다.
여기까지 따라오고 나니 제가 평소에 권한 확인을 끄고 모든 동작을 풀어 둔 채 여러 세션을 오가며 일한다는 사실이 새삼 다르게 다가옵니다. 에이전트를 강력하게 만드는 바로 그 성질 — 스스로 판단해 여러 단계를 밟고 도구를 쓰는 자율성 — 이 그대로 위험의 표면이 되기 때문입니다. 사이먼 윌리슨은 이를 치명적 삼각형이라고 불렀습니다. 사적인 데이터에 접근할 수 있고, 신뢰할 수 없는 외부 컨텐츠에 노출되며, 바깥으로 정보를 내보낼 수 있는 세 가지가 한 에이전트 안에서 만나면 공격자가 그 에이전트를 속여 사적인 데이터를 빼낼 수 있다는 것입니다[^The lethal trifecta for AI agents: private data, untrusted content, and external communication]. 윌리슨은 특히 MCP가 도구를 자유롭게 섞어 쓰도록 부추기는 구조라 이 삼각형이 만들어지기 쉽다고 지적했습니다. 모델을 아무리 잘 정렬해도 신뢰할 수 없는 웹페이지나 파일 안에 숨은 지시가 모델을 움직이는 간접적 프롬프트 주입은 막기 어렵습니다. 거기에 자율 실행이 길어질수록 각 단계의 작은 오류가 곱해지며 누적된다는 문제까지 더해집니다. 그래서 결정적인 동작 앞에 사람의 확인을 두거나 권한의 범위를 좁히는 안전장치가 중요한데 제가 그 확인을 통째로 꺼 두고 있다는 사실은 분명 다시 생각해 볼 대목입니다.
이 흐름이 어디로 갈지 조금이나마 예상해볼 수 있습니다. 한 에이전트가 여러 하위 에이전트를 동시에 만들어 일을 나눠 맡기고 결과를 종합하는 다중 에이전트 구조가 등장했고[^How we built our multi-agent research system] 서로 다른 회사의 에이전트끼리 능력을 광고하고 일을 위임하며 협력하게 하려는 별도의 표준도 나왔습니다[^Announcing the Agent2Agent Protocol (A2A)]. 도구와 에이전트를 잇는 규약과 에이전트끼리를 잇는 규약이 따로 자리잡으며 제가 터미널 창 세 개를 오가며 하던 일이 머지않아 에이전트들끼리 서로 일을 주고받는 모양으로 한 겹 더 추상화될 것 같은 그림입니다.
여기서 한 걸음 더 나아간 것이 최근 자리잡은 딥 리서치 모드입니다. 퍼플렉시티가 2025년 2월에 내놓은 딥 리서치[^Introducing Perplexity Deep Research], 앤트로픽이 2025년 4월에 클로드에 더한 리서치 기능[^Claude takes research to new places], 비슷한 시기에 OpenAI가 내놓은 딥 리서치[^Introducing deep research]가 모두 비슷한 종류의 물건입니다. 평소의 채팅과 무엇이 다른가를 한 줄로 정리하면 채팅은 파라미터 안에 든 지식만으로 한두 번의 추론을 거쳐 답하는 한 번의 자동완성에 가깝고, 코드 에이전트가 컴파일러와 테스트라는 분명한 합격·불합격 신호를 향해 같은 자동완성을 반복하는 일이라면, 딥 리서치는 그 반복의 상대가 웹 전체가 되는 일입니다. 질문을 받으면 곧장 답하는 대신 먼저 조사 계획을 세우고 여러 검색어를 던지고 돌아온 문서를 읽고 거기서 다음에 무엇을 찾을지 다시 정하는 과정을 수십 번 되풀이한 다음 출처를 단 보고서로 정리해 내놓습니다. 채팅이 몇 초 만에 끝난다면 딥 리서치는 몇 분에서 길게는 수십 분까지 이어지는데 그 시간의 대부분이 검색과 읽기와 다음 검색을 정하는 반복에 쓰입니다.
딥 리서치가 깊이 있는 답을 내놓는 이유는 새로운 종류의 지능이 생겨서가 아니라 앞에서 살펴본 조각들이 한자리에 모였기 때문입니다. 첫째는 추론 모델입니다. o1과 R1에서 살펴본 것처럼 답하기 전에 긴 사고 과정을 풀어내도록 강화학습으로 훈련된 모델이 조사 계획을 세우고 검색 결과를 평가하고 다음 행동을 정하는 일을 맡습니다. OpenAI는 자기 딥 리서치가 어려운 검색·추론 과제에 대해 강화학습으로 끝까지 훈련된 모델 위에서 동작한다고 밝혔습니다[^Introducing deep research]. 둘째는 검색 증강입니다. 답을 파라미터에 든 지식이 아니라 그때그때 가져온 문서에 근거해 내놓는 RAG가 더해지면서 출처를 단 보고서가 나옵니다. 셋째는 에이전트 반복입니다. 검색 결과라는 관찰을 맥락에 더하고 그 위에서 다시 생각하고 다시 검색하는 리액트식 순환이 매 단계 새 증거로 모델을 다시 조건화합니다. 여기에 앞서 본 다중 에이전트 구조가 얹히기도 합니다. 클로드의 리서치는 책임 에이전트가 조사 계획을 세운 다음 여러 하위 에이전트를 동시에 풀어 각자 다른 각도를 병렬로 조사하게 하고 그 결과를 종합하는 구조 위에서 동작하는데 앤트로픽은 자체 평가에서 이 다중 에이전트 구성이 단일 에이전트보다 90퍼센트 넘게 나은 성적을 냈다고 보고했습니다[^How we built our multi-agent research system]. 대신 비용도 같이 늘어서 에이전트는 채팅의 약 네 배, 다중 에이전트는 약 열다섯 배의 토큰을 씁니다.
결국 딥 리서치도 바닥에서 일어나는 일은 다음 토큰을 맞추는 자동완성 그대로입니다. 달라진 것은 그 자동완성이 한 번으로 끝나지 않고 검색이라는 도구를 손에 쥔 채 웹을 상대로 길게 반복하며 매 바퀴 새로 가져온 증거 위에서 다음 토큰을 맞춘다는 점입니다. 더 똑똑한 엔진이 아니라 같은 엔진에 더 많은 추론 시간과 더 많은 외부 근거를 부어 넣은 셈인데 앞에서 본 추론 시점의 연산을 늘리는 편이 때로 더 효율적이라는 발상이 여기서 제품의 모양으로 나타납니다. 물론 한계도 그대로 따라옵니다. 가져온 문서 자체가 틀렸거나 신뢰할 수 없으면 그 위에서 아무리 길게 추론해도 결과가 그만큼 부실해지고 출처를 달았다는 사실이 그 출처가 본문 주장을 실제로 받쳐 준다는 보장이 되지는 않습니다.
여기까지가 텍스트를 다루는 이야기인데 같은 질문을 그림이나 소리나 영상에 던지면 흥미로운 차이가 드러납니다. 텍스트 생성이 다음 토큰을 한 번에 하나씩 왼쪽에서 오른쪽으로 맞추는 자동완성이라면 요즘 이미지와 영상을 만드는 주류 방식인 디퓨전은 그 결과 전체를 한꺼번에 다듬어 가는 다른 방식입니다. 디퓨전 모델은 먼저 깨끗한 이미지에 노이즈를 조금씩 더해 완전한 잡음으로 만드는 고정된 과정을 정해 두고 신경망에는 그 반대 방향 즉 잡음이 섞인 이미지에서 더해진 노이즈가 무엇인지를 맞추도록 학습시킵니다[^Denoising Diffusion Probabilistic Models]. 생성할 때는 순수한 잡음에서 시작해 모델이 추정한 노이즈를 조금씩 걷어 내는 일을 수십 번 반복하면 이미지 한 장이 통째로 떠오릅니다. 수학적으로 보면 텍스트는 다음 토큰의 정확한 확률을 최대로 만드는 교차 엔트로피를 쓰지만 디퓨전은 더해진 노이즈와 모델이 추정한 노이즈 사이의 제곱오차를 줄이는 목표를 쓰는데 이것이 데이터 확률의 변분 하한이자 점수 매칭에 해당합니다. 한쪽은 이산적인 토큰을 차례로 뽑고 다른 쪽은 연속적인 그림 전체를 반복해서 다듬는다는 점이 가장 큰 차이입니다.
그렇다고 그림과 소리가 텍스트와 완전히 다른 수학 위에 서 있는 것은 아닙니다. 초기의 DALL-E는 이미지를 작은 조각들의 토큰으로 바꾼 다음 텍스트와 똑같이 다음 토큰을 차례로 맞추는 방식으로 그림을 그렸습니다[^Zero-Shot Text-to-Image Generation]. 소리도 마찬가지여서 WaveNet은 오디오 파형의 다음 샘플을 앞선 샘플들로부터 맞추는 완전한 자동완성이었고[^WaveNet: A Generative Model for Raw Audio] 구글의 AudioLM은 소리를 이산 토큰으로 바꿔 음악 생성을 아예 언어 모델링 문제로 다루었습니다[^AudioLM: a Language Modeling Approach to Audio Generation]. 연속적인 데이터를 잘게 잘라 토큰으로 바꿔 두면 그림이든 소리든 다시 다음 토큰을 맞추는 문제가 되는 셈입니다. 디퓨전조차 요즘은 트랜스포머를 그대로 뼈대로 쓰는 쪽으로 모이고 있어서[^Scalable Diffusion Models with Transformers] 결국 텍스트와 그림과 소리는 모두 같은 신경망 기계로 데이터의 분포를 학습한다는 점에서 한 가족이고 다만 그 분포에서 표본을 뽑는 방식이 자동완성이냐 노이즈 제거냐로 갈릴 뿐입니다.
이 관점을 한 걸음 더 끌고 가면 기계가 자동차를 운전하는 일도 같은 자리에 놓입니다. 자율주행을 만드는 한 가지 길은 카메라와 센서가 들어오면 사람이 정해 둔 중간 단계를 거쳐 차례로 인식하고 예측하고 계획하고 제어하는 모듈을 따로따로 만드는 것이지만 최근의 흐름은 카메라 화면에서 조향과 가속까지를 하나의 신경망이 통째로 잇는 끝에서 끝까지 학습입니다. 이미 2016년에 엔비디아가 전방 카메라의 픽셀을 곧장 조향 명령으로 잇는 신경망을 사람의 운전 데이터로 학습시켰는데[^End to End Learning for Self-Driving Cars] 핵심은 사람이 어떻게 운전했는지를 흉내 내도록 학습한다는 점입니다. 지금 이 순간의 센서 입력이라는 맥락이 주어졌을 때 사람이라면 다음에 어떤 조작을 했을지를 맞추는 일인데 이것은 텍스트의 다음 토큰을 맞추는 일과 정확히 같은 모양입니다. 맥락이 문장이 아니라 카메라 영상이고 맞추는 대상이 단어가 아니라 조향각과 가속이라는 점만 다를 뿐입니다.
여기서 앞에서 본 생성 모델이 다시 등장합니다. Wayve가 만든 GAIA라는 운전 세계 모델은 주행 영상을 토큰으로 바꾼 다음 다음 토큰을 맞추는 방식으로 다음 장면을 상상해 내는데[^GAIA-1: A Generative World Model for Autonomous Driving] 이미지 생성에서 본 그 기법을 그대로 미래의 카메라 화면을 만드는 데 쓴 것입니다. 구글이 로봇 팔에 적용한 RT-2는 로봇의 동작 자체를 언어 토큰과 똑같이 다뤄 행동을 예측했고[^RT-2: Vision-Language-Action Models Transfer Web Knowledge to Robotic Control] Wayve는 같은 발상을 도로 위에서 운전 경로를 예측하는 모델로 옮겼습니다[^LINGO-2: Driving with Natural Language]. 결국 운전하는 기계의 바닥에도 맥락을 받아 다음 행동을 맞추는 같은 자동완성이 있는 셈입니다. 다만 여기에는 정직하게 덧붙일 단서가 있습니다. 운전은 글자 그대로의 언어 모델이 아니고 잘못 뽑은 토큰은 어색한 문장으로 끝나지만 잘못 맞춘 조작은 사고로 이어지기 때문에 사람을 흉내 내는 것만으로는 부족하고 안전장치와 시뮬레이션과 끝없는 개입이 함께 필요합니다. 끝에서 끝까지 학습이 강한 흐름인 것은 맞지만 아직 모든 자율주행이 그 길로 간 것도 아닙니다.
이렇게 한 바퀴를 돌고 나니 처음의 불안이 완전히 사라지지는 않았지만 모양은 분명히 달라졌습니다. 가장 밑바닥에 다음 토큰을 맞추는 자동완성이 있고, 그 위에 트랜스포머라는 그릇과 거대화라는 역사와 정렬과 추론이라는 다듬기가 얹혀 있으며, 다시 그 위에 도구와 반복과 규약이 더해져 제 터미널까지 왔다는 큰 그림이 이제는 한 줄로 그려집니다. 안쪽을 알게 되었다고 해서 이 기계가 덜 강력해지는 것은 아닙니다. 오히려 어디가 이음새인지가 또렷해졌습니다. 어디까지나 확률로 그럴듯한 토큰을 고르는 자리, 사람의 피드백으로 방향을 틀 수 있는 자리, 외부 컨텐츠에 속을 수 있는 자리가 어디인지 조금은 분간할 수 있게 되었습니다. 의존을 줄일 생각은 없습니다. 'AI 활용 회고 (2025)'에서 이 주제가 식기세척기 논란과 비슷한 데가 있다고 적은 적이 있는데 결과가 늘 완벽하지 않더라도 그 시간에 다른 일을 할 수 있게 해 준다는 점에서 저는 여전히 이 기계를 계속 쓸 작정입니다. 다만 무엇을 맡기고 어디에서 한 번 멈춰 확인할지를 정하는 데에는 그 안에서 무슨 일이 일어나는지 어렴풋이라도 아는 편이 모르는 편보다 낫다는 것만큼은 분명해진 것 같습니다. 적어도 권한 확인을 통째로 꺼 둔 그 세 번째 창은 다음부터는 조금 다르게 다뤄야 할 듯합니다.