23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요. teus입니다.
이번 포스팅은, claude code에서 설정할 수 있는 reasoning effort가 과연 효과가 있는지
소스코드 레벨에서 점검해봅니다.
claude code를 보면, 위처럼 effort를 설정할 수 있습니다.
원래 claude 모델을 쓸 때는 위와같은 설정을 쓰는게 가정하고 학습이 되었겠지만
사내에서는 claude 모델이 아니라, vLLM기반의 OSS모델을 사용 중 입니다.
그러면 과연 해당 기능이 제대로 동작할 수 있을까요?
Claude Code /effort high
│
▼
POST /v1/messages
output_config.effort = "high"
│
▼
AnthropicMessagesRequest
│
▼
ChatCompletionRequest.reasoning_effort = "high"
│
▼
chat_template_kwargs = {
reasoning_effort: "high",
enable_thinking: true
}
│
▼
GLM 5.2 chat_template.jinja
│
├─ <|system|>Reasoning Effort: High
└─ <|assistant|><think>
│
▼
GLM 5.2 자동회귀 추론
│
▼
<think>...</think> 파싱
│
▼
Claude Code thinking/text/tool_use 블록올리는건 조금 의미있고
내리는건 의미없다.(원효대사 해골물)
먼저 해당하는 기능을 활성화할 경우, 아래와같이 /messages로 요청을 보낼 때 config가 추가됩니다.
...
"output_config": {
"effort": "high"
},
...그리고, 이제 위 요청은 vLLM으로 들어가게 됩니다.
최신 vLLM의 경우 /messages로 보내진 요청을 바로 처리할 수 있습니다.
그래서 보는것처럼, /messages로 보내진 요청은 이제
#https://github.com/vllm-project/vllm/blob/v0.23.0/vllm/entrypoints/anthropic/api_router.py#L48-L70
@router.post(
"/v1/messages",
...
)
@with_cancellation
@load_aware_call
async def create_messages(request: AnthropicMessagesRequest, raw_request: Request):
handler = messages(raw_request)
...
try:
generator = await handler.create_messages(request, raw_request)위 과정을 통해서 /messages(앤트로픽 표준) -> /chat/completion(openai 표준) 으로 변환되고
변환된 openai msg를 사용해서 huggingface 모델에서 추론이 시작됩니다.
# https://github.com/vllm-project/vllm/blob/0fc695fc6d1d82e9a5ac6835ac8e4e1c83703665/vllm/entrypoints/anthropic/serving.py#L474
async def create_messages(
...
) -> AsyncGenerator[str, None] | AnthropicMessagesResponse | ErrorResponse:
...
chat_req = self._convert_anthropic_to_openai_request(request)
...
generator = await self.create_chat_completion(chat_req, raw_request)
...
return self.message_stream_converter(generator)이때
"output_config": {
"effort": "high"
},위처럼 전달된 값은 openai 호환의 reasoning_effort라는 config로 변환되고
# https://github.com/vllm-project/vllm/blob/v0.23.0/vllm/entrypoints/anthropic/serving.py#L383-L401
if output_config and output_config.effort is not None:
req.reasoning_effort = output_config.effort위 내용이 이제 huggingface 모델의 추론에 영향을 주게됩니다.
https://docs.vllm.ai/en/stable/features/reasoning_outputs/#automatic-enable_thinking-activation
reasoning_effort의 경우 vLLM내부에서는 enable_thinking을 조절하는 용도로 사용되는 것으로 보입니다.
그리고, 마지막으로 reasoning_effort변수와 enable_thinking 변수는 GLM 모델의 추론의 template 로 들어가게 됩니다.
set effective_reasoning_effort =
'high'
if reasoning_effort == 'high'
else 'max'
<|system|>Reasoning Effort:
{{ effective_reasoning_effort | capitalize }}보는것처럼 high라고 들어올경우는 high라고 남기고, 나머지의 경우 모두 max로 처리해버리게 되어있습니다.
그리고, 나머지 system prompt에 Reasoning Effort라는 부분에 단어를 남기고, 다음단어 예측에 원하는 동작이 되기를 기도메타를 하게 되어있습니다.
그래서
high라는 값일 넣으면, system prompt에 high가 들어간다.
high 말고 무슨 값을 넣던지 max가 들어간다.
그래서 사실상 effort를 변화하는건 큰 효과가 없고, 토큰소모 줄일라고 effort를 내리면 오히려 토큰소모만 증가한다.
high말고 xhigh, max 를 넣으면 좋아질 가능성은 조금 있다.(일단 system prompt에 high 말고 max로 통일되어서 들어가니깐)
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.