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:Ranking Profile Weight Mapping
When using a Ranking Profile, theweights JSON maps to PRIE as follows:
Model Adaptation Table
Per-offer learning is stored in themodel_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
/respondoutcomes 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:resetTo:
category_prior— Fall back to category average (recommended)global_prior— Fall back to tenant-wide averagezero— Full cold start (0.5 default)
Pause Learning
Freeze learning for an offer while investigating:"action": "resume".
Reset Category
Reset all offers in a category:Scheduled Retraining
The cron endpointGET /api/v1/cron/scheduled-retrains handles:
- Schedule-based retraining: Models with
learnSchedule(e.g., “1h”, “24h”, “7d”) are retrained when the interval elapses - Evidence-based retraining: Models are retrained when 100+ new outcomes accumulate, regardless of schedule
- Evidence decay: Applied daily to all adaptation rows
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.