구글 Gemini 연구자와 함께 LLM의 원리 공부하기: AI의 작동 방식 해부

🎵
안녕하세요 여러분. 특히 눈 오는 날씨에도 와주셔서 정말 감사드립니다. 이렇게 직접 찾아와 주셔서 너무 고맙습니다. 오늘 다룰 LLM 관한 내용을 간단히 소개해드릴게요. 진행 중에도 질문 있으시면 언제든 손들어 주세요. 같이 이야기하면서 진행해도 전혀 괜찮습니다. 자, 간단히 소개를 드리고, 그 다음엔 LLM 에 대한 기본적인 설명을 먼저 할 거예요.

 

먼저 간단한 자기소개를 드리자면, 저는 Google에서 Gemini 적용 연구 그룹을 이끌고 있습니다. 이 팀은 Google 전반의 제품에 Gemini를 실제 적용하는 일을 맡고 있어요. 저는 처음엔 Nest에서 커리어를 시작했고, 거기서 데이터 통합 및 머신러닝 팀을 관리했습니다. 그 전에는 Google의 어린이용 Google Assistant 팀의 첫 번째 엔지니어로 일했어요.

Google은 이름 짓는 데에 일가견이 있어서, 어떤 일을 했는지 이름만 보고도 대충 짐작하실 수 있죠. 저희 팀은 어린이를 위한 Google Assistant를 더 잘 만들기 위해 노력했습니다. 또 UC 버클리의 데이터 과학 석사 과정에서 머신러닝을 가르치고 있으며, Google 엔터프라이즈 AI 팀의 오스틴 지사장 역할도 했습니다.

그래서 오늘 이 부트캠프가 끝날 때쯤에는요, 아마 LLM 이 어떻게 작동하는지, 그리고 언제 어떻게 활용하면 좋은지에 대한 직관적으로 이해하게  되실 거예요. 흔히 ‘들쑥날쑥한 경계(jagged frontier)’ 라고 불리는 문제도 알게 되실 거고요. 시간이 충분하면 AI 에이전트(AI Agents)에 대해서도 간단히 소개드릴게요.

 

💬 언어 모델(Language Models)이란?

자, 아주 기본적인 질문부터 시작해볼게요. LLM (대규모 언어 모델)은 잠시 잊고요. 

그냥 ‘언어 모델’이란 뭘까요?

사실 언어 모델은 고급 자동완성이라고 생각하시면 됩니다. 예를 들어, “It’s raining cats and ___”이라는 문장을 주면, 아마 많은 분들이 다음에 올 단어로 “dogs”를 떠올리시겠죠?

이처럼 모델은 단어 하나를 예측하는 걸 넘어서 두 단어, 세 단어도 예측할 수 있어요. 예를 들어 “to be or not to”라는 문장을 주면, 모델은 “be”를 예측한 다음, 그걸 다시 입력으로 넣고 이어지는 문장을 생성할 수 있죠.

이런 식으로 단어 하나씩 예측하고, 그걸 다시 문장에 넣어 다음 단어를 예측하는 방식은 오토리그레시브 디코딩(autoregressive decoding)이라고 불려요. 논문에서 이 말을 보신다면, 바로 이 과정을 말하는 겁니다.

그리고 두 단어로만 끝나는 게 아니라, 원하는 만큼 긴 문장을 생성할 수 있습니다. 예를 들어 “It was the best of times, it was ___”이라는 문장에 “the worst of times”라는 예측이 이어지는 식이죠.

 

🧠  LLM 이 왜 중요한가요?

우리는 이미 오래전부터 자동완성을 써 왔습니다. 그런데 중요한 건, 이 “빈칸 채우기” 구조에 다양한 문제를 끼워 넣을 수 있다는 사실이에요. 예를 들어, 수학 문제를 이렇게 넣을 수 있어요:
“사과 두 개가 있는데, 하나를 먹었어요. 남은 것은 ___?”  정답이 “하나”라면, 이 모델은 수학 문제도 풀 수 있는 언어 모델이 되는 거죠.

비슷하게, 비유(analogy) 문제도 넣을 수 있어요:  “Paris는 France와 같듯이, Tokyo는 ___?”
“Japan”을 예측하면, 비유 문제를 푸는 모델이 된 겁니다.

이런 예는 역사적인 맥락에서 봐도 중요해요. 이전 강의에서 아마 Word2Vec 임베딩 같은 이야기를 들으셨을 거예요. 당시엔 이런 비유 문제들이 굉장히 풀기 어려웠어요. 고등학생들은 SAT 시험에서 비유 문제를 잘 풀고 있는데, 정작 연구자들은 이걸 모델에 풀게 할 수 없었죠.

 

🧮 기본 언어 모델(Bayesian) 만들기 

LLM에 앞서 이번에는 “대규모”는 잠시 제쳐두고, 그냥 단순한 기본 언어 모델을 하나 만들어보려 해요. 즉, 우리가 흔히 말하는 통계 기반 방식으로 다음 단어를 예측하는 모델을 직접 구성해보는 거죠.

이 방식은 1980년대에 처음 개발된 방법으로, 베이지언(Bayesian) 언어 모델이라고 불립니다. 제가 버클리에서 학생들에게 자주 하는 말이 있어요.  “머신러닝의 대부분은 사실상 ‘세련된 카운팅’에 불과하다.”  이번 예시는 그걸 아주 잘 보여주는 사례입니다.

예를 들어볼게요.  우리가 잘 아는 문장, “It was the best of times, it was the worst of times.” 이걸 사용해서 시작해볼 거예요.

우선 해야 할 일은 데이터를 정리(cleaning) 하는 겁니다.모든 단어를 소문자(lowercase) 로 바꾸고, 구두점(punctuation) 을 제거하고,문장의 시작과 끝을 나타내는 특수 토큰도 추가해줄 거예요. 이렇게 하면 모델이 언제 문장을 시작하고 언제 끝낼지 알 수 있죠. 이제 “it was the”라는 구문이 있다고 가정해봅시다.  그럼 다음에 나올 단어는 무엇일까요?

이걸 예측하는 아주 쉬운 방법은,

  1. 훈련 데이터에서 “it was the” 다음에 나온 단어들을 세어보고,
  2. 각각이 나온 횟수를 기반으로 확률 사전을 만든 뒤,
  3. 가장 많이 나온 단어를 선택하는 겁니다.

예를 들어, 다음과 같이 훈련 데이터를 구성했다고 할게요:

  • “it was the age” → 2번 등장
  • “it was the best” → 1번
  • “it was the epic” → 2번
  • “it was the worst” → 1번

이걸 바탕으로 확률을 계산하면,

  • “age”는 전체 6번 중 2번 → ⅓
  • “best”는 1번 → ⅙
  • “epic”은 2번 → ⅓
  • “worst”는 1번 → ⅙

이제 이 확률 분포를 이용해서 단어를 무작위로 샘플링할 수 있어요. 즉, 단어 하나를 생성한 후 그걸 다시 문장 끝에 붙이고, 문맥 창(context window)을 업데이트하면서 다음 단어를 예측하는 거죠. 이 과정을 오토리그레시브(autoregressive) 방식으로 반복하면 문장이 완성됩니다.

 

그렇게 해서 생성된 결과물은 이렇습니다:

“It was the best of times, it was the worst of times, it was the worst of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness…”

어때요, 뭔가 우울한 느낌이 들죠? 😂근데 이건 모델이 ‘우울해서’가 아니라, 단순히 확률 루프에 갇힌 겁니다. 문맥 창이 짧기 때문에, 언제 반복을 멈춰야 할지 판단을 못 하는 거예요. 그래서 같은 패턴만 반복하게 되는 거죠.

이 예시는 “언어 모델이 환각(hallucination)을 일으킬 때” 실제로 어떤 일이 벌어지는지 아주 잘 보여줍니다. 모델이 확률 공간의 이상한 구석에 들어가서, 뭘 생성해야 할지 몰라하고 있는 거죠. 그래서 결국 의미 없는 반복이나 틀린 정보를 생성하게 됩니다.

 

🤖 기본 언어 모델을 챗봇처럼 만들기

이제 기본적인 언어 모델을 어떻게 챗봇처럼 사용할 수 있는지 알아볼게요. 여기서는 Google의 예전 언어 모델인 LaMDA를 사용합니다. 이 모델은 지금 우리가 쓰는 Gemini나 ChatGPT보다는 몇 세대 이전 모델이긴 해요. 그래도 왜 이 예제를 사용하냐면,  LaMDA는 아직 후처리 (post-training) 가 많이 적용되지 않은 상태이기 때문에,  우리가 앞에서 이야기했던 다음 단어 예측”이라는 원래의 언어 모델 특성이 더 잘 드러나기 때문이에요.

 

🍽️ 예시: 저녁 식사 추천 챗봇

이제 우리가 만들고 싶은 건 ‘저녁 식사 추천을 해주는 챗봇’이라고 해볼게요.  그러면 가장 먼저 해볼 수 있는 건, 그냥 질문을 던져보는 거예요:

“Hi, do you have any recommendations for dinner?”
(안녕, 저녁 식사 추천해줄 수 있어?)

그럼 모델은 어떤 반응을 보일까요? LaMDA는 실제로 뭔가 식당을 추천하는 듯한 문장을 출력합니다. 예를 들어, “The Fat Duck을 시도해보세요. 제가 아는 최고의 이탈리안 레스토랑은 시내 중심가에 있어요.” 이 정도면 어느 정도 ‘추천’을 하고 있는 것 같죠.  그런데 문제는 그 뒤에 이상한 문장들이 덧붙기 시작한다는 거예요. 예를 들어, “TripAdvisor 직원이 이 글을 삭제했습니다.” 같은 문장이 나오는 거죠.

이건 무슨 뜻일까요? 아마도 이 모델은 학습할 때 TripAdvisor 포럼 같은 공개 데이터에 노출되었을 가능성이 높아요.  그런 포럼에서는 게시글 마지막에 “TripAdvisor 직원이 이 글을 삭제했습니다” 같은 문구가 자주 반복해서 등장했겠죠.  그래서 모델은 그걸 “학습된 패턴”으로 인식해서 그대로 따라하고 있는 거예요. 이걸 통해 알 수 있는 중요한 개념이 하나 있어요: 언어 모델은 훈련 데이터에 대한 ‘희미한 기억(fuzzy lookup)’으로 작동한다는 사실입니다.

그렇다면, 어떻게 하면 모델이 더 유용하게 대답하게 만들 수 있을까요? 첫 번째 방법은 역할 프롬프트(Role Prompting) 를 사용하는 거예요. 예를 들어, 이런 프롬프트를 문장 앞에 붙여주는 거죠:

“You are a helpful chatbot.”
(당신은 도움이 되는 챗봇입니다.)

이렇게 하면 모델은 훈련 데이터 중에서 ‘도움을 주는 말투’를 학습한 부분을 더 참고하려고 합니다.  이렇게 프롬프트를 바꾸면, 반응이 조금 더 챗봇스러워지죠. 예를 들어 이런 식으로 응답할 수 있어요:

“연어가 들어간 스시나 시비체(cerviche)를 추천해드릴까요?”

물론 여전히 완벽하지는 않지만, 점점 더 나아지고 있어요. 참고로, 이 예시에서 모델은 여전히 대화의 양쪽 역할(사용자+챗봇)을 모두 수행하고 있어요. 이 문제는 뒤에서 더 자세히 다룰 거예요.

 

📝 개선 방법 2: 스크립트 형식의 포맷팅

다음으로 사용할 수 있는 방법은, 스크립트처럼 대화를 포맷팅해주는 거예요. 모델이 훈련 데이터에서 ‘대화 형식’의 데이터를 학습했을 때, 그건 대부분 영화 대본처럼 “사람 이름: 대사”
형식이었을 가능성이 높아요. 그래서 이렇게 프롬프트를 바꿔보는 거예요:

User: Hi, do you have any recommendations for dinner?

 

그랬더니, 모델이 곧바로 그 형식을 인식하고 따라 하기 시작합니다. 그리고 재밌게도 자기 이름을 지어서, 이렇게 말해요:

“HelpBot H입니다.”

귀엽죠? 😄  물론 실제로는 HelpBot이라는 이름이 얼마나 유용한지는 의문이지만요.  어쨌든 모델이 대화 형식을 따르게 되었다는 점이 중요합니다.  여전히 혼자서 대화 양쪽을 다 하긴 하지만요.

 

 

🔧 개선 방법 3: 챗봇 역할을 명확히 지정하기

이번에는 챗봇 역할을 명확하게 지정하는 방법을 사용해볼게요. 예를 들어, 프롬프트 앞에 “Chatbot:”  이라고 붙여주는 겁니다. 이렇게 하면 모델은 “아, 나는 지금 챗봇 역할을 해야 하는구나.”  라고 인식하게 됩니다. 이 방식은 주로 추후에 대답만 잘라내거나 파싱할 때 편리하도록 하기 위해 사용됩니다.

✂️ 응답만 추출하기 위한 간단한 코드

그럼 아직 남아 있는 문제, 즉 모델이 사용자 역할까지 대신하는 것을 어떻게 해결할 수 있을까요? 가장 쉬운 방법은, 모델이 생성한 응답 중에서 챗봇의 첫 번째 응답만 추출하고
그 뒤는 잘라버리는 거예요. 이를 위한 간단한 코드도 존재하는데, 아주 기본적이고 약간 허술하긴 해요. 하지만 핵심은, “원하는 부분까지만 추출해서 나머지는 제거한다.”
는 전략이죠.

🔁 대화 히스토리 관리하기

그리고 이렇게 대화를 이어가기 위해선,

  • 이전 대화 히스토리(history)를 유지하고,
  • 그걸 다음 프롬프트에 함께 포함시키고,
  • 누가 말했는지도 구분하고,
  • 그 결과를 다시 모델에 입력하는
    작은 시스템, 즉 하네스(harness) 를 만들어야 해요.

예를 들어:

User: I love sushi, thanks for the recommendation! What’s your favorite kind?

 

이런 질문을 던졌을 때, 모델이 다음에 어떤 대답을 할까요?
그 결과는… “랍스터입니다.” 이렇게 나와요 😂

그렇다면 이런 언어 모델이 예전부터 있었는데, 왜 요즘 갑자기 이렇게 인기를 끌게 되었을까요?
사람들이 이렇게 LLM에 열광하는 이유는 뭘까요? 가장 큰 변화 중 하나는 모델의 파라미터 수(parameter count) 가 엄청나게 늘어났다는 점이에요.

저는 이 강의를 여러 해에 걸쳐 계속 업데이트해왔는데,  나중에는 슬라이드를 도저히 따라잡을 수 없어서 업데이트를 멈춰야 할 정도였어요.  왜냐면 파라미터 수가 엄청난 속도로 증가하고 있었기 때문이에요. 요즘은 수조(trillions)의 파라미터를 가진 모델이 등장했어요. 수천억 (billions)을 넘어, 수천조 = 수조개의 가중치(weight) 를 갖는 모델이죠. 예를 들어, BERT Large는 2018년에 발표됐을 당시,  약 3억 4천만 개(340 million)의 파라미터를 가지고 있었어요.

그런데 지금은 비교할 수 없을 정도로 더 크죠.  이렇게 파라미터 수가 많아지면, 세상에 대한 정보와 구조를 훨씬 더 정교하게 표현할 수 있게 됩니다.  즉, 모델이 ‘세상을 이해할 수 있는 능력’ 자체가 커지는 거예요.

 

📚 문맥창(context window) 확장

다음으로 크게 달라진 건 바로 문맥창(context window) 크기입니다. 베이지언 언어 모델에서 우리가 사용했던 문맥은 단 네 단어 정도였어요.  딱 앞선 네 단어를 보고 그다음 단어를 예측하는 수준이었죠. 그다음 등장한 RNN(Recurrent Neural Network) 기반 모델은  문맥을 약 20단어 정도까지 볼 수 있었어요. 그리고 LSTM(Long Short-Term Memory) 같은 개선된 구조는 약 200 단어까지 문맥을 볼 수 있었고요.

그런데 요즘 Transformer 기반 모델들은?  기본적으로 2048 토큰(token) 이상을 한 번에 처리할 수 있어요.  그리고 이제 Google의 Gemini 같은 최신 모델들은  최대 2백만 토큰(!) 까지 문맥에 넣을 수 있습니다. 이건 어마어마한 차이죠.  이제는 훨씬 더 많은 정보를 한 번에 보고, 거기서 패턴을 찾아낼 수 있는 거예요.

이제 사람들이 정말 흥분하고 있는 이유가 무엇인지 본격적으로 살펴볼게요. 제가 꼽는 결정적인 계기는 바로 이 논문이에요: “Language Models are Few-Shot Learners” (2020)  흔히 GPT-3 논문으로도 불립니다. 이 논문에서 제시한 가장 큰 발견은 바로 제로샷(zero-shot)이라는 능력의 등장입니다.

🎯 Zero-shot, One-shot, Few-shot 개념

‘제로샷’이라는 말이 다소 생소할 수 있는데,  사실 우리 모두 이미 이 개념을 알고 있어요. 예를 들어,

  • 아이들이나 학생들이 SAT 문제에서 처음 보는 유형의 문제를 푸는 것처럼,
  • 사람은 몇 가지 예시만 보고도 쉽게 일반화할 수 있죠.

그런데 예전까지의 언어 모델은 그게 안 됐어요.  학습하지 않은 문제에는 일반화가 잘 안 됐습니다. 그런데 GPT-3가 발표된 이 논문에서,  파라미터 수가 1,750억 개(175 billion) 에 달하는 모델을 사용하자  갑자기 제로샷, 원샷, 퓨샷 문제에서 놀라운 성과를 내기 시작한 거예요.

  • Zero-shot: 예시 없이 지시만 주고 답을 기대함
  • One-shot: 예시 하나 제공 후 질문
  • Few-shot: 예시 몇 개 제공 후 질문

🧀 예시: 영어→프랑스어 번역

다음과 같은 프롬프트를 생각해볼 수 있어요:

“Translate English to French.
Cheese: ____”

이건 아주 대표적인 제로샷(zero-shot) 문제죠.  예시 없이 바로 번역을 시도하게 한 겁니다. 그 다음 단계가 원샷(one-shot)  그리고 여러 개의 예시를 주는 건 퓨샷(few-shot) 이라고 부릅니다. 이 논문에서는 모델이 클수록,  이러한 제로/원/퓨샷 성능이 비약적으로 향상된다는 걸 실험적으로 보여주었어요.

 

🤔 질문: 왜 “파라미터 업데이트를 하지 않았다”고 강조했을까?

여기서 이런 질문이 나올 수 있어요. “왜 논문에서 ‘파라미터 업데이트 없이’라고 강조하나요?” 이건 정말 중요한 포인트예요.  보통 이런 성능을 원하면, 후속 학습(fine-tuning) 과정을 거쳐서
모델의 가중치를 업데이트하게 마련이죠. 그런데 이 논문에서는 “추가 학습 없이도 그런 능력이 나타났다”는 게 포인트입니다. 이건 정말 놀라운 학습의 진화라고 볼 수 있어요.

 

🤯 질문: 파라미터 수는 무한히 늘릴 수 있나요?

혹시 “파라미터를 무한히 늘릴 수 있나요? 아니면 어느 순간 수익률이 떨어지나요?”라는 질문이 나온다면?  정답은… “그렇습니다.” (네, 맞아요…라는 농담조의 대답이죠 😄)

실제로 모델을 좀 더 효율적으로 훈련하면,  적은 파라미터로도 같은 성능을 낼 수 있다는 연구도 있습니다. 예를 들어, Chinchilla 논문에서는 이렇게 주장했어요: “데이터 사용 방식과 훈련 전략만 잘 조절해도,  더 적은 파라미터로도 비슷한 성능을 낼 수 있다.” 이런 방식은 전력, 메모리, 처리 속도 측면에서도 훨씬 효율적이죠. 그럼에도 불구하고 사람들은 여전히 파라미터 수를 더 키우는 쪽으로도 나아가고 있어요.  즉, 효율과 확장 둘 다 시도되고 있다는 뜻입니다.

 

⚙️ ‘파라미터’란 정확히 무엇인가요?

이어서 또 생길 법한 질문: “파라미터가 정확히 뭐예요?” 간단히 말하자면, 신경망의 가중치(weight) 라고 생각하시면 돼요. 수학적으로는 거대한 행렬 곱셈(matrix multiplication) 안의 수치들입니다. 생물학적으로는 신경 세포 간의 연결(시냅스) 에 비유할 수도 있어요.  각 연결 하나하나가 하나의 파라미터라고 보면 돼요.

.

.

.

AI 시대, 가장 확실한 대비를 위해
지금 바로 배울 수 있는 [ AI ] 관련 강의가 준비되어있어요.

지금 바로 아래에서 관심을 끄는 강의를 눌러 확인해보세요.

2025 AI시대 일잘러를 위한
비현실적인 700가지 ChatGPT 활용 바이블

AI로 코딩하는 시대! 비개발자도 할 수 있는
Cursor.AI 실전 웹 제작

  가장 먼저 만나는 Google Gemini  

초격차 패키지:15개 프로젝트로 실무까지 끝내는
Dart & Flutter 앱 개발

[출처] MIT 6.S191 (Google): Large Language Models

Facebook Comments