로컬 LLM 구축

사고형 LLM 짧은 응답 텅 빔 max_tokens 늘리고 예외 로깅 해결

AI 로컬 LLM 2026. 9. 7. 10:32

사고형 로컬 LLM에 짧은 응답을 시킬 때는 max_tokens를 넉넉하게 잡아야 한다. 그렇지 않으면 모델이 '생각'하느라 예산을 다 써버려 정작 출력은 텅 비게 된다.

최근 자동화 스크립트의 이미지 묘사 부분이 며칠째 제대로 작동하지 않아 삽질했다. 노트 파이프라인에서 블로그에 쓸 이미지 스케치 설명을 Qwen3.6 모델(사고형 모델이다)에 요청하고 있었다.

"이 그림 장면을 한 줄로 묘사해 줘"라고 시켰고, max_tokens=300을 설정했다. 한 줄짜리 설명이니 300토큰이면 충분하다고 봤다. 그런데 예상과 달리 텅 빈 응답이 계속 넘어왔다.

문제는 내가 쓴 파이썬 코드 response.splitlines()[0]에서 터졌다. 빈 응답이니 당연히 IndexError가 났다.

문제는 이 예외를 조용히 삼키고 "이미지 없이 진행"하는 로직이 있었던 것. 에러 로그가 남지 않으니 며칠 동안 이미지 스케치 작업이 조용히 빠지는 걸 알아차리지 못했다. 평소엔 잘 돌아가는 줄 알았지.

재현 스크립트를 만들어 단계별로 traceback을 찍어보니 원인이 명확해졌다. Qwen3.6 같은 '사고형' 모델들은 실제 출력을 내기 전에 내부적으로 추론(thinking) 과정에서 토큰을 소모한다. max_tokens=300은 모델이 생각할 예산까지 포함된 것이라, 한 줄짜리 응답이라도 생각을 마치는 데 그 예산을 다 써버린 것이다. 그래서 정작 출력할 토큰은 남지 않아 빈 문자열이 나온 거였다.

해결책은 간단했다. max_tokens를 2500으로 대폭 늘려줬다. 모델이 충분히 생각하고도 남을 만큼의 예산을 주는 셈이다. 그래도 혹시 모를 상황에 대비해 빈 응답이 오면 한 번 더 재시도하고, 그것마저 실패하면 미리 정해둔 폴백 문장으로 대체하도록 했다.

이번 경험으로 두 가지를 배웠다. 사고형 LLM에 아무리 짧은 응답을 요구하더라도 max_tokens는 넉넉하게 설정해야 한다. 그리고 예외를 조용히 삼키는 코드는 반드시 원인 추적이 가능하도록 로그를 남겨야 한다.

 

삽질 로그 — 직접 겪고 씁니다