项目文件夹

文件
wehub-resource-sync 23f7624596
ADR-166 MCP Bridge Security Lock / Static-source security lock (push) Failing after 0s
ADR-166 MCP Bridge Security Lock / Compose default binds loopback + Mongo has auth (push) Failing after 2s
CodeQL Advanced / Analyze (rust) (push) Failing after 0s
ADR-166 MCP Bridge Security Lock / plugin-agent-federation bindHost default (push) Failing after 1s
ADR-166 MCP Bridge Security Lock / Runtime behavior — 401 + terminal gate + fail-closed (push) Failing after 4s
business-pods-smoke / smoke (push) Failing after 1s
all-plugins-smoke / smoke-all (push) Failing after 2s
CI/CD Pipeline / Security & Code Quality (push) Failing after 1s
CI/CD Pipeline / Test Suite (ubuntu-latest) (push) Failing after 1s
CI/CD Pipeline / Build & Package (macos-latest) (push) Has been skipped
CI/CD Pipeline / Build & Package (ubuntu-latest) (push) Has been skipped
CI/CD Pipeline / Build & Package (windows-latest) (push) Has been skipped
CI/CD Pipeline / Documentation & Examples (push) Failing after 1s
Clone Tracker (14-day rolling) / Snapshot clones for ruflo ecosystem (push) Failing after 1s
CodeQL Advanced / Analyze (actions) (push) Failing after 1s
CodeQL Advanced / Analyze (javascript-typescript) (push) Failing after 1s
federation-peer-rust / stable-noop (push) Failing after 1s
metaharness-ci / score (push) Failing after 1s
metaharness-ci / router-compat (push) Failing after 0s
metaharness-ci / similarity-tests (push) Failing after 0s
no-agentbbs-smoke / smoke-without-agentbbs (push) Failing after 1s
V3 CI/CD Pipeline / Build V3 (windows-latest) (push) Has been skipped
codex-integration-audit / Codex integration audit (push) Failing after 1s
helpers-manifest-guard / guard (push) Failing after 1s
🔗 Cross-Agent Integration Tests / 🤝 Agent Coordination Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / 🧠 Memory Sharing Integration (push) Has been skipped
🔗 Cross-Agent Integration Tests / 🛡️ Fault Tolerance Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / ⚡ Performance Integration Tests (push) Has been skipped
metaharness-ci / mcp-scan (push) Failing after 1s
metaharness-ci / eject-dryrun (push) Failing after 1s
metaharness-ci / metaharness-real-data (push) Failing after 0s
no-cli-optdep-bloat-2561 / guard (push) Failing after 1s
no-metaharness-smoke / smoke-without-metaharness (push) Failing after 1s
no-phantom-agentic-flow-subpath / guard (push) Failing after 1s
🔄 Automated Rollback Manager / 🚨 Failure Detection (push) Failing after 1s
V3 CI/CD Pipeline / Plugin hooks smoke / ubuntu-latest / Node 22 (push) Failing after 1s
V3 CI/CD Pipeline / ruflo-graph-intelligence build + test smoke (#2044, ADR-123) (push) Failing after 1s
CVE Audit Gate / Audit root (critical-blocking) (push) Failing after 2s
cost-tracker-smoke / smoke (push) Failing after 3s
oia-audit-weekly / audit (push) Failing after 2s
ruflo-agent-smoke / ruflo-agent structural smoke (push) Failing after 1s
📊 Status Badges Update / 📊 Update Status Badges (push) Failing after 1s
V3 CI/CD Pipeline / Static regression guards (#2267 YAML + (push) Failing after 1s
V3 CI/CD Pipeline / Test V3 Packages (push) Failing after 0s
V3 CI/CD Pipeline / agent_execute provider routing smoke (#2042) (push) Failing after 0s
CVE Audit Gate / Audit v3 (critical-blocking) (push) Failing after 1s
federation-peer-rust / stable-native (push) Failing after 2s
🔗 Cross-Agent Integration Tests / 🚀 Integration Test Setup (push) Failing after 2s
neural-trader-smoke / runtime-smoke (push) Failing after 1s
V3 CI/CD Pipeline / Build V3 (macos-latest) (push) Has been skipped
V3 CI/CD Pipeline / Build V3 (ubuntu-latest) (push) Has been skipped
V3 CI/CD Pipeline / Type Check V3 (push) Failing after 1s
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / ubuntu-latest / Node 24 (push) Failing after 1s
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / ubuntu-latest / Node 22 (push) Failing after 2s
V3 CI/CD Pipeline / browser rvf create flag smoke (#2015) (push) Failing after 0s
V3 CI/CD Pipeline / Dependency review (#2046) (push) Has been skipped
V3 CI/CD Pipeline / Supply-chain audit (#2046) (push) Failing after 0s
V3 CI/CD Pipeline / witness marker drift smoke (#2021) (push) Failing after 1s
V3 CI/CD Pipeline / neural-trader portfolio CG smoke (#2068, ADR-126 Phase 3) (push) Failing after 1s
V3 CI/CD Pipeline / neural-trader backtest signing smoke (#2068, ADR-126 Phase 4) (push) Failing after 1s
V3 CI/CD Pipeline / kg-extract type-import classification smoke (#2049) (push) Failing after 0s
V3 CI/CD Pipeline / witness verify precondition smoke (#1880) (push) Failing after 2s
V3 CI/CD Pipeline / neural-trader pipeline risk-gate smoke (#2068, ADR-126 Phase 5) (push) Failing after 0s
V3 CI/CD Pipeline / neural-trader feature attribution smoke (#2068, ADR-126 Phase 6) (push) Failing after 0s
V3 CI/CD Pipeline / plugin-registry signature verification smoke (#1922, CWE-347) (push) Failing after 4s
V3 CI/CD Pipeline / memory stats legacy-DB smoke (#2120) (push) Failing after 4s
V3 CI/CD Pipeline / github deprecated actions smoke (#2089, ADR-127 Phase 3) (push) Failing after 1s
V3 CI/CD Pipeline / graph query + pathfinder smoke (ADR-130 P2+P5) (push) Has been skipped
V3 CI/CD Pipeline / graph trajectory hooks smoke (ADR-130 P3) (push) Has been skipped
V3 CI/CD Pipeline / graph plugin adapter smoke (ADR-130 P4) (push) Has been skipped
V3 CI/CD Pipeline / graph benchmark (ADR-130 P6) (push) Has been skipped
V3 CI/CD Pipeline / statusline generator delegation smoke (#2195) (push) Failing after 1s
V3 CI/CD Pipeline / wizard init regression guard (#2206 (push) Failing after 1s
V3 CI/CD Pipeline / memory no-stray-db smoke (ADR-125 P7) (push) Failing after 1s
V3 CI/CD Pipeline / github-safe injection smoke (#2089, ADR-127 Phase 1) (push) Failing after 1s
V3 CI/CD Pipeline / github actions pin smoke (#2089, ADR-127 Phase 1) (push) Failing after 1s
V3 CI/CD Pipeline / github attribution opt-in smoke (#2089, ADR-127 Phase 4) (push) Failing after 1s
V3 CI/CD Pipeline / pre-bash hook safety smoke (#2017) (push) Failing after 1s
V3 CI/CD Pipeline / Memory import smoke / ubuntu-latest (push) Failing after 0s
V3 CI/CD Pipeline / MCP protocol smoke / ubuntu-latest (push) Failing after 2s
V3 CI/CD Pipeline / ruvllm WASM auto-init smoke (#2086) (push) Failing after 4s
V3 CI/CD Pipeline / MCP paired-tool round-trip smoke (#1889) (push) Failing after 1s
V3 CI/CD Pipeline / Plugin package install-safety (#1902/#1903/#1904) (push) Failing after 1s
V3 CI/CD Pipeline / Tool description discoverability (ADR-112) (push) Failing after 3s
V3 CI/CD Pipeline / CLI npx-install smoke (#1147 / (22) (push) Failing after 1s
V3 CI/CD Pipeline / CLI npx-install smoke (#1147 / (24) (push) Failing after 1s
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / ubuntu-latest (push) Failing after 2s
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / ubuntu-latest (push) Failing after 1s
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / ubuntu-latest (push) Failing after 1s
V3 CI/CD Pipeline / Vector-index dimension audit (#1947) (push) Failing after 0s
V3 CI/CD Pipeline / Hook-command install safety (#1921) (push) Failing after 1s
V3 CI/CD Pipeline / ToolOutputGuardrail smoke (ADR-131, (push) Failing after 1s
V3 CI/CD Pipeline / init-bundle invariants smoke (#2095, ADR-128 Phase 5) (push) Failing after 1s
V3 CI/CD Pipeline / wasm provider bridge smoke (ADR-129 P1) (push) Failing after 2s
V3 CI/CD Pipeline / wasm gallery CRUD smoke (ADR-129 P3) (push) Failing after 1s
V3 CI/CD Pipeline / wasm plugin bridge smoke (ADR-129 P4) (push) Failing after 0s
V3 CI/CD Pipeline / wasm compose smoke (ADR-129 P2) (push) Failing after 4s
V3 CI/CD Pipeline / graph schema smoke (ADR-130 P1) (push) Failing after 0s
Validate Marketplace / validate (push) Failing after 1s
🔍 Verification Pipeline / 🚀 Setup Verification (push) Failing after 1s
🔍 Verification Pipeline / 🛡️ Security Verification (push) Has been skipped
🔍 Verification Pipeline / 📝 Code Quality (push) Has been skipped
🔍 Verification Pipeline / 🧪 Test Verification (${{ matrix.os }}, Node ${{ matrix.node }}) (push) Has been skipped
🔍 Verification Pipeline / 🏗️ Build Verification (push) Has been skipped
🔍 Verification Pipeline / 📚 Documentation Verification (push) Has been skipped
CVE Audit Gate / High-severity report (warn only) (push) Has been cancelled
🔄 Automated Rollback Manager / 🔄 Execute Rollback (push) Has been cancelled
🔄 Automated Rollback Manager / ✅ Post-Rollback Verification (push) Has been cancelled
🔄 Automated Rollback Manager / 📊 Rollback Monitoring (push) Has been cancelled
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / windows-latest (push) Has been cancelled
🔄 Automated Rollback Manager / ⏳ Manual Rollback Approval (push) Has been cancelled
V3 CI/CD Pipeline / MCP protocol smoke / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Memory import smoke / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / ubuntu-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Publish to npm (alpha) (push) Has been cancelled
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / macos-latest / Node 22 (push) Has been cancelled
V3 CI/CD Pipeline / Plugin hooks smoke / macos-latest / Node 22 (push) Has been cancelled
CI/CD Pipeline / Deploy & Release (push) Has been cancelled
CI/CD Pipeline / CI Status (push) Has been cancelled
🔗 Cross-Agent Integration Tests / 📊 Integration Test Report (push) Has been cancelled
🔄 Automated Rollback Manager / 🔍 Pre-Rollback Validation (push) Has been cancelled
🔍 Verification Pipeline / ⚡ Performance Verification (push) Has been cancelled
🔍 Verification Pipeline / 📊 Verification Report (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:02:19 +08:00

262 行
15 KiB
Markdown

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# BEIR Public-Benchmark Results — ruflo
This page tracks ruflo's measured retrieval performance on BEIR datasets.
Every cell is reproducible from the commands in the rightmost column;
every cell has a run JSON in `docs/benchmarks/runs/`. Published baseline
numbers come from Thakur et al. 2021 (BEIR paper) and the BAAI BGE paper.
## Result Matrix
> Numbers from `docs/benchmarks/runs/beir-{dataset}-bge-latest.json`. ADR-085
> (harness + BGE swap) + ADR-086 (significance testing).
| Dataset | Corpus | Test Q | Pipeline | Model | nDCG@10 | 95% CI | vs BM25 (CI verdict) | vs Best Listed Baseline | Rank | Latency | Run JSON |
|---|---:|---:|---|---|---:|---|---|---:|---:|---:|---|
| **NFCorpus** | 3,633 | 323 | direct dense (no rerank) | BGE-base-en-v1.5 (110M) | **0.352** | [0.317, 0.387] | +0.027 ↑ (n.s.) | -0.028 ↓ BGE-large 0.380 (n.s.) | **2/11** | 388 ms | `beir-nfcorpus-bge-latest.json` |
| **NFCorpus** | 3,633 | 323 | pure BM25 (silent hash-fallback path) | _no real dense_ | 0.289 | _n/a_ | -0.036 ↓ | -0.091 ↓ | 11/11 | 950 ms | `beir-nfcorpus-2026-05-30T19-16-23-024Z.json` |
| **SciFact** | 5,183 | 300 | direct dense (no rerank) | BGE-base-en-v1.5 (110M) | 0.626 | [0.577, 0.672] | **-0.053 ↓ (p<0.05)** | -0.096 ↓ BGE-large 0.722 (p<0.05) | 10/11 | 410 ms | `beir-scifact-bge-latest.json` |
### Bootstrap CI summary (per ADR-086, 10k resamples, seed=42)
The 95% confidence intervals tell the rigorous story. On NFCorpus, we beat BM25 by 0.027 *point estimate* but the CI overlaps the baseline (n.s. at p<0.05) — the "rank-2" headline is a single-realisation outcome, not a statistically distinguishable win. On SciFact, we lose to BM25 by 0.053 and the CI **excludes** the baseline (significant at p<0.05) — that loss is real, not noise.
### Two-dataset mean (rough generalisation gauge)
| System | NFCorpus | SciFact | Mean |
|---|---:|---:|---:|
| BGE-large-v1.5 (published) | 0.380 | 0.722 | 0.551 |
| SPLADE++ | 0.347 | 0.704 | 0.526 |
| BM25 (Lucene published) | 0.325 | 0.679 | 0.502 |
| **ruflo + BGE-base (direct dense, no rerank)** | **0.352** | **0.626** | **0.489** |
| **ruflo + BM25+BGE-base RRF k=60 (3.10.27, did NOT improve)** | 0.328 | 0.569 | 0.449 |
**We're below BM25 on the 2-dataset mean** (0.489 vs 0.502). RRF made it worse (0.449). The BEIR-average story requires more datasets *and* domain-specific tuning. The NFCorpus rank-2 is real but not representative.
### ADR-087 RRF ablation (3.10.27 honest negative result)
Standard BM25+dense RRF k=60 — the textbook "lowest-regret" first move — **degrades nDCG@10 on both datasets** because our multi-field BM25 is weaker than Lucene's (our pure-BM25 NFCorpus = 0.279 vs Lucene 0.325). RRF averages BM25 noise into top-K when one input is materially weaker than the other.
| Config | NFCorpus nDCG@10 | SciFact nDCG@10 | NFCorpus R@100 | SciFact R@100 |
|---|---:|---:|---:|---:|
| dense alone (BGE-base) | **0.352** | **0.626** | 0.305 | 0.828 |
| BM25 alone (ours) | 0.279 | 0.576 | 0.223 | 0.824 |
| **RRF k=60 equal (default)** | 0.328 ↓ | 0.569 ↓ | **0.321 ↑** | **0.951 ↑** |
| RRF k=30 equal | 0.335 ↓ | 0.582 ↓ | 0.321 | 0.954 |
| RRF k=60 dense=1.2, bm25=0.8 | 0.334 ↓ | 0.577 ↓ | 0.324 | 0.961 |
Recall@100 **does** improve (RRF surfaces more candidates) — which makes RRF a useful *first stage* before reranking. Tracked for ADR-088 (cross-encoder rerank).
The default BEIR runner stays at dense-only. RRF is opt-in.
### ADR-088 — Lucene BM25 + cross-encoder rerank (3.10.28) — the pipeline that works
Fixing the BM25 (Porter stemmer + Lucene stopwords + length norm, single-field over title+text) closes the asymmetric-strength problem and makes RRF + cross-encoder rerank produce real wins.
| Configuration | NFCorpus | SciFact | Mean | Notes |
|---|---:|---:|---:|---|
| dense alone (BGE-base) | 0.352 | 0.626 | 0.489 | baseline |
| **Lucene BM25 alone** | 0.328 | 0.681 | **0.505** | matches published baseline (0.325 / 0.679) |
| Lucene RRF k=30 (no CE) | **0.363** | 0.639 | 0.501 | RRF works once BM25 is strong |
| Multi-field RRF + CE rerank | 0.355 | 0.685 | 0.520 | rerank rescues weak BM25 |
| **Lucene RRF + CE rerank (best)** | **0.358** | **0.683** | **0.521** | rank 2 NFCorpus, rank 3 SciFact |
**Acceptance test PASSES** with Lucene RRF + CE rerank: beats published BM25 on both datasets (+0.033 NFCorpus, +0.004 SciFact). Mean 0.521 beats every listed BEIR baseline except SPLADE++ (0.526) and BGE-large (0.551).
### Final two-dataset means leaderboard
| System | Params | Mean nDCG@10 | NFCorpus | SciFact |
|---|---:|---:|---:|---:|
| BGE-large-v1.5 (published) | 335M | **0.551** | 0.380 | 0.722 |
| SPLADE++ (published) | 110M | **0.526** | 0.347 | 0.704 |
| **ruflo Lucene RRF + CE rerank (3.10.28)** | **110M** | **0.521** | **0.358** | **0.683** |
| ruflo multi-field RRF + CE rerank | 110M | 0.520 | 0.355 | 0.685 |
| ruflo Lucene BM25 alone | — | 0.505 | 0.328 | 0.681 |
| BM25 (published Lucene) | — | 0.502 | 0.325 | 0.679 |
| Contriever (published) | 110M | 0.502 | 0.328 | 0.677 |
| DocT5query (published) | 60M | 0.501 | 0.328 | 0.675 |
| ColBERT (published) | 110M | 0.488 | 0.305 | 0.671 |
| GTR-XL (published) | 1.2B | 0.502 | 0.343 | 0.662 |
| ruflo dense alone (BGE-base) | 110M | 0.489 | 0.352 | 0.626 |
| TAS-B (published) | 66M | 0.481 | 0.319 | 0.643 |
| SBERT msmarco (published) | 110M | 0.414 | 0.272 | 0.555 |
We rank **3rd of 13 entries on the 2-dataset mean**. Using a 110M-param base model (vs BGE-large's 335M and GTR-XL's 1.2B).
### ADR-089 — 3-dataset BEIR (3.10.29)
ArguAna joins NFCorpus + SciFact. Same harness, same Lucene-style BM25, same BGE-base-en-v1.5.
| Dataset | Best ruflo | Pipeline | Rank | Best Listed |
|---|---:|---|---:|---:|
| NFCorpus | **0.358** | Lucene + RRF + CE rerank | 2/11 | BGE-large 0.380 |
| SciFact | **0.683** | Lucene + RRF + CE rerank | 3/11 | BGE-large 0.722 |
| ArguAna | **0.432** | Lucene + RRF (CE rerank hurt) | 5/11 | BGE-large 0.636 |
| **3-dataset mean** | **0.491** | mixed | — | BGE-large 0.579 |
### 3-dataset means vs every listed baseline
| System | Params | NFCorpus | SciFact | ArguAna | Mean |
|---|---:|---:|---:|---:|---:|
| BGE-large-v1.5 (published) | 335M | 0.380 | 0.722 | 0.636 | **0.579** |
| SPLADE++ (published) | 110M | 0.347 | 0.704 | 0.521 | **0.524** |
| GenQ (published) | 110M | 0.319 | 0.644 | 0.493 | 0.485 |
| **ruflo best (per-dataset)** | **110M** | **0.358** | **0.683** | **0.432** | **0.491** |
| GTR-XL (published) | 1.2B | 0.343 | 0.662 | 0.439 | 0.481 |
| BM25 (published Lucene) | — | 0.325 | 0.679 | 0.397 | **0.467** |
| Contriever (published) | 110M | 0.328 | 0.677 | 0.379 | 0.461 |
| TAS-B (published) | 66M | 0.319 | 0.643 | 0.429 | 0.464 |
| ColBERT (published) | 110M | 0.305 | 0.671 | 0.233 | 0.403 |
| SBERT msmarco (published) | 110M | 0.272 | 0.555 | 0.371 | 0.399 |
**Rank 4 of 11 entries on the 3-dataset mean.** Beats published BM25 (+0.024), beats GTR-XL (with 1/10× our params), beats Contriever, TAS-B, ColBERT, SBERT. Loses to SPLADE++ (-0.033), GenQ (-0.006, basically tied), and BGE-large (-0.088).
### Counter-findings honestly reported
**ArguAna kills the cross-encoder rerank.** Pulled at the 50-query checkpoint (running nDCG 0.283 vs dense alone 0.431). Estimated 6+ hours wall time and was actively hurting. ArguAna is counter-argument retrieval — rerank's pointwise relevance scoring doesn't help when the task requires understanding opposition.
**BGE-large NFCorpus = no lift.** Xenova/bge-large-en-v1.5 (335M, int8 quantized) measured 0.350 vs our BGE-base 0.352 — no improvement. Below the published BAAI BGE-large baseline (0.380). Likely Xenova int8 quantization + no query prefix. ADR-089.
**BGE query prefix is mixed.** Per BAAI's docs (`Represent this sentence for searching relevant passages: `): NFCorpus +0.009 ✓, SciFact -0.007 ✗, ArguAna +0.003 ~noise. Opt-in only via `BGE_QUERY_PREFIX=1`. ADR-090.
### ADR-091 — 4-dataset BEIR (3.10.30): SciDocs joins, dense alone wins it
Same harness extended to SciDocs (25,657 docs, 1000 queries). Different best config:
| Dataset | Best ruflo | Pipeline | Rank |
|---|---:|---|---:|
| NFCorpus | 0.358 | Lucene + RRF + CE rerank | 2/11 |
| SciFact | 0.683 | Lucene + RRF + CE rerank | 3/11 |
| ArguAna | 0.432 | Lucene + RRF (CE rerank hurt) | 5/11 |
| **SciDocs** | **0.211** | **dense alone (RRF hurt by 0.008)** | **2/11** |
| **4-dataset mean** | **0.421** | mixed | — |
### 4-dataset means — final leaderboard
| System | Params | NFCorpus | SciFact | ArguAna | SciDocs | Mean |
|---|---:|---:|---:|---:|---:|---:|
| BGE-large-v1.5 (published) | 335M | 0.380 | 0.722 | 0.636 | 0.225 | **0.491** |
| SPLADE++ (published) | 110M | 0.347 | 0.704 | 0.521 | 0.159 | **0.433** |
| **ruflo best (per-dataset)** | **110M** | **0.358** | **0.683** | **0.432** | **0.211** | **0.421** |
| GTR-XL (published) | 1.2B | 0.343 | 0.662 | 0.439 | 0.174 | 0.405 |
| GenQ (published) | 110M | 0.319 | 0.644 | 0.493 | 0.143 | 0.400 |
| BM25 (published Lucene) | — | 0.325 | 0.679 | 0.397 | 0.158 | **0.390** |
| Contriever (published) | 110M | 0.328 | 0.677 | 0.379 | 0.165 | 0.387 |
| TAS-B (published) | 66M | 0.319 | 0.643 | 0.429 | 0.149 | 0.385 |
| DocT5query (published) | 60M | 0.328 | 0.675 | 0.349 | 0.162 | 0.378 |
| ColBERT (published) | 110M | 0.305 | 0.671 | 0.233 | 0.145 | 0.339 |
| SBERT msmarco (published) | 110M | 0.272 | 0.555 | 0.371 | 0.122 | 0.330 |
**Rank 3 of 11 on 4-dataset mean.** Beats every published baseline except SPLADE++ (-0.012) and BGE-large (-0.070, mostly the ArguAna gap). Using a 110M-param base — beats GTR-XL's 1.2B (+0.016, 1/10× the params).
### Third config-specific finding (SciDocs adds to the pattern)
| Dataset | Best config | What hurts |
|---|---|---|
| NFCorpus | Lucene+RRF+CE | nothing — full pipeline wins |
| SciFact | Lucene+RRF+CE | CE rerank wins, but Lucene BM25 alone is competitive (0.681) |
| ArguAna | Lucene+RRF (no CE) | CE rerank actively hurts (0.283 at 50q vs 0.432 RRF) |
| **SciDocs** | **dense alone** | **RRF hurt by 0.008 (0.211 → 0.203)** |
Three of four datasets pick a *different* best config. No single pipeline wins everywhere. Auto-selecting per-dataset would require a calibration step we don't have. Until then, callers should A/B their corpus.
> **What pipeline is reported here:** the NFCorpus 0.352 row is the **direct
> BGE dense path** — no fine-tuning, no hybrid BM25+dense fusion, no
> cross-encoder reranker. The hybrid pipeline (cosine + multi-field BM25 +
> MMR + opt-in rerank, ADRs 078-083) is what ruflo uses internally for
> small-corpus retrieval; the BEIR runner deliberately isolates the dense
> path for clean comparison to dense baselines. Hybrid + rerank variants on
> BEIR are tracked for a future ADR.
## Published Baselines (for reference)
### NFCorpus nDCG@10 (medical IR, n=323 test queries)
| Method | Params | nDCG@10 | Source |
|---|---:|---:|---|
| BGE-large-v1.5 | 335M | 0.380 | BAAI BGE paper |
| **ruflo + BGE-base-en-v1.5** | **110M** | **0.352** | **this repo** |
| SPLADE++ | 110M | 0.347 | Formal et al. 2022 |
| GTR-XL | 1.2B | 0.343 | Ni et al. 2022 |
| DocT5query | 60M | 0.328 | Nogueira & Lin 2019 |
| Contriever | 110M | 0.328 | Izacard et al. 2022 |
| BM25 (Lucene) | — | 0.325 | Thakur et al. 2021 |
| TAS-B | 66M | 0.319 | Hofstätter et al. 2021 |
| GenQ | 110M | 0.319 | Thakur et al. 2021 |
| ColBERT | 110M | 0.305 | Khattab & Zaharia 2020 |
| SBERT (msmarco) | 110M | 0.272 | Reimers & Gurevych 2019 |
### SciFact nDCG@10 (scientific IR, n=300 test queries)
| Method | nDCG@10 | Source |
|---|---:|---|
| BGE-large-v1.5 | 0.722 | BAAI BGE paper |
| SPLADE++ | 0.704 | Formal et al. 2022 |
| BM25 (Lucene) | 0.679 | Thakur et al. 2021 |
| Contriever | 0.677 | Izacard et al. 2022 |
| DocT5query | 0.675 | Nogueira & Lin 2019 |
| ColBERT | 0.671 | Khattab & Zaharia 2020 |
| GTR-XL | 0.662 | Ni et al. 2022 |
| GenQ | 0.644 | Thakur et al. 2021 |
| TAS-B | 0.643 | Hofstätter et al. 2021 |
| SBERT (msmarco) | 0.555 | Reimers & Gurevych 2019 |
## How to reproduce
```bash
git clone https://github.com/ruvnet/ruflo && cd ruflo
npm install && ( cd v3/@claude-flow/cli && npx tsc )
# NFCorpus
mkdir -p /tmp/beir-nfcorpus && cd /tmp/beir-nfcorpus
curl -sL -o nfcorpus.zip 'https://public.ukp.informatik.tu-darmstadt.de/thakur/BEIR/datasets/nfcorpus.zip' && unzip -q nfcorpus.zip
node /path/to/ruflo/v3/@claude-flow/cli/scripts/run-beir-bge.mjs
# → nDCG@10 0.352, rank 2 of 11
# SciFact
mkdir -p /tmp/beir-scifact && cd /tmp/beir-scifact
curl -sL -o scifact.zip 'https://public.ukp.informatik.tu-darmstadt.de/thakur/BEIR/datasets/scifact.zip' && unzip -q scifact.zip
BEIR_DATA_DIR=/tmp/beir-scifact/scifact node /path/to/ruflo/v3/@claude-flow/cli/scripts/run-beir-bge.mjs
# Paired bootstrap significance test (ADR-086)
node /path/to/ruflo/v3/@claude-flow/cli/scripts/beir-bootstrap-significance.mjs \
/path/to/ruflo/docs/benchmarks/runs/beir-nfcorpus-bge-latest.json
```
## Model size / speed / quality trade-offs
| Model | Params | Embed dim | Cache size (NFCorpus) | Ingest (3,633 docs) | Query latency |
|---|---:|---:|---:|---:|---:|
| `Xenova/bge-small-en-v1.5` | 33M | 384 | ~5.5 MB | ~15 min | ~250 ms |
| `Xenova/bge-base-en-v1.5` | 110M | 768 | ~11 MB | ~25 min | ~330 ms |
| `Xenova/bge-large-en-v1.5` | 335M | 1024 | ~15 MB | ~60 min (est.) | ~700 ms (est.) |
Per-row latency is on Apple Silicon CPU through `@xenova/transformers`
int8-quantised ONNX. GPU would be ~10-50× faster.
## Methodology notes
- **No fine-tuning.** All numbers are zero-shot — we use BAAI's released
BGE models as-is. NFCorpus has a 110K-pair train split that fine-tuning
could exploit for an additional ~0.02-0.05 nDCG lift; not done here.
- **`@xenova/transformers` direct API** (not `pipeline()`) used to bypass
the `sharp`/`libvips` transitive dependency that breaks on
darwin-arm64 (ADR-085 §"sharp-on-darwin-arm64 bug").
- **CLS-token pooling + L2 normalisation** per BAAI's BGE spec; cosine
becomes dot product on normalised vectors.
- **Graded relevance for nDCG** — qrels use 0/1/2 grades; we use
`(2^rel - 1) / log2(i+1)` per BEIR convention.
- **Reproducibility**: `BOOTSTRAP_SEED=42` for the significance test
(mulberry32 PRNG). Run JSONs include full per-query metrics so
external bootstrap-CI checks reproduce exactly.
## Limits & next steps
- **Two-dataset coverage isn't BEIR-average.** BEIR ships 18 datasets;
the published "BEIR average" is the standard generalisation gauge.
Tracking: TREC-COVID, FiQA-2018, ArguAna, HotpotQA, NQ next.
- **Single-annotator labelled retrieval** for internal ruflo bench
(ADR-081); not relevant to BEIR's externally-curated qrels.
- **The 0.005 gap to SPLADE++** (0.352 vs 0.347) is on the edge of noise
at N=323. The paired bootstrap test (ADR-086) gives a confidence
interval; report both point estimate AND CI.