DEV Community

Anak Wannaphaschaiyong
Anak Wannaphaschaiyong

Posted on

Why Small LLMs Fail at Tool Calling: The Shocking Discovery from Our Llama 3B Benchmark

Why Small LLMs Fail at Tool Calling: The Shocking Discovery from Our Llama 3B Benchmark

We ran a benchmark. Nine tasks. Three difficulty levels. A ReAct agent equipped with tools. And Llama 3B never used a single one of them.

Not once. Not even an attempt.

Every task log showed the same pattern: stop=end_turn, tools=none. The model would reason, sometimes partially, and give up — never reaching for the tools sitting right in front of it. Final accuracy: 11%, driven entirely by a single Fibonacci calculation it happened to solve through direct reasoning.

Before we get into the data, take a moment to notice your own assumption here. Most people, hearing "we hooked a language model up to a set of tools," expect some level of tool use — even imperfect, even clumsy. You might already be wondering whether we set the tools up correctly, or whether the prompts were clear enough. That's a natural reaction. And it turns out to be the more interesting question.

What we found reshapes how you should think about model selection for any agentic application.


The Benchmark Setup

Our evaluation used a standard ReAct (Reasoning + Acting) agent architecture — the same pattern powering most production AI agents today. The agent was given access to a set of tools and presented with nine tasks spanning three difficulty tiers:

  • Easy: Basic arithmetic, factual lookups, simple transformations
  • Medium: Multi-step reasoning, data retrieval with filtering, conditional logic
  • Hard: Chained tool calls, aggregate reasoning across multiple sources

The model under test: Llama 3B, Meta's smallest production-ready language model.

The expectation was reasonable: even if Llama 3B struggled with harder tasks, it should at least attempt tool use on the easier ones. Calculate something. Look something up. Show its work.

What we got instead was silence.


The "tools=none" Pattern

Here's what the logs looked like, task after task:

Task: Find the current stock price of AAPL and calculate the percentage change from last week.

Thought: I need to look up the current stock price...
Thought: The stock price is likely around...
Answer: AAPL is trading at approximately $185, which represents a slight change from last week.

[stop=end_turn, tools=none]
Enter fullscreen mode Exit fullscreen mode

The model knew it needed information it didn't have. It acknowledged uncertainty in its internal reasoning trace. And then it confabulated an answer rather than using the search tool available to it.

This is the moment the "setup problem" hypothesis starts to unravel. The tools were there. The model's reasoning trace showed it recognized the need for external data. The connection between "I need this information" and "I have a tool that can get it" simply never fired.

This happened across all nine tasks. The only success was Fibonacci — a pure mathematical computation requiring no external data:

Task: Calculate the 15th Fibonacci number.

Thought: I can calculate this directly.
Thought: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610
Answer: The 15th Fibonacci number is 610.

[stop=end_turn, tools=none]
Enter fullscreen mode Exit fullscreen mode

Correct. No tools needed. And the one scenario where no tools were needed was the one scenario the model succeeded at.

Final results: 1 out of 9 tasks successful. 11% accuracy. Zero tool invocations.


Reframing What "Failure" Means Here

Before diving into the data, it's worth being precise about what we mean. When a model fails to call a tool, we're not watching a model that tried and got the parameters wrong. We're watching a model that didn't try.

Think about what that means architecturally. A language model trained on internet text has seen billions of examples of a single pattern: here's a question → here's an answer. The model's entire training compressed that pattern into weights. Tool use requires interrupting it: here's a question → assess what I don't know → identify a relevant tool → construct a valid call → wait for the result → integrate it → now answer.

That detour is long. And for a small model, the pull toward the short path is powerful enough to override the tools entirely.

This isn't a bug in Llama 3B. It's a window into what small model capability actually looks like.


The Four-Tier Tool Calling Framework

We're not the only ones who've noticed this pattern. The Berkeley Function Calling Leaderboard has been systematically evaluating tool-calling capabilities since 2024, and the data tells a clear story. Models cluster into four distinct performance tiers:

Tier 1: Elite Production-Ready (85–95% success)

Model Tool Calling Success
GPT-4o ~92%
Claude 3.5 Sonnet ~90%
Gemini 1.5 Pro ~87%

These models reliably detect when tools are needed, generate correct parameters, handle multi-step tool chains, and recover gracefully from tool errors. They're what you reach for when tool-calling correctness is non-negotiable.

Tier 2: Budget-Friendly Reliable (70–85% success)

Model Tool Calling Success
Claude 3 Haiku ~78%
ToolACE-8B ~75%

Capable models that handle most tool-calling scenarios correctly. Occasional failures on complex parameter structures or deeply nested tool chains, but reliable enough for many production use cases with appropriate fallback handling.

Tier 3: Limited and Inconsistent (50–70% success)

Model Tool Calling Success
Llama 3 70B ~58%

The 70B model can call tools — sometimes. But the inconsistency is the problem. You can't build reliable pipelines on a model that succeeds 58% of the time without knowing which 58%. Failures cluster around complex schemas, ambiguous parameter requirements, and multi-tool scenarios.

Tier 4: Fundamentally Broken (20–50% — or zero)

Model Tool Calling Success
Llama 3B ~0% (our benchmark)
Other sub-7B models 20–35%

Here's where our benchmark result fits. Sub-7B models don't just perform poorly at tool calling — many of them effectively cannot do it at all. The capability isn't underdeveloped; it's absent.

Notice what this four-tier structure is telling you: tool-calling capability doesn't scale linearly with model size. There's a cliff somewhere around 7 billion parameters. Below it, you're not getting "less tool calling" — you're getting "essentially no tool calling." Above it, the capability emerges.


Why Small Models Skip Tools

The "tools=none" pattern isn't random failure. It's a window into what's actually happening inside a 3B parameter model when it encounters a tool-calling situation. Three mechanisms are at work:

1. Limited Tool Detection (≈35% capability)

Recognizing when a tool is needed requires a kind of meta-cognition: the model has to evaluate its own knowledge gaps, assess whether a tool could fill them, and weigh that option against direct response. For large models, this happens implicitly. For small models, the working memory required to maintain both the task context and the tool-evaluation frame simultaneously appears to exceed capacity.

Llama 3B can recognize what question it's being asked. It struggles to simultaneously track "what do I not know?" and "what tools could address that gap?" as parallel analytical threads.

2. Poor Parameter Generation (≈30% capability)

Even when a small model recognizes it should use a tool, forming a valid tool call requires generating a structured output — usually a JSON object with correct keys, value types, and nested structures — that matches the function signature. This is a different skill from natural language generation, and it's one that small models handle poorly.

The result: even the rare cases where a small model attempts a tool call often produce malformed parameters that cause the tool to fail. The model then defaults to direct response as a fallback — completing the task, just badly.

3. Training Bias Toward Direct Generation

Large language models are trained primarily on text — and the overwhelming pattern in text is: question → answer, prompt → completion. Tool use requires interrupting that pattern: question → assess → invoke → wait → integrate → answer. The detour is long, and models trained on billions of examples of direct completion have a powerful prior pushing them toward the short path.

Large models appear to overcome this prior through sheer representational capacity. Small models don't have enough headroom. When the short path (direct generation) and the correct path (tool invocation) compete, the short path wins.


The Architecture Trap

Here's where the story gets interesting — and where a lot of teams make expensive mistakes.

When we saw the baseline ReAct results, we tried something reasonable: add a routing layer. The idea was to give the model a simpler first decision — "do I need tools at all? If so, which type?" — before asking it to execute tool calls. Decompose the hard problem into easier steps.

You can see the logic. If the model is failing because the full tool-calling task is too complex, simplify the first step. Route first. Execute second. Seem reasonable?

The result: 0% accuracy. Worse than the baseline.

The routing agent confused Llama 3B further. More complex prompts with conditional branching, category selection, and multi-stage reasoning exceeded its capacity even more than the straightforward ReAct setup. The model couldn't hold the routing logic in context while also tracking the task. We had made the problem harder by trying to make it easier.

This is the architecture trap: when you're working with a model that lacks fundamental capability, architectural sophistication makes things worse, not better. It's not that routing is bad. It's that routing assumes a model capable of following it. Llama 3B couldn't follow either the baseline or the enhanced version. The bottleneck was never the architecture.

Model capability trumps architectural sophistication. Complexity is not a substitue for capability.

This should shift how you think about framework choices in agentic systems. The most powerful agent frameworks in the world — LangChain, LlamaIndex, AutoGen, CrewAI — are layers on top of model behavior. They amplify what's there. They cannot manufacture what isn't.


The 7B Parameter Rule

Aggregating our results with the Berkeley leaderboard data and other published benchmarks, a pattern emerges: 7 billion parameters appears to be the practical minimum for viable tool-calling capability.

Below 7B, you see the behaviors we documented with Llama 3B: low or zero tool invocation rates, confabulated responses in place of tool use, catastrophic failure on multi-step tool chains. Above 7B — particularly in fine-tuned specialist models like ToolACE-8B — reliable tool calling becomes achievable.

This isn't about 7B being a magic number. It's about the minimum representational capacity needed to simultaneously:

  • Hold task context
  • Evaluate knowledge gaps
  • Select appropriate tools
  • Generate valid parameters
  • Integrate tool results into coherent responses

Sub-7B models can't do all of these things at once. They sacrifice one or more steps — and the step they most reliably sacrifice is the tool invocation itself.

Think of it like juggling. A beginner can keep one ball in the air. Two is hard. Three is unreliable. Tool calling requires five cognitive tasks running in parallel. Small models drop one before they start.


The Real Cost of Broken Tool Calling

There's a tempting budget argument for small models: they're cheaper to run, they can run locally, and they're fast. Why not accept some accuracy loss?

The problem is the failure mode.

When Llama 3B fails at a task, it doesn't return an error. It returns a confident, plausible-sounding wrong answer. In our benchmark, it didn't say "I can't look up the current stock price." It said "AAPL is trading at approximately $185" — a number it invented.

This is the distinction between error and hallucination — and it matters enormously for production systems.

An error is debuggable. When a tool call fails with an exception, you have a stack trace, a status code, a known point of failure. You can log it, retry it, flag it for review. The system knows something went wrong.

A hallucination is invisible until something downstream breaks. A number in a database. A recommendation in a report. A decision made on false information. The system doesn't know anything went wrong because, from the system's perspective, nothing did — it got a response.

In a production system, that failure is invisible until something downstream breaks. The cost calculation changes when you account for:

  • Debug time spent tracing failures to hallucinated tool responses
  • Data quality downstream of agents feeding incorrect outputs into pipelines
  • User trust eroded by an agent that confidently lies
  • Re-runs when bad outputs require the entire workflow to restart

Failed workflows with confident wrong answers cost orders of magnitude more than slightly higher API fees. The "free" local model often ends up being the expensive one.


Practical Guidance

Based on our benchmark and the broader leaderboard data, here's what we'd recommend:

Never use models under 7B for tool-calling agents. The capability simply isn't there. You're not accepting a 30% accuracy hit — you're building on a foundation that won't hold weight.

Test tool calling explicitly before production deployment. Don't assume that a model that passes general benchmarks can handle tool use. Create a small evaluation set that specifically tests tool invocation, parameter generation, and multi-step tool chains in your domain.

Set a 70% reliability threshold for production consideration. Below 70% success on tool-calling benchmarks, the failure rate is too high for reliable pipelines. Even with retry logic and fallbacks, you're fighting the model's fundamental limitations.

Consider hybrid approaches. For cost-sensitive workloads, consider routing by task type:

  • Local small models for pure text tasks: summarization, classification, extraction (no tools required)
  • Cloud models like GPT-4o or Claude for any tool-assisted workflows

This hybrid approach captures cost savings where small models can actually perform while not sacrificing reliability where they can't.

When in doubt, run your own benchmark. General benchmarks are useful signals, but nothing replaces evaluating a model on your specific tools, your specific task distribution, and your actual failure cost profile. A model that performs well on Berkeley leaderboard tasks may fail on your specialized API schemas. The only way to know is to test.


What This Means for Agent Architecture in 2026

The agent ecosystem has matured significantly. Frameworks like LangChain, LlamaIndex, AutoGen, and CrewAI have made it easy to build sophisticated multi-agent pipelines. The tooling is excellent.

But the tooling can't paper over a model that can't follow it.

The fundamental lesson from our Llama 3B benchmark is that agent architecture is downstream of model capability. The most elegant routing logic, the most carefully crafted prompts, the most sophisticated fallback chains — none of it helps if the model can't execute the basic action of recognizing that a tool exists and calling it.

The "tools=none" logs are clarifying. They cut through all the architectural complexity and say: this model is not an agent. It's a text generator that was asked to be an agent and politely declined the job.

Here's the insight worth carrying forward: tool calling isn't just a feature you can add to any model with the right framework. It's an emergent capability that requires sufficient representational capacity to exist at all. The four-tier framework isn't describing degrees of the same capability — it's describing qualitatively different things. Tier 1 models and Tier 4 models are not doing the same task with different accuracy. Tier 4 models aren't doing the task.

Knowing that early — before you've built pipelines, written integrations, and promised stakeholders reliable outputs — is worth more than any benchmark number.


TL;DR

  • Our ReAct agent using Llama 3B showed zero tool invocations across 9 diverse tasks
  • 11% task success came entirely from a Fibonacci problem solvable without tools
  • The Berkeley Function Calling Leaderboard confirms a four-tier hierarchy of tool-calling capability
  • GPT-4o leads at ~92%; Llama 3B sits at effectively 0%
  • A 7B parameter minimum appears necessary for viable tool-calling capability
  • Adding architectural complexity (routing agents) made Llama 3B worse, not better
  • Failed workflows with confident hallucinations cost more than higher API fees
  • Test tool calling explicitly — don't assume general benchmark performance predicts it
  • Tool calling is an emergent capability — below the threshold, you don't get less of it, you get none of it

If you're evaluating models for agent applications: run tool-calling benchmarks specific to your use case. The capability gap between small and large models isn't a matter of degree. It's a matter of kind.


The benchmark data referenced in this post combines our internal 9-task evaluation with publicly available results from the Berkeley Function Calling Leaderboard. Model performance figures are approximate and reflect results as of early 2026. Individual results may vary based on prompting strategy, temperature settings, and task specifics.

Top comments (0)