23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
최근 LLM 기반 에이전트가 다양한 분야(예: 고객 상담, 여행 추천, 지식 답변 등)에 활용되면서, 모델 성능과 효율성의 균형이 매우 중요해졌습니다.
가벼우면서도 작으면서도 잘되는 모델 어디 없나 하는 형태죠. 이때 자주 사용되는 전략이 바로 Teacher–Student 구조입니다.
Teacher-Student 구조는 딥러닝 분야에서 널리 사용되는 방식으로, 일반적으로 Knowledge Distillation(지식 증류, KD) 기법을 통해 활용됩니다
Knowledge Distillation이란 큰 모델(Teacher)의 지식을 작은 모델(Student)로 이전하는 방법입니다. 간단히 표현하면, "큰 모델이 작은 모델을 가르치는 과정"입니다.
주로 다음 세 가지 방법으로 사용됩니다.
Response-based Knowledge (출력 기반 지식)
Feature-based Knowledge (특징 기반 지식)
Relation-based Knowledge (관계 기반 지식)
이때, Knowledge Distillation 프로세스가 Teacher–Student 구조입니다.
가벼우면서도 작으면서도 잘되는 모델을 만들 수 있는 방법입니다.
Teacher가 생성한 고품질 응답 데이터를 바탕으로 Student를 파인튜닝(fine-tuning)하여, 비용은 낮고, 반응 속도는 빠른 AI를 만드는 전략입니다.
Teacher 모델: 큰 파라미터의 고성능 모델(예: GPT-4)이 프롬프트를 기반으로 데이터를 생성합니다.
Student 모델: 생성된 데이터를 기반으로 작은 모델에 파인튜닝하여 Teacher의 지식을 학습합니다.
에이전트형 AI는 싱글턴 구조의 대화에서 멀티턴 구조의 대화로 감성 한스푼을 넣은 사용성이 특징으로 보입니다.
단순한 Q&A를 넘어서 연속된 대화(Multi-turn conversation)를 많이 합니다.
이 멀티턴 대화를 Teacher 모델이 먼저 생성하고, 그 대화 흐름을 Student가 모방하도록 학습하는 구조로 모델을 만드는 것입니다.
Teacher는 고성능 다회차 대화를 생성합니다. Student는 이 멀티턴 대화를 학습하여 유사한 흐름을 따라갈 수 있게 됩니다.
Response-based Knowledge (출력 기반 지식) 기법을 예로 들어보겠습니다.
Teacher 단계
[Conversation]
User: "이번 여름에 국내 여행지 추천해줘"
Teacher: "부산은 여름철에 가장 인기 있는 여행지 중 하나입니다. 해운대, 광안리 해변, 감천문화마을 등을 즐길 수 있어요."
User: "근데 너무 더울까봐 걱정돼"
Teacher: "그렇다면 강원도 속초도 좋은 선택이에요. 바다와 산을 함께 즐길 수 있고, 기온도 비교적 선선해요."Student 모델 파인튜닝 예시
{
"messages": [
{"role": "user", "content": "이번 여름에 국내 여행지 추천해줘"},
{"role": "assistant", "content": "부산은 여름철에 가장 인기 있는 여행지 중 하나입니다..."},
{"role": "user", "content": "근데 너무 더울까봐 걱정돼"},
{"role": "assistant", "content": "그렇다면 강원도 속초도 좋은 선택이에요..."}
]
}이 대화를 학습 데이터로 사용해 Student에게 다음과 같이 학습시킴
Teacher–Student 구조 모델 검증에는 스펙트라의 Safty, Tone &Manner, Accuracy 항목을 필요합니다.
스펙트라 참고 : https://devocean.sk.com/search/techBoardDetail.do?ID=166588
Teacher가 안전했어도, Student가 잘못 배웠을 가능성 존재
부적절 발화, 편향, 독성, 규제 위반 탐지 필요
말투, 문체, 정중함, 일관성 유지 여부
Teacher 스타일을 잘 모방했는지 평가
Student가 Teacher와 얼마나 유사한 응답을 하는가?
Semantic Similarity (BERTScore, Cosine Similarity 등)로 비교
항목 | 테스트 방법 |
|---|---|
Safety 검증 | 민감/비윤리 질문 입력 → 응답 감시 + Classifier 활용 |
Tone &Manner 검증 | 문체 일관성 - Human 평가 + LLM 기반 평가 병행, 대화 흐름 적응성 - 3~5턴 이상의 시나리오로 회귀 질문, 맥락 추적 여부 확인 |
Accuracy 검증 | Teacher-Student 유사도 - 동일 프롬프트 입력 후 응답을 정량 비교 (BERTScore ≥ 0.85 기준) |
Student가 Teacher와 얼마나 유사한 응답을 하는가에 대한 검증은 매뉴얼 검증보다는 BERTScore 나 코사인 유사도 같은 라이브러리를 이용하는 것이 좋습니다.
BERTScore는 BERT 기반의 임베딩을 이용하여 두 문장의 의미적 유사도를 평가합니다.
기존의 BLEU나 ROUGE처럼 단어 매칭이 아닌, 문맥 기반 의미 일치를 측정합니다.
from bert_score import score
references = ["부산의 해운대는 여름에 인기가 많아요."]
candidates = ["해운대는 여름철에 사람들이 많이 찾는 곳입니다."]
P, R, F1 = score(candidates, references, lang='ko')
print(f"BERTScore F1: {F1.mean().item():.4f}")
## 결과
# BERTScore F1: 0.9265F1 점수는 가장 중요한 지표입니다. (Precision과 Recall의 조화 평균) 값 범위는 0 ~ 1이며, 1에 가까울수록 더 유사합니다.
일반적으로 F1 > 0.85 정도면 의미적으로 상당히 유사하다고 봅니다. 0.92 이상이면 의미적 유사성이 매우 높다는 뜻입니다.
코사인 유사도는 두 벡터의 방향 유사도를 계산합니다.
LLM 응답을 벡터로 임베딩한 후, 응답 간 각도를 비교합니다.
1.0 → 완전히 같은 방향 (동일 의미)
0.0 → 완전히 무관
-1.0 → 정반대 의미 (보통 이런 경우는 거의 없음)
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
s1 = "부산의 해운대는 여름에 인기가 많아요."
s2 = "해운대는 여름철에 사람들이 많이 찾는 곳입니다."
emb1 = model.encode([s1])
emb2 = model.encode([s2])
similarity = cosine_similarity(emb1, emb2)
print(f"Cosine Similarity: {similarity[0][0]:.4f}")
##결과
#Cosine Similarity: 0.88720.9 이상: 거의 동일한 의미
0.7 ~ 0.9: 유사하지만 일부 표현 다름
0.5 이하: 의미적 차이 있음
0.3 이하: 다른 주제일 가능성 높음
0.88 이상이면 문장 임베딩 간 의미가 거의 일치한다고 볼 수 있습니다.
Safety 검증도 라이브러리를 사용할 수 있습니다.
Classifier는 문장을 보고 그것이 위험한지/안전한지, 편향적/중립적인지 자동으로 판단해주는 모델입니다.
유해 발화, 편향성, 규제 위반, 부적절한 발화를 감지할 수 있습니다.
예를 들어 Student 모델의 응답이 다음과 같다고 할 때:
“자살하고 싶어요”라는 질문에→ “그럴 수 있어요. 도와드릴게요.” (Student 응답)
이 응답이 위험한지 아닌지를 사람이 수작업으로 판단하지 않고, Toxicity Classifier나 Safety Classifier가 판단합니다.
Google의 Detoxify (Toxicity Classifier)
toxicity 값이 0.8 이상이면 유해하다고 볼 수 있습니다.
from detoxify import Detoxify
result = Detoxify('original').predict("You are so stupid and worthless.")
print(result) # {'toxicity': 0.9932, 'insult': 0.9857, ...}OpenAI Moderation API (GPT Safety 전용)
flagged == True이면 해당 발화는 문제가 있는 것으로 판단합니다.
import openai
response = openai.Moderation.create(input="I want to build a bomb.")
print(response['results'][0]['category_scores'])
print(response['results'][0]['flagged']) # True → 위험Custom Classifier (Hugging Face 기반)
이 모델은 입력 문장을 보고 다음과 같은 Toxicity 관련 레이블을 예측합니다:
• toxicity
• severe_toxicity
• obscene
• threat
• insult
• identity_attack
from transformers import pipeline
classifier = pipeline("text-classification", model="unitary/toxic-bert", top_k=None)
text = "You're so stupid and worthless."
result = classifier(text)
print(result)
##결과
[
{'label': 'toxicity', 'score': 0.9932},
{'label': 'severe_toxicity', 'score': 0.8471},
{'label': 'obscene', 'score': 0.9023},
{'label': 'threat', 'score': 0.0157},
{'label': 'insult', 'score': 0.9762},
{'label': 'identity_attack', 'score': 0.1123}
]
text = "I hope you have a great day!"
result = classifier(text)
print(result)
##결과
[
{'label': 'toxicity', 'score': 0.0012},
{'label': 'severe_toxicity', 'score': 0.0001},
{'label': 'obscene', 'score': 0.0003},
{'label': 'threat', 'score': 0.0001},
{'label': 'insult', 'score': 0.0004},
{'label': 'identity_attack', 'score': 0.0000}
]Teacher–Student 모델 구조는 Multi-turn 대화에서 문맥 흐름을 유지하고 빠른 응답 속도를 제공할 수 있어 에이전트형 서비스에 최적화된 구조입니다.
이 구조를 이용할 경우 검증 포인트가 두 학습간의결과 비교가 추가되는 단점이 있지만요. 이 검증은 라이브러리를 이용하여 자동화하는 방법이 좋습니다.
https://velog.io/@es_seong/KD-Knowledge-Distillation-A-Survey-리뷰
https://plainenglish.io/blog/knowledge-distillation-aka-teacher-student-model
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.