이미지 로딩 중...
AI Generated
2025. 11. 24. · 6 Views
BERT와 GPT 사전학습 모델 완벽 가이드
자연어 처리의 혁명을 일으킨 BERT와 GPT 같은 사전학습 모델을 초급 개발자도 쉽게 이해할 수 있도록 설명합니다. 실무에서 바로 활용할 수 있는 코드 예제와 함께 사전학습 모델의 핵심 개념을 다룹니다.
목차
1. 사전학습_모델이란
시작하며
여러분이 고객 리뷰를 분석하거나 챗봇을 만들려고 할 때, 처음부터 AI 모델을 학습시키려면 엄청난 양의 데이터와 시간이 필요합니다. 예를 들어, "이 리뷰가 긍정적인가?"를 판단하는 모델을 만들려면 수십만 개의 리뷰 데이터를 모으고 몇 주 동안 학습시켜야 합니다.
이런 문제는 실제 개발 현장에서 자주 발생합니다. 작은 스타트업이나 개인 개발자는 구글이나 오픈AI처럼 막대한 컴퓨팅 자원을 가지고 있지 않기 때문에, AI 프로젝트를 시작하기가 매우 어렵습니다.
바로 이럴 때 필요한 것이 사전학습 모델입니다. 이미 방대한 데이터로 학습된 모델을 가져와서 내 문제에 맞게 조금만 조정하면, 훨씬 빠르고 효율적으로 AI를 구축할 수 있습니다.
개요
간단히 말해서, 사전학습 모델은 이미 많은 것을 배운 똑똑한 AI 모델입니다. 마치 대학교를 졸업한 사람을 채용해서 회사 업무만 가르치면 되는 것과 같습니다.
왜 이 개념이 필요한지 실무 관점에서 설명하자면, AI 개발 비용과 시간을 90% 이상 줄일 수 있기 때문입니다. 예를 들어, 고객 문의를 자동으로 분류하는 시스템을 만들 때, 처음부터 학습하면 몇 주가 걸리지만 사전학습 모델을 사용하면 하루 만에 구축할 수 있습니다.
전통적인 방법에서는 모든 언어 규칙을 처음부터 학습시켜야 했다면, 이제는 이미 언어를 이해하는 모델을 가져와서 내 업무만 가르치면 됩니다. 이것을 "전이 학습(Transfer Learning)"이라고 부릅니다.
사전학습 모델의 핵심 특징은 첫째, 방대한 텍스트 데이터로 언어의 일반적인 패턴을 학습했다는 점, 둘째, 다양한 작업에 재사용할 수 있다는 점, 셋째, 적은 데이터로도 높은 성능을 낼 수 있다는 점입니다. 이러한 특징들이 AI 개발의 진입 장벽을 크게 낮춰주고, 중소기업도 최신 AI 기술을 활용할 수 있게 만들어줍니다.
코드 예제
from transformers import AutoModel, AutoTokenizer
# 사전학습된 BERT 모델 불러오기
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# 텍스트를 모델이 이해하는 형식으로 변환
text = "This product is amazing!"
inputs = tokenizer(text, return_tensors="pt")
# 모델에 입력하여 결과 얻기
outputs = model(**inputs)
# outputs는 텍스트의 의미를 담은 벡터입니다
설명
이것이 하는 일: 사전학습 모델은 위키피디아, 책, 웹사이트 등 수십억 개의 문장으로 먼저 학습한 후, 여러분이 다운로드해서 사용할 수 있도록 제공되는 AI 모델입니다. 첫 번째로, Hugging Face의 transformers 라이브러리를 사용하여 모델과 토크나이저를 불러옵니다.
AutoModel과 AutoTokenizer는 "자동으로" 적절한 모델 구조를 선택해주는 편리한 클래스입니다. 여기서는 "bert-base-uncased"라는 이름의 사전학습된 BERT 모델을 선택했습니다.
이 모델은 이미 영어 문장의 문법, 의미, 맥락 등을 학습한 상태입니다. 그 다음으로, 토크나이저가 우리의 텍스트를 모델이 이해할 수 있는 숫자 형태로 변환합니다.
"This product is amazing!"이라는 문장은 [101, 2023, 4031, 2003, 9233, 999, 102] 같은 숫자 배열로 바뀝니다. return_tensors="pt"는 PyTorch 텐서 형식으로 반환하라는 의미입니다.
마지막으로, 변환된 입력을 모델에 넣으면 outputs라는 결과가 나옵니다. 이 결과는 문장의 의미를 768차원의 벡터로 표현한 것입니다.
이 벡터를 사용하여 감정 분석, 문장 분류, 유사도 계산 등 다양한 작업을 수행할 수 있습니다. 여러분이 이 코드를 사용하면 단 5줄의 코드로 최신 AI 모델을 활용할 수 있습니다.
직접 모델을 학습시킬 필요 없이 구글과 같은 대기업이 수백만 달러를 들여 만든 모델을 무료로 사용할 수 있고, 즉시 높은 정확도의 자연어 처리 작업을 수행할 수 있으며, 코드 몇 줄만 추가하면 여러분의 데이터에 맞게 커스터마이징할 수 있습니다.
실전 팁
💡 Hugging Face Model Hub에는 10만 개 이상의 사전학습 모델이 있습니다. 한국어 모델이 필요하면 "klue/bert-base" 같은 한국어 특화 모델을 사용하세요.
💡 처음 모델을 다운로드할 때는 시간이 걸리지만, 한 번 다운로드하면 로컬에 캐시되어 다음부터는 빠르게 로드됩니다.
💡 GPU가 없어도 CPU에서 사용 가능하지만, 실시간 서비스를 만들 때는 GPU 사용을 권장합니다. Google Colab의 무료 GPU를 활용하면 좋습니다.
💡 모델 크기가 클수록 성능이 좋지만 메모리도 많이 사용합니다. "base" 버전(110M 파라미터)으로 시작해서 필요하면 "large" 버전(340M 파라미터)으로 업그레이드하세요.
💡 상용 서비스에 사용할 때는 각 모델의 라이선스를 확인하세요. 대부분 Apache 2.0이나 MIT 라이선스로 상업적 사용이 가능합니다.
2. BERT_모델
시작하며
여러분이 "은행에 돈을 맡겼다"라는 문장을 AI에게 이해시키려고 할 때, "은행"이 강가의 둔덕을 의미하는지 금융 기관을 의미하는지 어떻게 구분할까요? 전통적인 AI는 "은행"이라는 단어를 하나의 고정된 의미로만 이해했습니다.
이런 문제는 실제 개발 현장에서 자주 발생합니다. 챗봇이 사용자의 질문을 오해하거나, 검색 엔진이 엉뚱한 결과를 보여주는 이유가 바로 문맥을 제대로 이해하지 못하기 때문입니다.
바로 이럴 때 필요한 것이 BERT 모델입니다. BERT는 문장을 양쪽 방향에서 읽어서 각 단어의 진짜 의미를 문맥 속에서 파악합니다.
마치 여러분이 책을 읽을 때 앞뒤 문장을 모두 보고 의미를 이해하는 것처럼 말이죠.
개요
간단히 말해서, BERT(Bidirectional Encoder Representations from Transformers)는 문장을 왼쪽에서 오른쪽으로, 그리고 오른쪽에서 왼쪽으로 동시에 읽어서 각 단어의 의미를 정확하게 이해하는 AI 모델입니다. 왜 이 개념이 필요한지 실무 관점에서 설명하자면, 검색 엔진 최적화, 질문-답변 시스템, 문서 분류 등 문맥 이해가 중요한 작업에서 획기적인 성능 향상을 가져왔기 때문입니다.
예를 들어, 구글 검색은 2019년부터 BERT를 사용하여 검색 결과의 정확도를 크게 개선했습니다. "2019년 브라질 여행자가 미국 비자 필요한가요?"라는 검색어에서 "브라질 여행자가" 주어라는 것을 정확히 파악합니다.
기존에는 단어를 순서대로만 읽었다면, 이제는 양방향으로 읽어서 훨씬 정확한 이해가 가능합니다. 이전 모델들은 "사과를 먹었다"를 읽을 때 "사과"를 보고 "먹었다"를 예측했지만, BERT는 "사과"와 "먹었다"를 동시에 보고 "사과"가 과일이라는 것을 확신합니다.
BERT의 핵심 특징은 첫째, 마스크 언어 모델(MLM) 방식으로 학습하여 문맥을 깊이 이해한다는 점, 둘째, 문장 쌍의 관계를 파악하는 능력이 뛰어나다는 점, 셋째, 질문-답변, 문장 분류 등 다양한 작업에 쉽게 적용할 수 있다는 점입니다. 이러한 특징들이 자연어 처리 분야에 혁명을 일으켰고, 많은 후속 모델들의 기반이 되었습니다.
코드 예제
from transformers import BertTokenizer, BertForSequenceClassification
import torch
# BERT 감정 분석 모델 불러오기
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained(
'bert-base-uncased',
num_labels=2 # 긍정/부정 2개 클래스
)
# 리뷰 텍스트 분석
review = "This restaurant has terrible service but amazing food!"
inputs = tokenizer(review, return_tensors="pt", padding=True, truncation=True)
# 모델 예측 - 양방향으로 문맥을 이해합니다
with torch.no_grad():
outputs = model(**inputs)
predictions = torch.softmax(outputs.logits, dim=1)
print(f"긍정 확률: {predictions[0][1].item():.2%}")
설명
이것이 하는 일: BERT는 문장의 모든 단어를 동시에 보면서 각 단어가 문맥 속에서 어떤 의미를 가지는지 파악하고, 그 정보를 바탕으로 문장을 분류하거나 질문에 답하는 작업을 수행합니다. 첫 번째로, BertForSequenceClassification을 불러옵니다.
이것은 BERT 모델에 분류 레이어가 추가된 버전입니다. num_labels=2는 긍정과 부정 두 가지로 분류한다는 의미입니다.
모델을 처음부터 학습시킨 것이 아니라 이미 학습된 가중치를 불러온 것이므로, 여러분은 파인튜닝만 하면 됩니다. 그 다음으로, 토크나이저가 리뷰 텍스트를 처리합니다.
"This restaurant has terrible service but amazing food!"라는 문장을 보세요. 여기서 "terrible"과 "amazing"이라는 상반된 감정이 나타나는데, BERT는 "but"이라는 접속사를 기준으로 앞뒤 문맥을 모두 이해합니다.
padding=True는 여러 문장을 배치로 처리할 때 길이를 맞춰주고, truncation=True는 너무 긴 문장을 자동으로 잘라줍니다. 마지막으로, 모델이 예측을 수행합니다.
torch.no_grad()는 학습이 아닌 추론 모드로 실행하여 메모리를 절약합니다. outputs.logits는 각 클래스에 대한 원시 점수이고, softmax를 적용하면 확률값으로 변환됩니다.
이 예제의 경우 "terrible"과 "amazing"이 혼재되어 있어서 확률이 애매하게 나올 수 있지만, BERT는 "but" 이후의 "amazing food"에 더 비중을 두어 긍정으로 판단할 가능성이 높습니다. 여러분이 이 코드를 사용하면 복잡한 문장의 감정도 정확히 분석할 수 있습니다.
반어법이나 이중적인 의미를 가진 문장도 문맥을 통해 이해하고, 긍정과 부정이 섞인 리뷰에서도 전체적인 감정을 파악하며, 도메인에 맞게 파인튜닝하면 특정 산업(금융, 의료 등)의 전문 용어도 정확히 처리할 수 있습니다.
실전 팁
💡 BERT는 최대 512개 토큰까지만 처리할 수 있습니다. 긴 문서는 청크로 나누거나 Longformer 같은 모델을 사용하세요.
💡 실무에서는 사전학습된 BERT를 그대로 쓰기보다 내 데이터로 파인튜닝하는 것이 중요합니다. 1,000개 정도의 레이블 데이터만 있어도 큰 효과를 볼 수 있습니다.
💡 한국어 처리에는 "klue/bert-base", "beomi/kcbert-base" 같은 한국어 BERT 모델을 사용하세요. 영어 BERT로는 한국어를 제대로 이해하지 못합니다.
💡 BERT는 추론 속도가 느린 편입니다. 실시간 서비스에서는 DistilBERT(BERT의 60% 크기, 97% 성능)를 고려하세요.
💡 "uncased" 모델은 대소문자를 구분하지 않고, "cased" 모델은 구분합니다. 고유명사가 중요한 작업에는 "cased"를 사용하세요.
3. GPT_모델
시작하며
여러분이 블로그 글의 서론을 쓰고 나면, 다음에 어떤 내용이 올지 자연스럽게 떠오르죠? "오늘은 날씨가 좋아서..."라고 시작하면 야외 활동이나 기분에 대한 이야기가 이어질 것 같습니다.
GPT는 바로 이런 인간의 글쓰기 방식을 AI로 구현한 것입니다. 이런 문제는 실제 개발 현장에서 자주 발생합니다.
고객 응대 메시지를 자동 생성하거나, 상품 설명을 작성하거나, 코드 자동 완성을 구현할 때 "자연스러운 다음 단어"를 예측하는 능력이 필요합니다. 기존 방식으로는 템플릿을 일일이 만들어야 했고, 결과가 기계적이고 어색했습니다.
바로 이럴 때 필요한 것이 GPT 모델입니다. GPT는 이전 단어들을 보고 다음에 올 가장 적절한 단어를 예측하면서 자연스러운 텍스트를 생성합니다.
ChatGPT가 바로 이 원리로 작동합니다.
개요
간단히 말해서, GPT(Generative Pre-trained Transformer)는 주어진 텍스트를 읽고 그 다음에 올 단어를 예측하는 방식으로 학습된 텍스트 생성 모델입니다. 마치 자동완성 기능이 엄청나게 똑똑해진 것과 같습니다.
왜 이 개념이 필요한지 실무 관점에서 설명하자면, 사람처럼 자연스러운 텍스트를 생성하는 능력이 비즈니스에 큰 가치를 제공하기 때문입니다. 예를 들어, 고객 문의에 자동 응답하는 챗봇, 상품 리뷰 요약, 코드 주석 자동 생성, 이메일 자동 작성 등 수많은 작업을 자동화할 수 있습니다.
한 명의 개발자가 GPT를 활용하면 10명의 작업량을 처리할 수 있습니다. 기존에는 규칙 기반으로 템플릿을 만들어서 텍스트를 생성했다면, 이제는 문맥을 이해하고 창의적인 텍스트를 생성할 수 있습니다.
"고객님께 사과 메일 작성"이라고만 입력해도 상황에 맞는 정중한 사과 메일을 작성해줍니다. GPT의 핵심 특징은 첫째, 왼쪽에서 오른쪽으로 순차적으로 읽으며 다음 단어를 예측하는 자기회귀(autoregressive) 방식을 사용한다는 점, 둘째, 프롬프트만 잘 작성하면 추가 학습 없이도 다양한 작업을 수행할 수 있다는 점(제로샷 학습), 셋째, 모델 크기가 클수록 창발적 능력이 나타난다는 점입니다.
이러한 특징들이 GPT-3, ChatGPT, GPT-4로 이어지며 AI 산업 전체를 변화시켰습니다.
코드 예제
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch
# GPT-2 모델과 토크나이저 불러오기
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')
# 시작 문장 설정
prompt = "The future of artificial intelligence is"
inputs = tokenizer(prompt, return_tensors="pt")
# 텍스트 생성 - 다음 단어를 예측하며 이어갑니다
outputs = model.generate(
inputs.input_ids,
max_length=50, # 최대 50개 토큰까지 생성
num_return_sequences=1, # 1개의 결과 생성
temperature=0.7, # 창의성 조절 (높을수록 다양함)
top_p=0.9, # 상위 90% 확률의 단어들만 고려
do_sample=True # 랜덤 샘플링 활성화
)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)
설명
이것이 하는 일: GPT는 시작 문장(프롬프트)을 받아서 단어를 하나씩 예측하고 추가하면서 완전한 텍스트를 생성합니다. 마치 작가가 글을 쓰듯이 문맥을 고려하여 자연스러운 문장을 만들어냅니다.
첫 번째로, GPT2LMHeadModel을 불러옵니다. "LMHead"는 Language Model Head의 약자로, 다음 단어를 예측하는 레이어가 포함되어 있다는 의미입니다.
GPT-2는 OpenAI가 공개한 모델로, 15억 개의 파라미터를 가지고 있으며 다양한 주제의 텍스트를 생성할 수 있습니다. 상업적으로 사용 가능한 오픈소스 모델입니다.
그 다음으로, 프롬프트를 설정합니다. "The future of artificial intelligence is"라는 시작 문장을 주면, 모델은 이 문장의 패턴을 분석하여 다음에 올 적절한 단어들을 예측합니다.
temperature=0.7은 생성의 무작위성을 조절하는 매개변수입니다. 0에 가까우면 가장 확률 높은 단어만 선택해서 안전하지만 지루한 텍스트가 나오고, 1에 가까우면 다양하지만 때로 이상한 텍스트가 나올 수 있습니다.
마지막으로, model.generate()가 실제 텍스트를 생성합니다. top_p=0.9는 누적 확률이 90%가 될 때까지의 단어들 중에서만 선택하라는 의미입니다.
이렇게 하면 너무 희귀한 단어는 제외되어 더 자연스러운 결과가 나옵니다. max_length=50은 총 50개 토큰(약 30-40단어)까지만 생성하라는 제한입니다.
제한을 두지 않으면 모델이 계속 생성할 수 있습니다. 여러분이 이 코드를 사용하면 블로그 글 초안을 자동으로 작성할 수 있고, 고객 응대 메시지를 상황에 맞게 생성할 수 있으며, 코드 주석이나 문서를 자동으로 작성할 수 있습니다.
프롬프트만 바꾸면 무궁무진한 응용이 가능합니다.
실전 팁
💡 temperature 값을 조절하여 생성 스타일을 제어하세요. 사실 기반 텍스트는 0.3-0.5, 창의적인 글쓰기는 0.7-0.9가 적당합니다.
💡 GPT-2는 영어에 최적화되어 있습니다. 한국어 생성에는 "skt/kogpt2-base-v2"나 "kakaobrain/kogpt" 같은 한국어 GPT 모델을 사용하세요.
💡 생성된 텍스트가 반복되거나 이상하면 repetition_penalty=1.2를 추가하여 같은 단어 반복을 억제하세요.
💡 실제 서비스에서는 생성된 텍스트를 검증하는 로직이 필요합니다. GPT는 때때로 사실이 아닌 내용을 생성할 수 있습니다(환각, hallucination).
💡 GPT-2는 최대 1024 토큰까지 처리 가능합니다. 더 긴 컨텍스트가 필요하면 GPT-Neo, GPT-J, 또는 유료 API인 GPT-4를 고려하세요.
4. 토크나이저
시작하며
여러분이 "I'm loving it!"이라는 문장을 컴퓨터에게 이해시키려면 어떻게 해야 할까요? 컴퓨터는 글자를 읽을 수 없고 오직 숫자만 처리할 수 있습니다.
마치 외국어를 번역기로 변환하듯이, 텍스트를 숫자로 바꿔주는 중간 단계가 필요합니다. 이런 문제는 실제 개발 현장에서 자주 발생합니다.
AI 모델은 텍스트를 직접 받을 수 없기 때문에, 모든 자연어 처리 작업의 첫 단계는 항상 텍스트를 숫자로 변환하는 것입니다. 이 과정에서 실수하면 모델이 제대로 작동하지 않습니다.
바로 이럴 때 필요한 것이 토크나이저입니다. 토크나이저는 텍스트를 작은 조각(토큰)으로 나누고, 각 조각을 고유한 숫자로 변환하여 AI 모델이 이해할 수 있게 만듭니다.
개요
간단히 말해서, 토크나이저는 텍스트를 AI 모델이 이해할 수 있는 숫자 형태로 변환해주는 번역기입니다. "사과를 먹었다"를 [1234, 5678, 9012]처럼 숫자 배열로 바꿔줍니다.
왜 이 개념이 필요한지 실무 관점에서 설명하자면, 모든 자연어 처리의 시작점이 바로 토크나이제이션이기 때문입니다. 예를 들어, 챗봇을 만들 때 사용자 입력을 받으면 가장 먼저 토크나이저로 변환하고, 모델의 출력을 받으면 다시 토크나이저로 텍스트로 되돌립니다.
토크나이저 없이는 어떤 NLP 작업도 불가능합니다. 기존에는 단순히 공백으로 단어를 나눴다면(띄어쓰기 기반), 이제는 WordPiece, BPE(Byte Pair Encoding) 같은 서브워드 방식을 사용하여 미등록 단어 문제를 해결합니다.
"unhappiness"를 ["un", "happiness"]로 나누면, "unhappiness"를 본 적 없는 모델도 "un"과 "happiness"는 알고 있어서 의미를 추론할 수 있습니다. 토크나이저의 핵심 특징은 첫째, 모델마다 전용 토크나이저가 있어서 꼭 같은 것을 사용해야 한다는 점, 둘째, 어휘 사전(vocabulary)에 있는 단어만 인식하고 없는 단어는 [UNK]로 처리한다는 점, 셋째, 특수 토큰([CLS], [SEP] 등)을 추가하여 문장 구조를 표시한다는 점입니다.
이러한 특징들을 이해해야 모델이 왜 특정 입력을 제대로 처리하지 못하는지 디버깅할 수 있습니다.
코드 예제
from transformers import AutoTokenizer
# BERT 토크나이저 불러오기
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
# 텍스트를 토큰으로 변환
text = "I'm loving McDonald's!"
tokens = tokenizer.tokenize(text)
print(f"토큰: {tokens}")
# 출력: ['i', "'", 'm', 'loving', 'mcdonald', "'", 's', '!']
# 토큰을 숫자(ID)로 변환
token_ids = tokenizer.encode(text, add_special_tokens=True)
print(f"토큰 ID: {token_ids}")
# 출력: [101, 1045, 1005, 1049, 7377, 6862, 1005, 1055, 999, 102]
# 101 = [CLS] (문장 시작), 102 = [SEP] (문장 끝)
# 숫자를 다시 텍스트로 변환
decoded = tokenizer.decode(token_ids)
print(f"디코딩: {decoded}")
설명
이것이 하는 일: 토크나이저는 세 가지 핵심 작업을 수행합니다. 텍스트를 토큰으로 나누고(tokenize), 각 토큰을 고유한 숫자로 변환하며(encode), 숫자를 다시 읽을 수 있는 텍스트로 복원합니다(decode).
첫 번째로, tokenize() 메서드가 텍스트를 작은 조각으로 나눕니다. "I'm"은 ["i", "'", "m"]으로 분리되고, "McDonald's"는 ["mcdonald", "'", "s"]로 분리됩니다.
BERT의 uncased 토크나이저는 모든 글자를 소문자로 변환하기 때문에 "McDonald's"가 "mcdonald"가 됩니다. 이것은 대소문자를 구분하지 않아야 할 때 유용합니다.
그 다음으로, encode() 메서드가 각 토큰을 숫자로 변환합니다. BERT 토크나이저의 어휘 사전에는 약 30,000개의 토큰이 있고, 각각 고유한 ID가 할당되어 있습니다.
"i"는 1045번, "loving"은 7377번입니다. add_special_tokens=True를 설정하면 문장 앞에 CLS, 뒤에 SEP이 자동으로 추가됩니다.
이 특수 토큰들은 BERT가 문장의 시작과 끝을 인식하는 데 사용됩니다. 마지막으로, decode() 메서드가 숫자 배열을 다시 읽을 수 있는 텍스트로 변환합니다.
모델이 생성한 결과를 사용자에게 보여줄 때 이 과정이 필요합니다. skip_special_tokens=True 옵션을 주면 [CLS]와 [SEP] 같은 특수 토큰을 제거하고 깔끔한 텍스트만 반환합니다.
여러분이 이 코드를 사용하면 모델에 입력하기 전에 데이터가 어떻게 변환되는지 정확히 확인할 수 있고, 디버깅할 때 토큰화 과정에서 문제가 없는지 검증할 수 있으며, 커스텀 어휘를 추가하거나 특수한 토큰화 규칙을 적용할 수 있습니다.
실전 팁
💡 항상 모델과 같은 토크나이저를 사용해야 합니다. bert-base-uncased 모델에는 bert-base-uncased 토크나이저를, gpt2 모델에는 gpt2 토크나이저를 써야 합니다.
💡 최대 길이를 초과하는 텍스트는 truncation=True로 자동으로 잘라낼 수 있습니다. max_length=512로 설정하면 512 토큰을 넘는 부분은 제거됩니다.
💡 여러 문장을 배치로 처리할 때는 padding=True를 사용하여 길이를 맞춰주세요. 짧은 문장에는 [PAD] 토큰이 추가됩니다.
💡 return_tensors="pt"는 PyTorch 텐서로, "tf"는 TensorFlow 텐서로 반환합니다. 사용하는 프레임워크에 맞게 선택하세요.
💡 한국어는 띄어쓰기 규칙이 복잡하므로 형태소 분석 기반 토크나이저(KoBERT, KoGPT)를 사용하는 것이 좋습니다. 일반 BERT 토크나이저로는 한국어를 제대로 처리할 수 없습니다.
5. 파인튜닝
시작하며
여러분이 의료 분야의 문서를 분류하는 AI를 만들려고 할 때, 일반적인 사전학습 모델은 의학 용어를 제대로 이해하지 못합니다. "당뇨병성 신증"이나 "심근경색" 같은 전문 용어는 일반 텍스트에 거의 나오지 않기 때문입니다.
이런 문제는 실제 개발 현장에서 자주 발생합니다. 법률, 금융, 의료, 제조 등 특정 도메인의 데이터는 일반 데이터와 패턴이 달라서, 범용 모델로는 만족스러운 성능을 얻기 어렵습니다.
직접 학습하자니 데이터와 시간이 부족합니다. 바로 이럴 때 필요한 것이 파인튜닝입니다.
이미 언어의 일반적인 패턴을 배운 모델을 가져와서, 내 도메인의 소량 데이터로 추가 학습시키면 전문가 수준의 성능을 낼 수 있습니다.
개요
간단히 말해서, 파인튜닝은 사전학습된 모델을 내 특정 작업에 맞게 미세 조정하는 과정입니다. 마치 대학을 졸업한 신입 사원을 우리 회사의 업무에 맞게 교육하는 것과 같습니다.
왜 이 개념이 필요한지 실무 관점에서 설명하자면, 적은 데이터와 시간으로도 최고 수준의 성능을 얻을 수 있기 때문입니다. 예를 들어, 처음부터 학습하려면 100만 개의 데이터가 필요한 작업도 파인튜닝으로는 1,000개의 데이터만으로도 충분한 경우가 많습니다.
스타트업이나 중소기업도 대기업과 비슷한 수준의 AI를 만들 수 있게 해주는 비결입니다. 기존에는 모든 파라미터를 처음부터 학습해야 했다면, 이제는 사전학습된 가중치를 유지하면서 상위 레이어만 조정하거나, 전체를 작은 학습률로 미세 조정합니다.
"transfer learning"이라고도 불리는 이 방법은 컴퓨터 비전에서 먼저 유행했고, 이제는 NLP의 표준이 되었습니다. 파인튜닝의 핵심 특징은 첫째, 학습률을 매우 낮게 설정하여(1e-5 ~ 5e-5) 기존 지식을 망가뜨리지 않으면서 조정한다는 점, 둘째, 적은 에폭(3-5 에폭)만 학습해도 충분하다는 점, 셋째, 작은 배치 크기로도 잘 작동한다는 점입니다.
이러한 특징들이 일반 개발자도 GPU 한두 개로 최신 모델을 만들 수 있게 해줍니다.
코드 예제
from transformers import BertForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset
# 사전학습된 BERT에 분류 헤드 추가
model = BertForSequenceClassification.from_pretrained(
'bert-base-uncased',
num_labels=2 # 예: 스팸/정상 분류
)
# 데이터셋 준비 (예: IMDB 영화 리뷰)
dataset = load_dataset('imdb')
# 파인튜닝 설정 - 학습률이 매우 낮습니다
training_args = TrainingArguments(
output_dir='./results',
learning_rate=2e-5, # 매우 낮은 학습률로 조심스럽게 조정
per_device_train_batch_size=8,
num_train_epochs=3, # 3 에폭만 학습
weight_decay=0.01, # 과적합 방지
evaluation_strategy="epoch"
)
# Trainer로 간편하게 파인튜닝
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset['train'],
eval_dataset=dataset['test']
)
# 파인튜닝 실행
trainer.train()
설명
이것이 하는 일: 파인튜닝은 일반적인 언어 지식을 가진 모델에게 특정 도메인의 전문 지식을 가르치는 과정입니다. 기존 가중치를 유지하면서 새로운 데이터에 맞게 조금씩 조정합니다.
첫 번째로, BertForSequenceClassification을 불러올 때 사전학습된 가중치가 자동으로 로드됩니다. 그리고 num_labels=2를 설정하면 출력 레이어가 2개 클래스 분류에 맞게 초기화됩니다.
이때 기존 BERT 레이어들은 모두 유지되고, 맨 위의 분류 레이어만 랜덤으로 초기화됩니다. 이것이 "헤드를 붙인다"라고 표현하는 이유입니다.
그 다음으로, TrainingArguments에서 학습률을 2e-5(0.00002)로 매우 낮게 설정합니다. 일반적인 학습은 1e-3(0.001) 정도를 사용하는데, 파인튜닝은 50배나 낮은 학습률을 사용합니다.
왜냐하면 이미 좋은 가중치가 있는데 너무 크게 바꾸면 기존 지식이 망가지기 때문입니다. 조심스럽게 조금씩 움직이는 것이 핵심입니다.
마지막으로, Trainer 클래스가 복잡한 학습 루프를 자동으로 처리해줍니다. 여러분이 직접 작성하면 100줄 이상 필요한 코드를 Trainer가 대신 해줍니다.
그래디언트 계산, 역전파, 가중치 업데이트, 검증, 체크포인트 저장 등이 모두 자동입니다. trainer.train()을 호출하면 학습이 시작되고, 각 에폭마다 훈련 손실과 검증 정확도가 출력됩니다.
여러분이 이 코드를 사용하면 내 도메인 데이터로 맞춤형 모델을 만들 수 있고, 범용 모델보다 10-30% 높은 정확도를 얻을 수 있으며, Google Colab 무료 GPU로도 몇 시간 안에 파인튜닝을 완료할 수 있습니다.
실전 팁
💡 GPU 메모리가 부족하면 per_device_train_batch_size를 4나 2로 줄이고, gradient_accumulation_steps=4를 추가하여 효과적인 배치 크기를 유지하세요.
💡 과적합을 방지하려면 early stopping을 사용하세요. load_best_model_at_end=True로 설정하면 검증 성능이 가장 좋았던 모델을 저장합니다.
💡 데이터가 1,000개 미만이면 파인튜닝보다 Few-shot Learning이나 Prompt Engineering을 고려하세요. 너무 적은 데이터로 파인튜닝하면 과적합됩니다.
💡 학습 중간에 trainer.evaluate()로 검증 성능을 확인하세요. 훈련 손실은 계속 줄어드는데 검증 정확도가 떨어지면 과적합입니다.
💡 파인튜닝한 모델은 model.save_pretrained('./my-model')로 저장하고 나중에 BertForSequenceClassification.from_pretrained('./my-model')로 불러올 수 있습니다.
6. 감정_분석_실전
시작하며
여러분이 쇼핑몰을 운영하면서 매일 수백 개의 상품 리뷰가 달린다고 상상해보세요. "배송은 빨랐는데 품질이 별로예요"처럼 복잡한 리뷰도 많습니다.
이것을 일일이 읽고 긍정인지 부정인지 분류하는 것은 너무 많은 시간이 걸립니다. 이런 문제는 실제 개발 현장에서 자주 발생합니다.
고객 피드백 분석, 소셜 미디어 모니터링, 브랜드 평판 관리 등에서 감정 분석은 필수적입니다. 수작업으로는 불가능하고, 간단한 키워드 매칭으로는 정확도가 낮습니다.
바로 이럴 때 필요한 것이 BERT 기반 감정 분석입니다. 문맥을 이해하는 BERT를 사용하면 "별로"라는 부정어와 "빨랐다"는 긍정어가 섞인 문장도 정확히 분석할 수 있습니다.
개요
간단히 말해서, 감정 분석은 텍스트에 담긴 감정이 긍정인지 부정인지(또는 중립인지) 자동으로 판단하는 작업입니다. BERT 같은 사전학습 모델을 사용하면 높은 정확도로 실시간 분석이 가능합니다.
왜 이 개념이 필요한지 실무 관점에서 설명하자면, 비즈니스 의사결정에 직접적으로 활용할 수 있기 때문입니다. 예를 들어, 신제품 출시 후 소셜 미디어 반응을 실시간으로 분석하여 마케팅 전략을 조정하거나, 고객 불만이 급증하는 이슈를 조기에 발견하여 대응할 수 있습니다.
삼성, LG 같은 대기업들도 소셜 리스닝에 감정 분석을 필수적으로 사용합니다. 기존에는 "좋다", "나쁘다" 같은 키워드를 세었다면, 이제는 "비싸지만 그만한 가치가 있어요"처럼 복잡한 문장도 정확히 이해합니다.
"배송은 빨랐는데 품질이 별로예요"를 분석하면 전체적으로 부정적이라고 판단할 수 있습니다. 감정 분석의 핵심 특징은 첫째, 단순히 긍정/부정뿐 아니라 감정의 강도까지 측정할 수 있다는 점(0.8 긍정 vs 0.95 긍정), 둘째, 다국어 모델을 사용하면 한국어, 영어, 중국어 등 여러 언어를 동시에 처리할 수 있다는 점, 셋째, 도메인에 맞게 파인튜닝하면 일반 모델보다 20-30% 높은 정확도를 얻을 수 있다는 점입니다.
이러한 특징들이 감정 분석을 실용적인 비즈니스 도구로 만들어줍니다.
코드 예제
from transformers import pipeline
# 사전학습된 감정 분석 파이프라인 (파인튜닝 완료된 모델)
classifier = pipeline(
"sentiment-analysis",
model="nlptown/bert-base-multilingual-uncased-sentiment"
)
# 여러 리뷰를 배치로 분석
reviews = [
"이 제품 정말 마음에 들어요! 강력 추천합니다.",
"가격 대비 품질이 별로네요. 실망했어요.",
"배송은 빨랐는데 제품 상태가 안 좋았습니다.",
"그냥 그래요. 나쁘지도 좋지도 않아요."
]
# 실시간 감정 분석
results = classifier(reviews)
for review, result in zip(reviews, results):
stars = result['label'] # 1-5 별점
confidence = result['score'] # 확신도
print(f"리뷰: {review}")
print(f"평가: {stars} (확신도: {confidence:.2%})\n")
설명
이것이 하는 일: 감정 분석 파이프라인은 텍스트를 입력받아서 토크나이징, 모델 추론, 결과 해석까지 전체 과정을 자동으로 처리하여 감정 레이블과 확신도를 반환합니다. 첫 번째로, pipeline() 함수로 감정 분석기를 생성합니다.
"sentiment-analysis"는 작업 타입을 지정하는 것이고, model 파라미터로 특정 모델을 선택할 수 있습니다. 여기서 사용한 "nlptown/bert-base-multilingual-uncased-sentiment"는 103개 언어를 지원하는 다국어 모델로, 한국어, 영어, 중국어 리뷰를 모두 처리할 수 있습니다.
이미 수백만 개의 리뷰로 파인튜닝되어 있어서 즉시 사용 가능합니다. 그 다음으로, 여러 개의 리뷰를 리스트로 만들어서 한 번에 처리합니다.
"배송은 빨랐는데 제품 상태가 안 좋았습니다"처럼 긍정과 부정이 섞인 문장을 보세요. BERT는 "빨랐는데"와 "안 좋았습니다"를 모두 고려하여 전체 문맥을 판단합니다.
"~는데" 같은 연결어가 나오면 뒤의 내용에 더 비중을 두는 경향이 있습니다. 마지막으로, 결과는 딕셔너리 형태로 반환됩니다.
'label'은 1 star부터 5 stars까지의 별점이고, 'score'는 그 예측의 확신도입니다. 확신도가 0.95 이상이면 매우 확실한 판단이고, 0.6 이하면 애매한 경우입니다.
확신도가 낮은 리뷰는 사람이 직접 확인하는 하이브리드 시스템을 구축할 수 있습니다. 여러분이 이 코드를 사용하면 하루에 수천 개의 리뷰를 자동으로 분석할 수 있고, 부정 리뷰를 자동으로 필터링하여 고객 서비스팀에 전달할 수 있으며, 제품별 평균 감정 점수를 계산하여 대시보드를 만들 수 있습니다.
실전 팁
💡 한국어 전용 모델이 필요하면 "beomi/kcbert-base"를 파인튜닝하거나, "matthewburke/korean_sentiment" 같은 한국어 감정 분석 모델을 사용하세요.
💡 배치 처리를 활용하세요. 한 번에 여러 텍스트를 넣으면 GPU를 효율적으로 사용하여 10배 이상 빠릅니다.
💡 확신도가 낮은 경우(0.6 이하)는 "중립"으로 분류하거나 사람이 재검토하도록 하세요. 무리하게 긍정/부정으로 분류하면 오류율이 높아집니다.
💡 도메인이 특수한 경우(의료, 금융) 일반 모델은 정확도가 낮을 수 있습니다. 내 도메인 데이터로 파인튜닝하면 20-30% 성능 향상을 기대할 수 있습니다.
💡 실시간 서비스에서는 모델을 메모리에 미리 로드해두고 재사용하세요. 매번 로드하면 시작 시간이 3-5초 걸립니다.
7. 텍스트_생성_실전
시작하며
여러분이 고객 문의 답변을 작성할 때, 비슷한 내용을 반복적으로 타이핑하느라 시간을 낭비한 경험이 있나요? "배송 언제 되나요?"라는 질문에 대한 답변을 하루에 50번씩 작성하는 것은 비효율적입니다.
이런 문제는 실제 개발 현장에서 자주 발생합니다. 고객 서비스, 이메일 작성, 상품 설명 생성, 보고서 초안 작성 등 반복적인 글쓰기 작업이 많은데, 이것을 자동화하면 생산성을 크게 높일 수 있습니다.
바로 이럴 때 필요한 것이 GPT 기반 텍스트 생성입니다. 간단한 프롬프트만 제공하면 자연스러운 문장을 자동으로 생성하여 업무 시간을 90% 줄일 수 있습니다.
개요
간단히 말해서, 텍스트 생성은 AI가 주어진 프롬프트를 읽고 그 다음에 이어질 자연스러운 문장을 자동으로 작성하는 작업입니다. 마치 AI 비서가 글을 대신 써주는 것과 같습니다.
왜 이 개념이 필요한지 실무 관점에서 설명하자면, 콘텐츠 생산 비용과 시간을 획기적으로 줄일 수 있기 때문입니다. 예를 들어, 쇼핑몰에서 신제품 100개의 상세 설명을 작성해야 한다면 사람이 하면 며칠 걸리지만, GPT를 사용하면 1시간 안에 초안을 완성할 수 있습니다.
물론 사람이 검토하고 다듬어야 하지만, 초안 작성 시간을 90% 절약할 수 있습니다. 기존에는 템플릿에 변수만 채워 넣는 방식이어서 모든 문장이 똑같아 보였다면, 이제는 문맥을 이해하고 다양한 표현으로 자연스러운 텍스트를 생성합니다.
"배송 문의에 대한 답변 작성"이라고만 입력해도 정중하고 친절한 고객 응대 메일을 작성해줍니다. 텍스트 생성의 핵심 특징은 첫째, 프롬프트 엔지니어링으로 원하는 스타일과 톤을 조절할 수 있다는 점(공식적, 친근한, 전문적 등), 둘째, Few-shot learning으로 예시만 몇 개 보여주면 패턴을 학습한다는 점, 셋째, 창의성과 일관성을 파라미터로 조절할 수 있다는 점입니다.
이러한 특징들이 텍스트 생성을 실용적인 생산성 도구로 만들어줍니다.
코드 예제
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
# 한국어 GPT 모델 불러오기
model_name = "skt/kogpt2-base-v2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 프롬프트: 고객 문의에 대한 답변 생성
prompt = """고객님께서 배송 관련 문의를 주셨습니다.
고객 질문: 주문한 상품이 언제 도착하나요?
답변:"""
inputs = tokenizer(prompt, return_tensors="pt")
# 텍스트 생성 - 파라미터로 품질 조절
outputs = model.generate(
inputs.input_ids,
max_length=150,
num_beams=5, # Beam search로 더 좋은 결과 탐색
no_repeat_ngram_size=2, # 같은 구절 반복 방지
temperature=0.8, # 적당한 창의성
top_p=0.9,
early_stopping=True
)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)
설명
이것이 하는 일: 텍스트 생성 모델은 주어진 프롬프트의 문맥을 이해하고, 다음에 올 가장 적절한 단어들을 순차적으로 예측하면서 완성된 문장을 만들어냅니다. 첫 번째로, AutoModelForCausalLM을 사용하여 인과적 언어 모델(Causal Language Model)을 불러옵니다.
"Causal"은 왼쪽에서 오른쪽으로 순차적으로 읽으며 다음 단어를 예측한다는 의미입니다. "skt/kogpt2-base-v2"는 SK텔레콤이 만든 한국어 GPT-2 모델로, 한국어 텍스트 생성에 최적화되어 있습니다.
영어 GPT로는 자연스러운 한국어를 생성할 수 없으므로 한국어 모델이 필수입니다. 그 다음으로, 프롬프트를 신중하게 작성합니다.
여기서는 상황 설명("고객님께서 배송 관련 문의를 주셨습니다")과 구체적인 질문, 그리고 "답변:"이라는 명확한 시작점을 제공했습니다. 프롬프트가 구체적일수록 원하는 형태의 답변을 얻을 가능성이 높아집니다.
이것을 "프롬프트 엔지니어링"이라고 합니다. 마지막으로, generate() 메서드가 실제 텍스트를 생성합니다.
num_beams=5는 Beam Search라는 기법으로, 5개의 후보 경로를 동시에 탐색하여 가장 좋은 결과를 선택합니다. 이렇게 하면 단순히 가장 확률 높은 단어를 선택하는 것보다 전체적으로 더 자연스러운 문장이 나옵니다.
no_repeat_ngram_size=2는 같은 2단어 구절이 반복되는 것을 방지하여 "배송 배송", "확인 확인" 같은 어색한 반복을 막습니다. 여러분이 이 코드를 사용하면 고객 응대 메시지를 자동으로 초안할 수 있고, 블로그 글이나 상품 설명의 첫 문단을 빠르게 작성할 수 있으며, 다양한 변형을 생성하여 A/B 테스트용 문구를 만들 수 있습니다.
실전 팁
💡 temperature를 낮추면(0.3-0.5) 안전하고 예측 가능한 텍스트가, 높이면(0.8-1.2) 창의적이지만 때로 이상한 텍스트가 나옵니다. 업무용은 0.7 이하를 권장합니다.
💡 생성된 텍스트는 반드시 사람이 검토해야 합니다. 사실이 아닌 내용(환각)이 포함될 수 있으므로, 특히 의료·법률·금융 분야에서는 주의하세요.
💡 Few-shot learning을 활용하세요. 프롬프트에 좋은 예시를 2-3개 포함하면 모델이 패턴을 학습하여 비슷한 스타일로 생성합니다.
💡 max_length를 너무 크게 설정하면 의미 없는 내용으로 길게 늘어날 수 있습니다. 필요한 만큼만 생성하고 early_stopping=True로 자연스러운 끝맺음을 유도하세요.
💡 상용 서비스에는 OpenAI GPT-4 API나 Claude API 사용을 고려하세요. 오픈소스 모델보다 품질이 훨씬 좋고, 콘텐츠 필터링 기능도 있어서 안전합니다.
8. 임베딩_활용
시작하며
여러분이 검색 엔진을 만든다고 상상해보세요. 사용자가 "파이썬으로 데이터 분석하는 법"이라고 검색하면, "Python data analysis tutorial"이라는 제목의 영어 문서도 찾아줘야 합니다.
단순히 단어가 일치하는지 확인하는 방식으로는 불가능합니다. 이런 문제는 실제 개발 현장에서 자주 발생합니다.
의미 기반 검색, 문서 분류, 추천 시스템, 중복 감지 등에서 "의미적으로 비슷한지"를 판단해야 하는데, 단어 매칭만으로는 한계가 있습니다. 바로 이럴 때 필요한 것이 임베딩입니다.
임베딩은 단어나 문장을 고차원 벡터(숫자 배열)로 변환하여, 의미가 비슷한 것끼리 가까운 위치에 배치합니다. "파이썬"과 "Python"은 다른 단어지만 벡터 공간에서는 매우 가깝습니다.
개요
간단히 말해서, 임베딩은 텍스트를 숫자 벡터로 변환하는 과정으로, 의미가 비슷한 텍스트는 비슷한 벡터값을 갖게 됩니다. 마치 지도 위에 비슷한 것들을 가까운 곳에 배치하는 것과 같습니다.
왜 이 개념이 필요한지 실무 관점에서 설명하자면, 의미 기반 검색과 추천 시스템의 핵심 기술이기 때문입니다. 예를 들어, 넷플릭스가 "좋아할 만한 영화"를 추천하거나, 구글이 검색 결과를 정확하게 찾아주는 것은 모두 임베딩 덕분입니다.
전자상거래에서 "비슷한 상품 추천" 기능도 상품 설명을 임베딩으로 변환하여 유사도를 계산합니다. 기존에는 단어 빈도(TF-IDF)나 원-핫 인코딩을 사용했다면, 이제는 BERT나 Sentence-BERT 같은 모델이 문맥을 고려한 밀집 벡터(dense vector)를 생성합니다.
"사과를 먹었다"의 "사과"와 "사과를 보냈다"의 "사과"는 같은 단어지만 다른 벡터값을 가집니다(과일 vs 사죄). 임베딩의 핵심 특징은 첫째, 코사인 유사도로 두 텍스트의 의미적 유사성을 측정할 수 있다는 점, 둘째, 다국어 임베딩 모델을 사용하면 언어가 달라도 의미가 같으면 비슷한 벡터가 나온다는 점, 셋째, 벡터 데이터베이스(FAISS, Pinecone)와 결합하면 수백만 문서에서 밀리초 내에 검색할 수 있다는 점입니다.
이러한 특징들이 현대적인 검색 시스템의 기반이 됩니다.
코드 예제
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# 문장 임베딩 모델 불러오기 (다국어 지원)
model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')
# 여러 문장을 벡터로 변환
sentences = [
"파이썬으로 데이터 분석하는 방법",
"Python data analysis tutorial",
"자바스크립트 웹 개발 가이드",
"데이터 과학을 위한 파이썬",
]
# 모든 문장을 384차원 벡터로 변환
embeddings = model.encode(sentences)
print(f"임베딩 차원: {embeddings.shape}") # (4, 384)
# 첫 번째 문장과 나머지 문장들 간의 유사도 계산
query_embedding = embeddings[0:1]
similarities = cosine_similarity(query_embedding, embeddings)[0]
# 유사도 순으로 정렬
for idx, score in enumerate(similarities):
print(f"{sentences[idx]}: {score:.3f}")
설명
이것이 하는 일: 임베딩 모델은 텍스트를 고차원 벡터 공간에 배치하여, 의미가 비슷한 텍스트는 가까운 위치에, 다른 텍스트는 먼 위치에 놓이도록 합니다. 첫 번째로, SentenceTransformer를 사용하여 문장 임베딩 모델을 불러옵니다.
"paraphrase-multilingual-MiniLM-L12-v2"는 50개 이상의 언어를 지원하는 경량 모델로, 한국어와 영어 문장을 같은 벡터 공간에 배치할 수 있습니다. 384차원 벡터를 생성하는데, 이것은 768차원의 BERT보다 작아서 빠르고 메모리 효율적입니다.
그 다음으로, encode() 메서드로 모든 문장을 한 번에 벡터로 변환합니다. "파이썬으로 데이터 분석하는 방법"은 [0.123, -0.456, 0.789, ...] 같은 384개의 숫자 배열이 됩니다.
각 숫자는 특정한 의미 차원을 나타냅니다. 예를 들어, 어떤 차원은 "프로그래밍"과 관련이 있고, 다른 차원은 "데이터"와 관련이 있을 수 있습니다.
마지막으로, 코사인 유사도(cosine similarity)를 계산합니다. 이것은 두 벡터가 얼마나 같은 방향을 가리키는지 측정하는 것으로, -1에서 1 사이의 값이 나옵니다.
1에 가까우면 매우 유사하고, 0에 가까우면 관련 없고, -1에 가까우면 반대 의미입니다. 이 예제에서는 "파이썬으로 데이터 분석하는 방법"과 "Python data analysis tutorial"이 언어는 다르지만 높은 유사도(0.85 이상)를 보일 것입니다.
여러분이 이 코드를 사용하면 의미 기반 검색 엔진을 구축할 수 있고, 고객 문의를 자동으로 유사한 이전 문의와 매칭할 수 있으며, 중복 문서나 표절을 감지할 수 있고, 사용자의 읽은 글과 비슷한 콘텐츠를 추천할 수 있습니다.
실전 팁
💡 벡터 검색 속도를 높이려면 FAISS나 Annoy 같은 근사 최근접 이웃(ANN) 라이브러리를 사용하세요. 백만 개 문서에서도 밀리초 내에 검색 가능합니다.
💡 임베딩은 한 번 계산하면 재사용할 수 있습니다. 데이터베이스에 저장해두고 필요할 때 불러와서 유사도만 계산하면 됩니다.
💡 한국어 전용 모델이 필요하면 "jhgan/ko-sbert-nli"나 "sentence-transformers/xlm-r-100langs-bert-base-nli-stsb-mean-tokens"를 시도해보세요.
💡 긴 문서는 청크로 나누어 각각 임베딩하고 평균을 구하거나, 가장 관련 높은 청크를 선택하는 방식을 사용하세요. 512 토큰 제한을 넘으면 잘립니다.
💡 임베딩 모델도 파인튜닝할 수 있습니다. 도메인 특화 검색 시스템을 만들 때는 내 데이터로 파인튜닝하면 검색 정확도가 크게 향상됩니다.
댓글 (0)
함께 보면 좋은 카드 뉴스
범주형 변수 시각화 완벽 가이드 Bar Chart와 Count Plot
데이터 분석에서 가장 기본이 되는 범주형 변수 시각화 방법을 알아봅니다. Matplotlib의 Bar Chart부터 Seaborn의 Count Plot까지, 실무에서 바로 활용할 수 있는 시각화 기법을 배워봅니다.
이변량 분석 완벽 가이드: 변수 간 관계 탐색
두 변수 사이의 관계를 분석하는 이변량 분석의 핵심 개념과 기법을 배웁니다. 상관관계, 산점도, 교차분석 등 데이터 분석의 필수 도구들을 실습과 함께 익혀봅시다.
단변량 분석 분포 시각화 완벽 가이드
데이터 분석의 첫걸음인 단변량 분석과 분포 시각화를 배웁니다. 히스토그램, 박스플롯, 밀도 그래프 등 다양한 시각화 방법을 초보자도 쉽게 이해할 수 있도록 설명합니다.
데이터 타입 변환 및 정규화 완벽 가이드
데이터 분석과 머신러닝에서 가장 기초가 되는 데이터 타입 변환과 정규화 기법을 배워봅니다. 실무에서 자주 마주치는 데이터 전처리 문제를 Python으로 쉽게 해결하는 방법을 알려드립니다.
이상치 탐지 및 처리 완벽 가이드
데이터 속에 숨어있는 이상한 값들을 찾아내고 처리하는 방법을 배워봅니다. 실무에서 자주 마주치는 이상치 문제를 Python으로 해결하는 다양한 기법을 소개합니다.