Spaces:
Running
Running
Retitle FlavourBench around executable evaluation
Browse files- README.md +4 -3
- __pycache__/app.cpython-312.pyc +0 -0
- app.py +30 -28
- data/epicure-native-release.json +8 -8
README.md
CHANGED
|
@@ -8,12 +8,13 @@ sdk_version: 6.9.0
|
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
license: other
|
| 11 |
-
short_description:
|
| 12 |
---
|
| 13 |
|
| 14 |
-
# FlavourBench
|
| 15 |
|
| 16 |
-
An evidence
|
|
|
|
| 17 |
|
| 18 |
[Paper](https://github.com/josefchen/flavourbench/blob/main/paper/build/flavourbench.pdf) 路
|
| 19 |
[Dataset](https://huggingface.co/datasets/josefchen/flavourbench) 路
|
|
|
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
license: other
|
| 11 |
+
short_description: Executable culinary reasoning without a model judge.
|
| 12 |
---
|
| 13 |
|
| 14 |
+
# FlavourBench: An Executable Benchmark for Culinary Reasoning Without a Model Judge
|
| 15 |
|
| 16 |
+
An evidence explorer and leaderboard for 20 current language-model endpoints, scored against
|
| 17 |
+
executable culinary answer keys without a human or model judge.
|
| 18 |
|
| 19 |
[Paper](https://github.com/josefchen/flavourbench/blob/main/paper/build/flavourbench.pdf) 路
|
| 20 |
[Dataset](https://huggingface.co/datasets/josefchen/flavourbench) 路
|
__pycache__/app.cpython-312.pyc
ADDED
|
Binary file (25.5 kB). View file
|
|
|
app.py
CHANGED
|
@@ -277,10 +277,11 @@ def _hero_html() -> str:
|
|
| 277 |
return f"""
|
| 278 |
<div class="fb-shell fb-hero">
|
| 279 |
<section>
|
| 280 |
-
<div class="fb-kicker">
|
| 281 |
-
<h1>
|
| 282 |
-
<p class="fb-dek">FlavourBench
|
| 283 |
-
|
|
|
|
| 284 |
Open any pair to inspect the prompt, answers, tool trace, and hashes.</p>
|
| 285 |
<div class="fb-stats">
|
| 286 |
<div class="fb-stat"><strong>{counts["models"]}</strong><span>models</span></div>
|
|
@@ -289,11 +290,11 @@ def _hero_html() -> str:
|
|
| 289 |
<div class="fb-stat"><strong>{counts["observed_response_arms"]:,}</strong><span>observed arms</span></div>
|
| 290 |
</div>
|
| 291 |
</section>
|
| 292 |
-
<section class="fb-frontier" aria-label="
|
| 293 |
-
<div class="fb-frontier-head"><strong>
|
| 294 |
{_frontier_html()}
|
| 295 |
<div class="fb-note">One task equals 3.125 percentage points. Read adjacent rows as a
|
| 296 |
-
|
| 297 |
</section>
|
| 298 |
</div>
|
| 299 |
"""
|
|
@@ -309,9 +310,9 @@ def _leaderboard_frame() -> pd.DataFrame:
|
|
| 309 |
{
|
| 310 |
"Rank": model["rank"],
|
| 311 |
"Model": model["display_name"],
|
| 312 |
-
"
|
| 313 |
-
"
|
| 314 |
-
"
|
| 315 |
"Observed arms": f"{observed}/64",
|
| 316 |
"Backend": model["execution_backend"],
|
| 317 |
}
|
|
@@ -326,14 +327,14 @@ def _model_detail(model_name: str) -> tuple[str, pd.DataFrame]:
|
|
| 326 |
summary = f"""
|
| 327 |
<div class="fb-pair-status">
|
| 328 |
<div class="fb-condition good">
|
| 329 |
-
<small>
|
| 330 |
<strong>{off["accuracy_percent"]:.3g}%</strong>
|
| 331 |
<span>Wilson 95%: {off["wilson_95"][0] * 100:.1f}% to {off["wilson_95"][1] * 100:.1f}%</span>
|
| 332 |
</div>
|
| 333 |
<div class="fb-condition good">
|
| 334 |
-
<small>Epicure
|
| 335 |
<strong>{on["accuracy_percent"]:.3g}%</strong>
|
| 336 |
-
<span>
|
| 337 |
</div>
|
| 338 |
</div>
|
| 339 |
"""
|
|
@@ -342,8 +343,8 @@ def _model_detail(model_name: str) -> tuple[str, pd.DataFrame]:
|
|
| 342 |
family_rows.append(
|
| 343 |
{
|
| 344 |
"Family": family.title(),
|
| 345 |
-
"
|
| 346 |
-
"
|
| 347 |
"Change": (
|
| 348 |
f"{(on['family_accuracy'][family] - off['family_accuracy'][family]) * 100:+.1f} pp"
|
| 349 |
),
|
|
@@ -400,8 +401,8 @@ def _pair_detail(
|
|
| 400 |
on = _observation(model["model_id"], task_id, "epicure_on")
|
| 401 |
status = (
|
| 402 |
"<div class='fb-pair-status'>"
|
| 403 |
-
+ _status_card("
|
| 404 |
-
+ _status_card("
|
| 405 |
+ "</div>"
|
| 406 |
)
|
| 407 |
reference = json.dumps(
|
|
@@ -471,7 +472,7 @@ theme = gr.themes.Base(
|
|
| 471 |
)
|
| 472 |
|
| 473 |
|
| 474 |
-
with gr.Blocks(title="FlavourBench 路
|
| 475 |
gr.HTML(_hero_html())
|
| 476 |
|
| 477 |
with gr.Tabs():
|
|
@@ -480,8 +481,8 @@ with gr.Blocks(title="FlavourBench 路 Epicure evidence explorer") as demo:
|
|
| 480 |
"""
|
| 481 |
<div class="fb-section-title">
|
| 482 |
<div class="fb-kicker">Automated exact-choice track</div>
|
| 483 |
-
<h2>The public
|
| 484 |
-
<p>Rank follows
|
| 485 |
</div>
|
| 486 |
"""
|
| 487 |
)
|
|
@@ -494,8 +495,8 @@ with gr.Blocks(title="FlavourBench 路 Epicure evidence explorer") as demo:
|
|
| 494 |
column_widths=[55, 260, 95, 95, 105, 110, 110],
|
| 495 |
)
|
| 496 |
gr.Markdown(
|
| 497 |
-
"**Reading the table.**
|
| 498 |
-
"not a claim about general model quality. Equal scores
|
| 499 |
"frozen tie-break rules. Use Pair Lens before interpreting small differences."
|
| 500 |
)
|
| 501 |
|
|
@@ -565,8 +566,8 @@ with gr.Blocks(title="FlavourBench 路 Epicure evidence explorer") as demo:
|
|
| 565 |
)
|
| 566 |
choices = gr.JSON(value=initial_pair[2], label="Choices")
|
| 567 |
with gr.Row():
|
| 568 |
-
off_answer = gr.Markdown(value=initial_pair[3], label="
|
| 569 |
-
on_answer = gr.Markdown(value=initial_pair[4], label="
|
| 570 |
tool_trace = gr.JSON(value=initial_pair[5], label="Observed Epicure trace")
|
| 571 |
reference = gr.Textbox(
|
| 572 |
value=initial_pair[6],
|
|
@@ -599,9 +600,10 @@ with gr.Blocks(title="FlavourBench 路 Epicure evidence explorer") as demo:
|
|
| 599 |
<div class="fb-method-grid">
|
| 600 |
<div>
|
| 601 |
<h3>Scoring contract</h3>
|
| 602 |
-
<p><strong>
|
| 603 |
-
|
| 604 |
-
Epicure
|
|
|
|
| 605 |
<p>Tasks cover substitution, composition, cookability, and evidence. Every expected
|
| 606 |
answer is derived from a fixed read-only Epicure operation.</p>
|
| 607 |
<h3>Public records</h3>
|
|
@@ -642,7 +644,7 @@ public research preview.
|
|
| 642 |
gr.HTML(
|
| 643 |
"""
|
| 644 |
<div class="fb-shell fb-footer">
|
| 645 |
-
FlavourBench 路
|
| 646 |
</div>
|
| 647 |
"""
|
| 648 |
)
|
|
|
|
| 277 |
return f"""
|
| 278 |
<div class="fb-shell fb-hero">
|
| 279 |
<section>
|
| 280 |
+
<div class="fb-kicker">Frontier culinary reasoning benchmark 路 20 endpoints</div>
|
| 281 |
+
<h1>Culinary reasoning without a model judge.</h1>
|
| 282 |
+
<p class="fb-dek">FlavourBench scores 20 current language-model endpoints against answer
|
| 283 |
+
keys compiled by Epicure.
|
| 284 |
+
<strong>Blue measures Model only. Gold measures the gain from Epicure.</strong>
|
| 285 |
Open any pair to inspect the prompt, answers, tool trace, and hashes.</p>
|
| 286 |
<div class="fb-stats">
|
| 287 |
<div class="fb-stat"><strong>{counts["models"]}</strong><span>models</span></div>
|
|
|
|
| 290 |
<div class="fb-stat"><strong>{counts["observed_response_arms"]:,}</strong><span>observed arms</span></div>
|
| 291 |
</div>
|
| 292 |
</section>
|
| 293 |
+
<section class="fb-frontier" aria-label="FlavourBench Score and Epicure Gain">
|
| 294 |
+
<div class="fb-frontier-head"><strong>FlavourBench Score plus Epicure Gain</strong><span>Top 12 路 percent correct</span></div>
|
| 295 |
{_frontier_html()}
|
| 296 |
<div class="fb-note">One task equals 3.125 percentage points. Read adjacent rows as a
|
| 297 |
+
close score group, then inspect the underlying pairs.</div>
|
| 298 |
</section>
|
| 299 |
</div>
|
| 300 |
"""
|
|
|
|
| 310 |
{
|
| 311 |
"Rank": model["rank"],
|
| 312 |
"Model": model["display_name"],
|
| 313 |
+
"Model only": f"{off['accuracy_percent']:.3g}%",
|
| 314 |
+
"Model + Epicure": f"{on['accuracy_percent']:.3g}%",
|
| 315 |
+
"Epicure Gain": f"+{model['uplift_percentage_points']:.3g} pp",
|
| 316 |
"Observed arms": f"{observed}/64",
|
| 317 |
"Backend": model["execution_backend"],
|
| 318 |
}
|
|
|
|
| 327 |
summary = f"""
|
| 328 |
<div class="fb-pair-status">
|
| 329 |
<div class="fb-condition good">
|
| 330 |
+
<small>FlavourBench Score</small>
|
| 331 |
<strong>{off["accuracy_percent"]:.3g}%</strong>
|
| 332 |
<span>Wilson 95%: {off["wilson_95"][0] * 100:.1f}% to {off["wilson_95"][1] * 100:.1f}%</span>
|
| 333 |
</div>
|
| 334 |
<div class="fb-condition good">
|
| 335 |
+
<small>Model + Epicure accuracy</small>
|
| 336 |
<strong>{on["accuracy_percent"]:.3g}%</strong>
|
| 337 |
+
<span>Epicure Gain: +{model["uplift_percentage_points"]:.3g} percentage points</span>
|
| 338 |
</div>
|
| 339 |
</div>
|
| 340 |
"""
|
|
|
|
| 343 |
family_rows.append(
|
| 344 |
{
|
| 345 |
"Family": family.title(),
|
| 346 |
+
"Model only": f"{off['family_accuracy'][family] * 100:.1f}%",
|
| 347 |
+
"Model + Epicure": f"{on['family_accuracy'][family] * 100:.1f}%",
|
| 348 |
"Change": (
|
| 349 |
f"{(on['family_accuracy'][family] - off['family_accuracy'][family]) * 100:+.1f} pp"
|
| 350 |
),
|
|
|
|
| 401 |
on = _observation(model["model_id"], task_id, "epicure_on")
|
| 402 |
status = (
|
| 403 |
"<div class='fb-pair-status'>"
|
| 404 |
+
+ _status_card("Model only", off)
|
| 405 |
+
+ _status_card("Model + Epicure", on)
|
| 406 |
+ "</div>"
|
| 407 |
)
|
| 408 |
reference = json.dumps(
|
|
|
|
| 472 |
)
|
| 473 |
|
| 474 |
|
| 475 |
+
with gr.Blocks(title="FlavourBench 路 Frontier culinary reasoning benchmark") as demo:
|
| 476 |
gr.HTML(_hero_html())
|
| 477 |
|
| 478 |
with gr.Tabs():
|
|
|
|
| 481 |
"""
|
| 482 |
<div class="fb-section-title">
|
| 483 |
<div class="fb-kicker">Automated exact-choice track</div>
|
| 484 |
+
<h2>The complete public benchmark</h2>
|
| 485 |
+
<p>Rank follows FlavourBench Score. Model + Epicure and Epicure Gain show the matched intervention.</p>
|
| 486 |
</div>
|
| 487 |
"""
|
| 488 |
)
|
|
|
|
| 495 |
column_widths=[55, 260, 95, 95, 105, 110, 110],
|
| 496 |
)
|
| 497 |
gr.Markdown(
|
| 498 |
+
"**Reading the table.** Rank follows Model only accuracy over this 32-task release; "
|
| 499 |
+
"it is not a claim about general model quality. Equal scores follow the release's "
|
| 500 |
"frozen tie-break rules. Use Pair Lens before interpreting small differences."
|
| 501 |
)
|
| 502 |
|
|
|
|
| 566 |
)
|
| 567 |
choices = gr.JSON(value=initial_pair[2], label="Choices")
|
| 568 |
with gr.Row():
|
| 569 |
+
off_answer = gr.Markdown(value=initial_pair[3], label="Model only answer")
|
| 570 |
+
on_answer = gr.Markdown(value=initial_pair[4], label="Model + Epicure answer")
|
| 571 |
tool_trace = gr.JSON(value=initial_pair[5], label="Observed Epicure trace")
|
| 572 |
reference = gr.Textbox(
|
| 573 |
value=initial_pair[6],
|
|
|
|
| 600 |
<div class="fb-method-grid">
|
| 601 |
<div>
|
| 602 |
<h3>Scoring contract</h3>
|
| 603 |
+
<p><strong>FlavourBench Score</strong> is Model only exact-choice accuracy over
|
| 604 |
+
all 32 tasks. <strong>Model + Epicure</strong> uses the same endpoint-task cells
|
| 605 |
+
with one named Epicure operation. <strong>Epicure Gain</strong> is the matched
|
| 606 |
+
percentage-point change and does not affect rank.</p>
|
| 607 |
<p>Tasks cover substitution, composition, cookability, and evidence. Every expected
|
| 608 |
answer is derived from a fixed read-only Epicure operation.</p>
|
| 609 |
<h3>Public records</h3>
|
|
|
|
| 644 |
gr.HTML(
|
| 645 |
"""
|
| 646 |
<div class="fb-shell fb-footer">
|
| 647 |
+
FlavourBench 路 Executable culinary evaluation 路 Public automated benchmark
|
| 648 |
</div>
|
| 649 |
"""
|
| 650 |
)
|
data/epicure-native-release.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
{
|
| 2 |
-
"artifact_sha256": "
|
| 3 |
"benchmark": "FlavourBench",
|
| 4 |
"counts": {
|
| 5 |
"assigned_arms": 1280,
|
|
@@ -20,7 +20,7 @@
|
|
| 20 |
"reference_tool_match_pairs": 606,
|
| 21 |
"uplift_percentage_points": 50.0
|
| 22 |
},
|
| 23 |
-
"artifact_sha256": "
|
| 24 |
"benchmark": "FlavourBench",
|
| 25 |
"design": {
|
| 26 |
"conditions": [
|
|
@@ -1483,16 +1483,16 @@
|
|
| 1483 |
"official_track": true,
|
| 1484 |
"primary_metric": {
|
| 1485 |
"chance_level": 25,
|
| 1486 |
-
"definition": "100 times
|
| 1487 |
-
"name": "
|
| 1488 |
"range": [
|
| 1489 |
0,
|
| 1490 |
100
|
| 1491 |
],
|
| 1492 |
"rank_order": [
|
| 1493 |
-
"
|
| 1494 |
-
"Epicure
|
| 1495 |
-
"Epicure
|
| 1496 |
"model ID ascending"
|
| 1497 |
]
|
| 1498 |
},
|
|
@@ -34493,7 +34493,7 @@
|
|
| 34493 |
"release_id": "exploratory-unmatched-1790-runtime",
|
| 34494 |
"schema_version": "epicure-runtime-provenance-v1"
|
| 34495 |
},
|
| 34496 |
-
"leaderboard_artifact_sha256": "
|
| 34497 |
"manifest_sha256": "44220f0a6c26798871f830f6ddd62ed99d8872ad5dcb7516491b90bfc71887fc",
|
| 34498 |
"task_set_sha256": "c033bf8e349350b186a47b28c94d4b0f356cbb519d0cffb3d5a7389ce7d7ca2f",
|
| 34499 |
"taskset_artifact_sha256": "615e6164a29ea57c507d979934f3ce484d6b71f4d6da55e9e8d338147c68e536"
|
|
|
|
| 1 |
{
|
| 2 |
+
"artifact_sha256": "197b84d75ccaa549650ad08cc88f934a4ac1173c8e51c9fb149a703ce2602ce8",
|
| 3 |
"benchmark": "FlavourBench",
|
| 4 |
"counts": {
|
| 5 |
"assigned_arms": 1280,
|
|
|
|
| 20 |
"reference_tool_match_pairs": 606,
|
| 21 |
"uplift_percentage_points": 50.0
|
| 22 |
},
|
| 23 |
+
"artifact_sha256": "6076a904af22c6d58b11cb6a0b267431dbfeff639ab511bf6c936d9cf55eebf4",
|
| 24 |
"benchmark": "FlavourBench",
|
| 25 |
"design": {
|
| 26 |
"conditions": [
|
|
|
|
| 1483 |
"official_track": true,
|
| 1484 |
"primary_metric": {
|
| 1485 |
"chance_level": 25,
|
| 1486 |
+
"definition": "100 times Model only correct answers divided by 32, against the published Epicure answer keys",
|
| 1487 |
+
"name": "FlavourBench Score",
|
| 1488 |
"range": [
|
| 1489 |
0,
|
| 1490 |
100
|
| 1491 |
],
|
| 1492 |
"rank_order": [
|
| 1493 |
+
"FlavourBench Score descending",
|
| 1494 |
+
"Model + Epicure accuracy descending",
|
| 1495 |
+
"Model + Epicure completion descending",
|
| 1496 |
"model ID ascending"
|
| 1497 |
]
|
| 1498 |
},
|
|
|
|
| 34493 |
"release_id": "exploratory-unmatched-1790-runtime",
|
| 34494 |
"schema_version": "epicure-runtime-provenance-v1"
|
| 34495 |
},
|
| 34496 |
+
"leaderboard_artifact_sha256": "6076a904af22c6d58b11cb6a0b267431dbfeff639ab511bf6c936d9cf55eebf4",
|
| 34497 |
"manifest_sha256": "44220f0a6c26798871f830f6ddd62ed99d8872ad5dcb7516491b90bfc71887fc",
|
| 34498 |
"task_set_sha256": "c033bf8e349350b186a47b28c94d4b0f356cbb519d0cffb3d5a7389ce7d7ca2f",
|
| 34499 |
"taskset_artifact_sha256": "615e6164a29ea57c507d979934f3ce484d6b71f4d6da55e9e8d338147c68e536"
|