Dende
[LLM] 파인튜닝 예제 - (1) 학습 데이터 준비 본문

위의 파인튜닝 파이프라인에 따라 코드 실습을 진행해보겠습니다.
Topic은 금융상품 추천사유 생성입니다. 대형 언어 모델(LLM)을 통해 고객 개개인의 상황과 니즈를 고려한 맞춤형 추천 사유를 제공하는 것을 목표로 해보겠습니다.
파인튜닝 데이터 준비
- 파인튜닝은 사용 사례에 특화된 새로운 모델을 만드는 강력한 기술
- 사례학습을 위해 입력("prompt")과 해당하는 출력("completion")으로 구성된 일관성 있는 예제셋이 필요
※ 문서를 그대로 파인튜닝에 활용하는 것은 비효율적인 학습을 야기 → QA셋으로 전처리 수행
데이터 전처리
① 프롬프트 템플릿 지정
운영환경에서의 템플릿이 학습시의 템플릿과 일치하지 않을 경우, 정확도 및 일관성이 저하될 수 있음
② 데이터 확보
지식 증류(Knowledge Distillation)를 위해 Teacher 모형의 모범 답안을 참조하여 생성.
데이터의 양적인 보완을 위해 데이터증강(Data Augmentation) 검토.
Code Example
########################################################################
# 프롬프트 템플릿 지정
########################################################################
prompt = """
당신은 금융상품 추천 사유를 생성해주는 도우미입니다.
아래의 '고객 정보'를 바탕으로, 예금 상품을 추천하는 사유를 생성해주세요.
그리고 추천 사유를 만든 이유를 설명해주세요.
# 고객 정보:
{}
마지막으로, 생성된 사유들을 종합하여 하나의 최종 추천 사유로 만들어주세요.
그리고 뒤에는 주요 키워드를 3개만 뽑아서 해쉬태그도 만들어주세요.
"""
########################################################################
# 학습데이터 확보(데이터 증강)
########################################################################
# 데이터 증강을 위한 프롬프트
prompt_data_agmt = PromptTemplate.from_template(
"""
당신은 고객에게 추천된 금융상품의 추천사유를 만들어주는 직원입니다.
1. "입력 정보"의 데이터 증강을 {num_answer} 개수만큼 해주세요. 데이터 증강 방법은 동의어 사용 및 노이즈 추가 방식으로 해주세요.
2. "입력 정보"을 활용하여 예금 상품을 추천할 합리적이고 매력적인 사유를 생성해주세요. 추천사유를 생성한 뒤, 해당 추천사유에 대한 데이터 증강을 {num_answer} 개수만큼 해주세요.
2-1 : 증강된 추천사유별로 키워드를 한 개 추출한 해쉬태그도 추가해주세요.
2-2 : 각 추천사유는 60자 이내로 생성해주세요.
2-3 : "입력 정보"의 상황만 고려해서 생성해주세요.
### 입력 정보:
{input_information}
### Format:
{{
"INPUT_AUGMENTED": [
"이 고객은 만기 예정인 예금 상품을 보유하고 있습니다."
, "이 고객은 곧 만기될 예금 상품을 보유하고 있습니다."
, "이 고객은 예금 상품의 만기가 다가오고 있습니다."
, "이 고객의 예금 상품이 곧 만기됩니다."
, "이 고객은 만기가 임박한 예금 상품을 가지고 있습니다."
] ,
"ANSWER_AUGMENTED": [
"만기가 다가오는 예금 상품을 가지고 계시다면, 다른 예금상품으로 갈아타는 건 어떨까요? #만기예금"
, "곧 만기되는 예금 상품이 있으시네요! 다음 자산 운용을 위한 예금 상품 가입은 어떠세요? #자산운영"
, "만기가 임박한 예금 상품을 보유하고 계시다면, 새로운 예금 상품으로 전환해보세요! #예금전환"
, "만기 예정인 예금을 보유하고 계시다면, 다른 예금 상품으로 갈아타는 건 어떨까요? #예금갈아타기"
, "예금 만기가 임박했다면, 새로운 예금 상품으로 재투자해보세요! #재투자"
]
}}
"""
)
list_input_org = [
"이 고객은 만기 예정인 예금 상품을 보유하고 있습니다."
, "이 고객은 예금 상품 가입에 충분한 잔액을 보유하고 있습니다."
, "이 고객은 예적금 중심의 자산을 보유하고 있으며, 상품의 우대 조건을 충족했습니다."
, "이 고객은 예금 상품을 추천하기에 적합한 사회초년생(20~30대초 직장인)입니다."
, "최근 예금금리가 상승하였습니다."
, "최근 예금금리가 상승 추세입니다."
]
# 원하는 데이터 구조를 정의합니다.
class QAPair(BaseModel):
question: str = Field(description="Question generated from the text")
answer: str = Field(description="Answer related to the question")
# 파서를 설정하고 프롬프트 템플릿에 지시사항을 주입합니다.
parser = JsonOutputParser(pydantic_object=QAPair)
chain = (
prompt_data_agmt
| ChatOpenAI(
model="gpt-4o",
temperature= 0.5,
streaming=True,
callbacks=[StreamingStdOutCallbackHandler()],
)
| parser
) # 체인을 구성합니다.
qa_pair = []
for element in list_input_org[:1]:
qa_pair.append(
chain.invoke(
{"input_information": element, "num_answer": "3"}
)
)
증강된 답변 결과를 DataFrame 형태로 변환
# 데이터증강 결과를 데이터프레임으로 변환
df_train_base = pd.DataFrame([qa_pair[0]['INPUT_AUGMENTED'], qa_pair[0]['ANSWER_AUGMENTED']]
).transpose(
).rename(columns = {0 : '입력', 1: '출력'}
).reset_index(drop = True)
# '입력' 열의 각 값을 템플릿에 넣어 대체
df_train_base['입력'] = df_train_base['입력'].apply(lambda x: prompt.format(x))
display(df_train_base)
df_train_base.to_pickle(f'./df_train_base.pkl')
추후 이 데이터셋을 가지고 LLM의 지도 학습을 수행합니다.
'LLM' 카테고리의 다른 글
[LLM] 파인튜닝 예제 - (3) DPO Training (2) | 2024.09.03 |
---|---|
[LLM] 파인튜닝 예제 - (2) AI 모형 학습 (4) | 2024.09.03 |
[LLM] 파인튜닝 - PEFT(Parameter-Efficient Fine-Tuning) (0) | 2024.08.20 |
[LLM] 파인튜닝 개념정리 (0) | 2024.08.20 |