느리지만 꾸준히, 코딩

업스테이지 NLP 경진대회 본문

프로그래밍/AI

업스테이지 NLP 경진대회

slowin 2025. 3. 26. 18:14

대회 개요

대회명

  • Dialogue Summarization | 일상 대화 요약

대회일정

  • 2025.03.12 ~ 2025.03.24

  • One Team 6th

대회 소개

  • 주어진 데이터를 활용하여 일상 대화에 대한 요약을 효과적으로 생성하는 모델을 개발
  • 제공되는 데이터셋은 오직 "대화문과 요약문"
  • https://github.com/cylnlp/dialogsum

평가지표

  • Rouge-1
    • 모델 요약본과 참조 요약본 간에 겹치는 unigram의 수를 비교
  • Rouge-2
    • 모델 요약본과 참조 요약본 간에 겹치는 bigram의 수를 비교
  • Rouge-L
    • LCS 기법을 이용해 최장 길이로 매칭되는 문자열을 측정합니다. n-gram에서 n을 고정하지 않고, 단어의 등장 순서가 동일한 빈도수를 모두 세기 때문에 보다 유연한 성능 비교
  • ROUGE-F1
    • ROUGE-Recall과 ROUGE-Precisioin의 조화 평균입니다
  • 문장 토큰화
    • 한국어 데이터 특성 상 정확한 ROUGE score 산출하기 위하여 문장 토큰화를 진행한 후 평가
    • 한국어 형태소 분석기를 통해 의미를 갖는 최소한의 단위인 형태소 단위로 문장을 쪼갠 뒤 모델이 생성한 문장과 정답 문장을 비교하여 ROUGE score를 산출

문제 정의

Chat GPT
Claude
대회 훈련데이터

  • ChatGPT, Claude, 실제 훈련데이터의 요약 스타일은 각각 다름
  • 서로 다른 요약 스타일로 요약 품질을 좋고 나쁨으로 판단하기 난해함
  • Rouge-1, Rouge-2, Rouge-L 같은 평가 지표 활용
  • 그러나 여전히 근본적 질문 존재: 
    • 좋은 요약이란 무엇인가? 해결하고자 하는 포인트는?
좋은 요약이란 무엇인가?
  • 정보 보존이 중요한가, 문장 유창성이 중요한가, 핵심만 압축하는 것이 더 나은가?
  • 사용자의 목적에 따라 기준이 달라질 수 있음.

EDA

대화문 / 요약문 길이 분포

 

Train

max dialogue len  : 606 

max summary len : 99

Dev

max dialogue len  : 337 

max summary len : 52

Test

max dialogue len  : 577 

  • Train Set은 가장 긴 대화 데이터를 포함하며, 모델이 긴 문맥도 학습할 수 있도록 설계됨
  • Summary Length는 모두 100 이하로 비교적 짧고 간결한 요약을 요구함.
  • Test Set은 요약이 제공되지 않아, 생성된 요약의 품질 평가용으로 활용됨

요약비율

mean         0.200244

std          0.060514

min          0.038462

25%          0.161074

50%          0.192982

75%          0.229167

max          0.793103

  • 전체 분포의 평균값은 약 0.200으로, 전반적으로 낮은 비율 분포를 보임
  • 표준편차는 0.06 수준으로, 분포의 변동성이 크지 않음
  • 최솟값은 0.038, 일부 케이스는 거의 요약이 되지 않았거나 비정상적으로 짧은 경우 존재
  • 최댓값은 0.79로, 특정 케이스는 원문에 가까운 긴 요약도 존재

  • "극한으로 짧은 요약을 이상 데이터로 가져가야하는가?" 에 대한 고민

발화자 토큰

Train

['#Person1', '#Person2', '#Person3', '#Person4', '#Person5', '#Person6', '#Person7']

 

Dev

['#Person1', '#Person2', '#Person3', '#Person4']

 

Test

['#Person1', '#Person2', '#Person3']

 

  • 전체적으로 Train 데이터가 가장 다양한 화자(Person)를 포함하고 있어, 모델이 다양한 대화 구조를 학습할 수 있음
  • Dev와 Test는 등장 인물 수가 줄어들며, 대화 구조가 단순화되어 있음 → 모델이 평가 구간에서는 더 제한된 화자 구성에 노출됨
  • 이는 Train → Dev/Test 간 분포 차이(distribution shift)를 유발할 수 있으며, 특히 다중 화자 요약 성능에 영향을 줄 가능성 있음

포인트

  • 다자간 대화(multi-party dialogue)에 강한 모델을 만들고자 한다면, → Train의 다양한 화자 구조를 충분히 활용한 학습 전략이 필요
  • 평가(Dev/Test)에서는 단일/소수 화자 구조 중심이므로, → 모델의 요약 일반화 성능을 평가하기에 더 정제된 테스트 환경

스페션 토큰

Train : 

['#Address#', '#CarNumber#', '#CardNumber#', '#DateOfBirth#', '#Email#', '#PassportNumber#', '#Person#', '#PhoneNumber#', '#SSN#']

 

Dev : 

['#Address#', '#DateOfBirth#', '#PhoneNumber#']

 

Test : 

['#Address#', '#PassportNumber#', '#PhoneNumber#']

  • #SSN#, #CardNumber#, #CarNumber# 등은 Train에만 존재 → Train-Test 간 도메인 불일치(possible domain gap) 발생 가능
  • Test에서는 일부 스페션 토큰 종류만 포함되므로, → 평가 지표가 모델의 전체 스페션 토큰 대응 능력을 완전히 반영하지 못할 수 있음

왜 스페셜 토큰을 토크나이저에 추가해야 할까요?

1. 토크나이저는 텍스트를 “조각”으로 나눔

text = "제 이름은 #Person#이고, 전화번호는 #PhoneNumber#입니다."

스페셜 토큰을 추가하지 않으면?

#Person#이 다음과 같이 쪼개질 수 있음

['#', 'Person', '#'] 또는 ['#Per', 'son#']

이렇게 되면 모델은 이 토큰을 하나의 의미 있는 단어로 인식하지 못함

자연어 처리(NLP)에서 **스페셜 토큰(Special Tokens)**은 모델이 입력 텍스트를 효과적으로 이해하고 처리할 수 있도록 돕는 특별한 기호입니다. 이러한 토큰은 문장의 구조를 명확히 하거나, 특정한 의미를 부여하는 데 사용됩니다.

스페셜 토큰의 역할과 필요성
1. 문장 경계 표시: 모델이 문장의 시작과 끝을 정확히 파악하도록 돕습니다. 예를 들어, BERT 모델에서는 [CLS] 토큰이 문장의 시작을, [SEP] 토큰이 문장의 구분을 나타냅니다.
2. 특정 태스크 지시: 모델에게 현재 수행 중인 작업의 종류를 알려줍니다. 예를 들어, [MASK] 토큰은 마스킹된 언어 모델링에서 가려진 단어를 나타내는 데 사용됩니다.
3. 특수한 의미 부여: 개인정보와 같은 특정 정보를 일반화하여 모델이 이를 한 단위로 인식하고 처리할 수 있도록 합니다. 예를 들어, #Person#, #PhoneNumber#와 같은 토큰을 사용하여 이름이나 전화번호를 일반화할 수 있습니다.

스페셜 토큰은 NLP 모델이 입력 텍스트를 보다 정확하게 이해하고 처리하는 데 중요한 역할을 합니다. 특히, 특정 태스크나 도메인에 맞게 모델을 조정할 때, 스페셜 토큰의 활용은 모델의 성능 향상에 큰 도움이 됩니다. 따라서, 토크나이저에 적절한 스페셜 토큰을 추가하고, 모델이 이를 인식하도록 조정하는 것은 효과적인 NLP 모델 구축을 위한 중요한 과정입니다.

 


대화분석

#Person1#: 속았어! ㅋㅋ.. 완전 속았어.
#Person1#: 곧 봐! 안녕! 휴.. 드디어 끝났네. . . 나는 그 여자나 그녀의 건방진 딸을 참을 수 없어.
#Person2#: 남편의 이름은 린이에요, L - I - N.
#Person2#: 저는 L. A.에 머물렀고, 주말 내내 날씨가 맑았습니다. 대부분의 시간을 집에서 보냈지만 크리스마스날에는 킹콩을 보러 갔습니다.
#Person1#: 알겠습니다. 그럼 22파운드입니다.
#Person1#: 트럭 하나에 대략 200 위안 정도야.
#Person1#: 와!
감정 표현 과다 ‘ㅋㅋ’, ‘와!’, ‘휴…’ 등 감정적 표현 많음
언어 코드 혼용 영어 스펠링이나 단어(L-I-N, L.A.)가 한글과 함께 등장
단위 혼합 파운드, 위안 등 여러 화폐 단위가 혼재되어 있음
주제 다양성
일상 감정, 영화 관람, 위치 정보, 가격 협상 등 주제가 매우 다양함

 

데이터 전처리 예시

 #Person1#: 속았어! ㅋㅋ.. 완전 속았어.  -> 속았어! [웃음] . 완전 속았어.

 

실험

FP16

  • FP16은 16비트 부동소수점 형식으로, FP32(32비트 부동소수점)보다 낮은 비트 수를 사용하여 데이터를 표현
  • 이는 메모리 사용량을 절감하고 연산 속도를 높이는 데 도움
  • 그러나 정밀도가 낮아져 연산 오차가 발생할 수 있으므로, FP32와 FP16을 혼합하여 사용하는 혼합 정밀도를 활용 할 수 있음

Open Model

Gemma-3 모델을 활용한 요약 실험

프롬프트:

prompt:
당신은 한국어 대화 내용을 간결하게 요약하는 모델입니다.

#Person1#:더슨 씨, 받아쓰기 좀 해주세요.
#Person2#: 네, 실장님...
#Person1#: 이것은 오늘 오후까지 모든 직원에게 내부 메모로 전달되어야 합니다. 준비되셨나요?
#Person2#: 네, 실장님. 시작하셔도 됩니다.
#Person1#: 모든 직원들에게 주의하라... 즉시 효력을 발휘하여, 모든 사무실 통신은 이메일 통신과 공식 메모로 제한됩니다. 근무 시간 동안 직원들이 즉시 메시지 프로그램을 사용하는 것은 엄격히 금지됩니다.…
#Person1#: 그들은 그들의 의사소통 방법을 바꾸어야만 합니다. 이 사무실에서 누구도 즉시 메시지를 사용하지 않기를 원합니다. 너무 많은 시간을 낭비하게 됩니다! 이제, 메모를 계속해주세요. 우리가 어디까지 했나요?
#Person2#: 이것은 내부와 외부 통신에 적용됩니다.
#Person1#: 그렇습니다. 즉시 메시지를 계속 사용하는 어떤 직원이라도 먼저 경고를 받고 직무 정지에 처해질 것입니다. 두 번째 위반 시에는 직원은 해고에 처해질 것입니다. 이 새로운 정책에 대한 어떤 질문이라도 부서장에게 직접 문의하면 됩니다.
#Person2#: 그게 다신가요?
#Person1#: 네. 이 메모를 오후 4시 전에 모든 직원에게 타이핑하여 배포해 주세요.

출력: 

실장이 모든 직원에게 내부 메모를 통해 사무실 내 모든 통신(내부 및 외부)에서 즉시 메시지 사용을 금지하는 새로운 정책을 발표했습니다. 이를 위반할 경우 경고, 직무 정지, 해고될 수 있습니다. 메모는 오후 4시까지 모든 직원에게 배포되어야 합니다.

 

  • 특별하게 fine-tuning없이도 프롬프트 엔지니어링 만으로 요약이 가능한것을 확인
  • 하지만, 원하는 스타일의 요약 출력에 한계점 존재

incontext-learning 진행

 

One-Shot

당신은 한국어 대화 내용을 간결하게 요약하는 모델입니다.
주어진 대화 전문을 읽고, 그 대화의 핵심 내용(주요 행동, 요청, 결정사항 등)을 한 문장으로 요약하세요.
반드시 JSON 형식으로 summary 키를 가진 JSON 형식으로 반환하세요. 

요약예시:
대화:
...

요약:
...

대화:
#Person1#:더슨 씨, 받아쓰기 좀 해주세요.
#Person2#: 네, 실장님...
#Person1#: 이것은 오늘 오후까지 모든 직원에게 내부 메모로 전달되어야 합니다. 준비되셨나요?
#Person2#: 네, 실장님. 시작하셔도 됩니다.
...
요약:

출력:

#Person1#은 모든 사무실 통신을 이메일과 공식 메모로 제한하는 새로운 정책을 발표하고, 즉시 메시지 사용을 금지합니다. 위반 시 경고, 정지, 해고될 수 있습니다. #Person2#는 정책의 적용 범위에 대해 질문하고, #Person1#은 오후 4시까지 메모를 배포하도록 지시합니다.
  • 원하는 스타일과 유사하게 출력되는 것을 확인

가정: 그렇다면, Few-Shot을 시도한다면 적합한 출력을 할것인가?

당신은 한국어 대화 내용을 간결하게 요약하는 모델입니다.
주어진 대화 전문을 읽고, 그 대화의 핵심 내용(주요 행동, 요청, 결정사항 등)을 한 문장으로 요약하세요.
반드시 JSON 형식으로 summary 키를 가진 JSON 형식으로 반환하세요.
요약예시:
대화1

요약1

대화2

출력:

더슨 씨는 모든 직원을 대상으로 즉시 메시지 사용을 금지하는 새로운 정책을 발표하고, 이를 위반하는 직원은 경고, 정직, 해고될 수 있다고 경고합니다.
  • 좀 더 적합한 스타일로 출력 되는것을 확인
새로운 고민
비슷한 대화를 넣어주면 좋을까?
비슷한 대화는 어떻게 찾지?

 

Embedding

`jinaai/jina-embeddings-v3` 모델 활용

  • Embedding 된 값을 활용하여 코사인 유사도를 통해 비숫한 대화를 Few-Shot으로 활용
  • 크게 성능에 도움되지 않는것을 확인
요약 스타일을 학습시키는 방법이 없을까?

 

DPO(Direct Preference Optimization)

 

  • 요약은 단순히 문장을 짧게 줄이는 작업이 아닙니다. 어떤 내용을 강조할지, 어떤 어조를 쓸지, 문장의 구조를 어떻게 정리할지 등은 모두 사람마다 다른 스타일에 해당합니다.
  • DPO는 Direct Preference Optimization, 즉 직접적인 선호 최적화를 의미
  • 기존의 RLHF(Reinforcement Learning with Human Feedback)와는 달리, 사람의 선호만으로 모델을 직접 fine-tuning할 수 있는 방법입니다.
    • 보상 모델(reward model)이 필요 없음
    • 쌍의 비교만으로 학습 가능
    • 더 간단하고 안정적인 방식

DPO 학습코드 일부

문제발생

#Person1#은 아홉시 반 기차를 타야 한다. #Person2#는 #Person1#이 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지 늦게까지….
  • 최대 토큰 길이까지 끝나지 않는 추론

  • decoder_input에 eos_token도 같이 붙이기 (훈련 시 학습 안정화 도움)
요약:
#Person1#은 #Person2#의 건강검진을 받고 담배를 끊도록 권했습니다.
  • 시간적 여유가 없어 많은 데이터로 학습하지 못하였지만,
  • 의미있는 시도정도로 마무리

한국어 모델 시도

 

 


데이터 증강

Solar Pro 활용

  • Embedding + 코사인 유사도 를 활용
  • 비슷한 대화를 Few Shot 작용


최종 결론

 

좋은 요약이란 무엇인가? 무엇을 해결해야할까?
  • 요약은 단순히 문장을 줄이는 작업이 아닙니다.
  • 좋은 요약의 조건
    • 핵심 주제가 명확해야 함 : 글에서 가장 중요한 내용을 빠짐없이 담아야 함
    • 불필요한 정보는 제거 : 군더더기 없이 핵심만 간결하게 전달
    • 문장 구조가 깔끔해야 함 : 독자가 쉽게 이해할 수 있도록 자연스럽게 정리
    • 요약 스타일이 일관성 있게 유지 :  목적에 맞는 어조/형식으로 표현 (예: 논문, 블로그, 뉴스 등)

해결을 위한 방향

1.  스타일에 최적화된 학습 필요

  • 동일한 내용도 요약 스타일에 따라 표현이 완전히 달라질 수 있음
  • 따라서 원하는 스타일(간결한, 감성적인, 기술적인 등)에 맞는 DPO 학습 또는 SFT(Supervised Fine-tuning) 진행

2.  데이터 증강을 통한 다양성 확보

  • 한 입력에 대해 여러 요약 버전을 생성 → 다양한 표현 학습
  • 사람 피드백이 가능하다면 → DPO로 선호 스타일 반영

3.  정제된 전처리 및 토큰 설정

  • eos_token 처리 누락, 잘못된 padding 등으로 인한 무한 반복 방지
  • 학습 시 시작/끝 토큰, attention mask 등을 신경 써야 함

 

'프로그래밍 > AI' 카테고리의 다른 글

업스테이지 CV 경진대회 정리  (0) 2025.03.02
tensor: dim 이해하기  (0) 2025.02.11
역전파  (0) 2025.02.10
머신 러닝 발전 5단계  (0) 2025.02.10
딥러닝 학습노트  (0) 2025.02.10