앞선 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} 초")
⏱️ 소요 시간 비교
| 오프라인 (CPU-only) | 약 250초 | 약 740,000초 ≈ 205시간 |
| GPU (RTX 3090) 사용 | 약 3초 | 약 32,000초 ≈ 9시간 ✅ |
🚀 최종적으로 RTX 3090 환경에서 키워드 추출을 수행하여 약 9시간이 소요되었습니다.
🧹 키워드 후처리 (NLP)
모델이 생성한 키워드는 완벽하지 않았습니다.
- 불필요한 설명 : "키워드 5개는 다음과 같습니다", "~를 의미합니다" 등
- 특수문자 : 강조용 특수문자(**), 설명용 특수문자(:) 등
이러한 단어들을 제거하기 위해 간단한 NLP 후처리를 진행했습니다:
- 정규표현식으로 특수문자 제거
- 불필요한 문장 필터링
이후, 각 가사당 추출된 5개 키워드를 다음과 같이 저장했습니다:
🧹 키워드 추출 실패 가사 제거
일부 가사에 대해서는 LLM이 적절한 키워드를 추출하지 못했습니다.
이 경우 별도로 재처리하지 않고 과감히 삭제하여 데이터 품질을 유지했습니다.
모델 기반 작사 LLM에서는 학습 데이터의 품질이 양보다 중요하다고 판단했습니다.
🧩 최종 데이터셋
이제 각 가사에 대해 다음과 같은 정보를 가진 학습 데이터를 확보하게 되었습니다:
| Lyric | 원문 가사 (전처리 완료본) |
| key1 ~ key5 | 해당 가사의 대표 키워드 |
이 데이터셋은 이후 작사 LLM의 fine-tuning 및 keyword-to-lyrics 생성 모델 학습에 직접 활용됩니다.
🔜 다음 이야기
다음 글에서는 이렇게 구축한 키워드 + 가사 데이터셋을 이용해,
QLoRA 방식으로 작사 LLM을 튜닝하는 과정을 소개하겠습니다.
오프라인에서도 작동 가능한 소형 LLM을 활용해, 키워드 → 가사 생성 모델을 만드는 단계입니다.
📌 3편 예고: "작사 LLM 제작 - 3. QLoRA를 통한 LLM 튜닝"
'LLM' 카테고리의 다른 글
| 작사 LLM 제작 – 4. Suno AI와의 결합으로 곡 완성하기 (4) | 2025.08.09 |
|---|---|
| 작사 LLM 제작 – 3. QLoRA를 통한 LLM 튜닝 (0) | 2025.08.09 |
| 작사 LLM 제작 - 1. 데이터 전처리 (4) | 2025.08.08 |