이 지도 학습 기반 LLM 미세 조정 가이드에서는 다음을 배울 수 있습니다:
- LLM 맥락에서 감독형 미세 조정이란 무엇인가
- 이 작업의 목표는 무엇인가
- 이를 구현하는 데 필요한 리소스
- 지도형 LLM 미세 조정의 워크플로
- SFT 구현 시 기술적 과제 및 고려사항
- LLM에서 감독형 미세 조정을 재현하기 위한 단계별 튜토리얼
자, 시작해 보겠습니다!
LLM 맥락에서 감독형 미세 조정(SFT) 정의
지도형 미세 조정 (SFT)은 LLM에 적용되는 전이 학습의 한 형태입니다. 전이 학습은 한 문제를 해결하며 얻은 지식을 다른 관련 문제 해결에 활용하는 기계 학습 방법입니다.
LLM의 맥락에서, 지도 학습 기반 미세 조정은 사전 훈련된 모델을 가져와 추가로 훈련하는 것을 의미합니다. 특정 작업과 관련된 라벨링된 예제가 포함된 선별된 데이터 세트를 사용하여 모델의 매개 변수를 조정함으로써 수행됩니다.
이 과정에서 “지도형” 특성이 핵심인데, 이는 엔지니어가 전체 과정을 주도하기 때문입니다:
- 명시적인 입력-출력 쌍으로 구성된 미세 조정 데이터셋을 준비합니다. 이 데이터셋에는 특정 프롬프트에 대한 모델 학습을 유도하는 ‘정답’이 포함됩니다.
- 설정부터 모니터링 및 검증에 이르기까지 전체 미세 조정 과정을 관리합니다.
자세히 설명하자면, RAG(검색 강화 생성)와 비교할 때 파인 튜닝은 모델 자체를 수정합니다. RAG는 모델을 건드리지 않고 단순히 새로운 관련 정보를 공급할 뿐입니다. 반면 파인 튜닝은 새로운 훈련 과정을 수반합니다.
LLM에서 지도형 파인 튜닝의 목표는 무엇인가?
지도형 미세 조정의 주요 목표는 LLM이 사전 훈련된 일반적 역량을 넘어 특정 작업에서 성능을 향상시키는 것입니다. 여기에는 다음이 포함됩니다:
- 작업 전문화: 텍스트 요약, 특정 언어 코드 생성, 감정 분석 등 특정 작업에 모델을 능숙하게 만드는 것.
- 도메인 적응: 법률 문서 분석, 의료 보고서 생성, 금융 예측 등 틈새 분야에 특화된 지식과 용어를 모델에 주입합니다.
- 어조 조정: 챗봇과 같은 애플리케이션에 필요한 일관된 브랜드 목소리, 형식성 수준 또는 특정 대화 인물을 모델이 채택하도록 훈련합니다.
미세 조정을 구현하기 위해 필요한 것
이쯤 되면 궁금해질 수 있습니다: 왜 처음부터 LLM을 그렇게 훈련시키지 않는 걸까? 이유는 간단합니다. LLM 훈련에는 다음이 필요합니다:
- 여러 데이터 센터에 걸쳐 저장되는 방대한 양의 데이터.
- 많은 하드웨어가 필요합니다.
- 많은 자금과 시간 투자.
예를 들어 ChatGPT, Gemini 등과 같은 모델을 훈련시키려면 다음과 같은 시간이 필요합니다:
- 수개월에서 수년에 이르는 시간.
- 수천 달러씩 하는 GPU가 여러 데이터 센터에 분산 배치되어야 합니다.
반면, 미세 조정에는 단 세 가지만 필요합니다:
- 사전 훈련된 모델.
- 컴퓨터 한 대.
- 작은 라벨링 데이터셋.
이제 미세 조정이 왜 그렇게 편리한지 더 명확해질 것입니다.
지도 학습 기반 미세 조정 워크플로의 작동 원리
지도 학습 기반 파인 튜닝 프로세스 실행에는 여러 기술적 단계가 수반됩니다. 전체 과정을 단계별로 살펴보겠습니다!
1단계: 고품질 SFT 데이터셋 선별
프로세스의 효과는 튜닝 데이터 세트의 품질과 관련성에 크게 좌우됩니다. 여기에는 다음이 포함됩니다:
- 데이터 소싱: 다양한 데이터 소싱 기법 중 하나를 사용하여 대상 작업과 관련된 원시 데이터를 확보합니다. 데이터 크기는 수백 개에서 수만 개의 행까지 다양할 수 있습니다. 이는 작업의 복잡성과 사전 훈련된 모델에 따라 달라집니다.
- 데이터 구조화: 원시 데이터를 SFT 프로세스에 적합한 구조화된 형식으로 변환합니다. 대표적인 형식 중 하나는 JSON Lines(JSONL)로, 각 행은 입력값과 원하는 출력값을 위한 별도의 필드를 포함하는 JSON 객체입니다.
- 품질 보증: 데이터가 정확하고 일관되며 다양하며 모델 동작에 부정적 영향을 미칠 수 있는 편향성이 없도록 보장합니다.
단계 #2: 적절한 사전 훈련 모델 선택
사용 가능한 사전 훈련 모델은 다양합니다. 특정 사례에 최적의 모델을 선택하기 위한 주요 고려 사항은 다음과 같습니다:
- 모델 크기: 매개변수 수(예: 7B, 13B, 70B)로 표시되며, 복잡한 패턴과 미묘한 차이를 학습하는 모델의 능력과 상관관계가 있습니다. 일반적으로 더 큰 모델은 더 높은 성능을 제공하지만, 미세 조정을 위해 더 많은 하드웨어 리소스가 필요합니다.
- 아키텍처: 특정 아키텍처는 특정 작업에 적합할 수 있습니다. 예시:
- 디코더 전용 트랜스포머(GPT 시리즈, Llama, Mistral, PaLM): 입력의 연속으로 출력을 생성하는 생성형 작업에 탁월합니다. 여기에는 텍스트 생성, 요약, 명령어 수행, 대화 시스템이 포함됩니다. 이 아키텍처는 시퀀스 내 다음 토큰 예측에 본질적으로 적합합니다.
- 인코더-디코더 트랜스포머 (T5, BART, Flan-T5): 별도의 인코더와 디코더 구성 요소를 가집니다. 이러한 모델은 입력 시퀀스를 출력 시퀀스로 변환하는 작업(번역, 텍스트 요약, 질문 답변 등)에서 뛰어난 성능을 보입니다.
- 기본 성능 평가: 튜닝을 진행하기 전에, 목표 작업과 관련된 학술 벤치마크에서 사전 훈련된 모델의 성능을 평가하세요. 이는 기준점을 제공하고 모델의 적성을 나타냅니다. 예시:
- GPT-4, Claude 3 Opus, Gemini Advanced와 같은 모델은 일반적으로 복잡한 추론을 수행합니다.
- Llama 3 시리즈와 같은 오픈 모델은 다양한 벤치마크에서 강력한 성능을 보여줍니다. 추론, 코딩, 일반 상식 같은 작업에서 독점 모델과 경쟁할 수 있을 정도로 우수합니다.
- CodeLlama나 WizardCoder처럼 코딩을 위해 특별히 사전 훈련된 모델들은 코드 생성 작업에서 우수한 성능을 보입니다.
- 라이선스: 모델이 공개되는 라이선스는 모델의 사용, 수정 및 배포 방식을 규정합니다. 일부 모델은 오픈 소스 권한을 부여하는 반면, 다른 모델은 그렇지 않습니다.
- 기존 파인 튜닝 모델: 관련 작업에 대해 이미 파인 튜닝된 모델을 기반으로 시작하는 것이 원시 기본 모델에서 시작하는 것보다 효율적일 때가 있습니다. 이는 중간 파인 튜닝의 한 형태입니다.
단계 #3: 훈련 루프 구현
이 프로세스의 핵심은 라벨링된 데이터셋을 반복 처리하며 모델의 가중치를 다음과 같이 조정하는 것입니다:
- 전방 전달: 모델이 SFT 데이터셋의 입력(프롬프트)을 처리하여 출력을 생성합니다.
- 손실 계산: 손실 함수는 모델이 생성한 출력을 토큰 단위로 데이터셋의 목표 출력과 비교합니다. 이는 오류를 정량화하는 데 유용합니다.
- 역전파(backpropagation): 계산된 손실은 각 모델 가중치가 오차에 얼마나 기여했는지 나타내는 기울기를 계산하는 데 사용됩니다.
- 가중치 업데이트: 최적화 알고리즘이 기울기와 지정된 학습률을 활용하여 모델 가중치를 조정합니다. 목표는 후속 반복에서 오류를 최소화하는 것입니다.
- 하이퍼파라미터 튜닝: 훈련 과정을 제어하는 매개변수를 조정하여 모델 성능을 향상시킵니다.
단계 #4: 결과 평가
마지막 단계로, 미세 조정된 모델의 성능을 평가해야 합니다. 여기에는 다음이 포함됩니다:
- 검증 세트: 라벨링된 데이터 세트의 일부를 사용하여 진행 상황을 모니터링하고 과적합을 방지해야 합니다.
- 테스트 세트: 모델이 이전에 접하지 못한 새로운 데이터로 구성된 데이터셋이 필요합니다. 이는 튜닝 데이터셋의 하위 집합일 수 있습니다. 이 단계는 튜닝 완료 후 최종 평가를 위해 수행됩니다.
- 지표: 성능 평가를 위해 작업과 관련된 정량적 지표를 정의합니다.
- 정성적 분석: 모델 출력을 검토하여 일관성, 관련성, 스타일 준수 및 안전성을 평가합니다.
SFT 구현 시 기술적 과제 및 고려 사항
SFT 구현에는 다음과 같은 여러 기술적 과제가 존재합니다:
- 데이터셋 품질 및 규모: 가장 큰 과제는 충분히 크고, 고품질이며, 대표성을 갖춘 라벨링 데이터셋을 생성하거나 확보하는 데 있습니다. 데이터 품질이 낮으면 모델 성능도 저하됩니다. 데이터 추출, 정리, 라벨링, 집계 및 형식 지정에는 상당한 노력과 분야별 전문성이 필요합니다.
- 재앙적 망각 완화: 특정 작업에 대한 집중적인 미세 조정은 모델이 사전 훈련 과정에서 습득한 일반적인 능력 일부를 “잊어버리게” 할 수 있습니다. 낮은 학습률 사용, 적은 에포크 수로 미세 조정, 다양한 데이터 통합 등의 전략이 이 현상을 완화하는 데 도움이 될 수 있습니다.
- 하이퍼파라미터 최적화 전략: 최적의 하이퍼파라미터 세트를 찾는 것은 경험적 과정입니다. 이는 여러 실험과 검증 지표의 세심한 모니터링을 필요로 합니다. 자동화된 하이퍼파라미터 튜닝 프레임워크가 도움이 될 수 있지만 복잡성을 추가합니다.
지도 학습 기반 LLM 미세 조정: 단계별 튜토리얼
이론에서 실천으로 넘어갈 시간입니다. 이 튜토리얼 섹션에서는 추가 하드웨어 없이 컴퓨터에서 가벼운 LLM을 파인 튜닝하는 방법을 안내합니다. 목표는 특성의 목록을 주어 전자상거래 제품 설명을 생성하도록 LLM을 파인 튜닝하는 것입니다.
LLM으로는 DistilGPT2를 사용할 것입니다. 이는 GPT-2를 증류하여 크기와 효율성을 개선한 버전입니다.
선택한 모델을 튜닝해 보겠습니다!
필수 조건
지도 학습 방식의 LLM 미세 조정을 위한 이 튜토리얼을 재현하려면, 최소한 Python 3.10 이상이 컴퓨터에 설치되어 있어야 합니다.
또한 미세 조정을 위한 CSV 데이터셋이 필요합니다. 여기서는 전자상거래 제품 데이터를 포함한 사용자 정의 데이터셋을 사용할 것입니다. 데이터셋은 각 제품에 대해 다음과 같은 필드를 포함합니다:
- 카테고리: 전자제품, 도서, 주방용품 등.
- 이름: 제품의 이름.
- 특징: 제품의 주요 특징.
- 색상: 제품의 색상.
- 설명: 제품의 기능이나 특성을 설명하는 텍스트.
아래는 사용된 데이터 샘플을 보여주는 이미지입니다:

1단계: 시작하기
프로젝트의 메인 폴더를 fine_tuning/이라고 가정합니다 . 이 단계가 완료되면 폴더 구조는 다음과 같습니다:
fine_tuning/
├── data/
| └── data.csv
├── results_distilgpt2/
├── tuning.py
└── venv/
여기서:
data.csv에는앞서 소개한 LLM 미세 조정을 위한 라벨링된 데이터가 포함됩니다.results_distilgpts/는결과를 담을 폴더입니다. 이 폴더는 프로세스 중에 자동 생성됩니다.tuning.py는모든 로직을 포함하는 Python 파일입니다.venv/에는가상 환경이 포함됩니다.
다음과 같이 venv/ 가상 환경 디렉터리를 생성할 수 있습니다:
python -m venv venv
활성화하려면 Windows에서 다음을 실행하세요:
venvScriptsactivate
macOS/Linux에서는 다음과 같이 실행합니다:
source venv/bin/activate
활성화된 가상 환경에서 본 튜토리얼에 필요한 라이브러리를 설치하세요:
pip install transformers datasets torch trl
이 프로젝트에서 사용되는 라이브러리는 다음과 같습니다:
transformers: 최신 머신러닝 모델을 위한 Hugging Face의 라이브러리.datasets: Hugging Face의 데이터셋 접근 및 처리 라이브러리.torch: 오픈소스 머신러닝 프레임워크인 PyTorch.trl: Hugging Face의 Transformer 강화 학습 라이브러리로,SFTTrainer와같은 SFT 도구를 포함합니다.
완벽합니다! LLM 미세 조정을 위한 Python 환경이 올바르게 설정되었습니다.
2단계: 초기 설정, 데이터 로딩 및 텍스트 포맷팅
첫 단계로 tuning.py에서 전체 프로세스를 설정해야 합니다:
import os
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, pipeline
from trl import SFTTrainer
# 매개변수 구성
base_model_name = "distilgpt2" # 미세 조정할 사전 훈련 모델
data_file_path = "data/data.csv" # CSV 데이터 파일 경로
output_model_dir = "./results_distilgpt2" # 훈련 결과 및 체크포인트 저장 디렉터리
final_model_path = os.path.join(output_model_dir, "final_model") # 최종 미세 조정 모델 저장 경로
max_seq_length_for_tokenization = 512 # 입력 토큰화 시 최대 시퀀스 길이
# 데이터셋 로드
raw_dataset = load_dataset("csv", data_files=data_file_path)
# 항목을 프롬프트-완성 쌍으로 포맷팅하는 함수 정의
def format_dataset_entry(data_item):
prompt_template = "다음 항목에 대한 제품 설명을 생성하세요:n특징: {features_data}nn설명:"
data_item["text"] = prompt_template.format(features_data=data_item["features"]) + " " + data_item["description"]
return data_item
# 데이터셋의 훈련 분할에 포맷팅 함수 적용
text_formatted_dataset = raw_dataset["train"].map(format_dataset_entry)
이 코드 조각은:
base_model_name으로사용할 LLM의 이름을 정의합니다.- CSV 파일의 경로를 정의하고
load_dataset()메서드로 파일을 엽니다. - 결과를 저장할 폴더(
results_distilgpt2/)를 생성합니다. format_dataset_entry()함수를 생성하여raw_dataset의각 행을 파인 튜닝용 텍스트 형식으로 변환합니다. 또한 수정된 내용을 CSV의 “description” 열에 추가하여 기존 내용을 덮어씁니다. 이를 통해 모델에 정리된 텍스트 설명을 제공합니다.map()메서드를 사용하여 훈련용 분할 데이터셋의 모든 항목에format_dataset_entry()함수를 적용합니다.
잘하셨습니다! 프로세스의 초기 설정을 완료하셨습니다.
3단계: 데이터셋 토큰화
언어 모델은 원시 텍스트를 이해하지 못합니다. 토큰이라고 하는 수치 표현을 기반으로 작동합니다. 이 단계에서는 사전 훈련된 토큰화기를 로드하고 이를 사용하여 형식화된 텍스트 항목을 토큰 ID 시퀀스로 변환합니다:
# 기본 모델과 연관된 토큰화기 로드
tokenizer = AutoTokenizer.from_pretrained(base_model_name)
tokenizer.pad_token = tokenizer.eos_token # 패딩 토큰
# 데이터셋의 "text" 필드를 토큰화하는 함수 정의
def tokenize_function(data_items_batch):
return tokenizer(
data_items_batch["text"],
truncation=True,
padding="max_length",
max_length=max_seq_length_for_tokenization,
)
# 형식화된 데이터셋에 토큰화 함수 적용
tokenized_dataset = text_formatted_dataset.map(
tokenize_function,
batched=True,
remove_columns=text_formatted_dataset.column_names
)
위의 코드는 다음을 수행합니다:
base_model_name과연관된 토큰라이저를AutoTokenizer.from_pretrained()메서드로 로드합니다.- 모델에 입력할 때 모든 시퀀스의 길이를 동일하게 만들기 위해 패딩 토큰을 정의합니다.
- 사용자 정의 함수
tokenize_function()으로 데이터셋을 토큰화하고, 토큰화 결과를 데이터셋에 적용합니다.
훌륭합니다! 데이터셋이 토큰화되었습니다.
4단계: 파인 튜닝 프로세스 구성 및 실행
데이터셋이 준비되고 토큰화되었으므로 이제 파인 튜닝 작업의 핵심으로 넘어갈 수 있습니다:
# 사전 훈련된 언어 모델 로드
model = AutoModelForCausalLM.from_pretrained(base_model_name)
# SFTTrainer 훈련 인자 정의
training_args = TrainingArguments(
output_dir=output_model_dir,
num_train_epochs=3,
per_device_train_batch_size=1,
learning_rate=2e-5,
logging_steps=10,
save_steps=50,
report_to="none",)
# SFTTrainer 초기화
trainer = SFTTrainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
)
# 훈련 프로세스 시작
trainer.train()
# 미세 조정된 모델과 토큰라이저를 지정된 경로에 저장
trainer.save_model(final_model_path)
tokenizer.save_pretrained(final_model_path)
이 코드:
AutoModelForCausalLM.from_pretrained()메서드로 기본 모델을 로드합니다.TrainingArguments()메서드를 사용하여 에포크 수, 배치 크기, 학습률 등 프로세스 설정을 정의합니다.- 토큰화된 데이터셋과 훈련 인수를 모델에 제공하여
SFTTrainer()를 초기화하고 실행합니다. 이는 실제 미세 조정 루프를 관리합니다. - 모델을 훈련하고 전용 폴더에 결과를 저장합니다.
훌륭합니다! 이제 튜닝 프로세스를 시작하셨습니다.
단계 #5: 미세 조정된 모델 평가 및 테스트
이제 성능을 평가하고 모델이 새로운 미확인 제품 특징에 대해 설명을 생성하는 능력을 확인해야 합니다:
# 테스트용으로 미세 조정된 모델 및 토큰화기 로드
fine_tuned_model_for_testing = AutoModelForCausalLM.from_pretrained(final_model_path)
fine_tuned_tokenizer_for_testing = AutoTokenizer.from_pretrained(final_model_path)
# 미세 조정된 모델로 텍스트 생성 파이프라인 생성
generator_fine_tuned = pipeline("text-generation", model=fine_tuned_model_for_testing, tokenizer=fine_tuned_tokenizer_for_testing)
# 테스트용 예시 제품 기능 정의
test_product_features = [
"Category: 주방, Name: 전기 주전자, Features: 1.7L 용량, 스테인리스 스틸, 자동 전원 차단, 건조 방지 기능, Color: 실버",
"Category: 사무실, Name: 인체공학적 사무용 의자, Features: 요추 지지대, 높이 조절 가능, 메쉬 등받이, 회전 기능, Color: 블랙"
]
# 프롬프트 템플릿 정의
prompt_template_inference = "다음 품목에 대한 제품 설명을 생성하세요:n특징: {features}nn설명:"
# 각 테스트 품목에 대한 설명 생성
for features_item in test_product_features:
full_prompt = prompt_template_inference.format(features=features_item)
print(f"nPROMPT:n{full_prompt}")
generated_outputs = generator_fine_tuned(
full_prompt,
max_new_tokens=70,
num_return_sequences=1,
pad_token_id=fine_tuned_tokenizer_for_testing.eos_token_id,
eos_token_id=fine_tuned_tokenizer_for_testing.eos_token_id
)
print(f"생성된 결과 (미세 조정):n{generated_outputs[0]['generated_text']}")
이 코드 조각은 다음을 수행합니다:
- 미세 조정된 모델과 토큰라이저를 로드합니다.
pipeline()메서드를 사용하여 미세 조정된 모델로 텍스트 생성 파이프라인을 생성합니다.test_product_features를사용하여 모델의 미세 조정을 공급하고 평가할 새로운, 이전에 보지 못한 제품 설명을 제공하는 목록을 정의합니다.for루프 내에서 각 테스트 항목에 대한 설명을 생성합니다.- 미세 조정된 모델이 생성한 설명을 출력합니다.
멋지네요! 모델 성능을 테스트하고 평가하기 위한 파이프라인을 설정했습니다.
6단계: 모든 것을 통합하기
이제 tuning.py 파일에는 다음 내용이 포함되어야 합니다:
import os
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, pipeline
from trl import SFTTrainer
# 매개변수 구성
base_model_name = "distilgpt2" # 사전 훈련된 모델
data_file_path = "data/data.csv" # 데이터 경로
output_model_dir = "./results_distilgpt2" # 결과 및 체크포인트 저장 디렉터리
final_model_path = os.path.join(output_model_dir, "final_model") # 최종 미세 조정 모델 저장 경로
max_seq_length_for_tokenization = 512 # 입력 토큰화 최대 길이
# 데이터셋 로드
raw_dataset = load_dataset("csv", data_files=data_file_path)
# 항목을 프롬프트-완성 쌍으로 포맷하는 함수 정의
def format_dataset_entry(data_item):
prompt_template = "다음 항목에 대한 제품 설명을 생성하세요:n특징: {features_data}nn설명:"
data_item["text"] = prompt_template.format(features_data=data_item["features"]) + " " + data_item["description"]
return data_item
# 데이터셋의 훈련 분할에 포맷팅 함수 적용
text_formatted_dataset = raw_dataset["train"].map(format_dataset_entry)
# 기본 모델과 연관된 토큰라이저 로드
tokenizer = AutoTokenizer.from_pretrained(base_model_name)
tokenizer.pad_token = tokenizer.eos_token
# 데이터셋의 "text" 필드를 토큰화하는 함수 정의
def tokenize_function(data_items_batch):
return tokenizer(
data_items_batch["text"],
truncation=True,
padding="max_length",
max_length=max_seq_length_for_tokenization,
)
# 형식화된 데이터셋에 토큰화 함수 적용
tokenized_dataset = text_formatted_dataset.map(
tokenize_function,
batched=True,
remove_columns=text_formatted_dataset.column_names)
# 사전 훈련된 언어 모델 로드
model = AutoModelForCausalLM.from_pretrained(base_model_name)
# SFTTrainer의 훈련 인자 정의
training_args = TrainingArguments(
output_dir=output_model_dir,
num_train_epochs=3,
per_device_train_batch_size=1,
learning_rate=2e-5,
logging_steps=10,
save_steps=50,
report_to="none",)
# SFTTrainer 초기화
trainer = SFTTrainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
)
# 훈련 프로세스 시작
trainer.train()
# 미세 조정된 모델과 토큰화기를 지정된 경로에 저장
trainer.save_model(final_model_path)
tokenizer.save_pretrained(final_model_path)
# 테스트용으로 미세 조정된 모델과 토큰화기 로드
fine_tuned_model_for_testing = AutoModelForCausalLM.from_pretrained(final_model_path)
fine_tuned_tokenizer_for_testing = AutoTokenizer.from_pretrained(final_model_path)
# 미세 조정된 모델로 텍스트 생성 파이프라인 생성
generator_fine_tuned = pipeline("text-generation", model=fine_tuned_model_for_testing, tokenizer=fine_tuned_tokenizer_for_testing)
# 테스트용 제품 특징 예시 정의
test_product_features = [
"Category: 주방, Name: 전기 주전자, Features: 1.7L 용량, 스테인리스 스틸, 자동 전원 차단, 건조 가열 방지, Color: 실버",
"Category: 사무실, Name: 인체공학적 사무용 의자, Features: 요추 지지대, 높이 조절 가능, 메쉬 등받이, 회전 기능, Color: 블랙"
]
# 프롬프트 템플릿 정의
prompt_template_inference = "다음 품목에 대한 제품 설명을 생성하세요:n특징: {features}nn설명:"
# 각 테스트 품목에 대한 설명 생성
for features_item in test_product_features:
full_prompt = prompt_template_inference.format(features=features_item)
print(f"nPROMPT:n{full_prompt}")
generated_outputs = generator_fine_tuned(
full_prompt,
max_new_tokens=70,
num_return_sequences=1,
pad_token_id=fine_tuned_tokenizer_for_testing.eos_token_id,
eos_token_id=fine_tuned_tokenizer_for_testing.eos_token_id
)
print(f"생성된 결과 (미세 조정):n{generated_outputs[0]['generated_text']}")
다음 명령어로 코드를 실행하세요:
python tuning.py
예상 결과는 다음과 같습니다:

보시다시피 프롬프트는 전기 주전자에 대한 설명을 생성하도록 모델에 요청하며 필요한 정보를 제공합니다. 모델은 예상대로 설명을 생성합니다. 이 결과를 분석하면 다음과 같습니다:
- 생성된 제품명: “ProChef Luxury Living Hood Series X”라는 제품명을 생성했는데, 주방용품으로 그럴듯하게 들립니다.
- 모순된 세부사항: 프롬프트의 특징에 제공된 “색상: 실버”와 모순되는 “눈부신 순백색 마감으로 제공됩니다”로 결론짓습니다. 따라서 튜닝이 모델을 안내하더라도 완벽한 일관성을 보장하지는 않습니다. 특히 소규모 모델과 제한된 훈련에서는 이런 현상이 발생합니다.
불완전성과 모순은 생성형 모델, 특히 distilgpt2와 같은 소규모 모델에서 흔히 나타납니다. 이는 또한 튜닝 데이터셋의 규모와 품질, 훈련 에포크 수에 따라 달라질 수 있습니다. 본 사례에서 사용된 데이터셋은 단 300개 행으로 구성되었습니다. 더 큰 데이터셋을 사용했다면 주전자에 대한 설명이 더 우수했을 것입니다.
품질 저하를 보여주기 위해, 아래는 단 5개의 행만 포함된 CSV 파일로 예상되는 결과입니다:

보시다시피 결과는 완전히 허구입니다. 세부적으로 분석하면:
- 생성된 제품명: ****첫 문장에서 제품명을 “Ergonomic Office chair”가 아닌 “Office chair”로 명명함.
- 모순된 세부사항: ****두 번째 문장에서 제품명이 “요추”로 변경됩니다. 모델이 제품명과 기능(“요추 지지대”)을 혼동한 것입니다.
- 문법 불일치: 두 문장 모두 문법이 일관되지 않고 잘못되었습니다.
- 누락된 기능: 색상과 기능(“요추 지지대”, “높이 조절”, “회전”)이 설명에 언급되지 않았습니다.
그러나 미세 조정 과정 없이 동일한 프롬프트를 distilgpt2 모델에 제공한다면 출력은 훨씬 더 나빠질 것입니다. 이는 해당 모델이 이러한 특정 데이터로 훈련되지 않았기 때문입니다. 예를 들어, 주전자에 대한 설명을 제공하지 못할 수 있습니다.
프로세스가 완료되면 코드가 자동으로 results_distilgpt2/ 폴더를 생성합니다 . 이 폴더에는 결과 보고서가 저장됩니다. 내부에는 모델이 각 에포크별로 저장한 결과를 보고하는 하위 폴더들이 있습니다:

이것은 체크포인트로 저장된 모델을 원하는 대로 활용하고자 할 때 유용합니다.
자, 이제 LLM 미세 조정이 완료되었습니다.
결론
이 글에서는 LLM(대규모 언어 모델)의 감독형 파인 튜닝이 무엇인지 알아보았습니다. 또한 파인 튜닝 과정을 단계별로 재현하는 방법도 살펴보았습니다.
핵심 SFT는 모델 미세 조정을 위한 고품질 데이터셋 확보에 달려 있습니다. 다행히 Bright Data는 데이터셋 획득 또는 생성을 위한 다양한 서비스를 제공합니다:
- 스크래핑 브라우저: 내장된 잠금 해제 기능을 갖춘 Playwright, Selenium, Puppeteer 호환 브라우저.
- 웹 스크레이퍼 API: 100개 이상의 주요 도메인에서 구조화된 데이터를 추출하기 위한 사전 구성된 API.
- 웹 언락커: 봇 방지 기능이 적용된 사이트의 차단 해제를 처리하는 올인원 API.
- SERP API: 검색 엔진 결과를 잠금 해제하고 완전한 SERP 데이터를 추출하는 전문 API.
- 파운데이션 모델: 사전 훈련, 평가 및 미세 조정을 위한 규정 준수 웹 규모 데이터셋 접근.
- 데이터 공급자: 신뢰할 수 있는 공급자와 연결하여 대규모의 고품질 AI 준비 데이터 세트를 확보하세요.
- 데이터 패키지: 선별되고 즉시 사용 가능한 데이터 세트를 구조화, 보강 및 주석 처리된 형태로 제공합니다.
Bright Data 계정을 무료로 생성하여 데이터 추출 서비스를 테스트하고 데이터셋 마켓플레이스를 탐색해 보세요!