TL;DR
Qwen 3.5 모델의 로컬 추론 시 발생하는 XML 파싱 오류, 생각(Thinking) 태그 누출 등 4대 버그를 분석하고 서버별 대응 현황과 클라이언트 측 해결 코드를 제시한다.
배경
Qwen 3.5 모델을 로컬 환경(llama.cpp, Ollama 등)에서 에이전트 및 도구 호출 용도로 사용할 때 발생하는 기술적 결함들을 분석하고, 이를 해결하기 위한 서버 설정 및 클라이언트 측 코드를 공유했다.
의미 / 영향
Qwen 3.5와 같은 최신 모델의 에이전트 성능은 모델 자체의 능력보다 로컬 추론 서버의 프로토콜 준수 여부에 더 큰 영향을 받는다. 현재로서는 서버 측 업데이트를 기다리기보다 클라이언트 측에서 XML 파싱과 종료 사유를 보정하는 하이브리드 접근 방식이 실무에서 가장 안정적이다.
커뮤니티 반응
작성자가 제시한 해결책을 통해 Qwen 3.5 모델의 에이전트 신뢰도를 99%까지 끌어올렸다는 경험에 대해 긍정적인 반응이며, 특히 서버별 버그 현황 비교표가 유용하다는 평가이다.
주요 논점
Qwen 3.5는 모델 자체의 지능은 높으나 로컬 추론 서버들의 파싱 및 프로토콜 구현 미비로 인해 성능이 저하되고 있다.
서버 측 수정이 진행 중이지만, 당분간은 클라이언트 측에서 정규표현식 등을 이용한 커스텀 파싱 안전장치를 두는 것이 불가피하다.
합의점 vs 논쟁점
합의점
- Qwen 3.5의 기본 Jinja 템플릿에 도구 인자 처리에 관한 버그가 존재한다.
- llama.cpp는 현재 Qwen의 추론 태그 및 XML 파싱 처리에 있어 가장 불안정한 서버 중 하나이다.
- Unsloth에서 제공하는 수정된 GGUF와 템플릿이 로컬 실행의 표준 해결책으로 통용된다.
논쟁점
- Ollama의 최신 버전에서 도구 호출 유출 문제가 완전히 해결되었는지에 대해서는 여전히 간헐적인 오류 보고가 있어 의견이 갈린다.
실용적 조언
- Unsloth GGUF를 사용하여 템플릿 필터 오류를 방지하라.
- 서버 응답에서 <tool_call> 태그를 직접 추출하는 정규표현식 파서를 클라이언트 코드에 추가하라.
- 응답에 도구 호출이 포함되어 있다면 stop_reason을 강제로 tool_use로 변경하여 에이전트 중단을 막아라.
- LM Studio 0.4.9 이상 버전을 사용하여 서버 측 파싱 안정성을 확보하라.
섹션별 상세
import re, json, uuid
# 1. Parse Qwen XML tool calls from text content
def parse_qwen_xml_tools(text):
results = []
for m in re.finditer(r'<tool_call>([\s\S]*?)</tool_call>', text):
args = {}
for p in re.finditer(r'<parameter name="(.*?)">([\s\S]*?)</parameter>', m.group(2)):
k, v = p.group(1).strip(), p.group(2).strip()
try:
v = json.loads(v)
except:
pass
args[k] = v
results.append({"id": f"call_{uuid.uuid4().hex[:24]}", "name": m.group(1), "args": args})
return results
# 2. Fix finish_reason
def fix_stop_reason(message):
has_tools = any(b.get("type") == "tool_call" for b in message.get("content", []))
if has_tools and message.get("stop_reason") in ("stop", "error", "eos_token", "", None):
message["stop_reason"] = "tool_use"서버에서 실패하는 Qwen XML 도구 호출 파싱과 잘못된 종료 사유를 클라이언트 측에서 강제로 수정하는 안전장치 코드
용어 해설
- Tool Calling
- — LLM이 외부 API나 함수를 실행하기 위해 특정 형식(JSON, XML 등)의 명령을 생성하는 기능이다. 모델이 텍스트 생성 외에 실질적인 작업을 수행하게 하는 에이전트 아키텍처의 핵심 요소이다.
- Finish Reason
- — LLM 추론이 끝난 이유를 나타내는 상태 값이다. 일반 답변은 'stop', 도구 실행이 필요할 때는 'tool_calls' 또는 'tool_use'여야 하며, 이 값이 잘못되면 에이전트 루프가 중단된다.
- Thinking Block
- — 모델이 최종 답변을 내놓기 전 내부적으로 사고 과정을 거치는 영역으로 보통 <thought> 태그로 감싸진다. 로컬 서버에서 이 태그가 제대로 처리되지 않으면 답변 본문에 노출되어 컨텍스트를 오염시킨다.
- Jinja Template
- — 대화 기록을 모델별 특정 프롬프트 형식으로 변환하는 템플릿 엔진이다. Qwen 3.5의 경우 기본 템플릿의 필터 오류로 인해 도구 인자 전달이 실패하는 문제가 보고됐다.
언급된 도구
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.