HuggingFace LLM 모델 사용 실습

실습 설명

LLM 모델을 통해 동아리 모집 공고들을 요약한다.

  • 동아리는 총 12개로, 아래와 같다.
동아리명 모집공고
책나침반 인문·사회과학 도서를 함께 읽고 토론하는 독서 동아리입니다…
시네마포럼 상업 영화부터 독립 영화까지 다양한 작품을 감상하고 연출과…
디자인아틀리에 그래픽과 편집, 브랜딩 디자인 작업을 함께 진행하는 창작 동아리…
교육연결 교육 현장의 문제를 주제로 프로젝트를 기획하고 실행하는…
지역행동 지역 사회 문제 해결을 위한 기획과 봉사 활동을 함께하는…
창업아이디어랩 창업 아이디어를 발굴하고 사업 모델을 구체화하는 기획 중심…
글로벌교류 외국어 사용과 문화 교류 활동을 중심으로 운영되는 국제 교류…
예술과마음 미술 감상과 창작 활동을 통해 감정 표현과 자기 이해를 돕는 예술…
공공정책연구 사회 정책과 시사 이슈를 분석하고 토론하는 연구형 동아리입니다…
웰니스밸런스 운동과 마음 건강을 주제로 일상 속 균형을 찾는 동아리입니다…
여행기록단 국내외 여행을 통해 다양한 지역의 문화와 일상을 기록하는 여행…
사운드컬렉티브 밴드, 어쿠스틱, 작곡 등 다양한 음악 활동을 함께하는 음악…

준비

1
pip install transformers torch

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

model_name = "Qwen/Qwen2.5-7B-Instruct"

tokenizer = AutoTokenizer.from_pretrained(
    model_name,
    trust_remote_code=True
)

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto",
    trust_remote_code=True
)

posts = [
    ("책나침반", "인문·사회과학 도서를 함께 읽고 토론하는 독서 동아리입니다. 매주 한 권의 책 또는 지정된 분량을 읽고 핵심 주장과 개인의 관점을 공유합니다. 전공과 무관하게 비판적 사고와 글쓰기 능력을 기르고 싶은 학생을 모집합니다."),
    ("시네마포럼", "상업 영화부터 독립 영화까지 다양한 작품을 감상하고 연출과 메시지를 중심으로 토론하는 영화 동아리입니다. 자유로운 의견 교환을 통해 영화 감상의 깊이를 넓히는 것을 목표로 합니다."),
    ("디자인아틀리에", "그래픽과 편집, 브랜딩 디자인 작업을 함께 진행하는 창작 동아리입니다. 정기적인 작업 공유와 피드백을 통해 디자인 사고와 표현력을 키워 나갑니다. 경험 유무와 관계없이 참여할 수 있습니다."),
    ("교육연결", "교육 현장의 문제를 주제로 프로젝트를 기획하고 실행하는 동아리입니다. 학습 격차와 진로 탐색 등 다양한 교육 이슈를 다루며 실제 적용 가능한 결과물을 만드는 것을 목표로 합니다."),
    ("지역행동", "지역 사회 문제 해결을 위한 기획과 봉사 활동을 함께하는 동아리입니다. 현장 중심의 참여를 통해 사회적 책임과 협업 경험을 쌓고자 하는 학생을 모집합니다."),
    ("창업아이디어랩", "창업 아이디어를 발굴하고 사업 모델을 구체화하는 기획 중심 동아리입니다. 시장 조사와 사용자 분석, 발표 자료 제작을 통해 실무적인 기획 역량을 기릅니다."),
    ("글로벌교류", "외국어 사용과 문화 교류 활동을 중심으로 운영되는 국제 교류 동아리입니다. 회화 연습과 문화 발표를 통해 글로벌 감각을 키우고 싶은 학생에게 적합합니다."),
    ("예술과마음", "미술 감상과 창작 활동을 통해 감정 표현과 자기 이해를 돕는 예술 동아리입니다. 정기적인 전시 관람과 소규모 창작 프로젝트를 병행합니다."),
    ("공공정책연구", "사회 정책과 시사 이슈를 분석하고 토론하는 연구형 동아리입니다. 기사와 보고서를 기반으로 정책의 효과와 한계를 논의하며 논리적 사고력을 강화합니다."),
    ("웰니스밸런스", "운동과 마음 건강을 주제로 일상 속 균형을 찾는 동아리입니다. 가벼운 신체 활동과 스트레스 관리 경험을 공유하며 건강한 생활 습관을 만들어 갑니다."),
    ("여행기록단", "국내외 여행을 통해 다양한 지역의 문화와 일상을 기록하는 여행 동아리입니다. 소규모 여행 기획부터 답사, 사진 및 글 정리까지 함께 진행하며, 여행 경험을 콘텐츠로 남기는 것을 목표로 합니다. 여행을 좋아하고 기록에 관심 있는 학생을 모집합니다."),    
    ("사운드컬렉티브", "밴드, 어쿠스틱, 작곡 등 다양한 음악 활동을 함께하는 음악 동아리입니다. 정기적인 합주와 공연 준비를 중심으로 운영되며, 음악 장르나 실력에 관계없이 협업과 표현을 즐기고 싶은 학생이라면 참여할 수 있습니다.")
]

prompt = """
[지시사항]
- ■모집공고들을 동아리별로 요약하시오
- 요약할 때에는 ■요약형식 에 따라 작성합니다.

■요약형식
동아리 이름 : 
동아리 핵심 목표 : 
모집 기준 : 

■모집공고
"""

for post in posts:
    prompt += "\n" + post[0] + ":" + post[1]


inputs = tokenizer(
    prompt,
    return_tensors="pt"
).to(model.device)

outputs = model.generate(
    **inputs,
    max_new_tokens=2000,
    temperature=0.0,
    do_sample=False
)

summary = tokenizer.decode(
    outputs[0],
    skip_special_tokens=True
)

print(summary)

결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
동아리 이름 : 책나침반
동아리 핵심 목표 : 인문·사회과학 도서를 함께 읽고 토론하며 비판적 사고와 글쓰기 능력을 기르는 것
모집 기준 : 전공과 무관한 비판적 사고와 글쓰기 능력을 기르고 싶은 학생

동아리 이름 : 시네마포럼
동아리 핵심 목표 : 다양한 영화 작품을 감상하고 연출과 메시지를 중심으로 토론하며 영화 감상의 깊이를 넓히는 것
모집 기준 : 영화 감상의 깊이를 넓히고자 하는 학생

동아리 이름 : 디자인아틀리에
동아리 핵심 목표 : 그래픽과 편집, 브랜딩 디자인 작업을 통해 디자인 사고와 표현력을 키우는 것
모집 기준 : 경험 유무와 관계 없이 참여 가능

동아리 이름 : 교육연결
동아리 핵심 목표 : 교육 현장의 문제를 주제로 프로젝트를 기획하고 실행하며 실제 적용 가능한 결과물을 만드는 것
모집 기준 : 교육 이슈를 다루고 실제 적용 가능한 결과물을 만들고자 하는 학생

동아리 이름 : 지역행동
동아리 핵심 목표 : 지역 사회 문제 해결을 위한 기획과 봉사 활동을 통해 사회적 책임과 협업 경험을 쌓는 것
모집 기준 : 사회적 책임과 협업 경험을 쌓고자 하는 학생

동아리 이름 : 창업아이디어랩
동아리 핵심 목표 : 창업 아이디어를 발굴하고 사업 모델을 구체화하며 실무적인 기획 역량을 기르는 것
모집 기준 : 창업 관련 기획 역량을 기르고자 하는 학생

동아리 이름 : 글로벌교류
동아리 핵심 목표 : 외국어 사용과 문화 교류 활동을 통해 글로벌 감각을 키우는 것
모집 기준 : 글로벌 감각을 키우고 싶은 학생

동아리 이름 : 예술과마음
동아리 핵심 목표 : 미술 감상과 창작 활동을 통해 감정 표현과 자기 이해를 돕는 것
모집 기준 : 미술 감상과 창작 활동을 통해 감정 표현과 자기 이해를 원하는 학생

동아리 이름 : 공공정책연구
동아리 핵심 목표 : 사회 정책과 시사 이슈를 분석하고 토론하며 논리적 사고력을 강화하는 것
모집 기준 : 사회 정책과 시사 이슈를 분석하고 논리적 사고력을 강화하고자 하는 학생

동아리 이름 : 웰니스밸런스
동아리 핵심 목표 : 운동과 마음 건강을 주제로 일상 속 균형을 찾는 것
모집 기준 : 건강한 생활 습관을 만들고자 하는 학생

동아리 이름 : 여행기록단
동아리 핵심 목표 : 다양한 지역의 문화와 일상을 기록하며 소규모 여행 기획부터 답사, 사진 및 글 정리까지 진행하는 것
모집 기준 : 국내외 여행을 통해 다양한 지역의 문화와 일상을 기록하고 싶은 학생

동아리 이름 : 사운드컬렉티브
동아리 핵심 목표 : 밴드, 어쿠스틱, 작곡 등 다양한 음악 활동을 통해 협업과 표현을 즐기는 것
모집 기준 : 음악 장르나 실력에 관계 없이 협업과 표현을 즐기고 싶은 학생 ■요약형식 

코드 설명

사용 라이브러리

1
2
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
  • Hugging Face transformers 라이브러리 사용
  • Causal Language Model (텍스트 생성용) 을 불러오기 위한 준비
  • PyTorch 기반

모델 정보

1
model_name = "Qwen/Qwen2.5-7B-Instruct"
  • Alibaba에서 공개한 7B 파라미터 규모의 Instruct LLM
  • Instruct LLM : 사람의 지시를 잘 따르도록 학습된 생성 모델
  • 요약, 정보추출, 재구성 등 수행 가능

토크나이저

1
2
3
4
tokenizer = AutoTokenizer.from_pretrained(
    model_name,
    trust_remote_code=True
)
  • 텍스트 → 토큰 ID로 변환하는 도구
  • trust_remote_code=True : Qwen 모델이 자체 구현한 토크나이저/로직을 허용

모델 설정

1
2
3
4
5
6
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto",
    trust_remote_code=True
)
  • AutoModelForCausalLM : 다음 토큰을 예측하는 텍스트 생성 모델
  • torch_dtype=torch.float16 : 정밀도 지정
  • device_map=”auto” : GPU가 있으면 GPU로 자동 배치
torch_dtype 비트 수 특징 요약 주 사용 시점
torch.float32 32-bit 가장 안정적, 정확도 높음 CPU 추론, 연구·디버깅
torch.float16 16-bit 메모리 절반, 속도 빠름 GPU 추론 표준, 개인 GPU 환경
torch.bfloat16 16-bit 표현 범위 넓음, 안정성 우수 서버급 GPU (A100, H100 등)
torch.int8 8-bit 양자화, 메모리 대폭 절감 대규모 서빙, 저사양 환경
torch.int4 4-bit 초경량 양자화, 정확도 손실 큼 실험적 서빙, 리소스 극소 환경

프롬프트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
posts = [
    ...
]

prompt = """
[지시사항]
- ■모집공고들을 동아리별로 요약하시오
- 요약할 때에는 ■요약형식 에 따라 작성합니다.

■요약형식
동아리 이름 : 
동아리 핵심 목표 : 
모집 기준 : 

■모집공고
"""

for post in posts:
    prompt += "\n" + post[0] + ":" + post[1]
  • 정보 추출용 프롬프트 엔지니어링
  • LLM이 수행해야 할 사항과 출력 형식을 지정했다.

토크나이징 및 디바이스 이동

1
2
3
4
inputs = tokenizer(
    prompt,
    return_tensors="pt"
).to(model.device)
  • 아래와 같은 흐름이 일어남
  • 문자열 prompt → 토큰 ID 시퀀스로 변환 → torch.Tensor로 변환 → 모델이 올라간 GPU/CPU로 이동

텍스트 생성 (추론)

1
2
3
4
5
6
outputs = model.generate(
    **inputs,
    max_new_tokens=2000,
    temperature=0.0,
    do_sample=False
)
  • **inputs : 입력 프롬프트
  • max_new_tokens=2000 : 모델이 최대 2000 토큰까지 생성
  • temperature=0.0 : 랜덤성 제거, 가장 확률 높은 토큰만 선택
  • do_sample=False : 샘플링 비활성화, 결과를 최대한 결정적으로 만듦
  • 즉, 매번 거의 같은 “안정적인 요약 결과”를 얻기 위한 설정

결정적이다:
항상 확률 1위의 토큰을 선택한다. 따라서 출력이 거의 고정된다.
요약, 추출, 전처리 등에 잘 사용되곤 하는 옵션

디코딩 (토큰 to 문자열)

1
2
3
4
summary = tokenizer.decode(
    outputs[0],
    skip_special_tokens=True
)
  • 아래와 같은 흐름이 일어남
  • 모델이 생성한 토큰 ID → 사람이 읽을 수 있는 텍스트로 복원
  • skip_special_tokens=True : <s>, </s> 같은 내부 토큰 제거

Comments