Skip to main content
When a user interacts with a search result, that interaction carries a reward value that adjusts the learned fusion weights. A purchase is a stronger signal than a click; negative feedback is a penalty. The reward map controls these magnitudes.

Default Reward Map

If you do not provide a custom reward_map in learning_config, the system uses these defaults: Interaction types not listed in the reward map contribute a reward of 0.0 — they are recorded but do not influence fusion weights.

Custom Reward Maps

Override the defaults by setting reward_map in learning_config:
When you provide a custom reward_map, it replaces the defaults entirely. Only interaction types present in your map will influence fusion weights. Include every type you want to count.
The reward value is computed at interaction-write time and stored as reward_value in the interaction metadata. When an interaction has multiple types, the reward with the largest absolute value is used (not summed). For example, ['click', 'purchase'] yields 3.0 (the purchase reward), not 4.0. This means changing the reward_map only affects future interactions — previously recorded interactions retain their original reward values.

Negative Signals

Negative rewards (negative_feedback, skip, return_to_results) penalize the feature that surfaced the result. Mechanically, a negative reward increments the Beta distribution’s beta parameter, making it less likely that the associated feature receives high weight in future queries:
Negative signals should generally have smaller absolute values than positive signals. A single negative_feedback: -5.0 would outweigh five click: 1.0 interactions, which can cause rapid weight swings. Start conservative and tune based on evaluation results.

Position Bias

Results shown at position 0 get clicked more often than results at position 10, regardless of relevance. This is position bias — a well-known problem in learning-to-rank systems. Auto-Tune records the position field on every interaction for analytics and audit purposes. However, the current reward computation does not weight interactions by position — a click at position 8 receives the same reward value as a click at position 0. Position bias correction is a planned enhancement but is not yet implemented.
Include position when posting interactions. Although position does not currently affect reward computation, it is stored alongside each interaction for future position-aware modeling and for your own analytics. Recording it now means you won’t need to backfill when position-based weighting is added.

Temporal Decay

User preferences change over time. Auto-Tune applies exponential decay to older interactions so that recent behavior matters more:
Configure via learning_config:
Interactions older than decay_window_days are ignored entirely (not just decayed to near-zero, but excluded from the aggregation query).

Backfilling historical interactions

By default the server timestamps each interaction at the moment it’s recorded. If you’re migrating existing click/purchase logs into Mixpeek, pass occurred_at (ISO 8601) so temporal decay weights each interaction by its true age instead of treating everything as brand-new:
Python SDK
Omit occurred_at for live interactions — the server stamps “now”. A naive datetime is interpreted as UTC, and a future value is clamped to now. Backfilled events (with occurred_at) bypass the real-time within-session cache so historical data can’t pollute live, in-session adaptation.
For large histories, send interactions in bulk (1–1000 per call) instead of one request each:
Python SDK
REST
Each row is enriched (reward value, feature/context promotion) exactly like a single create; one bad row doesn’t sink the batch (it’s reported in errors). The response now also includes per-item results with assigned interaction_ids.
The private API uses feature_id while published (public) retrievers use document_id — they refer to the same field. Use whichever matches the endpoint you’re calling.

Examples

E-commerce: purchases matter most

A user who purchases products found via text search will see their text feature weight increase faster than a user who only clicks.

Content platform: engagement over clicks

Clicks are downweighted relative to deep engagement (long views, shares). Skips are penalized more heavily — a result shown but ignored is a stronger negative signal than a mere absence of clicks.

Internal search: explicit feedback only

Only explicit thumbs up/down influence weights. Clicks and views are ignored. No temporal decay — in an internal tool, preferences tend to be stable. Higher min_interactions threshold because explicit feedback is sparse.