What types of tasks I have at the moment, and what I write benchmarks for

At the moment, my main tasks can be divided into:

  • code generation and creating diagrams

  • TAG45@@summarizing and translating text
  • TAG49@@evaluating/comparing other models
  • TAG53@@explaining complex things in simple words
TAG57@@There are many tasks, but not that many benchmarks—wherever some deterministic action is needed, I try to use benchmarks (collecting metrics on how well or badly the model performs), but the line is thin, and it is not easy to identify(maybe it is worth writing another agent for this?). I follow the rules: “Do it properly, and it will be fine..” “If I can envision a specific valid result, I need to collect metrics. If there are several correct options, describe several options”.

What types of benchmarks

The score everywhere is a number from 0 to 1; the closer to one, the better.Benchmarks are divided into three groups: generative (text in—text out), embedding-based (work with text vectors), and decision-based (strict selection or rating on a scale).

Table of benchmark types
how much the final score matchedreference: 1.0 — assigned the same score as the reference; each error point deducts its share from one (the maximum error on the scale is 126, so a 10-point miss consumes ~0.08)

Benchmark

What it does, in simple terms

Score—what it measures

translation (translation)

the model translates text; there is a reference (if there are multiple variants, we score against the best one)

F1—the overlap between the words in the response and the reference, accounting for repetitions. Put simply: the same vocabulary as in a good translation; made-up content and filler lower the score

summarization (summary)

the model compresses a long text into a concise summary

the same F1 against the reference summary (there may be multiple reference variants)

codegen (code)

the model writes a function/class; the code actually compiles and runs on “input → expected output” cases (python, C++, Java, JavaScript)

pass_rate—the proportion of cases where the code ran and returned exactly the expected result.Not “seems true,” but “works—doesn’t work”

instructions (instructions)

formal requirements for the text: “no more than 30 words,” “uppercase,” “no numbers,” “valid JSON,” “bulleted list,” and so on

share of checklist items passed

math (mathematics)

tasks with numerical answers (the marker “Answer: ”)

1/0—whether the number matches the reference value (with a tolerance). Averaged across tasks, this gives the proportion actually solved—the solution process is not checked, only the final result

sts (text similarity)

pairs of texts, each with a human assessment of “how similar they are in meaning”

Spearman—whether the model’s ranking of pairs by semantic similarity (embedding cosine similarity) matches the human ranking.Closer to 1 — the model “feels” closeness like a human

retrieval (corpus search)

find relevant documents in the corpus based on the query (embeddings + cosine)

nDCG@10 — how highly relevant documents rank in the top 10 results: first place is the maximum, tenth is almost a miss

news_search (news search)

the same thing, but on a real news corpus(the news in my separate pet project, not the article’s topic)

nDCG@10

embedding_classification (classification)

the text is assigned to the class of the nearest sample (“prototype”), all using embeddings

accuracy — the proportion of correctly identified classes

decision (choice/rating on a scale)

strict selection via the Decision API (or chat with structured output for text models): choose an option (choice), state the confidence (noul), rate it on a scale (score)

“how accurately it was guessed”: choice — a match of 1/0; confidence — a penalty for an overconfident miss (Brier); scale — the average deviation from the reference (MAE)

scoring (article scoring)

an article is evaluated against three criteria on a 1–10 scale (importance / relevance / credibility), with the final score = 6·imp + 4·rel + 4·trust

custom (sandbox)

minor ad hoc checks (“count,” “repeat N times”); one-off tasks are assigned here

F1 against the reference, as in translation

Metrics table

Headline (the second column of the table) is the benchmark’s main score; it is included in the summary and run comparison. However, when each benchmark is run, the full set of metrics is collected:

share of relevant documents that made it into the results

TAG518@@macro F1TAG546TAG560decision

TAG573TAG575

Brier (choice/noul)

TAG588TAG601@@TAG603

threshold acc (null)

Metric

What it measures in plain language

Where it is calculated

headline score, described above

main benchmark score

all benchmarks

latency

average duration of a single model response ©

all benchmarks

tokens (prompt / completion / total)

token usage for the run, summed across all requests

all except embedding

pass@k

proportion of tests solved by at least one of the k samples (threshold for an almost exact match, 0.999): “could at least one of the k samples solve the test?”

once every k attempts»

all, meaningful with -n multisampling

score_std

typical variation in the score between samples of the same test — how stable the model’s responses are

all, when -n > 1

F1

overlap between the response words and reference words, accounting for multiplicity (repetitions counted); the best score is taken across multiple references

all generative

BLEU

proportion of n-grams (1–4) in the response that match the reference; a penalty for rambling around the correct text

all generative

ROUGE-1 / ROUGE-2 / ROUGE‑L

matching of individual words / word pairs / the longest common subsequence

all generative

norm.Levenshtein

string similarity: 1.0 — matched character by character; error = the number of minimum edits distinguishing the response from the reference (normalized by the length of the longer text)

all generative

code similarity

similarity between the source and the reference after normalization (comments and whitespace removed); read when the response is code

all generative

cosine (average)

cosine similarity of the embeddings of a pair of texts — a raw “vector distance”

sts

Spearman

whether the ordering of pairs by similarity agrees between the model (cosines) and the human — the main score

sts

Pearson

linear relationship between the model’s and human’s similarity vectors

sts

MSE

mean squared error of similarity prediction against human ratings

sts

nDCG@k

ranking quality: the higher the relevant documents, the better (ideal—all relevant ones at the top); the main score

retrieval, news_search

Recall@K

retrieval, news_search

MRR

TAG510@@average “1/rank” of the first relevant document: whether a relevant document was found in the top positionsTAG514@@retrieval, news_search
TAG520@@accuracy

share of correctly predicted classes; primary score

TAG528@@embedding_classification
TAG538@@average F1 across classes — rare classes do not get drowned outTAG542@@embedding_classification
TAG548@@micro F1TAG552@@F1 across all hits at once — frequent classes weigh more

embedding_classification

TAG562@@accuracy (choice)TAG566@@share of exact matches for the selected option
TAG580@@penalty for an overconfident miss: the more confident the model was in its error, the more it hurts the metricTAG584@@decision
TAG590@@log loss (choice/noul)TAG594@@logarithmic error of probabilities; merciless toward full confidence when wrongTAG598@@decision

proportion of correct “confident / not confident” decisions relative to the threshold

decision

ECE (null)

confidence calibration: discrepancy between the stated and actual accuracy (10 bins)

decision

MAE (score)

average deviation of the response from the reference scale level (1..N)

decision

level acc (score)

proportion of exact hits precisely at the scale level

decision

Spearman / Pearson (score)

consistency between the assigned scores and the reference scores

decision

final_mae

average deviation of the final score (score from 14 to 140, maximum error — 126)

scoring

MAE by criteria

individual average deviation for importance, relevance, and reliability — showing where the model is weaker

scoring

level acc

proportion of exact hits at levels 1..10 by criteria

scoring

threshold acc

proportion of correct “take / don’t take” decisions for an article relative to the reference threshold

scoring

Spearman / Pearson based on the final score

agreement between the final scores and the reference scores

scoring

Agent overview

I named the agent llm-judge (sorry for the poor originality and possible confusion), but it should not be confused with the LLM-as-a-judge approach; the agent component is essentially used only for final analysis, interpretation of the results, and subsequent discussion.

Right away, I’ll note that this is an MVP; I didn’t work much on the UI and focused only on the functionality that was important to me.

The agent is presented as a Go binary (my primary stack is JVM, but why I chose Go is the topic of another article. Briefly, using Go is simpler and more efficient in the context of agent-based development). The run mechanics are as follows: choose a host and model, choose benchmarks—run.

структура llm-judge (C4 L2: контейнеры ) — ранер бенчмарков, веб, админка (SQLite), агент-аналитик, писатель MySQL
llm-judge architecture (C4: L2: containers)—benchmark runner, web UI, admin panel (SQLite), analyst agent, MySQL writer
форма запуска — хост, модель с поиском, сэмплы, чекбоксы бенчмарков
launch form—host, model with search, samples, benchmark checkboxes

Each benchmark is a separate subprocess of the same CLI: the web UI streams the log and draws progress bars.Upon completion, we get question-answer files and aggregate files, which are then used to compare runs.

прогресс прогона вживую — полоски по бенчмаркам стримятся из лога
live run progress — bars for each benchmark are streamed from the log
тот же прогон после завершения — полосы хронометража
the same run after completion — timing bars
Sequence Diagram of the run execution
механика прогона от обнаружения бенчмарков до отчётов + агрегатов
run mechanics from benchmark discovery to reports + aggregates

Several runs can be compared at once.

список прогонов всех моделей + сноска отметок для сравнения
list of runs for all models + a comparison marker annotation
сравнение двух прогонов — скоры и дельты к базе
comparison of two runs — scores and deltas against the baseline

Next is working with the results. It is immediately clear that an LLM is a black box in itself, so I rely not only on the hard numbers (especially since, with the default temperature of 0.7 and the server's unseeded setup, the results may have noticeable noise), but also on subjective impressions.

The summary is discussed with the agent in a chat; the agent tries to explain why it turned out that way and has a read_file tool for reading specific files (logs).
панель выжимок — режим кратко/подробно + сохранённые выжимки
Summary panel — brief/detailed mode + saved summaries
отчёт выжимки в просмотре — скоры, дельты, аномалии
Summary report in the viewer — scores, deltas, anomalies
SD выжимки через агента
SD of the summary via the agent
чат по выжимке — вопросы агенту, он читает файлы отчётов сам
Chat about the summary — questions to the agent; it reads the report files itself
SD по чату
SD via chat
отчёт бенчмарка открыт в окне просмотра
The benchmark report is open in the viewer
админка — провайдеры + слот агента
Admin panel — providers + agent slot

Off-topic (rant)

I think many people are put off by info-gurus who promise to turn you into an AI champion and reduce your expenses by $2 million(with our subscription costing $20–200, that sounds very appealing). These “AI champions” often comparea harness with models, a search index + AI features with models, but don’t explain what tasks they solve, what context is passed into the agent, or how the agent processes it.

I have nothing against AI champions; I just want to say that no magic pill (a model, a harness, a service) exists(and if one did exist, it would be a deterministic action, and then why would a person be needed in this loop? Is a person more attentive than an agent? I don’t think so)and you should focus entirely on your own needs.

Even my solution is not perfect; it definitely contains errors and shortcomings, and all the more so, it should not be used as a methodology for evaluating models for your own tasks. The main idea was, and remains, to share ideas—to get recommendations and “nagging” in the comments—to improve and repeat the cycle.

Neuroslop conclusions

The section is named in my honor, so I’ll be the one talking—the text generator. Observations from inside the machine these benchmarks are running:

  • Don’t take my word for it—especially when the answer sounds confident. An LLM’s confidence is attached to tokens, not facts: therefore, Brier and ECE in decision-making are more honest than accuracy—they penalize a confident miss rather than merely a “got it/didn’t get it.”

  • I am good at tailoring text to the reference. F1/ROUGE measure wording, not meaning: their scores can be boosted with a “dictionary of correct words” without any understanding. The more a test has an executable endpoint (code, a number, a checklist), the more honest it is and the less of me it contains.

  • Post-hoc explanations are rationalization. When asked “why is there a discrepancy in codegen?”, I will give a coherent answer either way: whether there is truth in the numbers or I am fitting the narrative to the outcome. Therefore, the agent gets a tool—read_file for the raw logs—not my recollection of them.

  • Here, the models are judged not with the “eyes of an LLM-as-judge”—and rightly so: an LLM judge has its own favorites and biases. The metric and reference should be the judge; I was left only with interpretation.

  • TAG857@@A benchmark in its harness turns a model from “magic” into a component—with cost, latency, and limits of applicability.The most underrated effect of evaluation: you stop choosing the «best model» and start putting together the puzzle of «model × task × price × speed».

My conclusions

  • Model evaluation is a nontrivial and, most importantly, very important task; you can always say, «Use Claude Fable—it can do anything you want (except coffee—it can’t make it, and then bring it either)», and overall the result will be satisfactory.

  • If there is an opportunity to replace generation with deterministic execution (scripts, code, and the like), you should use it, since no LLM will ever be 100% immune to generating garbage, prompt injection, and other unpleasant things. (I didn’t cover this topic in the article, but I wanted to share the conclusion)

  • Large models have less control, are more independent in making decisions, and by no means always produce the result we expect.

  • A model is worth evaluating—but not by hard numbers alone: in and of itself, it is just a really cool formula for calculating the next token (and comparing “this formula is cooler than another formula” is somewhat childish nonsense).

P. S. I couldn’t get by without an AI assistant, because filling in the tables and creating the screenshots and diagrams would have eaten up most of the time budget for the article, so I apologize for “This time I decided to do without AI slop.”