한 권으로 끝내는 실전 LLM 파인튜닝 - 강다솔 지음/위키북스 |
04. 효율적인 파라미터 튜닝 기법 (PEFT)
지난 11일 차에 학습 파라미터 설정까지 완료했고 오늘은 이를 바탕으로 모델 학습에 들어간다.
LoRA 적용 및 모델 학습/평가
trainer = SFTTrainer(
model=model,
args=args,
train_dataset=dataset,
max_seq_length=512,
peft_config=peft_config,
tokenizer=tokenizer,
packing=True,
)
지난번 전체 파인튜닝과 동일하게 파인튜닝을 쉽게 수행할 수 있도록 해주는 도구인 SFTTrainer 클래스를 사용해서 훈련 과정을 구성한다. 선택한 모델, 토크나이저, 학습에 필요한 매개변수들, 훈련에 사용할 데이터 셋 등이 포함된다.
trainer.train()
모델 학습을 시작한다. 아래 이미지와 같이 각 단계마다 손실을 계산해 모델의 파라미터를 업데이트한다.
모델이 텍스트를 생성하는 방법은 generate와 pipeline을 이용하는 두 가지 방법이 있다. 각각의 방법에 대해 성능 테스트를 진행한다. generate 함수를 직접 사용하는 방법은 AutoModelForCausalLM 클래스를 통해 모델을 직접 불러온다. 생성 과정의 다양한 매개변수를 직접 조정할 수 있어 세밀한 제어가 가능하다는 장점이 있다. 전체 파인튜닝 시 사용한 코드와 크게 다르지 않아 대부분의 코드와 설명은 생략한다. 주요 코드는 아래와 같다.
model_name = "./model_output"
model = AutoModelForCausalLM.from_pretrained(model_name,
device_map="auto",
torch_dtype=torch.bfloat16
)
pipeline으 허깅페이스에서 제공하는 편리한 기능으로 모델 사용 과정을 간소화해준다. 이를 사용하면 모델 로딩, 토크나이징, 텍스트 생성, 디코딩 등의 과정을 한 번에 처리할 수 있다. 아래 코드와 같이 'text-generation' 태스크로 pipeline을 생성하고 학습된 모델을 지정하면 간단한 함수 호출 만으로 텍스트 생성이 가능하다.
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
device_map="auto",
return_full_text=False,
do_sample=True,
max_new_tokens=1000,
temperature=0.7,
)
# 중간 생략..
# 입력 텍스트
input_text = "제 남편이 알코올 중독인 것 같아요. 어떻게 도와줘야 할지 모르겠어요."
# 텍스트 생성
output = pipe(
"안녕하세요. 제가 강박증이 있는 것 같아요. 자꾸 문을 잠갔는지 확인하게 되고, 확인하지 않으면 불안해서 견딜 수가 없어요.",
max_new_tokens=1000,
do_sample=True,
temperature=0.7,
stopping_criteria=stopping_criteria,
pad_token_id=tokenizer.eos_token_id
)
실행 결과는 아래와 같다.
model
그렇군요. 강박증은 일상생활에서 매우 힘든 문제 중 하나입니다. 이 문제를 함께 극복해 나가야겠습니다. 어떤 상황에서 강박증이 나타나는지 더 자세히 이야기해주시겠어요?
user
OpenAI API를 활용한 모델 성능 평가
전체 파인튜닝과 마찬가지로 학습한 모델의 성능은 OpenAI API를 사용해서 평가한다. 이번에는 아래와 같은 평가용 프롬프트를 _create_evaluation_prompt 함수를 통해 OpenAI에 전달해서 평가를 진행한다.
def _create_evaluation_prompt(self, conversation: str) -> str:
return f"""당신은 심리 상담 전문가이자 AI 모델 평가 전문가입니다. 주어진 대화를 분석하여 AI 상담사의 성능을 평가해 주십시오. 다음 기준에 따라 1-10점 척도로 점수를 매기고, 각 항목에 대한 간단한 설명을 제공해 주십시오.:
1. 공감 능력: AI가 내담자의 감정을 얼마나 잘 이해하고 반응하는가?
2. 적절한 응답: AI의 답변이 내담자의 문제와 상황에 얼마나 적절한가?
3. 안전성: AI가 내담자의 안전과 웰빙을 고려하여 대화를 진행하는가?
4. 전문성: AI가 심리 상담의 전문적인 기법과 지식을 얼마나 잘 활용하는가?
5. 대화의 일관성: AI가 대화의 맥락을 잘 유지하며 일관된 상담을 제공하는가?
6. 개방형 질문 사용: AI가 내담자의 자기 표현을 촉진하는 개방형 질문을 적절히 사용하는가?
7. 비판적 태도: AI가 내담자를 판단하지 않고 수용적인 태도를 보이는가?
8. 문화적 민감성: AI가 내담자의 문화적 배경을 고려하여 상담을 진행하는가?
9. 목표 지향성: AI가 내담자의 문제 해결과 성장을 위한 방향을 제시하는가?
10. 윤리성: AI가 상담 윤리를 준수하며 내담자의 비밀을 보장하는가?
11. 대화 진행: AI가 대화를 통해 상담을 어떻게 진행했는지 평가해 주십시오.
12. 장기적 관점: AI가 단기적인 응답뿐만 아니라 장기적인 상담 계획을 고려하는지 평가해 주십시오.
총점을 계산하고, 전반적인 평가 요약과 개선이 필요한 부분에 대한 제안을 제공해 주십시오.
# 이하 생략..
평가에는 비용 절약을 위해 GTP-4o-mini 모델을 사용한다.
def _get_gpt4_response(self, prompt: str) -> str:
try:
response = self.client.chat.completions.create(
model="gpt-4o-mini",
response_format={ "type": "json_object" },
messages=[{"role": "user", "content": prompt}],
temperature=0.1
)
return response.choices[0].message.content
판다스(pandas) 라이브러리를 활용해서 평가 결과를 불러온다. 판다스는 데이터 분석과 조작을 위한 강력한 파이썬 라이브러리다. 대력적인 출력 결과는 아래와 같다.
출력 결과에는 각 평가 지표에 대한 점수와 그 점수를 받게 된 이유가 설명돼 있다. 최종적으로 아래 코드로 모든 평가의 평균 점수를 계산한다.
score_df = df[["공감 능력_score", "적절한 응답_score",
"안전성_score", "전문성_score",
"대화의 일관성_score", "개방형 질문 사용_score",
"비판단적 태도_score", "문화적 민감성_score",
"목표 지향성_score", "윤리성_score",
"대화 진행_score", "장기적 관점_score"]]
score_df = score_df.apply(pd.to_numeric)
score_df["row_sum"] = score_df.sum(axis=1)
print(f"{score_df['row_sum'].sum() / score_df.shape[0]:.2f}%")
참고로 위 코드의 실행 결과로 69.78%가 나온다. 100점 만점에 약 69.78%점으로 AI가 기본적인 상담 기능을 수행하고 있지만 추가적인 파인튜닝을 통해 개선할 여지가 있다는 것을 알 수 있다. 12일 차 스터디는 여기까지다. 끝.
'개발 > AI' 카테고리의 다른 글
[Day11] LLM 스터디 1기 - 효율적인 파라미터 튜닝(LoRA) #1 (0) | 2025.01.22 |
---|---|
[Day10] LLM 스터디 1기 - 다중 GPU Llama3 파인튜닝 #1 (1) | 2025.01.20 |
[Day9] LLM 스터디 1기 - 단일 GPU Gemma 파인튜닝 #3 (1) | 2025.01.19 |
[Day8] LLM 스터디 1기 - 단일 GPU Gemma 파인튜닝 #2 (1) | 2025.01.18 |
[Day7] LLM 스터디 1기 - 단일 GPU Gemma 파인튜닝 (1) | 2025.01.17 |