Skip to main content

Overview

KaireonAI’s adaptive learning system learns from every customer interaction to predict which offers each customer is most likely to engage with. Unlike batch-only ML systems, KaireonAI updates propensity estimates in real time — every impression, click, conversion, and dismissal immediately improves future recommendations. The system uses a hierarchical architecture that shares learning across offers, categories, and channels while maintaining per-offer specialization.

How It Works

Default Propensity

New offers start with a default propensity of 0.5 — a neutral score that neither favors nor penalizes the offer. As evidence accumulates, the learned propensity replaces the default.

Evidence Blending

When an offer has some evidence but below the maturity threshold (50 interactions), the system blends offer-level data with its strongest available broader-scope prior (the first of channel → direction → category → global that has evidence):
smoothingWeight defaults to 10. This gives new offers a warm start from the closest broader cell’s average performance, rather than starting cold.

Maturity Levels

PRIE Scoring Formula

KaireonAI uses a weighted geometric mean of four factors to produce a final priority score:
Weights must sum to 1.0. The geometric mean ensures:
  • A zero in any dimension eliminates the candidate (0^x = 0)
  • Default propensity (0.5) produces a baseline score of ~0.5
  • Each factor contributes proportionally to its weight

Weight Profiles

Configure PRIE weights on the Score node or via a Strategy Profile:
Propensity-heavy (P=0.8, R=0.05, I=0.1, E=0.05): Model-driven — offers the AI predicts will perform best dominate. Emphasis-heavy (P=0.1, R=0.1, I=0.1, E=0.7): Marketer-driven — offer priority determines ranking. Impact-heavy (P=0.1, R=0.1, I=0.7, E=0.1): Revenue-driven — highest business value offers surface first.

Ranking Profile Weight Mapping

When using a Ranking Profile, the weights JSON maps to PRIE as follows:

Model Adaptation Table

Per-offer learning is stored in the model_adaptations table — not as a JSON blob, but as independent rows that support atomic concurrent updates: Each (modelId, scope, scopeId) combination gets its own row, updated atomically via INSERT ON CONFLICT UPDATE.

Model isolation — adaptations credit the model that decided

Adaptation rows are written for exactly one model per outcome: the model that produced the decision. When /respond records an outcome, the target model is resolved from the delivery row’s recorded modelId (stamped by /recommend when a model scored the candidate). When no delivery row for the (customer, offer) carries a model attribution, no adaptation rows are written — the outcome is recorded but no model’s propensity cells move. The outcome is never fanned out to every active model, so one model’s outcome stream cannot flatten another model’s cold-start scoring through shared global/direction cells. The decision-time read is symmetric: scoring reads adaptations for the flow’s primary model only. (This isolation applies to the adaptation rows in this table. Per-outcome incremental model-state updates for bayesian / thompson_bandit / epsilon_greedy / online_learner models are a separate mechanism and apply to every active incremental-type model.)

Cold-Start Prior Seeding

New offers no longer start from a flat prior. When an offer is created with a category, KaireonAI seeds an offer-scope Model Adaptation per model from same-category neighbor offers:
  • Neighbors must have real offer-scope evidence (≥ 20 outcomes)
  • The seeded rate is the evidence-weighted mean of neighbor positive rates
  • Seeding writes 10 pseudo-observations — enough to nudge early scoring toward category reality, small enough to wash out quickly as real /respond outcomes arrive
  • Existing adaptations with real evidence are never overwritten
  • Seeding is fire-and-forget: a failure never blocks offer creation
  • The maturity ramp is unaffected — exposure gating still keys off real interaction counts

Evidence Decay

To prevent stale historical patterns from dominating, the system applies exponential evidence decay daily:
  • Decay rate: 0.5% per day (evidence halves in ~139 days)
  • Applied by: GET /api/v1/cron/scheduled-retrains (cron job)
  • Effect: Recent interactions matter more than old ones

Predictor Auto-Activation

During batch training, each predictor’s univariate AUC is computed: Predictor AUCs are stored in the global adaptation row and surfaced in the model detail API.

Reset & Pause

Reset Offer Learning

When an offer was misconfigured (wrong QR rules, wrong audience), reset its learned state:
Options for resetTo:
  • category_prior — Fall back to category average (recommended)
  • global_prior — Fall back to tenant-wide average
  • zero — Full cold start (0.5 default)

Pause Learning

Freeze learning for an offer while investigating:
Resume with "action": "resume".

Reset Category

Reset all offers in a category:

Scheduled Retraining

The cron endpoint GET /api/v1/cron/scheduled-retrains handles:
  1. Schedule-based retraining: Models with learnSchedule (e.g., “1h”, “24h”, “7d”) are retrained when the interval elapses
  2. Evidence-based retraining: Models are retrained when 100+ new outcomes accumulate, regardless of schedule
  3. Evidence decay: Applied daily to all adaptation rows
Configure per model:

Attribution-Aware Learning

When a conversion outcome has attribution data, the system looks up the attribution credit for the specific offer. This enables weighted learning — an offer that contributed 33% to a conversion gets proportional credit, not full credit. This prevents feedback inversion where offers that appear frequently (high impression count) get disproportionate positive signal from conversions they didn’t actually cause.

Next Steps

Decision Flows

Configure the Score node with PRIE weights and model selection.

Algorithm Models

Create and manage ML models for propensity scoring.