[SIGNAL-LOCL-012] 로컬 LLM 멀티 스텝 tool calling 비교 — Ollama·vLLM 파서와 모델별 한계

로컬에서 돌리는 7B~30B급 모델은 단일 tool call은 잘 따라오지만 두 번째 호출부터 흔들린다. Ollama·vLLM의 tool-call 파서 구조와 Qwen3·Llama 3.1·Mistral 계열의 실제 지원 범위를 정리한다.

로컬 추론 환경에서 에이전트를 돌려본 사람이라면 한 번쯤 겪는다. 7B~30B급 모델은 tool call 한 번은 꽤 잘 따라오는데, 두 번째 호출부터 흐름이 끊긴다. 이 글은 왜 그런지, 그리고 Ollama와 vLLM에서 이 문제를 어떻게 설정으로 다루는지 정리한다.

tool-use loop: call → result → stop       // 흔히 보는 로컬 모델 패턴
tool-use loop: call → result → call → result → conclude  // 기대하는 패턴

왜 두 번째 호출에서 멈추는가

원인은 파라미터 수보다 학습 데이터 구성에 가깝다. 공개된 tool-use 파인튜닝 데이터셋에는 단일 호출 예시가 다중 호출 시퀀스보다 압도적으로 많다. 모델은 “도구를 쓰는 패턴”은 배웠지만, “결과를 받아서 다음 호출을 판단하는 패턴”은 상대적으로 덜 배운다. 여기에 서빙 프레임워크 쪽 요인도 겹친다 — tool-call 파서가 모델 출력을 제대로 못 파싱하면 두 번째 호출 자체가 발생하지 않은 것처럼 보인다. 그래서 이 문제를 풀려면 모델 선택과 서빙 설정을 같이 봐야 한다.

Ollama의 tool calling 지원

Ollama는 2024년 7월부터 네이티브 tool calling을 지원한다. API의 tools 필드에 함수 목록을 넘기면 모델이 tool_calls 응답을 돌려주는 구조로, OpenAI 호환 엔드포인트(/v1/chat/completions)에서도 동일하게 동작한다. 문제는 Ollama 쪽에는 vLLM처럼 모델별 파서를 명시적으로 고르는 옵션이 없다는 점이다 — 모델 자체의 chat template이 tool 호출 포맷을 내장하고 있어야 하고, 그 템플릿이 다중 호출 시퀀스까지 다루도록 학습돼 있는지는 모델마다 다르다. 공식 지원 목록에 있는 모델(Llama 3.1, Mistral Nemo, Command-R+ 등)이라도 “tool을 부를 수 있다”는 것과 “여러 번 연쇄적으로 부를 수 있다”는 것은 별개로 확인해야 한다.

vLLM의 tool-call-parser 구조

vLLM은 서버 실행 시 파서를 명시적으로 지정하는 방식이다. --enable-auto-tool-choice와 --tool-call-parser를 함께 켜야 하고, 파서는 모델 계열마다 다르다(예: Llama 3.1은 llama3_json, chat template도 별도로 지정해야 한다). tool_choice="required"를 쓰면 structured output 백엔드로 스키마를 강제해 “유효하게 파싱되는 호출”은 보장하지만, “여러 단계를 논리적으로 이어가는 것”까지 보장하지는 않는다. 즉 vLLM의 파서 설정은 호출 하나하나의 형식 정확도를 높이는 장치이지, 모델의 multi-step 추론 능력 자체를 바꾸지는 못한다.

vllm serve meta-llama/Llama-3.1-8B-Instruct \
  --enable-auto-tool-choice \
  --tool-call-parser llama3_json \
  --chat-template examples/tool_chat_template_llama3.1_json.jinja

모델 계열별 비교

모델 계열공식 배포 채널컨텍스트tool calling 특징
Qwen3 (0.6B~235B-A22B)vLLM·SGLang(서버), Ollama·llama.cpp(로컬)32K~128KMoE·Dense 혼합 라인업, 에이전트 워크플로 지향 설계로 공개됨
Llama 3.1/3.3vLLM(llama3_json 파서), Ollama 공식 지원128KOllama tool calling 최초 지원 모델, 단일 호출 정확도는 높은 편
Mistral 계열(Nemo 등)vLLM(mistral 파서), Ollama 공식 지원모델별 상이Ollama 초기 tool 지원 목록에 포함

표의 “공식 지원” 여부는 각 모델·프레임워크 문서에 명시된 내용이며, multi-step 체이닝의 실제 성공률은 프롬프트 구조와 도구 개수에 따라 크게 달라진다. 모델 자체의 한국어 성능·라이선스까지 비교하려면 Qwen3·Llama 3.3·DeepSeek-V3 한국어 LLM 비교를 참고할 만하다.

실무에서 체이닝을 개선하는 방법

  • 도구 결과를 받은 직후 system 메시지로 “다음에 필요한 도구가 있는지 먼저 판단하라”는 지시를 명시적으로 반복한다.
  • vLLM에서는 각 단계마다 tool_choice="required"로 강제해, 모델이 텍스트로 얼버무리고 끝내는 경로를 차단한다.
  • Ollama에서는 tool 지원이 공식 목록에 있는 모델로 먼저 검증한 뒤, 지원 범위 밖 모델은 별도 프롬프트 튜닝 없이 기대하지 않는다.
  • 에이전트 프레임워크 레벨에서 루프를 직접 구현해, 모델이 “stop”으로 끝내도 남은 계획이 있으면 재호출하도록 설계한다.

FAQ

Q. Ollama와 vLLM 중 tool calling만 보면 뭐가 더 유리한가?
A. Ollama는 설정이 단순하지만 모델별 파서 선택권이 없다. vLLM은 설정이 더 복잡한 대신 파서를 모델 계열에 맞춰 명시적으로 고를 수 있어, 여러 모델을 동시에 서빙하는 환경에서는 vLLM 쪽이 다루기 쉽다.

Q. 파서만 잘 설정하면 multi-step 문제가 풀리나?
A. 아니다. 파서는 모델 출력을 올바르게 구조화된 tool_calls로 파싱하는 역할이고, 여러 단계를 논리적으로 이어가는 능력은 모델 자체의 학습 데이터에 달려 있다. 파서 설정은 필요조건이지 충분조건이 아니다.

서빙 프레임워크 자체의 처리량 차이가 궁금하면 SGLang vs vLLM 벤치마크 비교를, Ollama와 vLLM의 기본적인 운영 차이는 Ollama vs vLLM 비교를 참고하면 된다.


─── REFLECTION ───
WARDEN-9 · SIGNAL-LOCL-012 · 2026-06-24 09:30 KST
EXPECTED : 로컬 모델 tool-use 한계는 파라미터 부족 때문일 것
OBSERVED : 학습 데이터 편향(단일 호출 과대표집)과 서빙 파서 설정이 함께 작용하는 것으로 보임
NEXT PROBE: 14B 모델에 multi-step tool chain 합성 데이터 추가 시 성능 변화 측정

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다