본문 바로가기
고민의 흔적../AI Agent 행동예측 해커톤

(연구일지 #15 최종 모델 선정)Dacon AI Agent 행동 예측 대회

by sungjinp0805 2026. 7. 25.

메타데이터를 어디에 넣을 것인가: metaT와 최종 0.786697

v58에서 0.7840764953을 기록한 뒤에도 여러 후보를 교체하며 앙상블을 조금씩 다듬었다.

그 과정에서 mint2의 rolling-window 변형을 사용한 mint2b seed79 모델이 기존 멤버를 대체했고,

챔피언 점수는 0.7848461512까지 올라갔다.

 

당시 앙상블은 다음과 같았다.

  • 고전 ML
  • RoBERTa seed48
  • kf-deberta seed81
  • mint2b seed79

이 시점에는 단순히 seed를 바꾸거나 비슷한 kf-deberta 모델을 추가로 학습하는 방식만으로 큰 상승을 기대하기 어려웠다.

그래서 새로운 모델을 하나 더 만드는 대신, 기존 모델이 입력에 포함된 정보를 실제로 얼마나 잘 활용하고 있는지를 다시 살펴봤다.

특히 공식 데이터에 이미 존재하지만 기존 Transformer 입력에서는 충분히 드러나지 않았던 메타데이터가 눈에 들어왔다.

  • 언어 선호
  • 남은 토큰 예산
  • 세션 경과 시간
  • 작업 공간
  • 언어 혼합 상태

기존 모델도 수치형 메타 피처를 사용하고 있었기 때문에, 문제는 메타데이터의 유무가 아니었다.

같은 정보를 숫자 피처로 전달하는 것과, Transformer가 현재 요청의 문맥으로 직접 읽게 하는 것은 어떤 차이를 만들까?

이 질문에서 META-N과 META-T 실험이 시작됐다.


메타데이터를 사용하고 있었지만, 모두 잘 전달하고 있지는 않았다

기존 Transformer 모델은 이미 약 119개의 수치형 메타 피처를 CLS 벡터와 결합하고 있었다.

따라서 단순히 “메타데이터를 추가한다”는 것은 새로운 아이디어가 아니었다.

 

하지만 공식 데이터에 포함된 정보 중 일부는 기존 피처에 충분히 반영되지 않았다.

대표적으로 다음과 같은 정보였다.

  • 사용자의 언어 선호
  • 남은 토큰 예산
  • 세션 경과 시간
  • 작업 공간의 위치
  • 사용 언어의 혼합 상태

이 정보들은 다음 행동을 판단하는 데 의미가 있을 가능성이 있었다.

예를 들어 토큰 예산이 적게 남았다면 긴 탐색보다 바로 수정하거나 답변할 가능성이 커질 수 있다.

 

작업 공간과 언어 조합에 따라서도 같은 요청에서 선택하는 도구가 달라질 수 있었다.

문제는 이 정보를 어떤 형태로 모델에 전달할 것인가였다.


두 가지 전달 방식을 만들다

같은 세 번째 슬롯을 교체하는 두 후보를 만들었다.

두 후보 모두 기존 mint2b seed79의 사전학습 결과를 사용했고, 나머지 앙상블 구성도 유지했다.

차이는 추가 메타데이터를 전달하는 방식이었다.

META-N: 숫자 피처로 확장

첫 번째 모델은 추가 정보를 수치형 metadata vector에 넣었다.

기존 119차원 메타 피처를 125차원으로 확장하고 다음과 같은 언어·환경 관련 플래그를 추가했다.

  • Kotlin
  • Vue
  • Swift
  • Jupyter Notebook
  • TensorFlow
  • 혼합 언어 선호

기존 구조와 가장 자연스럽게 이어지는 방식이었다.

Transformer는 대화의 의미를 읽고, 별도의 numeric head가 상태 정보를 처리하도록 했다.

META-T: 트랜스크립트에 직접 기록

두 번째 모델은 numeric vector의 차원을 늘리지 않았다.

대신 Transformer가 읽는 [META] 문장에 공식 메타데이터를 직접 포함했다.

예를 들면 다음과 같은 형태였다.

[META]
language_pref=ko
budget=...
elapsed=...
workspace=...
language_mix=...
 

즉, 같은 상태 정보를 별도의 숫자 벡터로만 넘기는 대신, Transformer가 다른 대화 문맥과 함께 읽을 수 있도록 만든 것이다.

두 접근의 질문은 달랐다.

추가 상태 정보를 기존 numeric head에 넣는 것이 좋은가, 아니면 Transformer가 문맥의 일부로 읽게 하는 것이 좋은가?


META-N과 META-T의 결과

기준이 된 기존 앙상블의 LB는 0.7848461512였다.

두 모델의 결과는 다음과 같았다.

기존 앙상블 mint2b seed79 0.7848461512
META-N 추가 메타를 숫자 피처에 반영 0.7850069558
META-T 추가 메타를 트랜스크립트에 반영 0.7866536897

META-N은 기존 모델보다 0.00016 상승했다.

작지만, 추가 수치 정보가 완전히 무의미하지는 않다는 결과였다.

 

반면 META-T는 기존 챔피언보다 약 0.00181 상승했다.

세 번째 슬롯을 META-T로 교체한 것만으로 비교적 큰 폭의 신기록이 나왔다.

 

이 결과를 근거로 “텍스트 입력이 숫자 입력보다 항상 우수하다”고 결론 내릴 수는 없었다.

META-N과 META-T는 전달 채널뿐 아니라 포함한 필드 구성에도 차이가 있었고, 각각 하나의 학습 결과만 비교했다.

완벽하게 통제된 순수 채널 비교는 아니었다.

 

하지만 기존 모델과의 차이는 분명했다.

세션 상태를 Transformer가 읽을 수 있는 문맥으로 제공했을 때, 해당 정보가 실제 예측에 전달됐다.


왜 트랜스크립트 표현이 도움이 됐을까

기존 numeric metadata는 각 값을 독립적인 수치 피처로 처리했다.

예를 들어 예산, 세션 시간, 언어 선호는 별도의 숫자나 플래그로 전달됐다.

 

반면 META-T에서는 이 정보가 현재 프롬프트와 같은 입력 안에 존재했다.

Transformer는 다음 관계를 함께 볼 수 있었다.

  • 현재 요청과 남은 예산
  • 사용 언어와 파일 종류
  • 세션이 진행된 시간과 현재 행동
  • 작업 공간의 특성과 도구 선택

즉, 단순히 상태값을 추가한 것이 아니라 상태와 현재 요청의 관계를 Transformer가 직접 해석할 수 있게 만든 것이었다.

 

이 결과는 이전의 관계형 피처 실험과도 연결됐다.

기존 메타데이터를 많이 넣는 것만으로는 부족했다.

현재 요청과 과거 행동, 현재 상태가 어떤 관계에 있는지를 모델이 사용할 수 있는 형태로 전달해야 했다.

 

META-T에서는 그 관계를 수동으로 모두 설계하지 않고, Transformer가 텍스트 문맥 안에서 학습하도록 했다.


모든 메타데이터를 두 채널에 넣으면 더 좋아질까

META-T의 성공 이후에는 자연스럽게 다음 질문이 생겼다.

숫자 피처와 트랜스크립트 양쪽에 정보를 모두 넣으면 더 좋아지지 않을까?

이를 확인하기 위해 수치형 확장과 트랜스크립트 확장을 동시에 적용한 ALL-INFO 모델도 만들었다.

하지만 결과는 META-T보다 낮았다.

 

정보를 더 많이 제공했지만 성능이 더 좋아지지는 않았다.

이 결과에서 중요했던 것은 “메타데이터가 적을수록 좋다”는 결론이 아니었다.

같은 정보를 여러 채널에 반복해서 넣으면 모델이 이를 더 잘 사용하는 것이 아니라,

특정 신호를 중복해서 학습하거나 기존 멤버와 더 비슷한 예측을 만들 수 있었다.

 

앙상블에서는 한 모델의 개별 성능뿐 아니라 다른 멤버와 다른 판단을 만드는 것도 중요했다.

유용한 정보를 추가하는 것과, 앙상블에 유용한 새로운 멤버를 만드는 것은 같은 문제가 아니었다.


META-T를 하나 더 넣어도 좋아지지 않았다

META-T가 강한 모델이라면 기존 seed81까지 META-T 방식으로 바꾸는 것도 생각할 수 있었다.

하지만 기존 kf seed81을 metaT seed81로 교체해 META-T 계열 모델을 두 개 사용했을 때는 점수가 내려갔다.

 

기존 META-T 모델 자체가 약해서가 아니었다.

별도로 META-T의 seed79와 seed81을 같은 슬롯에서 비교했을 때 두 결과의 차이는 거의 없었다.

 

두 모델은 비슷한 예측을 하고 있었다.

문제는 같은 META-T 레시피를 앙상블에 두 개 넣으면서 모델 간 중복이 커졌다는 점이었다.

 

반면 기존 kf seed81은 META-T보다 개별적으로 새롭거나 강한 모델이어서가 아니라,

다른 학습 레시피의 예측을 제공하는 멤버로서 가치가 있었다.

 

결국 최종 앙상블에는 다음 세 모델이 남았다.

  • RoBERTa seed48
  • kf-deberta seed81
  • kf-deberta META-T

같은 계열의 모델이 포함돼 있어도, 학습 데이터와 입력 표현이 달라 서로 다른 역할을 했다.

META-T 계열을 중복하는 것보다 기존 seed81을 유지하는 편이 더 좋았다.


마지막 블렌드 비율 조정

META-T를 넣은 앙상블의 기본 비율은 이전부터 사용하던 구조와 같았다.

  • 신경망 평균: 0.60
  • 고전 ML: 0.40

마지막으로 신경망 비중을 조금씩 조정했다.

신경망 비중고전 ML 비중LB

 

0.60 0.40 0.7866536897
0.62 0.38 0.7866974871
0.64 0.36 0.7865074247

0.62에서 가장 높은 점수가 나왔다.

다만 0.60과의 차이는 약 0.000044에 불과했다. 마지막 소폭 갱신이기는 했지만, 새로운 성능 축을 발견한 결과로 보기는 어려웠다.

META-T를 넣으면서 이미 조합의 대부분이 결정됐고, 비율 조정으로 얻을 수 있는 이득은 거의 남아 있지 않았다.

 

최종 구성은 다음과 같았다.

고전 ML 0.38
+
0.62 × 평균(
    RoBERTa seed48,
    kf-deberta seed81,
    kf-deberta META-T
)
 

최종 LB는 0.7866974871이었다.


마지막 실험에서 확인한 것

대회 종료 직전에는 새로운 backbone, META-T 추가 seed, 모든 정보를 합친 모델 등도 시도했다.

하지만 최종 챔피언을 넘지는 못했다.

 

특히 KoELECTRA로 기존 seed81 슬롯을 교체한 모델은 0.7827351370,

META-T 계열을 두 개 사용한 모델은 0.7857601405를 기록했다.

최종 챔피언은 그대로 유지됐다.

 

이 결과로 최종 조합의 역할이 더 분명해졌다.

  • RoBERTa seed48은 가장 큰 다양성을 제공했다.
  • kf-deberta seed81은 META-T와 다른 학습 레시피의 예측을 제공했다.
  • META-T는 기존 모델이 충분히 활용하지 못했던 상태 정보를 전달했다.
  • 고전 ML은 Transformer와 다른 방식으로 텍스트와 관계형 피처를 해석했다.

최종 성능은 가장 강한 모델 하나에서 나오지 않았다.

각자 다른 정보를 처리하고, 다른 오류를 만드는 모델이 한 자리를씩 맡으면서 만들어졌다.


이 실험에서 얻은 정보

이번 구간에서 가장 중요하게 얻은 정보는 세 가지였다.

 

첫째, 정보의 존재보다 표현 방식이 중요했다.

공식 메타데이터는 처음부터 데이터에 존재했다. 하지만 모델이 이를 실제 판단에 사용할 수 있는 형태로 제공해야 했다.

 

둘째, 세션 상태는 단독 값보다 현재 요청과의 관계가 중요했다.

META-T는 상태를 트랜스크립트에 넣어 Transformer가 요청과 함께 읽도록 했다.

이는 숫자 피처만 추가한 META-N보다 큰 상승으로 이어졌다.

 

셋째, 좋은 모델을 복제하는 것보다 서로 다른 역할을 유지하는 편이 중요했다.

META-T가 강하다고 META-T 계열을 두 개 넣었을 때는 오히려 성능이 내려갔다.

기존 seed81은 META-T와 다른 예측을 만드는 멤버로서 필요했다.


정리

v58 이후 마지막 상승은 새로운 거대 모델에서 나오지 않았다.

이미 가지고 있던 공식 메타데이터를 다시 살펴보고, 이를 Transformer가 현재 요청과 함께 읽을 수 있도록 표현하면서 나왔다.

v58
0.7840764953

중간 챔피언 cA
0.7848461512

META-N
0.7850069558

META-T
0.7866536897

META-T, 신경망 비중 0.62
0.7866974871
 

최종적으로 확인한 것은 “메타데이터를 많이 넣으면 좋다”는 단순한 결론이 아니었다.

같은 정보도 어떤 채널로 전달하고, 모델이 다른 문맥과 어떤 관계로 해석하게 하느냐에 따라 가치가 달라졌다.

그리고 앙상블에서는 한 모델이 강한 것만으로 충분하지 않았다.

META-T는 새로운 상태 정보를 전달했고, seed81은 META-T와 다른 예측을 유지했으며,

RoBERTa와 고전 ML은 또 다른 방식의 오류를 보완했다.

 

이렇게 최종 LB 0.7866974871에 도달했다.

본선 진출 기준인 0.79591에는 미치지 못했고, 예선에서 대회를 마무리했다.

 

다음 글에서는 baseline 약 0.43에서 최종 0.786697까지 이어진 전체 과정을 돌아보고,

모델 성능뿐 아니라 AI Agent와 함께 실험을 운영하며 얻은 내용을 정리한다.