← All Research Notes

Research note · 13 September 2026

How many are awake?

Sparse and dense local models inside a multi-hop research agent: nine instrumented runs on one question and one laptop, with the raw data.

gpt-oss:20b holds 32 experts in each mixture-of-experts layer and routes every token to 4 of them. Which four changes token to token.
Question
“What did the PISA 2025 study find about Israel, and how do the results compare with previous cycles?”
Runs
9 variant runs in 3 comparisons · 108 model calls · 288 extracted claims · 114 sources
Machine
Apple M5 Pro, 48 GB unified memory, macOS 26.6.2
Stack
Ollama 0.34.0 · SearXNG 2026.9.7 · Python 3.12 · SQLite + sqlite-vec 0.1.6

Findings

  • The two sparse models were the two fastest single-model runs. gpt-oss:20b finished in 108 s, 7.6–11.4× faster than the three dense models run alongside it (825–1,234 s). The sparse gemma4:26b-a4b took 787 s against 1,812 s for its dense sibling.
  • Inside one model family, sparsity bought speed, not thoroughness. The sparse Gemma finished in 43% of the dense Gemma’s time and ran a second search round, but that round added no claims. On the eight identical first-round pages it extracted 27 claims to the dense model’s 33, and 16 distinct figures to 27. Every one of its 16 figures was also found by the dense model.
  • The gap is in the arithmetic per token. On a cache-busted ~7k-token prompt, the sparse models prefilled at 1,155–1,369 tokens/s and decoded at 61–65 tokens/s. The dense models managed 62–345 and 8.6–19.7.
  • The reader role dominates the workload and caps the content. The evaluator made 81–89% of all model calls in every run, and the writer only sees the claims the evaluator extracted.
  • A mixed team did not beat its members on content. gpt-oss planning and reading with qwen3.8 writing took 244 s, against 108 s for gpt-oss alone and 1,023 s for qwen3.8 alone. It produced a longer report (850 vs 721 words), but its coverage lead over gpt-oss alone was within the run-to-run variation of the same reader.
  • Errors enter at the reader, and the citation gate cannot see them. In one run gpt-oss recorded 59% for a figure its source gives as 60%. The number reached the final report with a valid citation, and every automated check passed.
  • Three quirks in Ollama’s own metrics can reverse a conclusion. They are JSON-mode thinking left out of token counts, queue time billed to calls, and prompt-cache-inflated prefill rates.

The system under test

The agent answers a question by iterating plan → search → fetch → evaluate → synthesize. Three roles call a model, and each role can use a different one:

  • Planner. Breaks the question into sub-questions with search queries, and re-plans when a sub-question is under-covered.
  • Evaluator (the reader). Reads one fetched page against one sub-question. It returns relevance, coverage, whether the page answers the sub-question, and a list of claims. Claims below relevance 0.35 are dropped.
  • Synthesizer (the writer). Receives only the kept claims, grouped by source key, and writes a report.

Pages come from a self-hosted SearXNG instance, with robots.txt respected. A sub-question closes once two pages independently answer it. The run stops as covered when every sub-question closes, or budget_exhausted at the round limit. A hard citation gate rejects any report sentence that does not cite a source the run actually retrieved.

Question→Planner→Search→Fetch→Reader→Writer
Figure 1. The writer never sees page text, only claims. The reader made 81–89% of all model calls.

Setup and controls

Three comparisons, all on the same question with the same effort settings:

  • E1: one model in all three roles. gpt-oss:20b, muse-glimmer:30b-mlx, qwen3.8 and gemma4:31b-mlx.
  • E2: the same family, dense against sparse. gemma4:31b against gemma4:26b-a4b.
  • E3: a mixed team (gpt-oss plans and reads, qwen3.8 writes) against each member alone.

Models

ModelArchitectureTotalActive per tokenOn diskUsed in
gpt-oss:20bSparse · 32 experts, 4 routed20.9B≈3.6B13.8 GBE1, E3
gemma4:26b-a4b-it-q4_K_MSparse · 128 experts, 8 routed25.8B≈4B18.0 GBE2
gemma4:31bDense31.3B31.3B19.9 GBE2
gemma4:31b-mlxDense31.3B31.3B20.2 GBE1
qwen3.8:latestDense27.3B27.3B17.7 GBE1, E3
muse-glimmer:30b-mlxDense · provenance unverified32.3B32.3B21.2 GBE1

The two sparse models sit on disk (and in memory) close to their dense neighbours. Sparsity cuts the compute per token, not the memory footprint.

Effort settings and controls

Search rounds (max)2Sub-questions2
URLs per round6Pages evaluated per round5
Answering pages to close a sub-question2Synthesis passes1
ThinkingmediumThinking, readerlow
Temperature0.2Enginesduckduckgo, brave
  • Shared seed plan. One round-1 plan per comparison, reused by every variant.
  • Shared round-1 corpus. Round-1 pages are searched and fetched once and evaluated by every variant. Later rounds search live, so variants diverge after round 1.
  • Sequential execution. Variants run one after another on one GPU.
  • Request gating. In-flight model calls are capped at what the Ollama server actually runs in parallel, which is one. E1 predates this.

What wall clock means here: a variant’s time runs from its first call to its report. It includes every round-1 evaluation and all of round 2’s searching and fetching. It excludes the shared plan and round-1 fetch, which happen once before any variant starts.

Results

4.1 One model in every role (E1, E2)

Six runs with one model in all three roles. E1 and E2 share settings but not their round-1 pages, so compare within an experiment first.

gpt-oss:20b1.8 min41 claims · covered
gemma4:26b-a4b13.1 min27 claims · budget exhausted
muse-glimmer:30b-mlx13.8 min30 claims · covered
qwen3.818.5 min30 claims · covered
gemma4:31b-mlx20.6 min30 claims · covered
gemma4:31b (GGUF)30.2 min33 claims · covered

Figure 2. Wall clock per run with one model in all three roles. The same gemma4:31b weights appear twice as different builds in different experiments, so that is not a controlled build comparison.

gpt-oss:20b1.8 min
gemma4:26b-a4b13.1 min
muse-glimmer:30b-mlx13.8 min
qwen3.818.5 min
gemma4:31b-mlx20.6 min
gemma4:31b (GGUF)30.2 min
Figure 3. Wall clock per single-model run. Sparse models are blue; dense models are orange.
VariantExpWallRoundsPagesClaimsFiguresAgreedWordsStop
E1 · 42 agreed figures
gpt-oss:20bE1108 s29414335752covered
muse-glimmer:30b-mlxE1825 s29303634905covered
qwen3.8E11,111 s210304641961covered
gemma4:31b-mlxE11,234 s210303631585covered
E2 · 16 agreed figures
gemma4:26b-a4bE2787 s213271616479budget_exhausted
gemma4:31bE21,812 s18332716592covered

A stricter bar in E1—figures found by at least three of the four models—gives the same order: qwen3.8 found all 34, gpt-oss 32, gemma4:31b-mlx 30, muse-glimmer 29. gpt-oss’s 41 claims are more granular rather than more complete.

Every one of the six reports passed the citation gate, and every number in every report appears in that run’s own claims. That is fidelity to the evidence, not correctness.

4.2 Same family, dense vs sparse (E2)

gemma4:31b and gemma4:26b-a4b share a vendor, a generation, a quantization and, within E2, the same round-1 pages. The sparse model took 787 s against 1,812 s. It closed neither sub-question in round 1, so it ran a second round and evaluated 13 pages to the dense model’s 8. That second round added no claims. On the eight shared round-1 page–sub-question pairs, the dense model found claims on 6 pages (33 claims) and the sparse model on 5 (27). The dense model’s 27 distinct figures include all 16 of the sparse model’s, plus 11 more.

One reliability event is worth noting. The sparse Gemma’s first synthesis call spent its entire 16,384-token budget thinking (56,072 characters) and returned no report. The automatic retry succeeded.

4.3 Prefill and decode

A separate micro-benchmark isolates per-token speed. Each model got one ~6–7k-token prompt with a random prefix to defeat prompt caching, one warm-up call, and then the mean of two calls.

Prefill · tokens/s

gpt-oss:20b 1,369
gemma4:26b-a4b 1,155
muse-glimmer:30b-mlx 345
qwen3.8 125
gemma4:31b 62

Decode · tokens/s

gpt-oss:20b 61.4
gemma4:26b-a4b 64.9
muse-glimmer:30b-mlx 19.5
qwen3.8 19.7
gemma4:31b 8.6

Prefill · tokens/s

gpt-oss1,369
gemma sparse1,155
muse345
qwen125
gemma dense62

Decode · tokens/s

gemma sparse64.9
gpt-oss61.4
qwen19.7
muse19.5
gemma dense8.6
Figure 4. Cache-busted prefill and decode speed, each on its own scale.

4.4 Where the tokens go

Planner and evaluator calls ask for JSON with thinking enabled. For those calls Ollama leaves thinking out of eval_count, which is why the raw completion column is small next to the thinking column.

VariantCallsPrompt tokensRaw completionThinking charsOutput charsThinking share
gpt-oss:20b1122,5803,0315,79310,95335%
muse-glimmer:30b-mlx1134,3095,98259,38611,09384%
qwen3.81235,7805,38832,62813,92770%
gemma4:31b-mlx1234,9415,57230,6388,78478%
gemma4:26b-a4b1651,81724,875128,6628,71094%
gemma4:31b924,7184,16721,3098,42372%

The sparse Gemma generated six times the thinking of its dense sibling (128,662 vs 21,309 characters) and still finished in under half the time. Its raw completion count is inflated by the failed 16,384-token synthesis call, which ran outside JSON mode.

4.5 A mixed team (E3)

Because the writer sees only claims, the reasoning was to put a fast model where calls repeat—the reader—and a slower model where the work happens once—the writer. E3 tests that against both members run alone, on the same plan and the same six round-1 documents.

Setup

Team
gpt-oss → gpt-oss → qwen3.8
244 s

Setup

gpt-oss alone
gpt-oss → gpt-oss → gpt-oss
108 s

Setup

qwen3.8 alone
qwen3.8 → qwen3.8 → qwen3.8
1,023 s

SetupWallPagesSourcesClaimsFiguresAgreedOnly hereWordsTraceable
Team244 s1116313030 / 32085029 / 29
gpt-oss alone108 s913322828 / 32072128 / 28
qwen3.8 alone1,023 s1112343829 / 3291,05037 / 37

The team ran in 244 s, 4.2× faster than qwen3.8 alone and 2.3× slower than gpt-oss alone. All three runs finished with covered, cited 6 sources and passed the citation gate.

The coverage difference between the team and gpt-oss alone is noise. Both used gpt-oss as the reader. Across the two gpt-oss runs on identical inputs, 26 figures matched, 3 appeared only in the team’s run and 1 only in the solo run. That run-to-run variation is as large as the 30-vs-28 gap, and the writer cannot add figures anyway. qwen3.8 was the more thorough reader.

What the slower writer did produce is a longer report: 850 words against 721 from the same claims base. Prose quality was not measured.

Limits

This is nine instrumented runs on one question, one laptop, one GPU and one set of effort settings. The results describe this agent configuration and workload; they do not establish a general ranking of model families or a universal advantage for sparse models.