회사 동기와 항해 플러스 AI 과정을 수료한 후 일주일에 한 번 한시간씩이라도 스터디를 하고있다.
스터디를 할 때마다 블로그에 기록을 했으면 더 좋았을 것 같은데 이제라도 기록을 해보고자 한다.
요구사항
국내 전국 관광지 데이터를 기반으로 모델을 학습시켜 사용자에게 여행지를 추천해준다.
데이터 수집
아래의 사이트에서 데이터를 받아 사용하였다.
https://www.data.go.kr/data/15021141/standard.do
전국관광지정보표준데이터
국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase
www.data.go.kr
데이터 전처리
1. 모델 학습에 필요한 필드만 추출하여 json 파일로 생성
2. 원천데이터의 지역명이 일정하지 않은 부분이 있어 추가 정제 (e.g. 경상북도, 경북)
-> 이 과정에서 원천데이터를 수정하는 것이 아니라 추가로 수정한 파일을 생성 후 관리했어야 하는데 원천데이터를 수정하였음. 데이터 전처리를 하게 된다면 원천데이터 보존을 잘 해야겠다는 생각이 들었음.
모델 선정
Pre-trained 모델을 가져와서 FineTuning 하는 방식으로 모델 학습.
국내 여행지에 대한 설명을 하기 때문에 한국어 생성형 모델인 KoGPT2를 사용하면 좋을 것이라고 생각하였음.
https://github.com/SKT-AI/KoGPT2
GitHub - SKT-AI/KoGPT2: Korean GPT-2 pretrained cased (KoGPT2)
Korean GPT-2 pretrained cased (KoGPT2). Contribute to SKT-AI/KoGPT2 development by creating an account on GitHub.
github.com
모델 학습
데이터 표본이 충분하지 않아(400~500개) 모델 학습이 제대로 이루어지지 않은 것 같음.
몇 주 간 모델 학습 방식을 다양한 방식으로 수정해보았으나 결론적으로 모델 학습을 자연스러운 답변이 나오게끔 성공시키지는 못하였음.
프로젝트 삽입
최초에는 사용자가 대화형식으로 여행지를 추천해달라고 말하면 적절한 여행지를 추천해주는 방식으로 설계하고자 하였으나, 모델 학습이 자연스럽게 되지 않아 정해진 지역을 입력 받아서 추천해주는 방식으로 진행해보기로 하였음.
지역명을 dropdown으로 입력 받으면 모델이 답변하는 방식으로 진행하였고 Gradio를 이용하여 구현해보았음.
1. 학습된 모델 프로젝트에 삽입
- 모델의 경로는 모델 폴더 전체로 지정하면 됨.
2. python 코드 작성
import gradio as gr
from transformers import pipeline
# Fine-tuned KoGPT2 모델 로드
model_name = "./model/fine_tuned_kogpt2" # Fine-tuned 모델 경로
qa_pipeline = pipeline("text-generation", model=model_name, tokenizer=model_name)
# 여행지 추천 함수
def recommend_travel(location):
# 입력 텍스트 준비
prompt = f"{location} 여행지 추천해줘."
# KoGPT2 모델을 사용해 텍스트 생성
result = qa_pipeline(
prompt,
max_length=100, # 답변의 최대 길이
num_return_sequences=1, # 하나의 답변만 생성
top_p=0.95, # 확률 누적 분포 제한
temperature=0.9, # 무작위성 조정
repetition_penalty=1.8 # 반복 방지
)
generated_text = result[0]["generated_text"]
# 후처리: 마지막 온점(.) 이전까지 자르기
if "." in generated_text:
first_dot = generated_text.find(".") # 첫 번째 온점 위치
second_dot = generated_text.find(".", first_dot + 1) # 두 번째 온점 위치
if second_dot != -1: # 두 번째 온점이 존재할 경우
processed_text = generated_text[first_dot + 1:second_dot].strip() # 첫 번째 온점 뒤 ~ 두 번째 온점 앞
else:
processed_text = "" # 두 번째 온점이 없으면 빈 문자열
else:
processed_text = "" # 온점이 없으면 빈 문자열
return processed_text
# Dropdown에 제공할 지역 옵션
locations = ["강원", "경기", "경남", "경북", "광주", "대구", "대전", "부산", "서울", "울산", "인천", "전남", "전북", "제주", "충남", "충북"]
# Gradio 인터페이스 정의
iface = gr.Interface(
fn=recommend_travel, # 여행지 추천 함수 연결
inputs=gr.Dropdown(choices=locations, label="지역 선택", value="서울"), # Dropdown으로 지역 선택
outputs=gr.Textbox(label="추천 여행지"), # 출력: 텍스트
title="여행지 추천 서비스",
description="지역명을 선택하면 추천 여행지를 알려줍니다!"
)
# Gradio 앱 실행
if __name__ == "__main__":
iface.launch(server_name="0.0.0.0", server_port=7860)
3. Gradio 실행
1) 라이브러리 설치
pip install gradio transformers torch safetensors
2) 스크립트 실행
python travel_recommend.py
3) 브라우저 접속
http://localhost:7860
4. 테스트 결과
결론
모델 학습이 제대로 이루어지지 않은 이유를 충분하지 않은 데이터로 추측하지만, 모델이 적합하지 않았을수도 있을것이라 생각함. 모델 학습을 적절하게 하기 위해서는 어떤 방식으로 접근해야하는지 더 알아볼 필요가 있음.
'AI' 카테고리의 다른 글
[AI 스터디] 가중치(Weight), 학습률(Learning Rate), 기울기(Gradient)의 차이점 (0) | 2025.02.23 |
---|