
이전 글 보러가기 👉 한국어 금융 데이터셋 파인튜닝 챗봇 - 1👈
모델 👉 https://huggingface.co/Bllossom/llama-3.2-Korean-Bllossom-3B
데이터셋 👉 https://huggingface.co/datasets/BCCard/BCCard-Finance-Kor-QnA
파인튜닝한 모델을 테스트하는 과정에서 대부분의 답변이 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)
위에서 파악한 문제의 원인을 해결하기 위해 다음과 같은 과정을 거쳤다.
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))
tokenizer.pad_token = "<|end_of_text|>"
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)"입니다. 페이북은 비씨카드가 제공하는 디지털 결제 플랫폼으로, 사용자들이 모바일 환경에서 다양한 금융 서비스를 간편하게 이용할 수 있도록 돕습니다. 이 앱을 통해 사용자는 간편결제, 포인트 적립 및 사용, 가맹점 할인 혜택, 카드 사용 내역 조회 등 다양한 기능을 이용할 수 있습니다. 페이북은 비씨카드 고객뿐만 아니라, 다양한 금융기관의 카드 사용자들도 이용할 수 있는 범용성을 갖추고 있어, 국내에서 매우 인기 있는 금융 앱 중 하나로 자리매김하고 있습니다.
학습 개선
에폭 수를 늘려서 학습을 완료한 후 모델의 답변 품질을 재평가할 예정이다.
RAG 기법 적용
Retrieval-Augmented Generation (RAG) 기법을 모델에 도입하여, 보다 높은 품질의 답변과 관련성을 제공할 수 있는 방안을 연구할 계획이다
이번 디버깅은 라마 모델의 작동 원리와 토크나이저에 대해 더 깊이 공부하게 된 계기가 되었다. 이러한 경험을 바탕으로 모델의 성능과 활용성을 지속적으로 개선하고 공부할 예정이다. 😺