LLM ALIGNMENT
한국어 UI 문구 생성에서 GRPO 형식 보정의 구조 아티팩트 분석
Ilho Ahn
한국어 추천 카드에서 GRPO의 형식 통과율 회복과 슬롯 과다 나열, 표적 페널티 이후 기본 슬롯 조합으로의 이동을 분석한다.
원글은 한국어 추천 카드 생성에서 직접 선호 최적화(DPO) 이후 낮아진 형식 통과율을 GRPO로 일부 회복하는 현상을 다뤘다. 이번 글은 Gemma 3 4B 계열에서 이 형식 보정이 출력 구조에 남기는 반복적 패턴, 즉 구조 아티팩트를 분석한다 [1].
GRPO는 형식 통과율을 회복하면서 슬롯 값을 과다하게 나열하는 현상(slot stuffing)도 늘렸다. 이를 억제하는 페널티는 출력을 기본 슬롯 조합으로 이동시켰다(Figure 1). 이러한 구조 변화는 참조 언어모델의 음의 로그우도(NLL)와 LLM 평가자(judge)의 문맥 점수에 충분히 반영되지 않았다. 이번 GRPO 변형 간 품질을 직접 비교한 인간 평가는 없다.
요약
- GRPO는 DPO의 형식 통과율
0.389를0.587-0.694로 회복했고, DPO가 얻은NLL_ctx개선도 대체로 유지했다. - 통과 여부만 보상하는 binary와 항목별 부분 점수를 주는 dense 보상은 slot stuffing을 DPO 대비 약 3배로 늘렸다. judge와 NLL 문맥 프록시는 이 구조 변화를 잘 구분하지 못했다.
- anti-stuffing 페널티는 과다 나열을 줄이면서 기본 슬롯 조합으로의 쏠림을 키웠다. 결합 페널티는 이 쏠림을 줄였고, stuffing은 dense보다 낮게 유지됐다.
- 학습 시드 추가, 슬롯 기준값 변경, 입력 단위 집계와 생성 반복에서도 핵심 구조 변화는 유지됐다. judge gap의 감소 추세는 무작위 표본에서 재현되지 않았다.
- 이번 제약 디코딩(constrained decoding)은 슬롯 값 개수 상한을 강제했지만, 길이·어미를 포함한 전체 형식 통과율은 충분히 회복하지 못했다.
관련 연구
Rafailov et al.의 DPO는 선호쌍으로 정책을 직접 조정하며 [2], Shao et al.의 GRPO(Group Relative Policy Optimization)는 생성 그룹 내 상대 보상을 사용한다 [3]. 여기서는 DPO 정책에 GRPO 형식 보상을 추가했을 때의 출력 변화를 본다.
Skalse et al.은 reward gaming이 발생하는 조건을 형식적으로 분석했고 [4], Gao et al.은 합성 보상 실험에서 프록시 보상 개선이 별도 기준 보상의 개선을 보장하지 않음을 보였다 [5]. 이번 분석은 형식 보상과 보상 밖의 구조 휴리스틱을 비교한다.
Zheng et al.은 LLM judge와 인간 판단의 일치도 및 평가 편향을 조사했다 [6]. 여기서는 judge의 인간 일치도와 표본 선택을 점검하고, 생성 중 문법·스키마를 강제하는 제약 디코딩 [7], [8]을 형식 제어의 보조 비교로 포함한다.
문제 설정
평가 대상은 한국어 추천 카드 문구다. 출력은 reason, title, subtitle 같은 짧은 문구 필드와 season, time, place 같은 메타 슬롯을 포함한다. 이처럼 메타 슬롯을 포함한 카드는 자유 형식 문장보다 충족해야 할 조건이 많다. 문장이 자연스러워도 길이, 어미, 슬롯 범주, 빈 값 제약을 어기면 UI에 배치하기 어렵다.
형식 검증기 V_public은 학습 보상에 쓰인 검사기로, 필드 존재, 길이 상한, 허용 어미, season/time 카테고리, 비어 있지 않은 place를 검사한다. binary와 dense는 이 규칙을 보상으로 사용하고, 완화 변형은 슬롯 관련 페널티를 추가한다. 이하의 “공개 검증기”라는 명칭은 보상에 사용된 규칙을 judge 평가와 구분한다. 검증기 코드가 공개 배포되었다는 의미는 아니다.
Table 1은 평가 신호의 역할을 구분한다. public_pass는 공개 검증 통과율, hidden_auto_pass는 judge 평가 표본 중 형식 검증과 judge 기준을 모두 만족한 비율이다. 별도 인간 정답에 대한 정확도가 아니라 두 검사를 결합한 자동 지표다. NLL_ctx는 입력 문맥에 대한 참조 언어모델의 음의 로그우도(NLL)로, 낮을수록 높은 확률을 부여받은 출력이다.
| 신호 | 무엇을 측정하나 | 해석 기준 |
|---|---|---|
| 공개 검증기 | 보상이 직접 보는 형식 규칙 통과 여부 | UI 배치 가능한 구조인지 보는 1차 형식 제약 |
| 구조 휴리스틱 | 슬롯 과다 나열, 기본 슬롯 집중, 어미·접미 패턴 집중 | 검증기가 통과시킬 수 있는 구조적 아티팩트 감지 |
| 고정 LLM judge | 자연성 nat과 입력-출력 문맥 적합도 ctx |
형식과 구분한 문구 품질의 보조 평가 |
| NLL 프록시 | 참조 LM 기준 조건부 NLL | DPO 이후 문맥 프록시 변화 추적 |
judge는 Gemini 2.5 Flash로 고정했다 [9]. 별도 인간 검토 500건의 0/1/2 점수와 비교한 이차 가중 카파(QWK, 점수 차이에 가중치를 둔 일치도)는 문맥 적합도에서 0.059, 자연성에서 0.143이었다. 정확 일치율은 약 0.53-0.56, 1점 이내 일치율은 약 0.94-0.95였지만 QWK는 낮아, judge를 보조 신호로 사용한다.
평가 설계
비교의 질문은 형식 보상을 높이는 과정에서 슬롯 과다 나열이 늘어나는지, 그 패턴을 감점하면 출력이 어디로 이동하는지다. 모든 GRPO 변형은 지도 미세조정(SFT)을 거쳐 DPO로 학습한 정책에서 시작한다. Table 2는 네 보상 변형을 비교한다.
| ID | 초기화 | 보상 | 역할 |
|---|---|---|---|
| DPO | SFT | 선호쌍 DPO | GRPO step 0 기준점 |
| GRPO-binary | DPO | V_public를 통과하면 1, 아니면 0 |
가장 단순한 형식 보상 기준선 |
| GRPO-dense | DPO | 파싱, 필드 존재, 길이, 어미, 슬롯 유효성, 빈 슬롯 여부를 나눠 부분 점수화 | 완전 통과/실패 대신 형식 구성요소별로 보상 |
| GRPO-antistuff | DPO | dense에서 총 슬롯 값 3개를 넘는 값 하나당 0.25 감점 | slot stuffing 표적 완화 |
| GRPO-antistuff2 | DPO | antistuff에서 season과 time이 모두 ‘전체’이면 0.40 추가 감점 | 기본 슬롯 조합으로의 쏠림 완화 |
slot stuffing은 place, time, season 세 필드의 값 개수가 합계 3개를 넘는 경우다. 필드마다 하나씩을 강제하는 기준은 아니다. dense 보상은 대체로 0.0-1.0 범위이며, 완화 계수는 슬롯 과다 나열과 기본 슬롯 집중을 억제했을 때의 변화를 확인하기 위해 수작업으로 정했다.
원글과 같은 학습 외 1,026개 테스트 입력을 사용하되, 이번 분석은 평가 시 입력당 K=4개 생성에서 얻은 약 5.5-6천 카드를 집계한다. 한 생성이 여러 카드를 낼 수 있다. K는 평가의 반복 생성 수이며 GRPO 학습 그룹 크기를 뜻하지 않는다. 원글의 출력 단위 통과율·형식 통과 출력 NLL과 이번 카드 단위 집계는 구분한다.
공개 검증기와 구조 휴리스틱은 전체 카드에서, judge는 체크포인트마다 고정 시드로 무작위 추출한 400카드에서 계산한다. 공개 통과율 상승에 더해 judge 결합 통과율, NLL, 구조 휴리스틱과 보상 상관을 각각 점검한다.
결과
전체 결과
Figure 2에서 DPO는 SFT의 public_pass 0.724를 0.389로 낮춘다. NLL_ctx는 3.152 -> 2.641로 낮아지고, 이후 GRPO는 이 프록시 개선을 유지하면서 public_pass를 0.587-0.694로 회복한다.
NLL_ctx를 낮추지만 형식 통과율을 떨어뜨리고, GRPO는 형식 통과율을 회복하는 동시에 형식 보상 조건에서 slot stuffing을 키운다.동시에 slot stuffing은 SFT 0.191, DPO 0.218에서 GRPO-binary 0.640, GRPO-dense 0.668로 상승한다. 기반 정책에도 있던 슬롯 과다 나열이 GRPO 형식 보정 단계에서 커진다.
Table 3은 최종 체크포인트를 비교한다. public_judge_gap은 judge 400카드 안에서 공개 통과율과 결합 통과율의 차이다. default_slot_rate는 season과 time이 모두 ‘전체’인 비율, suffix_concentration은 특정 어미·접미 패턴의 집중도를 나타낸다.
| 지표 | DPO | binary | dense | antistuff | antistuff2 |
|---|---|---|---|---|---|
| public_pass 전체 카드 |
0.389 |
0.587 |
0.669 |
0.694 |
0.647 |
| hidden_auto_pass judge 400카드 |
0.278 |
0.460 |
0.517 |
0.580 |
0.535 |
| public_judge_gap judge 400카드 |
0.110 |
0.138 |
0.122 |
0.115 |
0.135 |
| slot_stuffing | 0.218 |
0.640 |
0.668 |
0.016 |
0.141 |
| default_slot_rate | 0.072 |
0.066 |
0.056 |
0.345 |
0.068 |
| suffix_concentration | 0.268 |
0.344 |
0.390 |
0.417 |
0.308 |
| NLL_ctx median | 2.641 |
2.613 |
2.625 |
2.621 |
2.621 |
binary와 dense에서는 공개 통과율과 judge 결합 통과율이 함께 오른다. 공개 통과 카드 중 judge 실패율은 DPO 0.284에서 binary 0.230, dense 0.191로 낮아졌다. 반면 slot stuffing은 약 3배로 늘어, 문맥 프록시와 구조 휴리스틱이 서로 다른 변화를 포착했다.
step 810에서 보상과 judge 문맥 점수의 상관은 binary -0.016, dense -0.071, antistuff -0.086, antistuff2 +0.047로 작았다. 보상과 NLL_ctx의 상관도 -0.086에서 -0.108 사이였다. 학습 로그에서 DPO 기준 정책과의 분포 차이를 나타내는 KL 발산은 최종 체크포인트에서 1.077-1.182였다.
슬롯 과다 나열과 페널티 이후 이동
Figure 3에서 binary와 dense는 학습이 진행될수록 공개·judge 결합 통과율과 slot stuffing이 함께 상승한다. dense는 binary보다 높은 형식 통과율에 도달하지만, 두 설정 모두 슬롯 과다 나열이 높은 수준으로 수렴한다.
public_pass와 hidden_auto_pass를 올리지만, 같은 구간에서 slot stuffing도 상승한다. dense는 더 높은 통과율에 도달하지만 구조 실패를 제거하지는 못한다.Figure 4에서 GRPO-binary의 길이 위반(LEN_EXCEEDED)은 step 50의 0.539에서 step 810의 0.225로 줄었다. 어미 위반(BAD_SUFFIX)은 0.291 -> 0.275로 소폭 줄었고, 카테고리 위반(INVALID_CATEGORY)은 거의 0이었다. 슬롯 과다 나열은 주로 허용된 카테고리 값 안에서 발생했다.
BAD_SUFFIX는 남고 카테고리 위반은 거의 0에 가깝다. stuffing은 잘못된 카테고리 선택보다 유효 슬롯 값을 과도하게 나열하는 문제에 가깝다.구조 휴리스틱 중 가장 크게 움직인 것은 slot stuffing이었다. 템플릿 반복은 감소하고 다양성은 개선됐으며, 슬롯-문맥 충돌과 복사/문자 이상은 거의 0이었다. 어미·접미 패턴 집중은 모든 GRPO 변형에서 상승했지만 antistuff2에서 가장 낮았다.
최종 체크포인트 카드를 합친 슬롯 값 개수와 NLL_ctx의 Spearman 상관은 약 -0.008이었다. stuffing이 있는 카드와 없는 카드의 NLL 평균은 2.635 대 2.643, judge 문맥 점수 평균은 1.697 대 1.724였다. 추가 슬롯 값에 따른 뚜렷한 문맥 프록시 이득은 관찰되지 않았다.
Figure 5는 형식 통과율과 함께 슬롯 과다 나열·기본 슬롯 집중이 어떻게 달라지는지 비교한다.
public_pass와 구조 부산물의 관계를 나눠 본 그림이다. 왼쪽은 slot stuffing, 오른쪽은 기본 슬롯 비율과의 관계를 보여준다. binary와 dense는 형식 통과율을 올리지만 stuffing도 키우고, antistuff는 stuffing을 낮추는 대신 기본 슬롯 조합으로 이동하며, antistuff2는 기본 슬롯 집중을 다시 낮춘다.antistuff는 dense의 stuffing 0.668을 0.016으로 낮추면서 공개 통과율 0.694, judge 결합 통과율 0.580을 얻었다. 과다 나열을 줄여도 두 통과율은 유지되거나 높아졌다(Table 3).
동시에 기본 슬롯 비율은 dense 0.056에서 antistuff 0.345로 올랐다. 이 조합도 감점한 antistuff2는 기본 슬롯 비율을 0.068로 낮췄다. stuffing은 0.141로 antistuff보다 다시 올랐지만 dense 0.668보다는 낮았다. 공개 통과율은 dense 0.669에서 antistuff2 0.647로 약 2.2%p 낮아졌다.
같은 헤어스타일링 제품 입력에서 dense는 time=[아침, 저녁, 밤], place=[집, 미용실]처럼 값을 나열했다. antistuff는 season·time·place가 모두 ‘전체’에 가까운 조합으로, antistuff2는 time=아침, place=헤어샵처럼 구체적인 슬롯으로 이동했다.
불확실성과 반복 평가
binary/dense의 stuffing 증가와 antistuff의 감소는 DPO와 95% 신뢰구간(CI)이 겹치지 않을 정도로 크다(Appendix Table 1).
judge 결합 통과는 공개 통과의 부분집합이다. Table 4는 이 두 통과율의 차이가 모델 간에 얼마나 변했는지를 비교한다. 모든 CI가 0을 포함해 gap 변화는 확인되지 않았으며, 이를 품질 동등성의 근거로 사용하지 않는다.
| 비교 | Δ public_judge_gap | 95% CI |
|---|---|---|
| binary - DPO | +0.028 |
[-0.018, +0.073] |
| dense - DPO | +0.013 |
[-0.032, +0.057] |
| antistuff - dense | -0.008 |
[-0.052, +0.037] |
| antistuff2 - dense | +0.012 |
[-0.033, +0.057] |
| antistuff2 - antistuff | +0.020 |
[-0.025, +0.065] |
두 번째 학습 시드에서도 binary의 slot stuffing은 DPO 기준점 0.218보다 높았고(0.640, 0.696), antistuff는 낮게 유지됐다(0.016, 0.023). 슬롯 값 개수 기준을 >3, >4, >5로 바꾸거나 카드 단위 대신 입력 단위 평균을 써도 결론은 바뀌지 않았다.
Table 5는 step-810 체크포인트를 고정하고 다섯 생성 시드로 다시 평가한 결과다. 구조 휴리스틱의 시드별 표준편차는 핵심 효과보다 작았다.
| 변형 | public_pass | slot_stuffing | default_slot_rate |
|---|---|---|---|
| binary | 0.598 +/- 0.007 |
0.647 +/- 0.008 |
0.061 +/- 0.002 |
| dense | 0.666 +/- 0.007 |
0.663 +/- 0.005 |
0.060 +/- 0.002 |
| antistuff | 0.684 +/- 0.004 |
0.016 +/- 0.001 |
0.354 +/- 0.004 |
| antistuff2 | 0.649 +/- 0.007 |
0.138 +/- 0.006 |
0.067 +/- 0.001 |
judge 표본 선택의 영향
Figure 6에서 체크포인트의 앞쪽 400카드를 연속으로 쓰면 judge gap이 학습과 함께 감소하지만, 무작위 400카드에서는 평탄하거나 소폭 상승한다. 카드 순서가 입력 순서를 따르므로, 앞쪽 연속 표본이 특정 입력 하위집단을 과표집한 것으로 보인다.
제약 디코딩 비교
Figure 7은 DPO 정책의 추론에 JSON schema와 배열 길이 상한(array cap)을 적용한 비교다. 학습을 바꾸지 않고 출력 구조를 제한했을 때의 형식 회복 범위를 점검한다.
public_pass는 0.44 수준에 머물고 length boundary 문제가 커진다. RL antistuff는 public_pass와 hidden_auto_pass를 더 크게 회복한다.모든 출력이 파싱 가능해졌지만 public_pass는 0.389 -> 0.403-0.440으로 올랐다. +array-cap은 stuffing을 0.000으로 낮추면서 길이 경계 비율(length_boundary_rate)을 0.202 -> 0.394로 높였고, judge 결합 통과율은 0.265였다. antistuff의 public_pass 0.694, judge 결합 통과율 0.580과 비교하면, 이번 제약은 슬롯 과다 나열을 제거했지만 길이·어미를 포함한 전체 형식 통과율은 충분히 회복하지 못했다.
해석
DPO 이후 GRPO를 적용한 설정에서 NLL 문맥 프록시 개선과 형식 통과율 회복을 함께 유지했다. 동시에 슬롯 과다 나열이 증가했으며, judge와 NLL 점수는 이 구조 변화를 뚜렷하게 구분하지 못했다. 무작위 judge 표본에서 gap 감소가 재현되지 않았고 직접 인간 비교도 없으므로, 이 결과만으로 형식 보상이 문구 품질을 지속해서 높였다고 판단하기는 어렵다. 이번 결과의 중심은 통과율 회복과 구조 패턴 변화가 함께 나타났다는 관찰이다.
표적 페널티는 과다 나열을 줄이면서 기본 슬롯 집중을 키웠다. 결합 페널티는 이 집중을 줄였고, stuffing은 dense보다 낮게 유지됐다. 따라서 구조화 생성의 보상 보정은 통과율뿐 아니라 보상 밖의 구조 휴리스틱을 함께 측정하고, 완화 이후 출력이 어디로 이동하는지 추적할 필요가 있다.
한계
- 본문은 보상 구성요소와 완화 계수를 보고하지만 dense의 항목별 정확한 가중치, GRPO 학습 그룹 크기·학습률·배치 구성, judge 통과 임계값을 재현 가능한 명세로 제공하지 않는다. 이 값이 확인되기 전에는 동일 설정의 재현이나 다른 구현과의 직접 비교가 어렵다.
- 별도 judge 검증 자료는 있지만, 이번 GRPO 변형 간 품질을 직접 비교한 인간 평가는 없다. judge는 인간 일치도가 낮고 체크포인트별 400카드 표본에 한정된다.
- 카드 집합 bootstrap이 같은 입력에서 반복 생성된 카드 사이의 의존성을 반영했는지는 확인되지 않았다. 입력 단위 평균에서도 구조 변화의 방향은 유지됐지만, 이는 입력을 묶어 재표집한 신뢰구간을 제공한 것과는 다르다.
- 학습 곡선은 대부분 단일 학습 시드다. binary와 antistuff는 seed 43으로 반복했으며, 다섯 생성 시드 평가는 고정 체크포인트의 생성 변동만 측정한다.
- 슬롯 기준값, 페널티 계수와 judge 통과 임계값은 수작업 설정이다. 인접 슬롯 기준값에서도 방향은 유지됐지만 절대 비율은 설정에 의존한다.
- 범위는 Gemma 3 4B 계열의 한국어 추천 카드와 DPO 이후 GRPO 보정이다. constrained decoding도 DPO 위의 특정 JSON schema·array cap 비교에 한정된다.
Appendix: 주요 비율의 신뢰구간
| 모델 | public_pass 전체 카드 · 95% CI |
slot_stuffing 전체 카드 · 95% CI |
hidden_auto_pass judge 400카드 · 95% CI |
|---|---|---|---|
| DPO | 0.389 [0.377, 0.402] |
0.218 [0.207, 0.229] |
0.278 [0.232, 0.323] |
| binary | 0.587 [0.575, 0.599] |
0.640 [0.628, 0.653] |
0.460 [0.412, 0.510] |
| dense | 0.669 [0.657, 0.680] |
0.668 [0.656, 0.681] |
0.517 [0.468, 0.568] |
| antistuff | 0.694 [0.682, 0.705] |
0.016 [0.012, 0.019] |
0.580 [0.532, 0.627] |
| antistuff2 | 0.647 [0.635, 0.659] |
0.141 [0.132, 0.150] |
0.535 [0.486, 0.584] |
References
- Google DeepMind. Gemma 3 model card. 2025.
- Rafael Rafailov et al. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. NeurIPS 2023.
- Zhihong Shao et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300, 2024.
- Joar Skalse et al. Defining and Characterizing Reward Gaming. NeurIPS 2022.
- Leo Gao, John Schulman, and Jacob Hilton. Scaling Laws for Reward Model Overoptimization. ICML 2023.
- Lianmin Zheng et al. Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena. NeurIPS 2023.
- Brandon T. Willard and Rémi Louf. Efficient Guided Generation for Large Language Models. arXiv:2307.09702, 2023.
- Saibo Geng et al. Grammar-Constrained Decoding for Structured NLP Tasks without Finetuning. EMNLP 2023.
- Gheorghe Comanici et al. Gemini 2.5: Pushing the Frontier with Advanced Reasoning, Multimodality, Long Context, and Next Generation Agentic Capabilities. arXiv:2507.06261, 2025.
Citation
Text citation:
Ahn, I. (2026). 한국어 UI 문구 생성에서 GRPO 형식 보정의 구조 아티팩트 분석. Technical report.
BibTeX:
@techreport{ahn2026grpoValidatorArtifactEvaluation,
title = {한국어 UI 문구 생성에서 GRPO 형식 보정의 구조 아티팩트 분석},
author = {Ahn, Ilho},
year = {2026},
type = {Technical report},
url = {https://muted-color.github.io/technical-reports/korean-ui-grpo-validator-artifact-evaluation/}
}