What Is Reasoning

Armin Ronacher

추론이란 무엇인가

원문은 Armin Ronacher님이 에 게재했습니다. 이 블로그 구독하기

몇 주 전 논문이 공유됐다 클로즈드 웨이트 모델에서 추론 트레이스를 추출하는 방법을 보여주는 내용이었다. 모델을 속여 트레이스를 유출시키는 방법에 대한 온라인 논의와 함께 호기심에 좀 더 파고들어 보게 됐다. 트위터에는 이 작동 방식에 대한 반쪽짜리 진실과 혼란이 가득해 보이니, 이 글이 어떤 이들에게는 무슨 일이 일어나고 있는지 이해하는 데 도움이 되길 바란다.

트레이스 숨기기

추론 트레이스는 보통 우리에게 숨겨져 있다. 아쉬움을 표한 적도 있지만 대체로 받아들여야 한다. 다행히 오픈 웨이트 모델은 트레이스를 공개하고, 그 동작을 보면 트레이스가 길고 혼란스러울 수 있다는 걸 알 수 있다. 아마 그래서 일반 사용자에게 보여지는 내용과 분리하는 게 타당할 것이다.

최소한 UI는 트레이스를 감지해야 한다. 업계는 추론 트레이스를 뭔가 특별하고 신비로운 것처럼 포장하는 데는 능했지만, 사실 그저 텍스트일 뿐이다. 모델은 최종 답변에 앞서 응답의 일부로 자신의 사고를 스크래치패드에 출력하도록 학습된다.

GPT-OSS의 Harmony 응답 포맷을 보면 이를 쉽게 알 수 있다:

<|channel|>analysis<|message|>
I need to work this out ...
<|end|><|start|>assistant<|channel|>final<|message|>
The answer is ...
<|return|>

마커는 특수 토큰이지만, 그 사이에 들어가는 추론은 최종 답변과 “같은 텍스트”를 사용한다(다만 GPT의 chain-of-thought 텍스트는 정말 우스꽝스럽게 들린다). 모델이 analysis 채널 토큰을 샘플링하면 파서가 뒤따르는 텍스트를 Responses API를 통해 노출되는 별도 스트림으로 라우팅한다. 클로즈드 모델의 경우 아마도 단순한 모델이 이를 검열하고 요약할 것이다.

추론 노력

추론에 얼마나 많은 예산이 투입될까? 이전 API들은 추론 토큰 예산을 노출해 마치 샘플링 과정의 속성처럼 보이게 했다. 실제로는 추론 노력이 시스템 프롬프트에 들어간다. GPT-OSS는 시스템 프롬프트에 이렇게 넣는다:

Reasoning: low

그게 전부다. 학습이 그에 따른 동작을 만들어내는데, 예컨대 analysis 채널로 전환하는 토큰 시퀀스를 출력하는 식이다. 이는 추론 노력을 바꾸면 KV 캐시가 무효화되는 이유이기도 하다. 클로즈드 GPT 모델에서는 추론 노력을 “juice”라고 부르는 것 같다. 대부분의 모델에게 juice가 얼마나 남았는지 물어보면 알 수 있기 때문이다.

DwarfStar에서 DeepSeek의 최대 추론 설정 시에는 시스템 프롬프트에 이렇게 추가된다:

Reasoning Effort: Absolute maximum with no shortcuts permitted.
You MUST be very thorough in your thinking and comprehensively decompose the
problem to resolve the root cause, rigorously stress-testing your logic against
all potential paths, edge cases, and adversarial scenarios.

생각하지 않기

따라서 추론 토큰의 행선지는 학습된 관습이다. 모델은 임시 사고 과정을 final 채널 밖에 두도록 학습된다. 모델이 자신이 그 채널에 있다고 착각하게 만들면 토큰을 유출할 수도 있다. 심지어 구형 모델 중에는 thinking이 비활성화된 상태에서 bash 도구에 추론을 쓰고 그 생각을 /dev/null로 echo하는 경우도 봤다.

그러니 어떤 의미에서 일부 모델의 유일한 “특별한” 동작은 생각하지 않는 것이다. 이는 때로 모델이 평소 생각하는 방식을 “기계적으로” 제거하는 방식으로 이루어진다. DwarfStar에서는 thinking 비활성화 시 프리필로 </think>를, 활성화 시 <think>를 사용하는데, 각각 사고를 닫고 시작하는 토큰이다. GPT-OSS는 프리필을 하지 않고 모델이 스스로 어느 쪽이든 결정하도록 둔다.

하지만 아마도 일부 인퍼런스 API는 추론이 활성화되면 여는 토큰을 프리필해서 모델이 직접 샘플링하지 않도록 하고, 비활성화 시에는 추론 토큰의 샘플링을 차단하는데, 이는 간단히 감지할 수 있기 때문이다. 이는 왜 커스텀 think 도구가 일부 추론을 들어가선 안 될 곳에 넣도록 모델을 속일 수 있는지를 설명할지도 모른다 — 단, 네이티브 추론이 비활성화된 경우에만 그렇다.

재미있는 사실: 이 블로그 글 때문에 안전 검사가 발동했다

웃기게도 안전 필터 때문에 이 블로그 글의 맞춤법과 문법 검사를 GPT 5.6 terra로 할 수 없었다. Kimi로 바꿔야 했다.

이 블로그 글의 맞춤법 검사를 거부하는 GPT-5.6-terra

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글