TL;DR
This experiment tests a specific idea: do not ask the AI to produce a number. Ask it to pick one of five plain labels for the month ahead, then let a fixed lookup table and a simple ordering formula do the rest.
Each month, at each tier of a fictional automotive supply chain, gpt-4.1-mini chooses one of {STRONG_INCREASE, MODERATE_INCREASE, NEUTRAL, MODERATE_DECREASE, STRONG_DECREASE}. A fixed table turns that label into a buffer multiplier, and an Order-Up-To formula computes the actual order. The model never produces a number; it only classifies the situation. The label interface was completely reliable — and every condition still amplified the bullwhip well above the baseline.
What was tested
The problem is not ordering once. It is ordering repeatedly.
The bullwhip effect is what happens when small changes in customer demand become larger and larger order swings as they travel upstream through a supply chain. A retailer sees a bump in demand, the manufacturer orders extra to avoid a shortage, the component supplier sees that larger order and reacts again. By the time the signal reaches the top of the chain, a modest demand change can look like a crisis.
I measure that with OVAR, the Order Variance Amplification Ratio: how wildly orders swing compared with how wildly customer demand actually swings. An OVAR of 1 means orders are as steady as demand. Above 1 means the ordering is amplifying the swing. Lower is better.
An earlier experiment in this series (V3b) had let the model output a continuous number — a safety-stock multiplier — and the model consistently miscalibrated it. Language models have no intrinsic number line; they produce tokens, not quantities. So the design here removes the number entirely. If calibrating a float is the problem, replace the float with a multiple-choice label and let hard-coded software do the arithmetic. This is the intermediate V4a variant; the design it established was then carried forward into the V4b WorldEvents experiment, which is the primary V4 result.
Design and configuration
| What the AI does | Each month, at each tier, the AI picks one of five labels describing the demand direction for the month ahead. It does not place the order or produce any number. A fixed lookup table converts the label to a buffer multiplier, and an Order-Up-To formula produces the order. |
| Model tested | gpt-4.1-mini (Azure OpenAI) |
| What the AI was told | Three variants: inventory numbers only (IC-Blind); numbers plus a seasonal calendar and tier persona (IC-Context); numbers plus its own last three months of choices (IC-Stateful). |
| How many runs | 20 runs per AI condition to account for response variability. Fixed baselines run once — they are deterministic. |
| Demand used | 25 months of synthetic demand shaped around Indian automotive patterns — a monsoon slump, a Diwali peak, and a financial year-end surge. No demand shocks or supply disruptions. |
| Supply chain | A fictional 3-tier chain: OEM (Tatva Motors) → ancillary supplier → component maker. Orders placed monthly, lead time fixed at one month across all tiers. |
| Benchmarks | Pure algorithmic baselines with no AI: exponential smoothing (a standard demand-forecasting heuristic) and a hybrid control (the same order formula with the buffer fixed at its base level). |
Results
Numeric results
Read this table with one rule in mind: lower OVAR means less order volatility. A value below 1.0 means the ordering policy is absorbing volatility rather than transmitting it upstream. Exponential smoothing is the reference point.
| Condition | Chain OVAR (n=20) | Stockouts | Intent compliance |
|---|---|---|---|
| exp_smoothing (baseline) | 0.545 | 5 | — |
| hybrid_control (baseline) | 1.710 | 14 | — |
| IC-Blind (gpt-4.1-mini) | 3.843 ± 0.129 | 12.05 ± 0.94 | 1.000 |
| IC-Context (gpt-4.1-mini) | 3.268 ± 0.062 | 15.70 ± 0.80 | 1.000 |
| IC-Stateful (gpt-4.1-mini) | 3.762 ± 0.084 | 12.05 ± 1.15 | 1.000 |
Every AI condition is between roughly 6× and 7× the exponential-smoothing baseline. Full run-level data, per-tier OVAR, and standard deviations are in the GitHub repository.
Key findings
What I found
The label interface was rock-solid. Intent compliance was perfect — 1.000 across every condition and every one of the runs, with zero fallbacks. The model returned one of the five valid labels in clean form every single time, so the system never had to fall back to a default. That was the main design bet, and it held.
- But the AI amplified the bullwhip far more than the plain formula. Every AI condition landed at a chain OVAR between 3.268 ± 0.062 and 3.843 ± 0.129, against the exponential-smoothing baseline of 0.545 — roughly 6 to 7× more order-swing. IC-Blind is about 7× worse; IC-Context, the steadiest AI condition, is about 6× worse. The simple deterministic formula also held fewer stockouts. On the operational metric that matters, exponential smoothing clearly beat the language model here.
- The three information conditions barely moved — the Equaliser Effect. Giving the model the calendar (IC-Context) or its own history (IC-Stateful) changed the OVAR only a little, and not in a way that rescued it. Once you force the decision into a small fixed set of labels mapped to fixed multipliers, you put a ceiling and a floor on how far the outcome can move. The label set, not the model’s cleverness or the information it sees, dominates the result.
- The result is robust, not a small-sample fluke. I first ran 10 repetitions per condition, then doubled it to 20. Across every headline metric — chain OVAR, the per-tier OVAR, stockouts, and compliance — every average moved by less than one standard deviation when I doubled the sample. The n=20 set is the result of record; the n=10 set is kept only so this stability check can be reproduced.
Discussion
Why the labels could not save the orders
The design fixed the right problem and exposed a different one. Removing the number from the model’s output did exactly what it was meant to: compliance went to a perfect 1.000 with no fallbacks. Confining a language model to a small, fixed set of labels is a dependable way to get structured output. That part of the bet paid off.
But the same constraint that made the output reliable also capped the outcome. The five labels map to five fixed multipliers. Whatever the model reasons, the order it ultimately drives can only take one of a handful of values per period. That is the Equaliser Effect: the discrete lookup table creates a structural ceiling and floor on OVAR that no prompt, no extra context, and no memory can escape, because the label-to-multiplier mapping removes the AI’s capacity for fine-grained adjustment.
In this no-disruption seasonal environment, the multipliers the model selected drove the buffer up and down more aggressively than the demand pattern justified, and the orders swung accordingly — well past what exponential smoothing produces by gently averaging recent demand.
Practical implications
What this does and does not show
For this setup, the discrete-label interface is a dependable way to get structured output from a language model, but it did not beat a standard forecasting heuristic at keeping orders steady. The AI amplified the bullwhip about 6 to 7× more than exponential smoothing, and adding context or memory did not close that gap. These are useful, checkable facts about one model and one simulated chain.
This closes the V4a intent-classification line. The architecture it established — classification by the model, arithmetic by the formula — is carried forward into the V4b WorldEvents experiment, which tests the same design under stochastic lead times and world events and is the primary V4 result.
Limitations
The limits are worth stating plainly. I tested a single model (gpt-4.1-mini), a single 25-month synthetic demand series calibrated to Indian automotive seasonality, and a single simplified three-tier chain with a one-month lead time and no demand shocks. The intent-to-multiplier lookup values come from domain logic and are not guaranteed to be optimal. I would not generalise these numbers to other models, other markets, or more complex chains without testing them there.
Code, data, and sources
Full code, data, and result manifests are available on GitHub. View on GitHub →
Methodology note
All scenarios, companies, and products are fictional. The demand series is synthetic, calibrated to Indian automotive seasonal patterns across 25 months, with deterministic one-month lead times and no demand shocks. Results apply to a 3-tier intent-classifier architecture where gpt-4.1-mini selects one of five labels per period and a fixed lookup table maps each label to a buffer multiplier; do not generalise beyond this scope. The n=20 Azure set is the result of record.
Disclaimer
Independent, self-funded personal research by Siddharth Srinivasan. Views are my own and do not represent my employer, any model or service provider, or any third party. The work uses publicly available data or synthetic scenarios; no proprietary employer or customer data is used.