의료 트리아지, 법률 계약 검토, 금융 규제 준수 심사, 특정 산업군 전문 기술지원과 같은 버티컬 도메인에서는 전문 용어에 대한 정밀한 이해, 구조화된 추론 논리, 규격화된 답변 양식이 필수적입니다. 범용 상용 대형 언어 모델(LLM)이 뛰어난 대화 유창성을 갖추고 있으나, 엄격한 데이터 보안 규제와 장기적인 인프라 비용 부담으로 인해 기업들은 자체 구축 및 운영이 가능한 오픈 웨이트 모델로 눈을 돌리고 있습니다. 백천지능(Baichuan Intelligent Technology)이 공개한 Baichuan 시리즈(특히 Baichuan2-7B 및 Baichuan2-13B)는 2조 6천억 토큰 규모의 고품질 중·영 이중언어 코퍼스로 사전 학습되어 우수한 어휘 처리 효율과 도메인 이해력을 갖춘 강력한 기반 모델입니다.
하지만 7B 또는 13B 규모의 모델 전체를 특정 데이터셋으로 풀 파인튜닝(Full Fine-Tuning)하는 것은 대규모 GPU 클러스터 비용을 유발할 뿐만 아니라, 모델이 기존에 학습한 일반 상식과 대화 능력을 상실하는 '파국적 망각(Catastrophic Forgetting)'을 초래하기 쉽습니다. 저순위 적응(LoRA, Low-Rank Adaptation)은 사전 학습된 가중치를 동결한 채 핵심 투영 계층에만 학습 가능한 저순위 분해 행렬을 삽입함으로써, 단일 GPU나 제한된 예산 안에서도 극히 적은 연산량으로 고품질 도메인 어시스턴트를 구축할 수 있는 이상적인 해법을 제공합니다.
1. 아키텍처 정렬: Baichuan의 W_pack 어텐션 구조
LoRA 어댑터를 올바르게 구성하려면 Baichuan 모델 내부의 트랜스포머 아키텍처 특성을 정확히 파악하고 적절한 선형 계층을 지정해야 합니다.
일반적인 Llama 계열 모델은 자기 어텐션(Self-Attention)의 Query, Key, Value 선형 투영을 q_proj, k_proj, v_proj로 독립 분리하여 구성합니다. 반면 Baichuan은 추론 메모리 효율과 GPU 연산 처리량을 극대화하기 위해 Q, K, V 투영 행렬을 단일 패킹 계층인 W_pack으로 통합했습니다.
따라서 타 모델의 일반적인 LoRA 설정값을 그대로 적용할 경우 어텐션 계층에 아무런 가중치 갱신이 일어나지 않습니다. 어텐션 표현력과 다층 퍼셉트론(MLP)의 비선형 특징 변환을 모두 수용하기 위해 권장되는 LoRA 대상 모듈(target_modules)은 다음과 같습니다:
- 자기 어텐션 계층:
W_pack(Q, K, V 통합 행렬) 및o_proj(출력 투영) - MLP 계층:
gate_proj,up_proj,down_proj
최신 PEFT 환경에서 위 모듈들을 명시적으로 선언하거나 target_modules="all-linear"를 활성화하면 전문 도메인 지식을 흡수하기에 충분한 파라미터 용량을 확보할 수 있습니다.
2. 도메인 데이터셋 구축 및 특수 토큰 규격
특화 어시스턴트의 답변 정확도는 데이터 정제의 엄밀성과 대화 템플릿의 규격 준수에 의해 결정됩니다.
역할 토큰 규격
Baichuan2 대화형 모델(Chat)은 대화 턴을 구분하기 위해 전용 예약 토큰을 사용합니다:
<reserved_106>: 사용자 입력의 시작을 나타내는 토큰 (<|User|>에 대응)<reserved_107>: 어시스턴트 응답의 시작을 알리는 트리거 토큰 (<|Assistant|>에 대응)
표준 멀티턴 대화 JSON 포맷은 다음과 같이 구성됩니다:
[
{
"conversations": [
{
"from": "human",
"value": "특허법상 특허무효심판 청구의 법정 기간 및 필수 증거 요건은 무엇인가요?"
},
{
"from": "gpt",
"value": "특허법 규정에 따르면, 특허권 설정등록 공고가 있은 후에는 이해관계인 또는 심사관에 한하여 무효심판을 청구할 수 있습니다. 필수 요건 및 구비 서류는 다음과 같습니다..."
}
]
}
]
치명적 핵심: Loss Masking(손실 마스킹)
자체 학습 파이프라인 개발 시 가장 흔히 발생하는 중대한 실수는 전체 토큰 시퀀스에 대해 무차별적으로 교차 엔트로피 손실을 계산하는 것입니다. 지도 미세조정(SFT) 시 역전파 손실은 오직 어시스턴트가 생성한 토큰에 대해서만 계산되어야 합니다.
엔지니어는 레이블 벡터(labels)에서 사용자 질문, 시스템 프롬프트 및 역할 구분 토큰을 PyTorch CrossEntropyLoss의 기본 무시 인덱스인 -100으로 마스킹해야 합니다. 프롬프트를 마스킹하지 않으면 모델은 정답을 도출하는 지식을 익히는 대신 '사용자처럼 질문하는 법'을 학습하게 되어, 추론 시 동어반복이나 질문 되풀이 현상이 발생합니다.
도메인 데이터셋 구축 원칙
- 전문 진단 및 실무 문답: 의료 케이스, 판례 논리, 재무 분석을 다루는 고품질 질의응답 쌍 5,000~20,000건을 구축합니다.
- 일반 지시 데이터 혼합(파국적 망각 방지): 데이터셋 전체에 5~10% 비중으로 범용 지시 대화 데이터를 혼합합니다. 이 앵커 데이터가 모델의 기본 문맥 이해력과 일상 대화 논리를 유지해 줍니다.
- 안전 경계 및 거절 샘플: 단정적인 의료 진단이나 확정적 수익률 약속 등 법적 위험이 높은 질의에 대해 면책 고지를 안내하고 전문 상담을 권고하는 네거티브 샘플을 반드시 배치합니다.
3. Hugging Face PEFT 기반 LoRA 구현 절차
Baichuan2-7B-Base 또는 Baichuan2-7B-Chat 모델을 대상으로 Hugging Face transformers, peft, PyTorch를 활용한 파인튜닝 파이프라인 구현 예시입니다.
1단계: 필수 패키지 설치
pip install torch>=2.0.0 transformers>=4.31.0 peft>=0.5.0 accelerate bitsandbytes datasets
2단계: 모델 로드 및 LoRA 설정
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model, TaskType
model_id = "baichuan-inc/Baichuan2-7B-Base"
# 토크나이저 로드 (trust_remote_code 필수)
tokenizer = AutoTokenizer.from_pretrained(
model_id,
use_fast=False,
trust_remote_code=True
)
# 수치 안정성이 높은 bfloat16 정밀도로 모델 로드
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True
)
# LoRA 하이퍼파라미터 정의
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=16, # 랭크 차원 (버티컬 분야는 16 또는 32 권장)
lora_alpha=32, # 스케일링 팩터 (일반적으로 2*r)
lora_dropout=0.05, # 도메인 데이터 과적합 방지
target_modules=[
"W_pack",
"o_proj",
"gate_proj",
"up_proj",
"down_proj"
],
bias="none"
)
# PEFT 모델 어댑터 결합
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 출력 예시: trainable params: ~20M || all params: 7B || trainable%: ~0.28%
3단계: 학습 실행 및 그래디언트 체크포인팅
그래디언트 체크포인팅(gradient_checkpointing)을 활성화하여 VRAM 사용량을 대폭 절감하고 배치 사이즈를 확보합니다:
training_args = TrainingArguments(
output_dir="./baichuan2-lora-vertical",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
warmup_ratio=0.03,
lr_scheduler_type="cosine",
logging_steps=10,
num_train_epochs=3,
save_strategy="epoch",
fp16=False,
bf16=True, # 최신 GPU 아키텍처 권장
gradient_checkpointing=True,
report_to="none"
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_domain_dataset,
tokenizer=tokenizer
)
trainer.train()
model.save_pretrained("./baichuan2-vertical-adapter")
RTX 3090/4090과 같은 24GB 단일 GPU 환경에서는 모델 로드 시 BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16) 설정을 적용하여 QLoRA 방식으로 학습을 진행할 수 있습니다.
4. 제로 오버헤드 서빙을 위한 가중치 병합
운영 환경에서 LoRA 어댑터를 동적으로 마운트하여 서빙하는 것은 추론 지연 시간과 시스템 복잡도를 증가시킵니다. 검증 평가를 통과한 어댑터 가중치는 베이스 모델에 직접 영구 병합하는 것이 유리합니다.
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
import torch
base_model_path = "baichuan-inc/Baichuan2-7B-Base"
adapter_path = "./baichuan2-vertical-adapter"
output_path = "./baichuan2-7b-vertical-merged"
tokenizer = AutoTokenizer.from_pretrained(base_model_path, trust_remote_code=True)
base_model = AutoModelForCausalLM.from_pretrained(
base_model_path,
torch_dtype=torch.bfloat16,
device_map="cpu",
trust_remote_code=True
)
# 어댑터 로드 및 가중치 병합
model = PeftModel.from_pretrained(base_model, adapter_path)
merged_model = model.merge_and_unload()
# 독립형 모델로 저장
merged_model.save_pretrained(output_path)
tokenizer.save_pretrained(output_path)
병합 완료된 가중치는 원본 Baichuan 구조와 동일하므로, vLLM이나 TGI와 같은 고성능 추론 엔진에 즉시 배포하여 지연 시간 증가 없이 높은 동시 처리량을 확보할 수 있습니다.
5. 아키텍처 설계 비교: LoRA 파인튜닝 vs. 검색 증강 생성(RAG)
버티컬 솔루션 기획 시 LoRA와 RAG 사이에서 기술적 선택을 고민하는 경우가 많습니다. 실제 산업 현장에서 두 기술은 상호 보완적으로 작동합니다:
| 평가 항목 | LoRA 파인튜닝 | 검색 증강 생성 (RAG) |
|---|---|---|
| 핵심 강점 | 전문 어조 내재화, 복잡한 추론 패턴 체득, 엄격한 출력 형식 준수 | 실시간 변경 문서, 최신 법률 및 기업 내부 데이터의 즉각적 반영 |
| 사실적 신뢰성 | 파라미터 기반 기억; 수시로 변하는 세부 수치에 환각 위험 존재 | 높은 감사 가능성; 검색된 문서 본문을 직접 인용하여 근거 명시 |
| 운영 비용 | 초기 GPU 학습 비용 발생; 병합 후 추론 비용은 베이스 모델과 동일 | 벡터 데이터베이스 운영, 청킹 파이프라인 및 임베딩 검색 비용 상시 발생 |
| 지식 갱신 주기 | 새로운 데이터셋을 기반으로 한 재학습 사이클 필요 | 벡터 인덱스 추가만으로 수 초 내 즉시 지식 갱신 가능 |
엔터프라이즈 권장 아키텍처: LoRA와 RAG 중 하나만 선택할 필요가 없습니다. 가장 완성도 높은 전략은 **하이브리드 아키텍처(Hybrid Architecture)**입니다. LoRA 파인튜닝을 통해 Baichuan 모델에게 해당 산업의 전문적 사고방식과 표준 어투를 습득시키고, 런타임에는 RAG 파이프라인으로 최신 근거 문서를 주입하여 환각 없는 정확한 답변을 도출하는 것입니다.
참고 자료
- GitHub - baichuan-inc/Baichuan2: A series of large language models developed by Baichuan Intelligent Technology · GitHub
- [2309.10305] Baichuan 2: Open Large-scale Language Models
- baichuan-inc/Baichuan2-7B-Base · Hugging Face
- baichuan-inc/Baichuan2-13B-Chat · Hugging Face
- GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. · GitHub