尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Score LLM answers on verifiable correctness, and keep fluency as a separate signal, so a confident-but-wrong model can't win your evaluation.
When I chose the model behind NYU Stern's V-Lab research assistant, I benchmarked six LLM providers on a 40-point rubric covering accuracy, depth and reasoning. Partway through, I found the rubric couldn't separate a correct answer from a fluent one. Two of the three criteria were judged from how an answer read, so confident phrasing was earning points that correctness should have earned. I had to rebuild the rubric and re-score everything.檢視完整 README ↗Score LLM answers on verifiable correctness, and keep fluency as a separate signal, so a confident-but-wrong model can't win your evaluation.
When I chose the model behind NYU Stern's V-Lab research assistant, I benchmarked six LLM providers on a 40-point rubric covering accuracy, depth and reasoning. Partway through, I found the rubric couldn't separate a correct answer from a fluent one. Two of the three criteria were judged from how an answer read, so confident phrasing was earning points that correctness should have earned. I had to rebuild the rubric and re-score everything.
This tool makes that failure impossible to miss:
In the bundled sample run, the confident model is last on correctness (0.14) but would be #2 under a style-weighted rubric.
git clone https://github.com/mgupta646/llm-rubric-eval && cd llm-rubric-eval
pip install -e ".[dev]"
# score the bundled sample answers and write an HTML report
rubriceval score --questions examples/questions.json --answers examples/answers --out report.html
| Rank | Model | Correctness | Fluency | Naive score | Confidently wrong |
|---:|---|---:|---:|---:|---:|
| 1 | sample-a (accurate) | 1.00 | 0.71 | 0.80 (#1) | 0 |
| 2 | sample-c (hedged) | 0.95 | 0.34 | 0.55 (#3) | 0 |
| 3 | sample-d (mixed) | 0.60 | 0.50 | 0.53 (#4) | 0 |
| 4 | sample-b (confident) | 0.14 | 0.96 | 0.69 (#2) | 11 |
! A style-weighted rubric would rank these models differently.
The four sample "models" are hand-written synthetic answers designed to show distinct behaviours (accurate, confident-but-wrong, hedged, mixed). They are not outputs of real models; see
examples/make_sample_answers.py.
export GROQ_API_KEY=... # or OPENAI_API_KEY / ANTHROPIC_API_KEY
rubriceval collect --questions examples/questions.json --provider groq --out answers/groq.jsonl
rubriceval collect --questions examples/questions.json --provider anthropic --out answers/claude.jsonl
rubriceval score --questions examples/questions.json --answers answers --out report.html
Keys are read from environment variables only. They are never written to disk or passed as arguments.
Each question carries its own criteria. Points come only from checks you could verify by hand:
{
"id": "q02_var",
"question": "A portfolio's 1-day 99% Value at Risk is $1 million. What does that mean?",
"criteria": [
{"id": "tail_probability", "type": "any_of", "points": 1, "any_of": ["1%", "99%"]},
{"id": "exceedance", "type": "any_of", "points": 1, "any_of": ["exceed", "more than", "greater than"]},
{"id": "about_losses", "type": "regex", "points": 1, "pattern": "\\bloss"},
{"id": "not_a_max", "type": "forbidden","penalty": 1.5, "phrases": ["maximum loss", "worst case"]}
]
}
| Type | Passes when | Notes |
|---|---|---|
any_of | any listed phrase appears | case, accent and dash-insensitive |
all_of | every listed phrase appears | |
number | a number in the answer is within abs_tol (or rel_tol) of value | parses $1,157.63, 12%, -3.5 |
regex | the pattern matches the normalized answer | |
forbidden | none of the known-wrong claims appear | a hit subtracts penalty |
forbidden matters more than it looks. In the sample, one answer swaps precision and recall but still contains both correct formulas. Only the forbidden-claim check catches it.
questions.json ─┐
├─► checks.py verifiable criteria → correctness (0–1)
answers/*.jsonl ┤
├─► fluency.py length, sentence shape, assertive vs hedging words → fluency, confidence
│
└─► scorer.py flags: confidently_wrong · hedged_but_right · known_wrong_claim
leaderboard: rank by correctness vs style-weighted "naive" rank
└─► report.py self-contained HTML (inline SVG, no JS)
forbidden entries for the mistakes you expect.any_of lists, or a human pass.pytest -q # 20 tests
Built by Mehul Gupta · Portfolio · LinkedIn