GPT-OSS용 템플릿 개선 및 수정 (재업로드). preserve_thinking 기능 추가 및 Unsloth 관련 버그 수정
Improved and fixed template for GPT-OSS (again). Includes preserve_thinking and fix for Unsloth-induced bug
핵심 요약
GPT-OSS 모델의 채팅 템플릿 버그를 수정하고 추론 과정을 유지하는 기능을 추가했습니다.
- 템플릿 버그 수정 — 채팅 기록 재현 시 답변이 누락되던 심각한 버그를 해결함
- 추론 과정 유지 — preserve_thinking 기능을 추가하여 모델의 일관성을 높임
- 성능 최적화 — 멀티턴 추론 시 프리픽스 캐싱을 통해 속도 향상
- 모델 활용도 — GPT-OSS 120B의 빠른 속도와 지식 기반 활용 능력 강조
몇 달 전에 Unsloth 버전을 기반으로 만든 GPT-OSS https://huggingface.co/arbv/gpt-oss-fixed-jinja-template 템플릿을 업데이트해서 올렸었지 https://www.reddit.com/r/LocalLLaMA/comments/1vfo8be/gptoss_has_turned_one_year_old_today/ https://huggingface.co/unsloth/gpt-oss-120b/blob/main/chat_template.jinja.
근데 Unsloth 버전(당연히 내 것도 포함해서)에 아주 심각한 버그가 하나 있더라. 대화 기록을 다시 불러올 때 이전 추론 과정(일명 analysis 채널)이 포함되어 있으면 모델 성능이 개판 날 수 있는 버그임. 요즘 웬만한 툴들은 이런 기록을 기본적으로 남기는 추세고, API 레벨에서도 추론이랑 답변을 합쳐서 보내는 경우가 많으니까 문제가 될 수밖에 없지.
메시지 렌더링 루프에서 이 코드 조각의 문제점을 찾을 수 있겠냐? (Unsloth 템플릿에서 가져온 거임 https://huggingface.co/unsloth/gpt-oss-120b/blob/main/chat_template.jinja#L317):
{%- elif "thinking" in message %}
{#- CoT is dropped during all previous turns, so we never render it for inference #}
{{- "<|start|>assistant<|channel|>analysis<|message|>" + message.thinking + "<|end|>" }}
{%- set last\_tool\_call.name = none %}
{%- else %}
{#- CoT is dropped during all previous turns, so we never render it for inference #}
{{- "<|start|>assistant<|channel|>final<|message|>" + message.content + "<|end|>" }}
{%- set last\_tool\_call.name = none %}
대화 기록을 렌더링할 때, 메시지에 content(모델의 답변)랑 thinking(추론 과정)이 둘 다 들어있으면 추론 내용만 렌더링하고 정작 답변은 날려버리는 구조야! 이러면 턴이 넘어갈 때마다 모델이 아주 헷갈려 하겠지.
주석도 틀렸어. 그냥 복붙하다가 실수한 것 같음. OpenAI 공식 레퍼런스 템플릿 https://huggingface.co/openai/gpt-oss-120b/blob/main/chat_template.jinja#L302에는 이런 거 없거든.
GPT-OSS 20B가 가끔씩 완전히 맛이 가버리는 경우가 있었는데, 이제야 왜 그런지 알겠네. 웃긴 건 GPT-OSS 120B는 추론 과정만 가지고도 대화 맥락이랑 방향을 잘 잡아서 복구하더라.


