한국어 금융 데이터셋 파인튜닝 챗봇 - 2

현주·2024년 12월 14일
0
post-thumbnail

이전 글 보러가기 👉 한국어 금융 데이터셋 파인튜닝 챗봇 - 1👈

모델 👉 https://huggingface.co/Bllossom/llama-3.2-Korean-Bllossom-3B
데이터셋 👉 https://huggingface.co/datasets/BCCard/BCCard-Finance-Kor-QnA


Llama 모델 답변 무한 생성 및 반복 문제

파인튜닝한 모델을 테스트하는 과정에서 대부분의 답변이 max token까지 비슷한 문장을 반복해 생성되는 문제가 발생했다. 이런 문제를 해결하기 위해 문제 상황과 원인을 분석하고 해결책을 찾는 디버깅 과정을 수행하였다😭

먼저 많은 검색을 통해 라마 모델의 패딩토큰 문제에 대해 알게되었다.. 내가 파인튜닝중인 모델 또한 라마 모델 기반이어서 라마 모델에 대해서도 많은 내용을 배웠다. https://discuss.huggingface.co/t/how-to-set-the-pad-token-for-meta-llama-llama-3-models/103418


디버깅🐛

먼저 디버깅을 하면서 토크나이징이 잘 되는지 확인을 해봤다. datasets = preprocess(dataset) 이 줄에 breakpoint를 걸고 디버깅을 했는데, eos 토큰이 문장 끝마다 있었다. 이때 나는 pad 토큰을 eos 토큰으로 설정해놨었고, 이 부분이 문제의 원인이라고 생각했다

def preprocess(data):
    return data.map(
        lambda x: {
            'data': tokenizer.apply_chat_template(
                [{"role": "system", "content": x['instruction']},
                 {"role": "assistant", "content": x['output']}],
                add_generation_prompt=False, tokenize=False, return_tensors="pt"
            )
        }
    ).map(lambda samples: tokenizer(samples["data"]), batched=True)

datasets = preprocess(dataset)

문제 해결

위에서 파악한 문제의 원인을 해결하기 위해 다음과 같은 과정을 거쳤다.

  1. apply_chat_template 함수를 사용하지 않고 직접 템플릿을 작성했다.(apply_chat_template 함수를 돌렸을때 나온 결과를 참고해서 템플릿을 작성했다)
template = '''<|begin_of_text|><|start_header_id|>system<|end_header_id|>당신은 유능한 AI 어시스턴트 입니다. 사용자의 질문에 대해 친절하게 답변해주세요.<|eot_id|><|start_header_id|>user<|end_header_id|>{instruction}<|eot_id|><|start_header_id|>assistant<|end_header_id|>{output}<|eot_id|>'''

...

def preprocess(data):
        return data.map(
            lambda x: {
                'text': template.format(instruction = x["instruction"], output=x["output"])
            }
        ).map(lambda samples: tokenizer(samples["text"], padding=True, add_special_tokens=False))

  1. pad 토큰 변경
    pad 토큰을 기존의 eos_token에서 모델의 tokenizer_config.json에 명시되어있는 <|end_of_text|> 토큰으로 변경하였다. 이를 통해 모델이 패딩과 종료 신호를 명확히 구분할 수 있도록 조정하였다.
tokenizer.pad_token = "<|end_of_text|>"

  1. 테스트 환경 조정
    테스트 실행 시, eos_token_id 값을 <|end_of_text|> 토큰의 ID로 설정하였다. 이를 통해 모델이 텍스트 종료 조건을 올바르게 인식하도록 수정하였다.
outputs = model.generate(
    input_ids,
    max_new_tokens=1024,
    eos_token_id=tokenizer.convert_tokens_to_ids("<|end_of_text|>"),
    do_sample=True,
    temperature=0.6,
    top_p=0.9
)

결과 확인

위의 변경 사항을 적용한 후 모델을 다시 테스트하였다. 모델이 적절한 시점에서 답변을 종료하며 더 이상 답변을 max token까지 반복하여 생성하지 않는 것을 확인하였다.

이번 디버깅 과정을 통해 문제를 성공적으로 해결하였다!

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

model_id = './results/checkpoint-19530'

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
instruction = "비씨카드의 주요 경쟁사는 누구인가요?"

messages = [
    {"role": "user", "content": f"{instruction}"}
    ]

input_ids = tokenizer.apply_chat_template(
    messages,
    add_generation_prompt=True,
    return_tensors="pt"
).to(model.device)

terminators = [
    tokenizer.convert_tokens_to_ids("<|eot_id|>")
]

outputs = model.generate(
    input_ids,
    max_new_tokens=1024,
    eos_token_id=terminators,
    do_sample=True,
    temperature=0.1
)

print(tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True))

질문 : 비씨카드의 주요 경쟁사는 누구인가요?

답변 : 비씨카드의 주요 경쟁사로는 신한카드, 삼성카드, KB국민카드 등이 있습니다. 이들 카드사는 모두 국내외 카드 결제 시장에서 경쟁하며, 각기 다른 혜택과 서비스를 제공하고 있습니다. 비씨카드는 이러한 경쟁사들과의 경쟁에서 혁신적인 서비스와 고객 중심의 접근을 통해 시장 점유율을 유지하고 있습니다.

데이터셋 답변 : 비씨카드의 주요 경쟁사로는 신한카드, 국민카드, 삼성카드 등 국내 주요 카드사들이 있습니다. 이들 경쟁사들은 다양한 혜택과 차별화된 서비스를 통해 시장 점유율을 확보하고 있으며, 비씨카드는 이들과의 경쟁 속에서 독자적인 디지털 혁신과 친환경 프로그램 등을 통해 차별화를 추구하고 있습니다.


질문 : 비씨카드의 모바일 앱 이름은 무엇인가요?

답변 : 비씨카드의 주요 모바일 앱은 '페이북'입니다. 페이북은 다양한 금융 서비스를 통합하여 제공하며, 간편 결제, 포인트 조회, 카드 관리 등 다양한 기능을 제공합니다. 페이북 앱은 비씨카드 고객들이 편리하게 금융 서비스를 이용할 수 있도록 돕습니다.

데이터셋 답변 : 비씨카드의 모바일 앱 이름은 "페이북(Paybooc)"입니다. 페이북은 비씨카드가 제공하는 디지털 결제 플랫폼으로, 사용자들이 모바일 환경에서 다양한 금융 서비스를 간편하게 이용할 수 있도록 돕습니다. 이 앱을 통해 사용자는 간편결제, 포인트 적립 및 사용, 가맹점 할인 혜택, 카드 사용 내역 조회 등 다양한 기능을 이용할 수 있습니다. 페이북은 비씨카드 고객뿐만 아니라, 다양한 금융기관의 카드 사용자들도 이용할 수 있는 범용성을 갖추고 있어, 국내에서 매우 인기 있는 금융 앱 중 하나로 자리매김하고 있습니다.


향후

  1. 학습 개선
    에폭 수를 늘려서 학습을 완료한 후 모델의 답변 품질을 재평가할 예정이다.

  2. RAG 기법 적용
    Retrieval-Augmented Generation (RAG) 기법을 모델에 도입하여, 보다 높은 품질의 답변과 관련성을 제공할 수 있는 방안을 연구할 계획이다


결론

이번 디버깅은 라마 모델의 작동 원리와 토크나이저에 대해 더 깊이 공부하게 된 계기가 되었다. 이러한 경험을 바탕으로 모델의 성능과 활용성을 지속적으로 개선하고 공부할 예정이다. 😺


레퍼런스

profile
공부하는 블로그😎

0개의 댓글