Traffic Splitting
Therollout_pct field controls what percentage of requests use learned fusion weights. The rest fall back to static fusion (RRF by default).
Bucketing uses a hash of the
user_id. If no user_id is provided in the query, the request always uses static fusion regardless of rollout_pct.Live rollout override
rollout_pct in learning_config is the durable setting. To ramp rollout up or down without editing the retriever config — for a gradual canary, or to dial back instantly during an incident — set a live override:
rollout_pct: 100 clears the override so the configured value applies again. In the Studio, the Learning tab → Rollout Controls slider drives this endpoint. The learned-fusion/stats response reports the rollout_pct actually in effect plus a rollout_override flag and the underlying config_rollout_pct.
Shadow Mode
Shadow mode computes learned fusion weights and logs what the results would have been, but serves static fusion results to the user. This lets you evaluate the quality of learned fusion before it affects real users.- Both fusion strategies execute in parallel
- Static fusion results are served to the user
- Learned fusion weights and re-ranked results are logged as
shadow_executionmetadata - The evaluation system can compare shadow vs. served results offline
learned_fusion_context field (when shadow mode is active) so you can inspect what weights would have been used:
Kill Switch
Instantly disable learned fusion for all users on a retriever:rollout_pct. All requests fall back to static fusion within the next request cycle. Re-enabling removes the kill-switch key, restoring the previous rollout percentage.
To re-enable:
learning_config and accumulated user weights remain intact, ready to resume when re-enabled.
Per-User Opt-Out
Exclude a specific user from learned fusion. Their requests will always use static fusion regardless ofrollout_pct.
- Internal test accounts that would skew weights
- Users who reported unexpected result changes
- Debugging — isolate a user to static fusion while investigating
Preference Reset
Delete all learned personalization for a specific user, returning them to global-level weights:- Flushes their session cache entries
- Marks pre-reset interactions so the aggregation query ignores them
- Returns the user to global fallback weights immediately
Weight Bounds
Even with strong personalization data, individual feature weights are clamped to prevent degenerate rankings:| Setting | Default | Effect |
|---|---|---|
min_weight | 0.05 | No feature drops below 5% weight — it always contributes something to results |
max_weight | 0.95 | No feature exceeds 95% weight — a single feature cannot completely dominate |
[min_weight, max_weight] and re-normalized to sum to 1.0. This means even a user with extreme interaction patterns will always see results influenced by all configured features.
Circuit Breaker
If learned fusion weight resolution takes too long (due to ClickHouse latency, Redis issues, or high load), the system automatically falls back to static fusion for that individual request:circuit_breaker_timeout_ms field in learning_config (range 1–30000ms).
The circuit breaker is per-request, not per-retriever. A single slow request does not disable learned fusion for everyone. The response’s learned_fusion_context metadata indicates when a fallback occurred:
context_level of "none" with circuit_breaker_triggered: true indicates the circuit breaker fired and uniform priors were used. The weight_resolution_ms field shows the actual resolution time. Monitor the mxp_learned_fusion_circuit_breaker_total Prometheus metric to detect systemic latency issues.
Recommended Rollout Plan
Shadow mode (1-2 weeks)
Enable
shadow_mode: true with rollout_pct: 100. All users get static results, but learned fusion runs in parallel and logs what it would have returned.Check: Run evaluations comparing shadow vs. served results. Learned fusion NDCG should be equal to or better than static.1% canary (1 week)
Set
shadow_mode: false, rollout_pct: 1.0. A small fraction of users get learned fusion.Check: Monitor click-through rates and circuit breaker triggers. No degradation vs. control group.10% ramp (1 week)
Set
rollout_pct: 10.0. Enough traffic to produce statistically significant comparisons.Check: Run a benchmark comparing learned vs. static. Expect learned fusion to show improvement for users with sufficient interaction history.50% ramp (1 week)
Set
rollout_pct: 50.0. Half of users get personalized results.Check: Monitor weight distributions across users. Look for convergence patterns (weights stabilizing) rather than oscillation.- Use the kill switch for immediate revert
- Investigate using the
/learned-fusion/weights/{user_id}endpoint to inspect specific users - Check whether the issue is global (bad reward map) or user-specific (outlier behavior)
- Adjust the
learning_configand restart from the previous step
Python SDK
All rollout controls are available via the Python SDK:Related
- Auto-Tune — overview of the full feedback loop
- Reward Signals — tuning how interactions influence weights
- Evaluations — measuring retrieval quality

