Research-grade eval: live model benchmark, judge calibration, structured-output study (v2.2.0)#6
Merged
Merged
Conversation
…ning-model empty output (v2.2.0) - Live benchmark (pnpm bench): 4 local models x 2 prompt conditions x 27 curated EN->zh-TW fixtures with Taiwan-convention references; chrF cross-validated against sacrebleu 2.6.0, artifact rates, TTFT-net/TTFT-UI, tokens/s, JSON-schema-constrained LLM judge -> eval/BENCHMARK-RESULTS.md - Judge calibration: seeded blind labeling page + Cohen's kappa (plain + quadratic-weighted) judge<->human (pnpm bench:agreement) -> eval/AGREEMENT.md - Structured-output study (pnpm eval:structured): prompt-only vs schema-constrained decoding + failure-shape taxonomy -> eval/STRUCTURED-RESULTS.md - Found & fixed: OpenAI-compat /v1 endpoint leaves content empty on reasoning models (qwen3.5: 99 s / 4,055 tokens / 0 visible chars). Client migrated to native /api/chat with think:false (same fixture: 1.6 s). Requires Ollama >= 0.9. - Benchmark-driven default model: qwen2.5 -> qwen3:latest (chrF 46.3, TTFT-UI p50 451 ms, ~48 tok/s) - Capture enrichment now schema-constrained (format param) - measured: deepseek-r1 93.3% -> 100% usable metadata at zero latency cost - docs/BENCHMARK.md methodology report (setup, metrics, found-bug case study, limitations, reproduce steps); README/ARCHITECTURE/CHANGELOG updated - +35 unit tests (chrF, kappa, taxonomy, native chunk parser) - 120 total Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Turns the eval story from "offline sanitizer scoring" into a research-grade evaluation suite — and ships the product fixes the data demanded.
1. Live model × prompt benchmark (
pnpm bench)4 local models × 2 prompt conditions × 27 curated EN→zh-TW fixtures (Taiwan-convention references: 升息一碼, 執行緒, 連接埠, 工作階段…), streamed through the exact shipped pipeline (
buildMessages→/api/chatNDJSON →extractChunk→StreamAssembler+ OpenCC). Scored with:pnpm bench:agreementResult highlights (216/216 cells, 0 errors →
eval/BENCHMARK-RESULTS.md):2. Found & fixed: reasoning models returned nothing
Through the OpenAI-compat
/v1endpoint, thinking models can burn the whole generation as hiddenreasoningwithcontentempty — measured: qwen3.5, 99 s, 4,055 tokens, 0 visible characters.think:falsevia/v1didn't help.Fix: client migrated to native
/api/chat+think: false(same fixture: 1.6 s / TTFT 282 ms). Hybrid thinkers stop thinking; non-thinkers no-op; deepseek-r1 still thinks but keeps it out ofcontent. Requires Ollama ≥ 0.9.3. Structured-output study (
pnpm eval:structured)Prompt-only vs schema-constrained decoding, 4 models × 16 realistic excerpts + failure-shape taxonomy. Honest surprise: modern small models emit clean JSON ~100% of the time with the shipped prompt at temp 0 — the old 42.9%→71.4% salvage story belongs to older/thinking-contaminated generations. Schema still closes the last tail (deepseek-r1 93.3%→100%) at zero latency cost → now sent on every enrichment request.
4. Data-driven product changes
qwen2.5→qwen3:latestdocs/BENCHMARK.md— methodology, found-bug case study, limitations, reproduce stepsVerification
pnpm compile/pnpm lintclean;pnpm test120 passed (+35)pnpm eval,pnpm eval:captureunchanged (offline CI gates stay deterministic)pnpm buildproduction build OKHuman labeling (15 min,
eval/results/labeling.html→pnpm bench:agreement) is the one follow-up that needs a person; infrastructure and docs are in place.🤖 Generated with Claude Code