From 31ad2c893607ba6af333f214db4f4d365dbe7dd6 Mon Sep 17 00:00:00 2001 From: Ali Norouzi Date: Tue, 15 Sep 2026 01:46:11 +0400 Subject: [PATCH] Add the paper's benchmark artifact and PDF The CLINC150 and BANKING77 numbers in the FlowRoute paper were reproducible only from the arXiv source bundle, not from this repository, so the results could not be checked against anything committed here. Add experiments/ verbatim from that bundle -- run_benchmark.py, the pinned requirements and environment record, and results/benchmark_results.json with complete per-seed metrics, thresholds, model revision, dataset URLs and checksums. All six files match the SHA-256 digests recorded in the bundle's SOURCE_SHA256SUMS.txt. Add the paper PDF under paper/. The README section notes that the scoring rule benchmarked in the paper is not the one HuggingFaceRetriever implements: the paper embeds each description and each example separately and takes the maximum example similarity, while the shipped retriever embeds one concatenated capability string per contract. This is what CONTRIBUTING.md asks for -- no claimed benchmark numbers without a reproducible evaluation artifact. Co-Authored-By: Claude Opus 5 --- README.md | 28 + experiments/README.md | 37 + experiments/environment-lock.txt | 34 + experiments/requirements.txt | 4 + experiments/results/benchmark_results.json | 805 +++++++++++++++++++++ experiments/results/ranking_summary.csv | 13 + experiments/run_benchmark.py | 767 ++++++++++++++++++++ paper/FlowRoute_Ali_Norouzi.pdf | Bin 0 -> 156564 bytes 8 files changed, 1688 insertions(+) create mode 100644 experiments/README.md create mode 100644 experiments/environment-lock.txt create mode 100644 experiments/requirements.txt create mode 100644 experiments/results/benchmark_results.json create mode 100644 experiments/results/ranking_summary.csv create mode 100644 experiments/run_benchmark.py create mode 100644 paper/FlowRoute_Ali_Norouzi.pdf diff --git a/README.md b/README.md index 7dc78ce..dd7b157 100644 --- a/README.md +++ b/README.md @@ -300,6 +300,34 @@ python training/train_retriever.py \ Do not publish the demo-derived checkpoint as a research result. Build workflow-disjoint train, calibration, and hidden test splits first. +## Paper experiments + +The CLINC150 and BANKING77 results reported in the FlowRoute paper are +reproduced by `experiments/run_benchmark.py`. The script downloads both +datasets from their official repositories, verifies their SHA-256 digests, +pins the `all-MiniLM-L6-v2` model revision, keeps the test splits out of every +tuning decision, and records complete per-seed results. + +```bash +cd experiments +python -m venv .venv +.venv/bin/pip install --index-url https://download.pytorch.org/whl/cpu torch==2.8.0 +.venv/bin/pip install -r requirements.txt +HF_HOME=cache .venv/bin/python run_benchmark.py +``` + +`experiments/results/benchmark_results.json` is the record the paper's tables +are derived from: per-seed metrics, selected thresholds, model revision, source +URLs, checksums, and the environment. `experiments/results/ranking_summary.csv` +is a compact view of the ranking table. + +Note that the scoring rule benchmarked in the paper is not the one used by +`flowroute.backends.HuggingFaceRetriever`. The paper embeds each workflow +description and each approved example separately and takes the maximum example +similarity; the shipped retriever embeds one concatenated capability string per +contract. The two are not interchangeable, and the paper's numbers correspond +to the former. + ## Repository map ```text diff --git a/experiments/README.md b/experiments/README.md new file mode 100644 index 0000000..c77781b --- /dev/null +++ b/experiments/README.md @@ -0,0 +1,37 @@ +# FlowRoute paper benchmark + +This directory reproduces every empirical number in the FlowRoute paper. The +benchmark downloads the official CLINC150 and BANKING77 files, verifies their +SHA-256 digests, and evaluates the pinned `all-MiniLM-L6-v2` model revision. + +The public test splits are never used to select the description/example mixing +weight or abstention thresholds. CLINC150 uses its official validation split +and combines its official out-of-scope training and validation sets for +threshold selection. Both calibration constraints use the upper endpoints of +two-sided 95% Wilson intervals rather than point estimates. +Because BANKING77 has no official validation split, the script deterministically +reserves 20 training examples per intent before selecting workflow examples. + +## Run + +Python 3.12 was used for the paper. Create an environment and install the pinned +dependencies: + +```bash +python -m venv .venv +.venv/bin/pip install --index-url https://download.pytorch.org/whl/cpu torch==2.8.0 +.venv/bin/pip install -r requirements.txt +HF_HOME=cache .venv/bin/python run_benchmark.py +``` + +The script writes: + +- `results/benchmark_results.json`: complete per-seed metrics, thresholds, + environment, model revision, source URLs, and checksums. +- `results/ranking_summary.csv`: compact ranking table. +- `environment-lock.txt`: the complete package-version record from the + reported run. It is an environment record, not a cross-platform installer. + +Downloaded dataset files and model cache files are intentionally excluded from +the source bundle. The original licenses apply: CC BY 3.0 for CLINC150, CC BY +4.0 for BANKING77, and Apache 2.0 for `all-MiniLM-L6-v2`. diff --git a/experiments/environment-lock.txt b/experiments/environment-lock.txt new file mode 100644 index 0000000..fc61cb3 --- /dev/null +++ b/experiments/environment-lock.txt @@ -0,0 +1,34 @@ +# Exact `pip freeze` record from the reported Linux x86_64 benchmark run. +Jinja2==3.1.6 +MarkupSafe==3.0.3 +PyYAML==6.0.3 +certifi==2026.7.22 +charset-normalizer==3.5.1 +cloudpickle==3.1.2 +filelock==3.32.3 +fsspec==2026.7.0 +hf-xet==1.6.0 +huggingface_hub==0.36.2 +idna==3.19 +joblib==1.6.0 +mpmath==1.3.0 +narwhals==2.26.0 +networkx==3.6.1 +numpy==2.5.3 +packaging==26.3 +pillow==12.3.0 +regex==2026.9.10 +requests==2.34.2 +safetensors==0.8.0 +scikit-learn==1.9.1 +scipy==1.18.1 +sentence-transformers==5.1.2 +setuptools==78.1.0 +sympy==1.14.0 +threadpoolctl==3.6.0 +tokenizers==0.22.2 +torch==2.8.0+cpu +tqdm==4.70.1 +transformers==4.57.6 +typing_extensions==4.16.0 +urllib3==2.7.0 diff --git a/experiments/requirements.txt b/experiments/requirements.txt new file mode 100644 index 0000000..58f8851 --- /dev/null +++ b/experiments/requirements.txt @@ -0,0 +1,4 @@ +numpy==2.5.3 +scikit-learn==1.9.1 +sentence-transformers==5.1.2 +torch==2.8.0 diff --git a/experiments/results/benchmark_results.json b/experiments/results/benchmark_results.json new file mode 100644 index 0000000..49da9e2 --- /dev/null +++ b/experiments/results/benchmark_results.json @@ -0,0 +1,805 @@ +{ + "data": { + "banking77_test.csv": { + "sha256": "d12d6e3bc4c3103966ae786dc435913c0c563dfa328f5a3646d0e62cfeeb474d", + "url": "https://raw.githubusercontent.com/PolyAI-LDN/task-specific-datasets/master/banking_data/test.csv" + }, + "banking77_train.csv": { + "sha256": "b06e26ac675513959a63135f11b94ea7786ed02da65db93a5650d8838cbc664b", + "url": "https://raw.githubusercontent.com/PolyAI-LDN/task-specific-datasets/master/banking_data/train.csv" + }, + "clinc150_full.json": { + "sha256": "36923c3705a59e08fe9c3883d8bc2dd966ef93e22cb78ac41171782a698d56e0", + "url": "https://raw.githubusercontent.com/clinc/oos-eval/master/data/data_full.json" + } + }, + "datasets": [ + { + "ablation": { + "0": { + "alpha": { + "mean": 1.0, + "sd": 0.0 + }, + "recall_at_5": { + "mean": 0.8846666666666667, + "sd": 0.0 + }, + "top1": { + "mean": 0.6537777777777778, + "sd": 0.0 + } + }, + "1": { + "alpha": { + "mean": 0.58, + "sd": 0.04472135954999579 + }, + "recall_at_5": { + "mean": 0.9428444444444445, + "sd": 0.006145157684141472 + }, + "top1": { + "mean": 0.7440888888888889, + "sd": 0.013314431045826693 + } + }, + "10": { + "alpha": { + "mean": 0.32, + "sd": 0.08366600265340757 + }, + "recall_at_5": { + "mean": 0.9799555555555555, + "sd": 0.0013462338871876591 + }, + "top1": { + "mean": 0.8501333333333333, + "sd": 0.0045259198642136735 + } + }, + "3": { + "alpha": { + "mean": 0.38, + "sd": 0.08366600265340757 + }, + "recall_at_5": { + "mean": 0.9665777777777779, + "sd": 0.004514995590826805 + }, + "top1": { + "mean": 0.7989333333333334, + "sd": 0.005271399654834336 + } + }, + "5": { + "alpha": { + "mean": 0.38, + "sd": 0.08366600265340757 + }, + "recall_at_5": { + "mean": 0.9732, + "sd": 0.0031055505863605594 + }, + "top1": { + "mean": 0.818888888888889, + "sd": 0.007573508083534212 + } + } + }, + "dataset": "CLINC150", + "labels": 150, + "lexical_10_examples": { + "recall_at_5": { + "mean": 0.9475111111111112, + "sd": 0.004313057979647678 + }, + "top1": { + "mean": 0.8070666666666668, + "sd": 0.003549995652927268 + } + }, + "ood_test_examples": 1000, + "ood_validation_examples": 200, + "reference_confusions": { + "examples_per_workflow": 10, + "pairs": [ + { + "count": 15, + "gold": "time", + "predicted": "timezone" + }, + { + "count": 15, + "gold": "todo_list_update", + "predicted": "todo_list" + }, + { + "count": 13, + "gold": "shopping_list_update", + "predicted": "shopping_list" + }, + { + "count": 13, + "gold": "reminder_update", + "predicted": "reminder" + }, + { + "count": 12, + "gold": "change_user_name", + "predicted": "change_ai_name" + }, + { + "count": 10, + "gold": "change_user_name", + "predicted": "what_is_your_name" + }, + { + "count": 10, + "gold": "user_name", + "predicted": "what_is_your_name" + }, + { + "count": 10, + "gold": "share_location", + "predicted": "current_location" + } + ], + "seed": 37 + }, + "seed_results": [ + { + "examples": { + "0": { + "alpha": 1.0, + "recall_at_5": 0.8846666666666667, + "top1": 0.6537777777777778 + }, + "1": { + "alpha": 0.6, + "recall_at_5": 0.9444444444444444, + "top1": 0.7533333333333333 + }, + "10": { + "alpha": 0.2, + "recall_at_5": 0.9808888888888889, + "top1": 0.8557777777777777 + }, + "3": { + "alpha": 0.4, + "recall_at_5": 0.9684444444444444, + "top1": 0.8053333333333333 + }, + "5": { + "alpha": 0.3, + "recall_at_5": 0.9746666666666667, + "top1": 0.8295555555555556 + } + }, + "seed": 11 + }, + { + "examples": { + "0": { + "alpha": 1.0, + "recall_at_5": 0.8846666666666667, + "top1": 0.6537777777777778 + }, + "1": { + "alpha": 0.6, + "recall_at_5": 0.9324444444444444, + "top1": 0.7282222222222222 + }, + "10": { + "alpha": 0.4, + "recall_at_5": 0.9806666666666667, + "top1": 0.8486666666666667 + }, + "3": { + "alpha": 0.4, + "recall_at_5": 0.964, + "top1": 0.798 + }, + "5": { + "alpha": 0.5, + "recall_at_5": 0.9686666666666667, + "top1": 0.8095555555555556 + } + }, + "seed": 23 + }, + { + "examples": { + "0": { + "alpha": 1.0, + "recall_at_5": 0.8846666666666667, + "top1": 0.6537777777777778 + }, + "1": { + "alpha": 0.6, + "recall_at_5": 0.9462222222222222, + "top1": 0.7615555555555555 + }, + "10": { + "alpha": 0.4, + "recall_at_5": 0.978, + "top1": 0.8455555555555555 + }, + "3": { + "alpha": 0.5, + "recall_at_5": 0.9693333333333334, + "top1": 0.8024444444444444 + }, + "5": { + "alpha": 0.4, + "recall_at_5": 0.976, + "top1": 0.8171111111111111 + } + }, + "seed": 37 + }, + { + "examples": { + "0": { + "alpha": 1.0, + "recall_at_5": 0.8846666666666667, + "top1": 0.6537777777777778 + }, + "1": { + "alpha": 0.6, + "recall_at_5": 0.9482222222222222, + "top1": 0.7366666666666667 + }, + "10": { + "alpha": 0.3, + "recall_at_5": 0.9791111111111112, + "top1": 0.854 + }, + "3": { + "alpha": 0.3, + "recall_at_5": 0.9711111111111111, + "top1": 0.7973333333333333 + }, + "5": { + "alpha": 0.3, + "recall_at_5": 0.9753333333333334, + "top1": 0.8226666666666667 + } + }, + "seed": 53 + }, + { + "examples": { + "0": { + "alpha": 1.0, + "recall_at_5": 0.8846666666666667, + "top1": 0.6537777777777778 + }, + "1": { + "alpha": 0.5, + "recall_at_5": 0.9428888888888889, + "top1": 0.7406666666666667 + }, + "10": { + "alpha": 0.3, + "recall_at_5": 0.9811111111111112, + "top1": 0.8466666666666667 + }, + "3": { + "alpha": 0.3, + "recall_at_5": 0.96, + "top1": 0.7915555555555556 + }, + "5": { + "alpha": 0.4, + "recall_at_5": 0.9713333333333334, + "top1": 0.8155555555555556 + } + }, + "seed": 71 + } + ], + "seeds": [ + 11, + 23, + 37, + 53, + 71 + ], + "selective_routing": { + "seed_results": [ + { + "alpha": 0.2, + "margin_threshold": 0.055, + "score_threshold": 0.535, + "seed": 11, + "test": { + "accepted_id": 3047, + "accepted_ood": 35, + "id_coverage": 0.6771111111111111, + "ood_fpr": 0.035, + "selective_error": 0.05382343288480473, + "wrong_accepted_id": 164 + }, + "validation": { + "accepted_id": 1988, + "accepted_ood": 3, + "id_coverage": 0.6626666666666666, + "ood_fpr": 0.015, + "ood_fpr_wilson_upper_95": 0.04316572879269026, + "selective_error": 0.039235412474849095, + "selective_error_wilson_upper_95": 0.048696674268041445, + "wrong_accepted_id": 78 + } + }, + { + "alpha": 0.4, + "margin_threshold": 0.065, + "score_threshold": 0.47000000000000003, + "seed": 23, + "test": { + "accepted_id": 2909, + "accepted_ood": 37, + "id_coverage": 0.6464444444444445, + "ood_fpr": 0.037, + "selective_error": 0.04090752836026126, + "wrong_accepted_id": 119 + }, + "validation": { + "accepted_id": 1855, + "accepted_ood": 3, + "id_coverage": 0.6183333333333333, + "ood_fpr": 0.015, + "ood_fpr_wilson_upper_95": 0.04316572879269026, + "selective_error": 0.03827493261455526, + "selective_error_wilson_upper_95": 0.04800303825871906, + "wrong_accepted_id": 71 + } + }, + { + "alpha": 0.4, + "margin_threshold": 0.04, + "score_threshold": 0.505, + "seed": 37, + "test": { + "accepted_id": 2871, + "accepted_ood": 26, + "id_coverage": 0.638, + "ood_fpr": 0.026, + "selective_error": 0.054684778822709855, + "wrong_accepted_id": 157 + }, + "validation": { + "accepted_id": 1925, + "accepted_ood": 3, + "id_coverage": 0.6416666666666667, + "ood_fpr": 0.015, + "ood_fpr_wilson_upper_95": 0.04316572879269026, + "selective_error": 0.03896103896103896, + "selective_error_wilson_upper_95": 0.048563379564802375, + "wrong_accepted_id": 75 + } + }, + { + "alpha": 0.3, + "margin_threshold": 0.05, + "score_threshold": 0.53, + "seed": 53, + "test": { + "accepted_id": 2889, + "accepted_ood": 23, + "id_coverage": 0.642, + "ood_fpr": 0.023, + "selective_error": 0.04915195569401177, + "wrong_accepted_id": 142 + }, + "validation": { + "accepted_id": 1912, + "accepted_ood": 2, + "id_coverage": 0.6373333333333333, + "ood_fpr": 0.01, + "ood_fpr_wilson_upper_95": 0.0357217617161768, + "selective_error": 0.0397489539748954, + "selective_error_wilson_upper_95": 0.049468642990548276, + "wrong_accepted_id": 76 + } + }, + { + "alpha": 0.3, + "margin_threshold": 0.085, + "score_threshold": 0.505, + "seed": 71, + "test": { + "accepted_id": 2687, + "accepted_ood": 25, + "id_coverage": 0.5971111111111111, + "ood_fpr": 0.025, + "selective_error": 0.03126163007071083, + "wrong_accepted_id": 84 + }, + "validation": { + "accepted_id": 1771, + "accepted_ood": 3, + "id_coverage": 0.5903333333333334, + "ood_fpr": 0.015, + "ood_fpr_wilson_upper_95": 0.04316572879269026, + "selective_error": 0.024844720496894408, + "selective_error_wilson_upper_95": 0.03318720358989378, + "wrong_accepted_id": 44 + } + } + ], + "target_validation_ood_fpr": 0.05, + "target_validation_selective_error": 0.05, + "test": { + "id_coverage": { + "mean": 0.6401333333333333, + "sd": 0.028575047389870285 + }, + "ood_fpr": { + "mean": 0.029199999999999997, + "sd": 0.0063403469936589435 + }, + "selective_error": { + "mean": 0.045965865166499684, + "sd": 0.009870578752526052 + } + } + }, + "test_examples": 4500, + "validation_examples": 3000 + }, + { + "ablation": { + "0": { + "alpha": { + "mean": 1.0, + "sd": 0.0 + }, + "recall_at_5": { + "mean": 0.8389610389610389, + "sd": 0.0 + }, + "top1": { + "mean": 0.6133116883116884, + "sd": 0.0 + } + }, + "1": { + "alpha": { + "mean": 0.6799999999999999, + "sd": 0.04472135954999579 + }, + "recall_at_5": { + "mean": 0.899155844155844, + "sd": 0.007574752561660528 + }, + "top1": { + "mean": 0.6756493506493506, + "sd": 0.008152519174993315 + } + }, + "10": { + "alpha": { + "mean": 0.12000000000000002, + "sd": 0.044721359549995794 + }, + "recall_at_5": { + "mean": 0.9687662337662338, + "sd": 0.001385112273227392 + }, + "top1": { + "mean": 0.831038961038961, + "sd": 0.0053625513823539125 + } + }, + "3": { + "alpha": { + "mean": 0.42000000000000004, + "sd": 0.08366600265340755 + }, + "recall_at_5": { + "mean": 0.9370129870129871, + "sd": 0.0032790600449227373 + }, + "top1": { + "mean": 0.7368181818181818, + "sd": 0.004791574237499559 + } + }, + "5": { + "alpha": { + "mean": 0.32, + "sd": 0.04472135954999581 + }, + "recall_at_5": { + "mean": 0.9527922077922077, + "sd": 0.0031023062819717675 + }, + "top1": { + "mean": 0.7834415584415584, + "sd": 0.006775531413866621 + } + } + }, + "dataset": "BANKING77", + "labels": 77, + "lexical_10_examples": { + "recall_at_5": { + "mean": 0.9344155844155845, + "sd": 0.003862135471873467 + }, + "top1": { + "mean": 0.7235064935064935, + "sd": 0.012326122422674071 + } + }, + "ood_test_examples": 0, + "ood_validation_examples": 0, + "reference_confusions": { + "examples_per_workflow": 10, + "pairs": [ + { + "count": 14, + "gold": "top_up_reverted", + "predicted": "pending_top_up" + }, + { + "count": 14, + "gold": "why_verify_identity", + "predicted": "verify_my_identity" + }, + { + "count": 10, + "gold": "exchange_via_app", + "predicted": "fiat_currency_support" + }, + { + "count": 8, + "gold": "top_up_by_bank_transfer_charge", + "predicted": "transfer_fee_charged" + }, + { + "count": 8, + "gold": "unable_to_verify_identity", + "predicted": "verify_my_identity" + }, + { + "count": 7, + "gold": "top_up_reverted", + "predicted": "top_up_failed" + }, + { + "count": 7, + "gold": "transfer_timing", + "predicted": "balance_not_updated_after_bank_transfer" + }, + { + "count": 7, + "gold": "beneficiary_not_allowed", + "predicted": "failed_transfer" + } + ], + "seed": 37 + }, + "seed_results": [ + { + "examples": { + "0": { + "alpha": 1.0, + "recall_at_5": 0.8389610389610389, + "top1": 0.6133116883116884 + }, + "1": { + "alpha": 0.7, + "recall_at_5": 0.8918831168831168, + "top1": 0.6743506493506494 + }, + "10": { + "alpha": 0.1, + "recall_at_5": 0.9701298701298702, + "top1": 0.8311688311688312 + }, + "3": { + "alpha": 0.3, + "recall_at_5": 0.9327922077922078, + "top1": 0.736038961038961 + }, + "5": { + "alpha": 0.4, + "recall_at_5": 0.950974025974026, + "top1": 0.7724025974025974 + } + }, + "seed": 11 + }, + { + "examples": { + "0": { + "alpha": 1.0, + "recall_at_5": 0.8389610389610389, + "top1": 0.6133116883116884 + }, + "1": { + "alpha": 0.7, + "recall_at_5": 0.8951298701298701, + "top1": 0.6814935064935065 + }, + "10": { + "alpha": 0.1, + "recall_at_5": 0.9672077922077922, + "top1": 0.8262987012987013 + }, + "3": { + "alpha": 0.5, + "recall_at_5": 0.936038961038961, + "top1": 0.7396103896103896 + }, + "5": { + "alpha": 0.3, + "recall_at_5": 0.9571428571428572, + "top1": 0.7827922077922078 + } + }, + "seed": 23 + }, + { + "examples": { + "0": { + "alpha": 1.0, + "recall_at_5": 0.8389610389610389, + "top1": 0.6133116883116884 + }, + "1": { + "alpha": 0.6, + "recall_at_5": 0.910064935064935, + "top1": 0.6746753246753247 + }, + "10": { + "alpha": 0.1, + "recall_at_5": 0.9675324675324676, + "top1": 0.8386363636363636 + }, + "3": { + "alpha": 0.4, + "recall_at_5": 0.9366883116883117, + "top1": 0.7435064935064936 + }, + "5": { + "alpha": 0.3, + "recall_at_5": 0.9525974025974026, + "top1": 0.788961038961039 + } + }, + "seed": 37 + }, + { + "examples": { + "0": { + "alpha": 1.0, + "recall_at_5": 0.8389610389610389, + "top1": 0.6133116883116884 + }, + "1": { + "alpha": 0.7, + "recall_at_5": 0.8948051948051948, + "top1": 0.6633116883116883 + }, + "10": { + "alpha": 0.1, + "recall_at_5": 0.9688311688311688, + "top1": 0.8334415584415584 + }, + "3": { + "alpha": 0.4, + "recall_at_5": 0.9376623376623376, + "top1": 0.7318181818181818 + }, + "5": { + "alpha": 0.3, + "recall_at_5": 0.9542207792207792, + "top1": 0.788961038961039 + } + }, + "seed": 53 + }, + { + "examples": { + "0": { + "alpha": 1.0, + "recall_at_5": 0.8389610389610389, + "top1": 0.6133116883116884 + }, + "1": { + "alpha": 0.7, + "recall_at_5": 0.9038961038961039, + "top1": 0.6844155844155844 + }, + "10": { + "alpha": 0.2, + "recall_at_5": 0.9701298701298702, + "top1": 0.8256493506493506 + }, + "3": { + "alpha": 0.5, + "recall_at_5": 0.9418831168831169, + "top1": 0.7331168831168832 + }, + "5": { + "alpha": 0.3, + "recall_at_5": 0.949025974025974, + "top1": 0.7840909090909091 + } + }, + "seed": 71 + } + ], + "seeds": [ + 11, + 23, + 37, + 53, + 71 + ], + "test_examples": 3080, + "validation_examples": 1540 + } + ], + "environment": { + "cpu": "AMD EPYC 9V74 80-Core Processor", + "numpy": "2.5.3", + "platform": "Linux-6.18.35-x86_64-with-glibc2.39", + "python": "3.12.14", + "scikit_learn": "1.9.1", + "sentence_transformers": "5.1.2", + "torch": "2.8.0+cpu" + }, + "evaluation_seconds_excluding_initial_query_encoding": 90.92143702507019, + "experiment": "FlowRoute public-data benchmark", + "latency": { + "batch_size": 1, + "catalog_workflows": 150, + "examples_per_workflow": 10, + "iterations": 500, + "mean_ms": 11.637435477999999, + "median_ms": 11.536568500000001, + "p95_ms": 13.47621255, + "p99_ms": 14.88310988, + "threads": 1 + }, + "method": { + "alpha_grid": [ + 0.0, + 0.1, + 0.2, + 0.3, + 0.4, + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1.0 + ], + "example_counts": [ + 0, + 1, + 3, + 5, + 10 + ], + "seeds": [ + 11, + 23, + 37, + 53, + 71 + ], + "selection": "alpha and route thresholds selected on validation data only; both validation risk constraints use upper endpoints of two-sided 95% Wilson intervals" + }, + "model": { + "id": "sentence-transformers/all-MiniLM-L6-v2", + "parameters": 22713216, + "revision": "1110a243fdf4706b3f48f1d95db1a4f5529b4d41" + } +} diff --git a/experiments/results/ranking_summary.csv b/experiments/results/ranking_summary.csv new file mode 100644 index 0000000..e5d467d --- /dev/null +++ b/experiments/results/ranking_summary.csv @@ -0,0 +1,13 @@ +dataset,system,top1_mean,top1_sd,recall_at_5_mean,recall_at_5_sd +CLINC150,word-char TF-IDF (10 examples),0.8070666666666668,0.003549995652927268,0.9475111111111112,0.004313057979647678 +CLINC150,dense example-aware (0 examples),0.6537777777777778,0.0,0.8846666666666667,0.0 +CLINC150,dense example-aware (1 examples),0.7440888888888889,0.013314431045826693,0.9428444444444445,0.006145157684141472 +CLINC150,dense example-aware (3 examples),0.7989333333333334,0.005271399654834336,0.9665777777777779,0.004514995590826805 +CLINC150,dense example-aware (5 examples),0.818888888888889,0.007573508083534212,0.9732,0.0031055505863605594 +CLINC150,dense example-aware (10 examples),0.8501333333333333,0.0045259198642136735,0.9799555555555555,0.0013462338871876591 +BANKING77,word-char TF-IDF (10 examples),0.7235064935064935,0.012326122422674071,0.9344155844155845,0.003862135471873467 +BANKING77,dense example-aware (0 examples),0.6133116883116884,0.0,0.8389610389610389,0.0 +BANKING77,dense example-aware (1 examples),0.6756493506493506,0.008152519174993315,0.899155844155844,0.007574752561660528 +BANKING77,dense example-aware (3 examples),0.7368181818181818,0.004791574237499559,0.9370129870129871,0.0032790600449227373 +BANKING77,dense example-aware (5 examples),0.7834415584415584,0.006775531413866621,0.9527922077922077,0.0031023062819717675 +BANKING77,dense example-aware (10 examples),0.831038961038961,0.0053625513823539125,0.9687662337662338,0.001385112273227392 diff --git a/experiments/run_benchmark.py b/experiments/run_benchmark.py new file mode 100644 index 0000000..ceea183 --- /dev/null +++ b/experiments/run_benchmark.py @@ -0,0 +1,767 @@ +#!/usr/bin/env python3 +"""Reproduce the FlowRoute benchmark reported in the paper. + +The experiment treats each intent label as a runtime workflow. It compares a +lexical index, description-only dense routing, and example-aware dense routing. +No generative model is called and no benchmark test example is used to choose +hyperparameters or decision thresholds. +""" + +from __future__ import annotations + +import argparse +import csv +import hashlib +import json +import math +import os +import platform +import random +import statistics +import sys +import time +import urllib.request +from collections import Counter, defaultdict +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +import numpy as np +import sklearn +import torch +from sentence_transformers import SentenceTransformer +from sklearn.feature_extraction.text import TfidfVectorizer + + +MODEL_ID = "sentence-transformers/all-MiniLM-L6-v2" +MODEL_REVISION = "1110a243fdf4706b3f48f1d95db1a4f5529b4d41" +SEEDS = (11, 23, 37, 53, 71) +EXAMPLE_COUNTS = (0, 1, 3, 5, 10) +ALPHAS = tuple(value / 10 for value in range(11)) +TARGET_SELECTIVE_ERROR = 0.05 +TARGET_OOD_FPR = 0.05 + +DATASETS = { + "clinc150_full.json": { + "url": "https://raw.githubusercontent.com/clinc/oos-eval/master/data/data_full.json", + "sha256": "36923c3705a59e08fe9c3883d8bc2dd966ef93e22cb78ac41171782a698d56e0", + }, + "banking77_train.csv": { + "url": "https://raw.githubusercontent.com/PolyAI-LDN/task-specific-datasets/master/banking_data/train.csv", + "sha256": "b06e26ac675513959a63135f11b94ea7786ed02da65db93a5650d8838cbc664b", + }, + "banking77_test.csv": { + "url": "https://raw.githubusercontent.com/PolyAI-LDN/task-specific-datasets/master/banking_data/test.csv", + "sha256": "d12d6e3bc4c3103966ae786dc435913c0c563dfa328f5a3646d0e62cfeeb474d", + }, +} + + +@dataclass(frozen=True) +class DatasetSplit: + name: str + train_by_label: dict[str, list[str]] + validation: list[tuple[str, str]] + test: list[tuple[str, str]] + ood_validation: list[str] + ood_test: list[str] + + +def sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for block in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def ensure_data(data_dir: Path) -> None: + data_dir.mkdir(parents=True, exist_ok=True) + for filename, metadata in DATASETS.items(): + target = data_dir / filename + if not target.exists(): + print(f"Downloading {filename}", file=sys.stderr) + urllib.request.urlretrieve(metadata["url"], target) + actual = sha256(target) + if actual != metadata["sha256"]: + raise RuntimeError( + f"Checksum mismatch for {target}: expected {metadata['sha256']}, got {actual}" + ) + + +def load_clinc(data_dir: Path) -> DatasetSplit: + raw = json.loads((data_dir / "clinc150_full.json").read_text(encoding="utf-8")) + train_by_label: dict[str, list[str]] = defaultdict(list) + for text, label in raw["train"]: + train_by_label[label].append(text) + return DatasetSplit( + name="CLINC150", + train_by_label=dict(train_by_label), + validation=[tuple(item) for item in raw["val"]], + test=[tuple(item) for item in raw["test"]], + ood_validation=[text for text, _ in [*raw["oos_train"], *raw["oos_val"]]], + ood_test=[text for text, _ in raw["oos_test"]], + ) + + +def load_banking(data_dir: Path) -> DatasetSplit: + train_by_label: dict[str, list[str]] = defaultdict(list) + with (data_dir / "banking77_train.csv").open( + encoding="utf-8", newline="" + ) as handle: + for row in csv.DictReader(handle): + train_by_label[row["category"]].append(row["text"]) + with (data_dir / "banking77_test.csv").open(encoding="utf-8", newline="") as handle: + test = [(row["text"], row["category"]) for row in csv.DictReader(handle)] + + validation: list[tuple[str, str]] = [] + exemplar_pool: dict[str, list[str]] = {} + for label, examples in sorted(train_by_label.items()): + label_seed = int(hashlib.sha256(label.encode("utf-8")).hexdigest()[:8], 16) + shuffled = list(examples) + random.Random(20260912 + label_seed).shuffle(shuffled) + validation.extend((text, label) for text in shuffled[:20]) + exemplar_pool[label] = shuffled[20:] + + return DatasetSplit( + name="BANKING77", + train_by_label=exemplar_pool, + validation=validation, + test=test, + ood_validation=[], + ood_test=[], + ) + + +def workflow_description(label: str) -> str: + return f"Workflow for {label.replace('_', ' ')}." + + +def select_examples( + train_by_label: dict[str, list[str]], labels: list[str], count: int, seed: int +) -> dict[str, list[str]]: + selected: dict[str, list[str]] = {} + for label in labels: + label_seed = int(hashlib.sha256(label.encode("utf-8")).hexdigest()[:8], 16) + values = list(train_by_label[label]) + random.Random(seed + label_seed).shuffle(values) + selected[label] = values[:count] + return selected + + +def dense_components( + model: SentenceTransformer, + query_embeddings: np.ndarray, + labels: list[str], + examples: dict[str, list[str]], +) -> tuple[np.ndarray, np.ndarray | None, np.ndarray, np.ndarray | None]: + descriptions = [workflow_description(label) for label in labels] + description_embeddings = model.encode( + descriptions, + batch_size=128, + normalize_embeddings=True, + convert_to_numpy=True, + show_progress_bar=False, + ) + description_scores = query_embeddings @ description_embeddings.T + count = len(examples[labels[0]]) if labels else 0 + if count == 0: + return description_scores, None, description_embeddings, None + + flat_examples = [text for label in labels for text in examples[label]] + example_embeddings = model.encode( + flat_examples, + batch_size=128, + normalize_embeddings=True, + convert_to_numpy=True, + show_progress_bar=False, + ).reshape(len(labels), count, -1) + example_scores = np.einsum("qd,lnd->qln", query_embeddings, example_embeddings).max( + axis=2 + ) + return ( + description_scores, + example_scores, + description_embeddings, + example_embeddings, + ) + + +def combine_scores( + description_scores: np.ndarray, example_scores: np.ndarray | None, alpha: float +) -> np.ndarray: + if example_scores is None: + return description_scores + return (alpha * description_scores) + ((1.0 - alpha) * example_scores) + + +def label_indices( + rows: list[tuple[str, str]], label_to_index: dict[str, int] +) -> np.ndarray: + return np.asarray([label_to_index[label] for _, label in rows], dtype=np.int64) + + +def ranking_metrics(scores: np.ndarray, gold: np.ndarray) -> dict[str, float]: + order = np.argsort(-scores, axis=1, kind="stable") + top1 = float(np.mean(order[:, 0] == gold)) + top5 = float( + np.mean(np.any(order[:, : min(5, scores.shape[1])] == gold[:, None], axis=1)) + ) + return {"top1": top1, "recall_at_5": top5} + + +def common_confusions( + scores: np.ndarray, gold: np.ndarray, labels: list[str], limit: int = 8 +) -> list[dict[str, Any]]: + predictions = np.argmax(scores, axis=1) + pairs = Counter( + (labels[int(expected)], labels[int(predicted)]) + for expected, predicted in zip(gold, predictions, strict=True) + if expected != predicted + ) + return [ + {"gold": gold_label, "predicted": predicted_label, "count": count} + for (gold_label, predicted_label), count in pairs.most_common(limit) + ] + + +def tune_alpha( + description_scores: np.ndarray, + example_scores: np.ndarray | None, + gold: np.ndarray, +) -> float: + if example_scores is None: + return 1.0 + candidates: list[tuple[float, float]] = [] + for alpha in ALPHAS: + metrics = ranking_metrics( + combine_scores(description_scores, example_scores, alpha), gold + ) + candidates.append((metrics["top1"], alpha)) + # Prefer more description weight when validation accuracy ties. + return max(candidates, key=lambda item: (item[0], item[1]))[1] + + +def lexical_scores( + queries: list[str], labels: list[str], examples: dict[str, list[str]] +) -> np.ndarray: + documents = [ + " ".join([workflow_description(label), *examples[label]]) for label in labels + ] + word = TfidfVectorizer( + lowercase=True, + strip_accents="unicode", + ngram_range=(1, 2), + sublinear_tf=True, + min_df=1, + ) + char = TfidfVectorizer( + lowercase=True, + strip_accents="unicode", + analyzer="char_wb", + ngram_range=(3, 5), + sublinear_tf=True, + min_df=1, + ) + word_documents = word.fit_transform(documents) + char_documents = char.fit_transform(documents) + word_scores = (word.transform(queries) @ word_documents.T).toarray() + char_scores = (char.transform(queries) @ char_documents.T).toarray() + return np.clip((0.65 * word_scores) + (0.35 * char_scores), 0.0, 1.0) + + +def top_score_and_margin( + scores: np.ndarray, +) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + order = np.argsort(-scores, axis=1, kind="stable") + best_index = order[:, 0] + row_ids = np.arange(scores.shape[0]) + best_score = scores[row_ids, best_index] + second_score = ( + scores[row_ids, order[:, 1]] + if scores.shape[1] > 1 + else np.zeros_like(best_score) + ) + return best_index, best_score, best_score - second_score + + +def decision_metrics( + id_scores: np.ndarray, + id_gold: np.ndarray, + ood_scores: np.ndarray, + score_threshold: float, + margin_threshold: float, +) -> dict[str, float | int]: + prediction, best_score, margin = top_score_and_margin(id_scores) + accepted = (best_score >= score_threshold) & (margin >= margin_threshold) + accepted_count = int(accepted.sum()) + wrong_count = int((accepted & (prediction != id_gold)).sum()) + id_coverage = accepted_count / len(id_gold) + selective_error = wrong_count / accepted_count if accepted_count else 0.0 + + if len(ood_scores): + _, ood_best_score, ood_margin = top_score_and_margin(ood_scores) + ood_accepted = (ood_best_score >= score_threshold) & ( + ood_margin >= margin_threshold + ) + ood_false_positive_count = int(ood_accepted.sum()) + ood_fpr = ood_false_positive_count / len(ood_scores) + else: + ood_false_positive_count = 0 + ood_fpr = math.nan + + return { + "id_coverage": id_coverage, + "selective_error": selective_error, + "accepted_id": accepted_count, + "wrong_accepted_id": wrong_count, + "ood_fpr": ood_fpr, + "accepted_ood": ood_false_positive_count, + } + + +def tune_decision_thresholds( + id_scores: np.ndarray, + id_gold: np.ndarray, + ood_scores: np.ndarray, +) -> tuple[float, float, dict[str, float | int]]: + id_prediction, id_best_score, id_margin = top_score_and_margin(id_scores) + id_wrong = id_prediction != id_gold + _, ood_best_score, ood_margin = top_score_and_margin(ood_scores) + best: tuple[float, float, float, float, float, dict[str, float | int]] | None = None + for score_threshold in np.linspace(0.0, 1.0, 201): + for margin_threshold in np.linspace(0.0, 0.5, 101): + id_accepted = (id_best_score >= score_threshold) & ( + id_margin >= margin_threshold + ) + accepted_id = int(id_accepted.sum()) + wrong_accepted_id = int((id_accepted & id_wrong).sum()) + ood_accepted = (ood_best_score >= score_threshold) & ( + ood_margin >= margin_threshold + ) + accepted_ood = int(ood_accepted.sum()) + metrics: dict[str, float | int] = { + "id_coverage": accepted_id / len(id_gold), + "selective_error": wrong_accepted_id / accepted_id + if accepted_id + else 0.0, + "accepted_id": accepted_id, + "wrong_accepted_id": wrong_accepted_id, + "ood_fpr": accepted_ood / len(ood_scores), + "accepted_ood": accepted_ood, + "selective_error_wilson_upper_95": wilson_interval( + wrong_accepted_id, accepted_id + )[1], + "ood_fpr_wilson_upper_95": wilson_interval( + accepted_ood, len(ood_scores) + )[1], + } + if metrics["accepted_id"] < 100: + continue + if metrics["selective_error_wilson_upper_95"] > TARGET_SELECTIVE_ERROR: + continue + if metrics["ood_fpr_wilson_upper_95"] > TARGET_OOD_FPR: + continue + candidate = ( + float(metrics["id_coverage"]), + -float(metrics["selective_error"]), + -float(metrics["ood_fpr"]), + -float(score_threshold), + -float(margin_threshold), + metrics, + ) + if best is None or candidate[:5] > best[:5]: + best = candidate + if best is None: + raise RuntimeError("No threshold pair satisfied the validation constraints") + return -best[3], -best[4], best[5] + + +def mean_sd(values: list[float]) -> dict[str, float]: + return { + "mean": float(statistics.fmean(values)), + "sd": float(statistics.stdev(values)) if len(values) > 1 else 0.0, + } + + +def wilson_interval( + successes: int, total: int, z: float = 1.959963984540054 +) -> list[float]: + if total == 0: + return [math.nan, math.nan] + proportion = successes / total + denominator = 1 + (z * z / total) + centre = (proportion + (z * z / (2 * total))) / denominator + radius = ( + z + * math.sqrt( + (proportion * (1 - proportion) / total) + (z * z / (4 * total * total)) + ) + / denominator + ) + return [centre - radius, centre + radius] + + +def evaluate_dataset( + model: SentenceTransformer, + split: DatasetSplit, + all_query_embeddings: dict[str, np.ndarray], +) -> dict[str, Any]: + labels = sorted(split.train_by_label) + label_to_index = {label: index for index, label in enumerate(labels)} + test_texts = [text for text, _ in split.test] + validation_gold = label_indices(split.validation, label_to_index) + test_gold = label_indices(split.test, label_to_index) + validation_embeddings = all_query_embeddings[f"{split.name}:validation"] + test_embeddings = all_query_embeddings[f"{split.name}:test"] + + seed_results: list[dict[str, Any]] = [] + ablations: dict[int, list[dict[str, float]]] = { + count: [] for count in EXAMPLE_COUNTS + } + reference_confusions: list[dict[str, Any]] = [] + + for seed in SEEDS: + seed_record: dict[str, Any] = {"seed": seed, "examples": {}} + for count in EXAMPLE_COUNTS: + examples = select_examples(split.train_by_label, labels, count, seed) + val_desc, val_ex, desc_embeddings, example_embeddings = dense_components( + model, validation_embeddings, labels, examples + ) + alpha = tune_alpha(val_desc, val_ex, validation_gold) + test_desc = test_embeddings @ desc_embeddings.T + test_ex = ( + np.einsum("qd,lnd->qln", test_embeddings, example_embeddings).max( + axis=2 + ) + if example_embeddings is not None + else None + ) + test_scores = combine_scores(test_desc, test_ex, alpha) + metrics = ranking_metrics(test_scores, test_gold) + metrics["alpha"] = alpha + seed_record["examples"][str(count)] = metrics + ablations[count].append(metrics) + if seed == 37 and count == 10: + reference_confusions = common_confusions(test_scores, test_gold, labels) + seed_results.append(seed_record) + + aggregate_ablations: dict[str, Any] = {} + for count, records in ablations.items(): + aggregate_ablations[str(count)] = { + "top1": mean_sd([record["top1"] for record in records]), + "recall_at_5": mean_sd([record["recall_at_5"] for record in records]), + "alpha": mean_sd([record["alpha"] for record in records]), + } + + lexical_seed_metrics: list[dict[str, float]] = [] + for seed in SEEDS: + examples = select_examples(split.train_by_label, labels, 10, seed) + scores = lexical_scores(test_texts, labels, examples) + lexical_seed_metrics.append(ranking_metrics(scores, test_gold)) + + result: dict[str, Any] = { + "dataset": split.name, + "labels": len(labels), + "validation_examples": len(split.validation), + "test_examples": len(split.test), + "ood_validation_examples": len(split.ood_validation), + "ood_test_examples": len(split.ood_test), + "seeds": list(SEEDS), + "seed_results": seed_results, + "ablation": aggregate_ablations, + "lexical_10_examples": { + "top1": mean_sd([item["top1"] for item in lexical_seed_metrics]), + "recall_at_5": mean_sd( + [item["recall_at_5"] for item in lexical_seed_metrics] + ), + }, + "reference_confusions": { + "seed": 37, + "examples_per_workflow": 10, + "pairs": reference_confusions, + }, + } + + if split.ood_validation and split.ood_test: + ood_validation_embeddings = all_query_embeddings[f"{split.name}:ood_validation"] + ood_test_embeddings = all_query_embeddings[f"{split.name}:ood_test"] + selective_results: list[dict[str, Any]] = [] + for seed in SEEDS: + examples = select_examples(split.train_by_label, labels, 10, seed) + val_desc, val_ex, desc_embeddings, example_embeddings = dense_components( + model, validation_embeddings, labels, examples + ) + alpha = tune_alpha(val_desc, val_ex, validation_gold) + validation_scores = combine_scores(val_desc, val_ex, alpha) + ood_val_desc = ood_validation_embeddings @ desc_embeddings.T + ood_val_ex = np.einsum( + "qd,lnd->qln", ood_validation_embeddings, example_embeddings + ).max(axis=2) + ood_validation_scores = combine_scores(ood_val_desc, ood_val_ex, alpha) + score_threshold, margin_threshold, validation_metrics = ( + tune_decision_thresholds( + validation_scores, validation_gold, ood_validation_scores + ) + ) + + test_desc = test_embeddings @ desc_embeddings.T + test_ex = np.einsum("qd,lnd->qln", test_embeddings, example_embeddings).max( + axis=2 + ) + test_scores = combine_scores(test_desc, test_ex, alpha) + ood_test_desc = ood_test_embeddings @ desc_embeddings.T + ood_test_ex = np.einsum( + "qd,lnd->qln", ood_test_embeddings, example_embeddings + ).max(axis=2) + ood_test_scores = combine_scores(ood_test_desc, ood_test_ex, alpha) + test_metrics = decision_metrics( + test_scores, + test_gold, + ood_test_scores, + score_threshold, + margin_threshold, + ) + selective_results.append( + { + "seed": seed, + "alpha": alpha, + "score_threshold": score_threshold, + "margin_threshold": margin_threshold, + "validation": validation_metrics, + "test": test_metrics, + } + ) + + result["selective_routing"] = { + "target_validation_selective_error": TARGET_SELECTIVE_ERROR, + "target_validation_ood_fpr": TARGET_OOD_FPR, + "seed_results": selective_results, + "test": { + "id_coverage": mean_sd( + [float(item["test"]["id_coverage"]) for item in selective_results] + ), + "selective_error": mean_sd( + [ + float(item["test"]["selective_error"]) + for item in selective_results + ] + ), + "ood_fpr": mean_sd( + [float(item["test"]["ood_fpr"]) for item in selective_results] + ), + }, + } + return result + + +def benchmark_latency( + model: SentenceTransformer, + split: DatasetSplit, + seed: int, + count: int = 10, + iterations: int = 500, +) -> dict[str, Any]: + torch.set_num_threads(1) + labels = sorted(split.train_by_label) + examples = select_examples(split.train_by_label, labels, count, seed) + descriptions = model.encode( + [workflow_description(label) for label in labels], + normalize_embeddings=True, + convert_to_numpy=True, + show_progress_bar=False, + ) + example_embeddings = model.encode( + [text for label in labels for text in examples[label]], + batch_size=128, + normalize_embeddings=True, + convert_to_numpy=True, + show_progress_bar=False, + ).reshape(len(labels), count, -1) + queries = [text for text, _ in split.test] + alpha = 0.4 + + def route_once(query: str) -> None: + query_embedding = model.encode( + [query], + normalize_embeddings=True, + convert_to_numpy=True, + show_progress_bar=False, + )[0] + description_scores = descriptions @ query_embedding + example_scores = np.einsum( + "lnd,d->ln", example_embeddings, query_embedding + ).max(axis=1) + scores = (alpha * description_scores) + ((1.0 - alpha) * example_scores) + int(np.argmax(scores)) + + for query in queries[:50]: + route_once(query) + samples: list[float] = [] + for index in range(iterations): + start = time.perf_counter_ns() + route_once(queries[index % len(queries)]) + samples.append((time.perf_counter_ns() - start) / 1_000_000) + return { + "threads": torch.get_num_threads(), + "iterations": iterations, + "batch_size": 1, + "catalog_workflows": len(labels), + "examples_per_workflow": count, + "median_ms": float(np.median(samples)), + "p95_ms": float(np.percentile(samples, 95)), + "p99_ms": float(np.percentile(samples, 99)), + "mean_ms": float(np.mean(samples)), + } + + +def cpu_model_name() -> str: + try: + for line in Path("/proc/cpuinfo").read_text(encoding="utf-8").splitlines(): + if line.lower().startswith("model name"): + return line.split(":", 1)[1].strip() + except OSError: + pass + return platform.processor() or "unknown" + + +def write_summary_csv(results: dict[str, Any], path: Path) -> None: + rows: list[dict[str, Any]] = [] + for dataset in results["datasets"]: + rows.append( + { + "dataset": dataset["dataset"], + "system": "word-char TF-IDF (10 examples)", + "top1_mean": dataset["lexical_10_examples"]["top1"]["mean"], + "top1_sd": dataset["lexical_10_examples"]["top1"]["sd"], + "recall_at_5_mean": dataset["lexical_10_examples"]["recall_at_5"][ + "mean" + ], + "recall_at_5_sd": dataset["lexical_10_examples"]["recall_at_5"]["sd"], + } + ) + for count in EXAMPLE_COUNTS: + record = dataset["ablation"][str(count)] + rows.append( + { + "dataset": dataset["dataset"], + "system": f"dense example-aware ({count} examples)", + "top1_mean": record["top1"]["mean"], + "top1_sd": record["top1"]["sd"], + "recall_at_5_mean": record["recall_at_5"]["mean"], + "recall_at_5_sd": record["recall_at_5"]["sd"], + } + ) + with path.open("w", encoding="utf-8", newline="") as handle: + writer = csv.DictWriter(handle, fieldnames=list(rows[0])) + writer.writeheader() + writer.writerows(rows) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--data-dir", type=Path, default=Path(__file__).parent / "data") + parser.add_argument( + "--output-dir", type=Path, default=Path(__file__).parent / "results" + ) + parser.add_argument( + "--cache-dir", type=Path, default=Path(__file__).parent / "cache" + ) + args = parser.parse_args() + + ensure_data(args.data_dir) + args.output_dir.mkdir(parents=True, exist_ok=True) + args.cache_dir.mkdir(parents=True, exist_ok=True) + os.environ.setdefault("HF_HOME", str(args.cache_dir.resolve())) + + torch.manual_seed(20260912) + np.random.seed(20260912) + model = SentenceTransformer(MODEL_ID, revision=MODEL_REVISION) + model.eval() + parameter_count = sum(parameter.numel() for parameter in model.parameters()) + + datasets = [load_clinc(args.data_dir), load_banking(args.data_dir)] + query_embeddings: dict[str, np.ndarray] = {} + for split in datasets: + groups = { + "validation": [text for text, _ in split.validation], + "test": [text for text, _ in split.test], + "ood_validation": split.ood_validation, + "ood_test": split.ood_test, + } + for group_name, texts in groups.items(): + if texts: + query_embeddings[f"{split.name}:{group_name}"] = model.encode( + texts, + batch_size=128, + normalize_embeddings=True, + convert_to_numpy=True, + show_progress_bar=False, + ) + + started = time.time() + dataset_results = [ + evaluate_dataset(model, split, query_embeddings) for split in datasets + ] + latency = benchmark_latency(model, datasets[0], seed=SEEDS[0]) + elapsed = time.time() - started + + results: dict[str, Any] = { + "experiment": "FlowRoute public-data benchmark", + "model": { + "id": MODEL_ID, + "revision": MODEL_REVISION, + "parameters": parameter_count, + }, + "method": { + "seeds": list(SEEDS), + "example_counts": list(EXAMPLE_COUNTS), + "alpha_grid": list(ALPHAS), + "selection": ( + "alpha and route thresholds selected on validation data only; both validation " + "risk constraints use upper endpoints of two-sided 95% Wilson intervals" + ), + }, + "datasets": dataset_results, + "latency": latency, + "environment": { + "python": platform.python_version(), + "platform": platform.platform(), + "cpu": cpu_model_name(), + "torch": torch.__version__, + "numpy": np.__version__, + "scikit_learn": sklearn.__version__, + "sentence_transformers": __import__("sentence_transformers").__version__, + }, + "data": { + filename: { + "url": metadata["url"], + "sha256": sha256(args.data_dir / filename), + } + for filename, metadata in DATASETS.items() + }, + "evaluation_seconds_excluding_initial_query_encoding": elapsed, + } + result_path = args.output_dir / "benchmark_results.json" + result_path.write_text( + json.dumps(results, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + write_summary_csv(results, args.output_dir / "ranking_summary.csv") + print(f"Wrote {result_path}") + for dataset in dataset_results: + dense = dataset["ablation"]["10"] + print( + f"{dataset['dataset']}: " + f"top-1={dense['top1']['mean']:.4f} +/- {dense['top1']['sd']:.4f}, " + f"R@5={dense['recall_at_5']['mean']:.4f} +/- " + f"{dense['recall_at_5']['sd']:.4f}" + ) + print( + f"CPU latency: median={latency['median_ms']:.2f} ms, " + f"p95={latency['p95_ms']:.2f} ms" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/paper/FlowRoute_Ali_Norouzi.pdf b/paper/FlowRoute_Ali_Norouzi.pdf new file mode 100644 index 0000000000000000000000000000000000000000..56066a46f820f893862399c00870278a921d6bda GIT binary patch literal 156564 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 z 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 z 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 literal 0 HcmV?d00001