히어로 타이틀 카드: DeepSeek V4.1 Flash 툴 호출 기능이 vLLM에 적용 — 띄어쓰기 된 태그가 V4 감지기를 망가뜨렸다
Engineering & Research

DeepSeek V4.1 Flash 도구 호출 기능, vLLM에 적용되다: 공백 태그가 망가뜨린 것

작성자

Rowan Sterling

게시일

최신 모델 · 20모든 모델 보기
벤치마크: Artificial Analysis · 매일 업데이트
모든 게시물로 돌아가기

DeepSeek V4.1 Flash는 2026년 9월 10일부터 정식 제공(GA)되었는데, 출시 후 첫 12일 동안 이 모델에는 아무도 언급하지 않은 공백이 있었습니다. 추론할 수 있고, 이미지를 볼 수 있고, 100만 토큰의 컨텍스트를 담을 수 있었지만, 가장 널리 사용되는 오픈 서빙 스택을 통해 도구를 안정적으로 호출하지는 못했습니다. 이제 그 공백은 vLLM에서 해소되었습니다. 구성 플래그가 아니라 파서 재작성으로 말입니다. 두 개의 풀 리퀘스트가 그 작업을 담고 있으며, 그것이 필요했던 이유가 바로 흥미로운 부분입니다.

요약하자면: DeepSeek V4.1 Flash는 도구 호출을 기존 DeepSeek V4 감지기가 인식하지 못하는 태그 형식으로 내보냅니다. 그래서 기본 vLLM 배포에서는 도구 호출 마크업이 구조화된 출력 대신 일반 텍스트로 들어옵니다. 아무 오류도 발생하지 않습니다. 모델이 그냥 함수 호출을 거부한 것처럼 보입니다. 자체 호스팅 DeepSeek V4.1 Flash를 대상으로 에이전트 루프를 테스트하면서 이 모델이 도구를 잘 못 다룬다고 결론 내리고 있었다면, 십중팔구 바로 이것을 보고 있었던 것입니다.

서빙 스택에서 실제로 무엇이 바뀌었나

DeepSeek 모델을 위한 vLLM의 도구 호출 파싱은 한동안 두 곳에 존재해 왔습니다: Python 프런트엔드와 더 새로운 Rust 프런트엔드이며, 문법 수준 작업은 XGrammar 프로젝트에 위임되어 있습니다. V4.1 Flash 지원을 가져오는 일은 XGrammar 내부의 C++ deepseek_xml 변환을 Rust 빌더로 포팅한 다음, 모델 자체의 인코딩을 vLLM의 토크나이저 디렉터리에 연결하는 것을 의미했습니다.

• Rust 프런트엔드 작업은 PR #56235로, XGrammar C++ deepseek_xml 변환을 Rust 빌더로 이식하는 작업입니다. V4.1 전용 신규 테스트 18개를 포함하며, 기존의 전체 스위트 — vllm-parser의 472개 테스트와 vllm-chat의 326개 테스트 — 도 모두 통과 상태를 유지합니다.

• Python 프런트엔드 작업은 PR #56408이며, 아직 초안 상태입니다. 이는 업스트림 XGrammar 변경(mlc-ai/xgrammar#885)이 먼저 반영되는 것에 의존하며, 해당 의존성을 적용한 상태에서 110개의 테스트가 통과한다고 보고합니다.

• 새 인코딩 모듈은 vllm/tokenizers/deepseek_v41_encoding.py — V4 인코딩 내부의 분기가 아니라 별도 파일이며, 이는 태그 문법이 단순히 확장된 것이 아니라 실제로 다르다는 것을 알려줍니다.

• 호출은 명시적입니다: --tool-parser deepseek_v41. 조용히 알아서 올바르게 처리해 주는 자동 감지 폴백은 없습니다.

공백이 포함된 태그가 전부입니다

새로운 파서가 더 넓게 확장된 정규 표현식 대신 존재하는 이유는 공백 때문이다. DeepSeek V4.1 Flash는 DSML 도구 태그를 토큰 사이에 공백을 두고 작성한다. V4 감지기의 패턴은 공백이 없는 형식을 기대하므로 일치에 실패하며, 도구 호출 파서에서 일치 실패는 설계상 조용히 처리된다 — 텍스트는 예외를 발생시키는 대신 콘텐츠로 그대로 전달된다.

그 실패 모드는 가장 값비싼 종류이기에 곱씹어 볼 가치가 있다. 예외를 던지는 파서는 오후 한나절이면 고쳐진다. 호출자가 요청한 적 없는 마크업을 포함한 잘 구성된 문자열을 반환하는 파서는 모델 품질 문제처럼 보이고, 팀은 모델 품질 문제에 대응하듯 대응한다. 다른 프롬프트를 시도하고, 예시를 추가하고, 모델을 바꾼다. 12일이면 그런 일이 비공개로 많이 일어났을 만큼 충분히 길다.

그것은 또한 이 수정이 튜닝 노브가 아니라는 것을 의미합니다. 모델의 출력 형식과 일치하지 않는 탐지기를 프롬프트로 빠져나갈 수는 없으며, 클라이언트에서 후처리로 고칠 수도 없습니다. 텍스트가 클라이언트에 도달할 때쯤이면 구조는 이미 사라져 있기 때문입니다. 이는 서빙 스택에서 이루어져야 하며, 바로 지금 그곳에 있습니다.

이것이 V4에서보다 V4.1 Flash에서 더 중요한 이유

툴 호출은 이 특정 모델에게 있으면 좋은 기능이 아닙니다. DeepSeek V4.1 Flash는 5,520억 개 파라미터의 전문가 혼합(mixture-of-experts) 모델로, 입력 시 80억 개, 출력 시 160억 개 파라미터가 활성화되며, 100만 토큰 컨텍스트 윈도우와 384K 토큰 최대 출력을 갖추고 있습니다. 활성화 분할이 핵심 단서입니다: 이 모델은 큰 입력 — 리포지토리, 문서 세트, 긴 툴 트레이스 — 을 받아 긴 구조화된 응답을 내보내도록 만들어졌습니다. 이는 채팅 형태가 아니라 에이전트 형태입니다.

출시 스펙의 나머지 부분도 같은 방향을 가리킨다. MIT 라이선스 가중치, 토큰당 890바이트의 KV 캐시, 45조 개의 사전 학습 토큰, 네이티브 비전. KV 캐시 수치는 1M 컨텍스트에서 운영상 중요한 값이다: 긴 에이전트 기록을 상주시켜 두는 비용을 감당 가능하게 해 주는 것이 바로 이 수치이며, 더 비싼 모델이 감독하는 루프에서 이 모델이 저렴한 작업자로 타당한 이유이기도 하다.

Single-model scoreboard for DeepSeek V4.1 Flash: 552B total parameters in a mixture-of-experts design with 8B active on input and 16B on output, 1M-token context window, 384K max output, $0.15 input and $0.60 output per 1M tokens off-peak, and an 890-byte KV cache per token, footnoted as specs from DeepSeek's own release page with no independent tool-calling score yet

이로 인해 12일간의 도구 호출 공백은 각주가 아니라 실질적인 비용이 된다. 경제적 근거가 에이전트 파이프라인에서 대량 실행자 역할을 하는 데 달려 있는 모델은, 파이프라인이 그 모델로부터 구조화된 호출을 얻어낼 수 없다면 거의 가치가 없다.

Screenshot of DeepSeek's own release page for DeepSeek-V4.1-Flash dated 2026/09/10, showing the 552B-parameter MoE architecture with 8B active for input and 16B for output, a KV-cache memory-reduction graphic, and DeepSeek's own four-benchmark comparison chart

아직 열려 있는 것은 무엇인가요?

2026년 9월 22일 기준, 솔직한 현황:

• Rust 프런트엔드 경로(PR #56235)는 새 V4.1 케이스와 기존 스위트 모두에서 전체 테스트 커버리지를 갖춘 경로입니다. 이를 포함한 vLLM 빌드를 사용 중이라면, 파서를 오늘 바로 사용할 수 있습니다.

• Python 프론트엔드 경로(PR #56408)는 초안이며 외부 종속성이 있습니다. XGrammar 변경 이전의 빌드에 고정되어 있다면, Python 프론트엔드는 아직 V4.1 도구 파싱을 제공하지 않습니다.

• 호출이 명시적이므로, vLLM을 업그레이드하되 실행 플래그는 변경하지 않는 배포는 기존 동작을 그대로 유지합니다. 파서가 존재하는 것과 파서가 실제로 사용되는 것은 별개의 문제입니다.

• 새로운 파서가 적용된 V4.1 Flash를 대상으로 독립적인 도구 호출 벤치마크를 실행한 공개적 증거는 아직 없습니다. 우리가 아는 것은 내부 연결 체계가 작동하고 테스트가 통과한다는 사실입니다. 모델의 도구 호출 품질이 좋은지 여부는 이번 병합이 답하지 않는 별개의 질문입니다.

그 마지막 요점이야말로 꼭 기억해야 할 부분입니다. 파서 수정은 모델을 "평가할 수 없음"에서 "평가할 수 있음"으로 옮깁니다. 그것은 판정을 위한 전제 조건이지, 판정 자체는 아닙니다.

서빙 스택을 직접 실행하고 싶지 않다면

더 짧은 경로가 있습니다. DeepSeek V4.1 Flash는 OrcaRouter의 전용 엔드포인트를 통해 사용할 수 있습니다. 즉, 도구 호출 동작이 빌드 문제가 아니라 일반 API 호출로 전달됩니다 — 맞춰야 할 XGrammar 버전도, 선택해야 할 프런트엔드도, 기억해야 할 실행 플래그도 없습니다. 이것이 여기서 특히 중요한 이유는 수정 사항이 서로 다른 성숙도로 두 곳에 반영되었는데, 호스팅된 엔드포인트를 쓰면 그 결정은 사라지기 때문입니다.

같은 키는 또한 비교하게 될 나머지 모델들에도 도달합니다. 이는 질문이 "이 파서가 올바른가"가 아니라 "이 모델이 내 루프에 충분히 좋은가"일 때 유용한 특성입니다. DeepSeek V4.1 Flash를 저렴한 실행자로 라우팅 규칙 뒤에 두고, 호출이 실패하면 더 강력한 모델로 페일오버할 수 있으며, 두 번째 계약이나 두 번째 SDK가 필요하지 않습니다. 툴 호출 지원이 겨우 2주 된 모델을 시도해 보는 것은 자동 페일오버가 존재하는 바로 그런 상황입니다.

Screenshot of the OrcaRouter model page for deepseek/deepseek-v4.1-flash, showing the model id with a Featured badge, 1M-token context, 384K max output, text and image input, $0.15 input and $0.60 output per 1M tokens, a cache read rate of $0.003, and observed time to first token of 2.63 s at p50 and 9.05 s at p95

다음에 볼 것

세 가지가 이것을 배관 이야기에서 평결로 바꿔 놓을 것이다:

• PR #56408이 초안에서 벗어나며, 이는 Python 프런트엔드 경로를 실질적으로 만들고 두 계층 지원 상황을 끝낼 것입니다.

• 고정된 서빙 스택에서 V4.1 Flash를 대상으로 실행한 독립 에이전트 또는 도구 호출 평가. 이 모델은 출시된 지 12일 되었고 파서가 사용 가능해진 지는 그보다도 짧습니다. 따라서 지금 이 모델에 대해 인용되는 도구 호출 점수는 한번 따져볼 필요가 있습니다 — 설정도 모델만큼 중요합니다.

• 다른 서빙 스택들도 따라오는지 여부. 공개 PR이 있는 쪽은 vLLM이다; 공백 태그 문제는 vLLM에만 국한된 것이 아니므로, V4.1 출력에서 다시 도출하지 않고 V4 탐지기를 채택한 스택이라면 어디든 동일한 조용한 실패가 그 안에 도사리고 있다.

그중 첫 번째가 실현되기 전까지, 정확한 요약은 범위가 좁으며 분명히 말할 가치가 있다: DeepSeek V4.1 Flash는 MIT 라이선스 가중치, 1M 컨텍스트, 384K 출력 상한을 갖춘 GA 모델이고, 이제 vLLM의 Rust 경로에서 명시적 파서 플래그로 도구 호출이 작동한다. 그것은 실질적인 진전이며 아직 결과는 아니다.

이 글에서 비교한 모델1

이 글에서 자동 인식 · 벤치마크: Artificial Analysis · 매일 업데이트