<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Paragon666</title>
    <description>The latest articles on DEV Community by Paragon666 (@paragon666).</description>
    <link>https://dev.to/paragon666</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4243583%2Fc0222d54-c5b8-4c62-abd4-14165ba74ed1.jpg</url>
      <title>DEV Community: Paragon666</title>
      <link>https://dev.to/paragon666</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/paragon666"/>
    <language>en</language>
    <item>
      <title>We Benchmarked Our Extraction Pipeline Four Ways. The Obvious Knobs Lied.</title>
      <dc:creator>Paragon666</dc:creator>
      <pubDate>Sat, 14 Nov 2026 01:01:03 +0000</pubDate>
      <link>https://dev.to/paragon666/we-benchmarked-our-extraction-pipeline-four-ways-the-obvious-knobs-lied-3f7c</link>
      <guid>https://dev.to/paragon666/we-benchmarked-our-extraction-pipeline-four-ways-the-obvious-knobs-lied-3f7c</guid>
      <description>&lt;p&gt;We are a small independent lab in Los Angeles, and this is the lab notebook&lt;br&gt;
of one real production job — not a synthetic benchmark. The job:&lt;br&gt;
verbatim-quote extraction over a fixed private text corpus. For each chunk,&lt;br&gt;
the model returns up to a fixed quota of exact quotes with anchors. We ran&lt;br&gt;
that job several ways on public models and public software — a local 9B&lt;br&gt;
model on a consumer GPU, and two hosted flagships — and measured the things&lt;br&gt;
that decide whether the output is usable: ground-truth completeness (share&lt;br&gt;
of the reference quote set recovered), parse failure rate, the non-verbatim&lt;br&gt;
rejection share (rejected quotes over all returned quotes), and time.&lt;br&gt;
Within each test the arms share inputs and scoring; where a test uses a&lt;br&gt;
different metric, it says so on the spot. The headline claims travelling&lt;br&gt;
with this stack did not survive contact with a real task. Four tests&lt;br&gt;
changed how we configure everything — and the scoreboard near the end sums&lt;br&gt;
up what is better where, so you do not have to assemble it from the tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A server upgrade that wins and loses on the same day
&lt;/h2&gt;

&lt;p&gt;llama.cpp, Qwen3.5-9B-Q4_K_M, RTX 3060 12 GB. Production build b11669 vs&lt;br&gt;
release v1.0.0 (b12359), side by side:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Build&lt;/th&gt;
&lt;th&gt;Completeness, quota 20&lt;/th&gt;
&lt;th&gt;Completeness, quota 40&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;b11669&lt;/td&gt;
&lt;td&gt;0.4288&lt;/td&gt;
&lt;td&gt;0.4676&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v1.0.0&lt;/td&gt;
&lt;td&gt;0.5469&lt;/td&gt;
&lt;td&gt;0.3916&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The newer build is +11.8 points at quota 20, −7.6 points at quota 40, and&lt;br&gt;
slower at both: +1.5% wall-clock at quota 20, +16.9% at quota 40. The&lt;br&gt;
ranking reverses with a prompt parameter. We kept the old build. "Newer is&lt;br&gt;
better" is not a measurement; it is a hope.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Bigger chunks, worse results
&lt;/h2&gt;

&lt;p&gt;Same server and model, context fixed at 65,536 tokens, quote quota fixed&lt;br&gt;
at 20 per chunk; only chunk size changes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chunk&lt;/th&gt;
&lt;th&gt;Completeness&lt;/th&gt;
&lt;th&gt;Wall-clock, same 9 units&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;48K chars&lt;/td&gt;
&lt;td&gt;0.4288&lt;/td&gt;
&lt;td&gt;724.1 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;192K chars&lt;/td&gt;
&lt;td&gt;0.2460&lt;/td&gt;
&lt;td&gt;335.9 s (assembled — see below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;384K chars&lt;/td&gt;
&lt;td&gt;0.1553&lt;/td&gt;
&lt;td&gt;— (different context and offload; not comparable)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One large unit (603,683 chars) tells the same story: 0.664 at 48K chunks,&lt;br&gt;
0.4063 at 96K, and an outright failure at 192K — at ~2.8 chars/token the&lt;br&gt;
prompt simply exceeds a 65,536-token window. Char-based chunk limits are&lt;br&gt;
not token-safe. One sample unit returned zero quotes as a single big&lt;br&gt;
chunk: valid JSON, empty list, a silent whole-unit miss. At 48K it yields&lt;br&gt;
16 quotes.&lt;/p&gt;

&lt;p&gt;The bigger chunk bought a 2.16× assembled-time ratio and destroyed&lt;br&gt;
coverage: with a fixed per-chunk quota, a bigger chunk is a smaller sample&lt;br&gt;
of the text. Note what this test does &lt;em&gt;not&lt;/em&gt; show: it does not isolate&lt;br&gt;
context-window size — the context was fixed. The obvious fix, scaling the&lt;br&gt;
quota with the chunk, was tested next and failed too: 96K chunks at quota&lt;br&gt;
40 scored 0.2670, worse than 48K at either quota. The calibration's answer&lt;br&gt;
was boring: 48K chunks.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The output budget is a quality parameter
&lt;/h2&gt;

&lt;p&gt;Hosted models, same task. One metric warning, because it decides what can&lt;br&gt;
be compared: the hosted figures below are &lt;em&gt;union overlap&lt;/em&gt; — how much of&lt;br&gt;
our local baseline's accepted quote set each arm also returned, on a&lt;br&gt;
common 8-unit / 14-chunk subset. Our local baseline (Qwen3.5-9B&lt;br&gt;
self-hosted) is scored differently: 42.9% &lt;em&gt;ground-truth&lt;/em&gt; completeness on&lt;br&gt;
nine units (28.9% on the same eight), 190 accepted quotes, 12.0% of its&lt;br&gt;
returned quotes rejected as non-verbatim. Different metrics, no common&lt;br&gt;
scale — we do not rank the hosted arms against the local bar.&lt;/p&gt;

&lt;p&gt;ERNIE 5.5 Flash at a 4,800-token output budget (our pipeline's setting,&lt;br&gt;
not a verified vendor default): 71.4% parse failures on the subset,&lt;br&gt;
overlap 0.142. The cause was measurable: hidden reasoning consumed ≈86%&lt;br&gt;
of the output budget before any answer existed. On the full 23-chunk run&lt;br&gt;
at that budget: 52.2% parse failures, overlap 0.151. The same model at a&lt;br&gt;
16,000-token budget: parse failures 21.4%, overlap 0.479, with a 1.5%&lt;br&gt;
non-verbatim rejection share.&lt;/p&gt;

&lt;p&gt;Qwen4-Max-Preview beat ERNIE's 16k arm on all four extraction metrics on&lt;br&gt;
their common subset: 257 accepted quotes, overlap 0.537, zero measured&lt;br&gt;
non-verbatim rejects, zero parse failures in 14 chunks (and 0 of 23 on&lt;br&gt;
its full extension). One method note, because it matters: its&lt;br&gt;
subscription terms allow interactive use only, so that arm ran&lt;br&gt;
tool-mediated inside agent sessions rather than as a raw API — and 257 is&lt;br&gt;
257 of a &lt;em&gt;nominal&lt;/em&gt; 280 prompt slots, not a hard ceiling, so what a higher&lt;br&gt;
quota would have bought is unmeasured. The inconvenient axes: it was far&lt;br&gt;
slower per call (111.2 s vs 26.6 s on average) and its accepted quotes had&lt;br&gt;
a lower Cyrillic share (0.307 vs 0.42).&lt;/p&gt;

&lt;p&gt;And the honest half: on a separate free-form synthesis task — one prompt&lt;br&gt;
per model — ERNIE outscored Qwen4-Max (5/8 vs 3/8 on a fact rubric),&lt;br&gt;
while &lt;strong&gt;both&lt;/strong&gt; models invented the same two numbers that were not in the&lt;br&gt;
source, and ERNIE invented two more besides. Extraction quality and&lt;br&gt;
synthesis trustworthiness are different axes, and a single leaderboard&lt;br&gt;
hides that.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Two production blocks, two different models
&lt;/h2&gt;

&lt;p&gt;With the geometry fixed by tests 1–3 (48K chunks, quota 20 — no scaled&lt;br&gt;
quota anywhere), the pipeline ran at production scale, and the two blocks&lt;br&gt;
ran on &lt;em&gt;different&lt;/em&gt; models:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Block 1, local Qwen3.5-9B:&lt;/strong&gt; 727 of 727 unit jobs completed, 1,187
chunks, 15,841 accepted quotes. 96 chunk responses (8.1%) failed strict
parsing and were skipped by the code — not recovered inside the run; a
separate rescue shard re-runs them through the hosted model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block 2, Qwen4-Max-Preview:&lt;/strong&gt; 345 of 345 prompts completed across two
lines, at 30–32 chunks per active session-hour per line. No reply was
zero-byte; two were valid JSON with empty quote lists. We have no
scored completeness figure for block 2 yet, and we claim none.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The advertising claims, checked
&lt;/h2&gt;

&lt;p&gt;Four marketing-style claims travel with this stack — stated here in our&lt;br&gt;
words, as we encountered them; we sourced no vendor copy. We measured&lt;br&gt;
what we could.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"New major version: faster, better."&lt;/strong&gt; v1.0.0 was slower at both
quotas we run (+1.5% and +16.9%), and its quality ranking flipped with
a prompt parameter. Not confirmed on this task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Bigger context windows let the model use more of your data."&lt;/strong&gt; What
we actually varied was chunk size at a fixed context, and coverage fell
from 0.4288 to 0.2460; one unit silently returned nothing; one chunk
did not fit the window at real token density. Long prompts were
accepted mechanically — capacity is real. The quality implication is
not confirmed; window size alone was never isolated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Flagship reasoning, reliable out of the box."&lt;/strong&gt; At our pipeline's
4,800-token output budget: 71.4% parse failures on the subset — and in
prose, invented numbers. At ~3.3× the budget the same model's
extraction improved sharply. Blanket reliability: not confirmed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Flagship hosted model, dependable."&lt;/strong&gt; For extraction on the tested
calls it was the cleanest arm we measured: zero measured rejects, zero
parse failures. For prose it invented the same two numbers as its rival
and scored below it on the synthesis rubric. Dependable is per task
shape, not per model — partially not confirmed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The scoreboard: what is better where, and how to apply it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server version (b11669 vs v1.0.0):&lt;/strong&gt; no outright winner — v1.0.0 is
better at quota 20 (+11.8 points of completeness), b11669 is better at
quota 40 (+7.6 points) and faster at both. &lt;em&gt;Apply:&lt;/em&gt; benchmark an upgrade
on your own quota profile before adopting it. We stayed on b11669.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chunk geometry (48K vs 192K chars):&lt;/strong&gt; 48K wins quality (0.4288 vs
0.2460 completeness at fixed context and quota); 192K wins only raw
speed — and loses the data. Scaling the quota with the chunk does not
fix it (tested: 0.2670). &lt;em&gt;Apply:&lt;/em&gt; 48K chunks, quota 20; count tokens,
not characters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning-model output budget (4.8k vs 16k tokens):&lt;/strong&gt; 16k,
decisively — parse failures fell from 71.4% to 21.4%, because hidden
reasoning ate ≈86–87% of the budget either way. &lt;em&gt;Apply:&lt;/em&gt; give reasoning
models ≥16k output tokens for structured extraction, or do not use them
for it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosted extraction (Qwen4-Max vs ERNIE at 16k):&lt;/strong&gt; Qwen4-Max for quote
fidelity — 257 accepted quotes, overlap 0.537, zero measured rejects,
zero parse failures, against ERNIE's 193 / 0.479 / 1.5% / 3-of-14.
ERNIE wins speed (26.6 s vs 111.2 s per call on average) and Cyrillic
share (0.42 vs 0.307). &lt;em&gt;Apply:&lt;/em&gt; fidelity → Qwen4; throughput or language
mix → ERNIE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local 9B vs hosted flagships:&lt;/strong&gt; the local model is the only arm scored
on ground truth at production scale — 15,841 accepted quotes in block 1,
data never leaving the box, zero API cost — at a 12.0% rejection share
in the bake-off sample, where Qwen4 measured zero. &lt;em&gt;Apply:&lt;/em&gt; bulk on
local, hard residue to the hosted model. That rescue pattern is what
our pipeline actually runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free-form synthesis (either hosted model):&lt;/strong&gt; neither, unverified.
ERNIE scored higher (5/8 vs 3/8, one prompt each) — and both invented
the same two numbers that were not in the source. &lt;em&gt;Apply:&lt;/em&gt; any number
in model prose gets checked against the source before use. No
exceptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we take from this
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The largest single lever we measured was chunk size (−18.3 points for
48K → 192K at fixed context and quota). A version swap moved +11.8
points; a quota change moved +3.9. Measure the configuration, not the
label.&lt;/li&gt;
&lt;li&gt;With a fixed extraction quota, larger chunks measurably destroy
coverage. Context-window size by itself was not isolated in these
tests, and we make no claim about it either way.&lt;/li&gt;
&lt;li&gt;For reasoning models, the output budget is a quality parameter:
raising it ~3.3× moved one model from 71.4% parse failures to 21.4%
(its own metric — no cross-metric ranking is made).&lt;/li&gt;
&lt;li&gt;Report the inconvenient half. Every table above includes the arm that
makes our own production choice look worse on some axis — because it
was.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Method note: we report wall-clock on the real task rather than synthetic&lt;br&gt;
tokens/second; the one assembled figure is labelled where it appears. One&lt;br&gt;
cautionary datapoint for co-tenancy fans: a co-resident sandbox instance&lt;br&gt;
on partial offload on the same box generated at 2.31 tok/s — a&lt;br&gt;
measurement rig, not a serving mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification
&lt;/h2&gt;

&lt;p&gt;These numbers were cross-checked before release, by named reviewers on different models. An independent audit session (Daybreak Blue program, GPT-6 Sol, ultra reasoning) returned a &lt;strong&gt;not fit to publish&lt;/strong&gt; verdict with 18 findings — including a model-attribution error of ours that our own first audit had missed. A parallel Daybreak review flagged three further defects. All three were confirmed against the records; the 18 findings were reconciled the same way, and every figure was re-derived from the raw run records. The text above is the corrected version. Where a checker and the records disagreed, the records won.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow **Paragon 666&lt;/em&gt;* on DEV — we publish reproducible bench notes: method and raw numbers with every result, including the inconvenient halves.*&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
