LLM

작사 LLM 제작 - 2. 키워드 추출과 데이터셋 구축

skydance_blog 2025. 8. 8. 13:38
728x90
반응형

앞선 1편에서는 공개 가사 데이터셋을 전처리하여
불필요한 문장과 이상치를 제거하고, 10,744개의 가사로 정제하는 과정을 다뤘습니다.

 

이번 글에서는 이 데이터를 기반으로 각 가사에서 핵심 키워드를 추출하고,
LLM 학습에 사용할 수 있는 형태의 데이터셋으로 구축한 과정을 소개합니다.

 

 

 

💡 오프라인 작동을 위한 구조 설계

이 프로젝트의 목표 중 하나는 다음과 같습니다:

“인터넷 연결 없이도 작동하는 완전한 오프라인 작사 LLM 제작”

 

따라서 키워드 추출 또한 오프라인 상태에서 실행 가능한 모델로 구현해야 했습니다.
이를 위해 Hugging Face에서 제공하는 경량 LLM인 google/gemma-2-2b 모델을 선택하여,
로컬 환경에 다운로드한 후 모든 추출 작업을 진행했습니다.

 

from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
import torch

# 저장된 로컬 경로
local_dir = "./hug_model/gemma-2-2b/"

# 모델과 토크나이저 불러오기
tokenizer = AutoTokenizer.from_pretrained(local_dir)
model = AutoModelForCausalLM.from_pretrained(local_dir, torch_dtype=torch.float16)

 

 

 

⚙️ 키워드 추출 방식

  • 모델: gemma-2-2b
  • 입력: 각 곡의 가사 전체
  • 출력: 해당 곡을 대표하는 키워드 5개
  • 프롬프트: 단순 지시문 형태 (예: "중요한 키워드 5개를 뽑아주세요.")

 

import time

# 입력 프롬프트
qqq = "중요한 키워드 5개를 뽑아주세요."

for i in range(len(df1)):

    # 실행 시간 측정 시작
    start_time = time.time()
    
    print()
    print()
    print(str(i) + "/" + str(len(df1) - 1))
    prompt = df1['Lyric'][i] + ". " + qqq
    inputs = tokenizer(prompt, return_tensors="pt")

    # 스트리밍 출력 포함한 생성
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=100,
            do_sample=True,
            temperature=0.7,
            pad_token_id=tokenizer.eos_token_id,
        )

    ##################################################
    # 입력 토큰 길이 확인
    input_length = inputs["input_ids"].shape[1]
    
    # 입력 이후의 토큰만 디코딩 → 프롬프트 제외하고 모델 출력만 얻음
    generated_tokens = outputs[0][input_length:]
    response = tokenizer.decode(generated_tokens, skip_special_tokens=True)
    
    # 최종 출력
    print(response.strip())
    ##################################################

    # 실행 시간 측정 종료
    end_time = time.time()
    print(f"실행 시간: {end_time - start_time:.2f} 초")

 

 

 

⏱️ 소요 시간 비교

환경곡당 처리 시간총 소요 시간 (약 10,700곡)
오프라인 (CPU-only) 약 250초 약 740,000초 ≈ 205시간
GPU (RTX 3090) 사용 약 3초 약 32,000초 ≈ 9시간

🚀 최종적으로 RTX 3090 환경에서 키워드 추출을 수행하여 약 9시간이 소요되었습니다.

 

 

 

🧹 키워드 후처리 (NLP)

모델이 생성한 키워드는 완벽하지 않았습니다.

  • 불필요한 설명 : "키워드 5개는 다음과 같습니다", "~를 의미합니다" 등
  • 특수문자 : 강조용 특수문자(**), 설명용 특수문자(:) 등

 

이러한 단어들을 제거하기 위해 간단한 NLP 후처리를 진행했습니다:

  • 정규표현식으로 특수문자 제거
  • 불필요한 문장 필터링

 

이후, 각 가사당 추출된 5개 키워드를 다음과 같이 저장했습니다:

 

 

 

🧹 키워드 추출 실패 가사 제거

일부 가사에 대해서는 LLM이 적절한 키워드를 추출하지 못했습니다.
이 경우 별도로 재처리하지 않고 과감히 삭제하여 데이터 품질을 유지했습니다.

모델 기반 작사 LLM에서는 학습 데이터의 품질이 양보다 중요하다고 판단했습니다.

 

 

 

🧩 최종 데이터셋

이제 각 가사에 대해 다음과 같은 정보를 가진 학습 데이터를 확보하게 되었습니다:

Column설명
Lyric 원문 가사 (전처리 완료본)
key1 ~ key5 해당 가사의 대표 키워드
 

이 데이터셋은 이후 작사 LLM의 fine-tuning 및 keyword-to-lyrics 생성 모델 학습에 직접 활용됩니다.

 

 

 

🔜 다음 이야기

다음 글에서는 이렇게 구축한 키워드 + 가사 데이터셋을 이용해,
QLoRA 방식으로 작사 LLM을 튜닝하는 과정을 소개하겠습니다.
오프라인에서도 작동 가능한 소형 LLM을 활용해, 키워드 → 가사 생성 모델을 만드는 단계입니다.

📌 3편 예고: "작사 LLM 제작 - 3. QLoRA를 통한 LLM 튜닝"

 

728x90
반응형