Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

Dende

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

LLM

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

Dende 2024. 9. 3. 10:36

위의 파인튜닝 파이프라인에 따라 코드 실습을 진행해보겠습니다.

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의 지도 학습을 수행합니다.

다음화에 계속...