Skip to main content
Interactions capture how users engage with search results—clicks, purchases, skips, dwell time. This feedback automatically improves your retrievers through fine-tuning, personalization, and analytics.
Mixpeek Interactions Flow

Why Track Interactions

Automatic Quality Improvement: User behavior becomes training data for fine-tuning embedding models and ranking algorithms—no manual labeling required. Measure Real Performance: Traditional IR metrics (precision, recall) use test sets. Interactions reveal actual user satisfaction through click-through rates, conversion, and engagement. Personalization at Scale: Build user preference profiles from interaction history to deliver personalized results without managing separate recommendation systems. Identify Blind Spots: Find queries with low engagement, results that users skip despite high rankings, and content gaps causing zero-result queries.

What You Get

Training Data Generation

Interactions format into contrastive pairs (query, clicked_doc) for embedding fine-tuning. Position is recorded for future bias correction.

Relevance Analytics

CTR by position, documents with high skip rates, queries needing tuning, time-to-first-click—all without custom infrastructure.

Result Deduplication

Exclude previously purchased, viewed, or consumed content automatically by filtering on past interactions.

Popularity Boosting

Rerank results based on recent interaction signals (clicks, conversions) to surface trending content.

Capture Interactions

Record user behavior with a single API call:
interaction_type is always a JSON array — even for a single signal (["click"], not "click"). The array captures the co-occurring signals of one user action, not several separate events: a single result that was shown, clicked, and dwelt on is ["view", "click", "long_view"] in one request. Send a separate request per discrete user action (each click, each purchase) — don’t batch unrelated events into one array.

Signal Types

Combine multiple types per event: ["click", "long_view"] when a user clicks and stays engaged.

Signal Strategy

Which signals to capture, when, and why. Not all signals carry equal weight.

Signal Strength Matrix

This table maps each interaction type to how it’s used across the platform:

Use Case Patterns

Primary signals: purchase, add_to_cart, click — conversion is the strongest relevance indicator.Key patterns:
  • Track add_to_cart separately from purchase to measure funnel drop-off
  • Use position for learning-to-rank bias correction
  • Store order_value in metadata for revenue-weighted metrics

Position Tracking

Always capture position. Although position-based reward weighting is not yet implemented, position is stored for analytics and will be used for future position-aware modeling. Recording it now avoids a costly backfill later.
Position bias is a well-known problem — users tend to click higher-ranked results regardless of relevance. The system records position on every interaction for analytics and audit purposes. However, position-based reward weighting is not yet implemented — a click at position 8 currently receives the same reward as a click at position 0. Record position now so you won’t need to backfill when position-aware modeling is added.

Cold Start

When you first deploy you have zero interactions. The system adapts automatically through the hierarchical fallback in Thompson Sampling (personal → demographic → global → uniform prior):

Client-Side Capture

Track clicks and dwell time directly from the browser, using sendBeacon so dwell events survive page unload:

Outcomes & Use Cases

1. Fine-Tune Embedding Models

Outcome: 10-30% improvement in relevance metrics from domain-specific fine-tuning using real user preferences.

2. Identify & Fix Ranking Issues

Outcome: Data-driven decisions on which retrievers need adjustment, which taxonomy mappings to update, or which filters to refine.

3. Personalize Without Recommendation Infrastructure

Outcome: Improved user experience (no duplicate suggestions) without building separate collaborative filtering or recommendation systems.

4. Continuously Tune Ranking from Interactions

Set fusion: "learned" and click/purchase signals automatically re-weight your search over time — no manual reranking rules. Weight higher-intent signals above clicks with the reward_map:
Outcome: click/purchase signals continuously re-tune feature weights via auto-tune — higher-intent interactions carry more weight — with no manual reranking rules. See Reward Signals for the full reward_map.

Query & Export

Retrieve interactions for analysis or external ML pipelines:

Reward Values and Auto-Tune

When a retriever uses Auto-Tune (fusion: "learned"), every interaction automatically receives a computed reward_value stored in its metadata. This value is derived from the retriever’s reward_map configuration at write time:
In this example, the reward is determined by the interaction type with the largest absolute value: purchase (3.0) wins over click (1.0), so reward_value is 3.0 (not summed). The reward value determines how much this interaction shifts the fusion weights for the associated feature. How it feeds into Auto-Tune:
  1. Each interaction records which feature URI surfaced the clicked result
  2. The reward_value adjusts the Thompson Sampling Beta distribution for that feature
  3. Positive rewards increase the feature’s weight; negative rewards decrease it
  4. The next search for this user reflects the updated weights
See Reward Signals for the full default reward map, customization options, and examples for different use cases (e-commerce, content, internal search).

Feature URI

The feature_uri field identifies which embedding model/feature produced the result the user interacted with. This is required for Auto-Tune — without it, the interaction cannot contribute to weight learning because the system doesn’t know which feature to reward.
You can find the feature_uri for each result in the execution response’s learned_fusion_context.feature_uris array, or extract it from the document’s metadata. If feature_uri is set as a top-level field, it is automatically promoted into metadata.feature_uri for backward compatibility.
The session_id field enables within-session adaptation. When provided, clicks in the current session influence the next search immediately via a session cache — without waiting for the ClickHouse write-then-read cycle.

Privacy & Compliance

GDPR Deletion: Remove all interactions for a user to honor right-to-deletion requests.
Anonymization: Hash user_id before sending if you need consistent tracking without PII.

Python SDK

Bulk Backfill

Migrate existing interaction history into Mixpeek using the batch endpoint. Send up to 1,000 interactions per call with occurred_at timestamps so temporal decay weights them by their true age.
The response includes per-item results: {created: 2, failed: 0, results: [{index: 0, interaction_id: "...", status: "created"}, ...]}. Backfilled interactions bypass the real-time session cache — they affect learned fusion weights only after the next ClickHouse aggregation.

Best Practices

  1. Always capture position — recorded for analytics and future position-aware modeling
  2. Store query text in metadata — enables query-document pair export for fine-tuning
  3. Track dwell time — separates genuine engagement (long_view) from accidental clicks
  4. Backfill with timestamps — use the batch endpoint with occurred_at so temporal decay weights by true age
  5. Monitor weekly — set up dashboards to track CTR trends and catch relevance regressions early
See Improve Relevance → Analytics for dashboards and alerting on interaction-driven metrics like CTR, engagement rates, and query quality.