Qwen 도구 호출 루프, 템플릿 버그가 주원인

Why Some Qwen Tool-Calling Loops Are Not Model Loops?

·2026.10.18 00:24

핵심 내용

Qwen 도구 호출 루프는 모델 반복이 아닌 템플릿 직렬화 오류로 확인됐다.

자세히 보기

근본 원인: 직렬화 불일치

Qwen 기반 코딩 에이전트에서 반복되는 도구 호출은 흔히 모델의 반복 문제로 오해되지만, 실제 조사 결과 이는 채팅 템플릿이 이전 도구 호출 기록을 손상시킨 데서 비롯된 것으로 드러났다. OpenAI 호환 도구 기록은 함수 인자를 직렬화된 JSON 문자열로 표현하는 반면, Qwen 호환 채팅 템플릿은 구조화된 매핑을 기대한다. 템플릿이 tool_call.arguments | items로 문자열을 순회하려 하면 TypeError가 발생하거나 기록이 비어 있거나 손상된 상태로 렌더링된다. 모델이 이전 명령어가 보이지 않는 대화 기록을 받으면 동일한 도구 호출을 재발행하여 모델 자체의 루프처럼 보일 수 있다.

패치 및 A/B 테스트 결과

템플릿 동작과 모델 동작을 분리하기 위해 연구진은 런타임 타입에 따라 인자를 처리하는 타입 인식 패치를 적용했다. 이 수정사항은 27B 모델에서 가중치가 동일한 A/B 비교(모든 866개 텐서의 SHA-256 해시 일치)를 통해 검증되었다. 패치된 템플릿은 렌더링 실패를 해결했다.

  • Hugging Face 렌더링: 3/10에서 10/10으로 개선.
  • llama.cpp/minja 렌더링: 9/10에서 10/10으로 개선.
  • 성능: 중간 디코딩 속도는 30.53 tok/s(기존 29.92 tok/s)로 안정적이며, MTP 수용률은 76.81%(기존 76.41%)로 측정 가능한 회귀가 없었다.

모델 민감도 및 네이티브 문법

이 수정은 모든 Qwen 모델에 범용적으로 적용되지 않는다. 더 작은 Qwen3.5-9B 모델 테스트에서 네이티브 태그/XML 도구 형식을 직접 JSON으로 대체하면 12턴 반복 루프를 포함한 동작 회귀가 발생했다. 작은 모델은 네이티브 도구 호출 표현에 더 강하게 조건화되어 있는 것으로 보인다. 따라서 Qwopus 설정에서는 일반 매핑에는 네이티브 XML 스타일 형식을 유지하고, 직렬화된 문자열 기록에는 JSON 보존 처리를 추가하는 하이브리드 설계를 채택했다. 현재 공식 Qwen3.6 및 Qwen3.8 템플릿에는 여전히 매핑 지향 코드 경로가 포함되어 있어, 모델이 학습한 도구 문법을 깨뜨리지 않도록 API 경계에서 정규화가 필요하다.

에이전트 디버깅에 대한 광범위한 시사점

이 연구는 "모델 루프"가 모델 동작뿐만 아니라 에이전트 스택 전반에 걸친 여러 다른 실패 모드의 증상임을 강조한다. 여기에는 다음이 포함된다.

  • 손상된 도구 기록: 프롬프트 렌더링 중 인자가 사라짐.
  • 파서 실패: 네이티브 도구 태그의 구분자 오해석.
  • 에이전트 계약 실패: 종결 도구가 성공한 후에도 하네스가 실행을 계속함.
  • 런타임 차이: HF Jinja, minja 및 기타 서버 간 인자 정규화 불일치.

신뢰할 수 있는 도구 사용을 위해서는 모델, 채팅 템플릿, 파서, 에이전트 하네스 등 전체 파이프라인을 평가해야 하며, 모델이 생성하도록 학습된 특정 도구 문법을 보존하고 템플릿 렌더링 전에 와이어 형식을 정규화하는 것이 권장된다.

이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.

AI 처리 방식을 확인하거나, 요약 오류와 출처 표기 문제, 삭제 요청을 문의 · 건의로 알려주세요.