evalreliability
Measure the reliability of LLM-as-judge evaluations.
Your eval score went from 3.80 to 4.10 after a prompt change. Did anything improve?
Run the same judge on the same items twice and you may find it moves 0.68 on its own. Then 0.30 was never a result. Most teams have never measured this, because no tool in the eval stack reports it.
Other tools give you a judge score. This one gives you the error bar on that score, and tells you which decisions it can carry.
Install
pip install evalreliability
Core depends only on numpy, pandas and scipy. Harness integrations are extras:
pip install "evalreliability[inspect]"
Status
Early. 0.0.1 ships the input contract and design checking. The measurement
verbs land next — see the roadmap below.
Input
One long frame, one row per rating:
| item | rater | rater_type | run | dimension | score |
|---|---|---|---|---|---|
| doc_01::M3 | gpt-4 | judge | 0 | coherence | 4 |
| doc_01::M3 | claude | judge | 0 | coherence | 3 |
| doc_01::M3 | expert_0 | human | 0 | coherence | 4 |
item, rater and score are required. rater_type, run and dimension
are optional, and each one you supply unlocks another facet of the analysis.
Design checking
Every reliability coefficient assumes a measurement design. Choose the wrong one and the number is wrong in a way nothing downstream will flag. So the design question gets answered from the data, first:
import pandas as pd
from evalreliability import check_design
df = pd.read_parquet("ratings.parquet")
print(check_design(df, by="dimension")["coherence"])
coherence: crossed, 1600 items x 3 raters, 3 ratings per item
When a two-way model is not licensed, it says so and why:
relevance: nested, 400 items x 12 raters, 3 ratings per item
two-way models are not licensed here (raters differ across items);
use a one-way model
And it warns where precision will be poor regardless of how many items you have:
coherence: crossed, 1600 items x 3 raters, 3 ratings per item
warning: 3 raters gives 2 df on the rater term, so absolute-agreement
intervals will be very wide
That last one matters more than it looks. Absolute-agreement reliability depends on a rater variance component estimated from the number of raters, not the number of items. Sixteen hundred items do nothing for it.
Roadmap
| Release | Verb | The question it answers |
|---|---|---|
| 0.0.1 | check_design() |
What measurement design do I actually have? |
| 0.1 | ceiling() |
How much do my raters agree, and what is the best score anyone could get? |
| 0.1 | stability() |
How much does my judge wobble, and what is the smallest change it can detect? |
| 0.2 | compare() |
How does my judge do against the reference, relative to the ceiling? |
| 0.3 | plan() |
How many raters, runs and items do I need, and what will it cost? |
What this does not do
It will not tell you whether a judge is correct. No tool can. There is no ground truth for whether a summary is coherent — only what qualified people think, and they disagree. In SummEval, three expert annotators reached a Krippendorff's alpha of 0.41 before reconciliation.
So "correct" is not available as a target. What is available is how far a judge sits from a human reference whose own noise you have measured, and how much of your reported number is signal.
Design principles
- Correct over comprehensive. Every coefficient is tested against an independent implementation — pingouin, krippendorff, GeneralizIT — rather than against itself.
- The form follows the decision. You say whether the score value carries your decision or only the ordering. The library derives which coefficient that implies and names it in the output. No dropdown of six options you have to already understand.
- Small install. A measurement library nobody installs measures nothing.
- Say what is not supported. Where a claim is not licensed by the data, the output says so rather than printing a number anyway.
Citing
See CITATION.cff. Each release is archived on Zenodo with a DOI.
License
Metadata
Release files for evalreliability 0.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| evalreliability-0.0.1.tar.gz | 9.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| evalreliability-0.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.0 kB
Release files / evalreliability-0.0.1.tar.gz
| Download URL | evalreliability-0.0.1.tar.gz |
|---|---|
| Size | 9.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5408128ecb42c8aeb09a3053620d436a240dab5f9da44dd224440d839d31faf1
|
|
BLAKE2b-256 checksum How to use checksums |
fe5a1ad8fec1dfa0d483b109c663eb02d9c0fe9ab2b0a96007b006597ae6b9cd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / evalreliability-0.0.1-py3-none-any.whl
| Download URL | evalreliability-0.0.1-py3-none-any.whl |
|---|---|
| Size | 11.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e782fded9d3727205c605f85d1a3eddf374b25351582f6f620714ced1720c2d8
|
|
BLAKE2b-256 checksum How to use checksums |
ea83123c3d5967aacb78d37c794e2a6dd58d87ce64817bd777b7d5b1b4242879
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|