
BERT vs GPT: 인공지능의 두 얼굴 (이해 vs 생성)
둘 다 같은 Transformer 자식인데 왜 다를까? '빈칸 채우기'와 '이어 쓰기' 비유로 알아보는 BERT와 GPT의 결정적 차이. 프로젝트에서 겪은 시행착오와 선택 가이드.

둘 다 같은 Transformer 자식인데 왜 다를까? '빈칸 채우기'와 '이어 쓰기' 비유로 알아보는 BERT와 GPT의 결정적 차이. 프로젝트에서 겪은 시행착오와 선택 가이드.
ChatGPT는 질문에 답하지만, AI Agent는 스스로 계획하고 도구를 사용해 작업을 완료한다. 이 차이가 왜 중요한지 정리했다.

고객 상담 챗봇이 엉뚱한 대답을 해서 식은땀 흘린 경험, 그리고 RAG(검색 증강 생성)를 도입해 '오픈북 테스트'를 치르게 한 과정을 공유합니다. 벡터 DB, 임베딩, 그리고 하이브리드 검색까지 파헤쳐봅니다.

RNN의 한계인 '치매 증상'을 극복하고, 구글이 'Attention Is All You Need' 논문으로 세상을 뒤집은 이야기. 쿼리(Query), 키(Key), 밸류(Value)의 완벽한 도서관 검색 비유와 멀티 헤드 어텐션, 그리고 Vision Transformer까지 연결합니다.

컴퓨터는 '사과'와 '배'가 비슷한 과일이라는 것을 어떻게 알까요? 원-핫 인코딩의 한계부터 Word2Vec, 그리고 현대 AI의 핵심인 트랜스포머(Transformer) 기반 임베딩까지. 텍스트를 숫자로 변환하여 의미를 계산하는 임베딩의 세계와 이를 활용한 RAG(검색 증강 생성) 아키텍처를 다뤄봤습니다.

제가 처음 자연어 처리(NLP) 프로젝트를 맡았을 때 들었던 가장 흔한 조언은 "텍스트 분류는 BERT를 쓰고, 텍스트 생성은 GPT를 써라"였습니다. 당시 저는 의문이 들었습니다. "둘 다 구글이 만든 Transformer(트랜스포머) 아키텍처 기반이라던데, 왜 용도가 이렇게 극명하게 갈리지?"
호기심에 저는 반대로 해봤습니다. GPT-2로 감성 분석(분류)을 시도했고, BERT로 문장 생성(생성)을 시도했죠. 결과는 처참했습니다. BERT가 뱉어낸 문장은 뒤죽박죽이었고, GPT가 분류한 감정은 정확도가 들쭉날쭉했습니다.
그제야 알게 되었습니다. "아, 태생부터 뇌 구조가 다르구나." BERT는 이해(Understanding)를 위해 태어난 녀석이고, GPT는 창작(Generation)을 위해 태어난 녀석입니다. 이 둘의 차이를 명확히 아는 것이 AI 엔지니어링의 시작입니다.
가장 혼란스러웠던 부분은 "양방향(Bidirectional) vs 단방향(Unidirectional)"이라는 용어였습니다. "텍스트를 읽는 방향이 다르다는 건 알겠는데, 그게 왜 지능의 차이를 만들지?"
그리고 "Encoder"와 "Decoder"의 역할 분담도 헷갈렸습니다. 번역기 모델(Transformer)에서 인코더는 번역할 문장을 읽고, 디코더는 번역된 문장을 뱉어낸다는 건 알겠는데, 이걸 따로 떼어내면 무슨 일이 벌어지는지 상상이 안 갔습니다.
이해하는 데 결정적이었던 비유는 "시험 문제 유형"이었습니다.
[MASK]를 먹었다. 그것은 빨갛고 달콤했다."[MASK]에 들어갈 말이 "사과"라는 것을 추론합니다.BERT는 트랜스포머 모델에서 인코더(Encoder) 부분만 떼어내서 쌓아 올린 모델입니다. 인코더의 역할은 정보를 압축해서 "숫자(Vector/Embedding)"로 만드는 것입니다.
GPT는 트랜스포머 모델에서 디코더(Decoder) 부분만 떼어내서 쌓아 올린 모델입니다. 디코더의 역할은 뱉어내는 것입니다.
선택: BERT 리뷰 전체를 다 읽고 판단해야 하기 때문입니다.
from transformers import BertTokenizer, BertForSequenceClassification
import torch
# BERT는 문장 전체를 한 번에 벡터화합니다.
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
text = "The movie was not bad at all."
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
# 'not'과 'bad'의 관계를 이해하고 'Positive'로 분류
선택: GPT 자연스러운 문장 생성이 목표이기 때문입니다.
from transformers import GPT2LMHeadModel, GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')
prompt = "Subject: Meeting Invitation\nHi Team, I would like to"
inputs = tokenizer(prompt, return_tensors="pt")
# 창의성(Temperature)을 조절하며 다음 단어들을 생성
outputs = model.generate(inputs['input_ids'], max_length=50, temperature=0.7)
print(tokenizer.decode(outputs[0]))
2023년 이후, LLM(Large Language Model)의 시대가 오면서 이 둘의 경계가 조금씩 희미해지고 있습니다.
하지만 여전히 가성비(Cost/Performance) 측면에서는 구분이 유효합니다. 단순 분류 작업에 거대한 GPT-4를 쓰는 건 닭 잡는 데 소 잡는 칼을 쓰는 격이니까요. 빠르고 가벼운 DistilBERT가 훨씬 효율적일 수 있습니다.
할 수는 있습니다(Gibbs Sampling 등). 하지만 엄청 느리고 부자연스럽습니다. 빈칸을 하나 채우고, 다시 처음부터 돌려서 또 하나 채우고... 비효율의 극치입니다.
GPT는 "진실"을 말하도록 학습된 게 아니라, "그럴싸한 다음 단어"를 말하도록 학습되었기 때문입니다. 문맥상 가장 확률이 높은 단어를 뱉는데, 그게 팩트인지는 검증하지 않습니다. (이걸 잡으려고 RAG 기술이 떴죠).
개발자로서 AI 모델을 고를 때, 이 기준만 기억하세요.
물론 요즘은 "똑똑한 작가(GPT-4)"가 분석도 잘해서 분석가 자리를 위협하고 있지만, 전용 분석가(BERT)가 필요한 순간(속도, 보안, 비용)은 반드시 옵니다. 도구의 특성을 정확히 알고 적재적소에 쓰는 것이 진짜 엔지니어의 실력이니까요.