Kostnad, kvoter och prissättning
Kunna sätta kvoter och priser som täcker inferenskostnaden.
Förkunskaper
Intuition
AI-produkter har en kostnadsstruktur som traditionell mjukvara inte har: varje användning kostar pengar.
| Vanlig SaaS | AI-produkt | |
|---|---|---|
| Marginalkostnad per användare | nära noll | betydande |
| Storanvändare | gratis marknadsföring | kan gå med förlust |
| Fast pris per månad | fungerar | farligt utan kvoter |
Det ändrar prissättningen i grunden. En obegränsad plan för 99 kr i månaden fungerar utmärkt tills en användare kör tio tusen anrop per dag.
Tre prismodeller:
| Modell | Fördel | Nackdel |
|---|---|---|
| Fast pris + kvot | förutsägbart för kunden | kvoten måste vara rätt satt |
| Förbrukning | följer kostnaden exakt | oförutsägbart för kunden — många ogillar det |
| Krediter | kombinerar båda | kräver förklaring |
Den första är vanligast i konsumentprodukter, den andra i utvecklarverktyg.
Formellt
Räkna på fördelningen, inte medelvärdet. Användning av AI-produkter är extremt sned: ofta står några få procent av användarna för en stor del av förbrukningen.
Att sätta priset efter genomsnittsanvändaren ger förlust på svansen. Räkna i stället:
| Steg | Fråga |
|---|---|
| 1 | Vad kostar mediananvändaren? |
| 2 | Vad kostar p95-användaren? |
| 3 | Vad kostar den dyraste procenten? |
| 4 | Vilken kvot täcker 95 % av användarna utan att de märker den? |
| 5 | Håller marginalen om alla använder upp kvoten? |
Steg 5 är det kritiska. Kvoten definierar din maximala kostnad per användare, och den måste vara betald av priset. En kvot på 500 anrop à 0,15 kr är 75 kr — ett pris på 99 kr ger då 24 kr i bruttomarginal före allt annat, vilket är för tunt.
Gratisnivån är en marknadsföringskostnad och ska behandlas som en:
| Fråga | Exempel |
|---|---|
| Vad kostar den per användare och månad? | 3 kr |
| Hur många gratisanvändare tål budgeten? | 5 000 → 15 000 kr/mån |
| Vad är konverteringsgraden? | 2 % |
| Vad är anskaffningskostnaden per betalande? | 15 000 / 100 = 150 kr |
Är den sista siffran lägre än vad en betalande kund är värd över tid är gratisnivån lönsam. Annars är den en läcka.
Kvoter är också en säkerhetsmekanism, inte bara ekonomi. Utan tak kan en buggig klient, en loop eller ett missbruk bränna en månadsbudget på en natt. Tre lager behövs:
| Lager | Skyddar mot |
|---|---|
| Per användare och dag | enskilt missbruk |
| Per organisation och månad | budgetöverskridande |
| Global kill-switch | katastrof |
Fem sätt att sänka kostnaden innan man höjer priset:
- Prompt-caching — ofta nära halverad kostnad i RAG-system.
- Mindre modell för rutinsvar, eskalering vid behov.
- Kortare kontext — skicka bara det som behövs.
- Svarscache för återkommande frågor.
- Färre steg i kedjan.
Var öppen med kvoterna. En kvot som användaren inte visste om och slår i mitt i arbetet är en sämre upplevelse än ett något högre pris. Visa förbrukningen löpande.
Kod
import numpy as np
def kostnadsfordelning(anrop_per_anvandare, kr_per_anrop=0.15):
a = np.asarray(anrop_per_anvandare)
kr = a * kr_per_anrop
return {
"median": round(float(np.median(kr)), 2),
"medel": round(float(kr.mean()), 2),
"p95": round(float(np.percentile(kr, 95)), 2),
"p99": round(float(np.percentile(kr, 99)), 2),
"max": round(float(kr.max()), 2),
"andel_fran_topp_5_procent": round(
float(np.sort(kr)[-max(1, len(kr) // 20):].sum() / kr.sum()), 3),
}
# Sned fördelning: några få står för det mesta
rng = np.random.default_rng(0)
anrop = rng.lognormal(mean=3.5, sigma=1.6, size=5000).astype(int)
f = kostnadsfordelning(anrop)
print(f)
def marginal(pris, kvot_anrop, kr_per_anrop=0.15, ovrig_kostnad=8.0):
"""Marginal i värsta fall — alla använder upp kvoten."""
varsta = kvot_anrop * kr_per_anrop + ovrig_kostnad
return {"pris": pris, "kostnad_varsta_fall": round(varsta, 2),
"marginal_varsta_fall": round(pris - varsta, 2),
"marginal_procent": round((pris - varsta) / pris, 3) if pris else 0.0}
for pris, kvot in ((99, 500), (149, 800), (249, 2000)):
print(marginal(pris, kvot))
# {'pris': 99, 'kostnad_varsta_fall': 83.0, 'marginal_varsta_fall': 16.0, ...}
# ↑ 16 % marginal i värsta fall är för tunt
def valj_kvot(anrop_per_anvandare, tackning=0.95):
"""Kvot som 95 % av användarna inte märker av."""
return int(np.percentile(anrop_per_anvandare, tackning * 100))
print("kvot som täcker 95 %:", valj_kvot(anrop))
# Tre lager av skydd
class Budgetvakt:
def __init__(self, dag_per_anvandare, manad_per_org, global_dag):
self.tak = {"anvandare_dag": dag_per_anvandare,
"org_manad": manad_per_org, "global_dag": global_dag}
self.forbrukning = {}
def far_kora(self, anvandare, org, kostnad):
f = self.forbrukning
if f.get(("a", anvandare), 0) + kostnad > self.tak["anvandare_dag"]:
return False, "dagskvoten är slut — den återställs i morgon"
if f.get(("o", org), 0) + kostnad > self.tak["org_manad"]:
return False, "organisationens månadsbudget är slut"
if f.get(("g",), 0) + kostnad > self.tak["global_dag"]:
return False, "tjänsten är tillfälligt begränsad"
return True, "ok"
def registrera(self, anvandare, org, kostnad):
for nyckel in (("a", anvandare), ("o", org), ("g",)):
self.forbrukning[nyckel] = self.forbrukning.get(nyckel, 0) + kostnad
Felmeddelandena i far_kora är medvetet olika. «Dagskvoten är slut — den återställs i morgon» är användbart; «fel 429» är det inte. Kvoter som användaren förstår upplevs som rimliga; kvoter som bara stoppar upplevs som trasiga.
Behärskning innebär
- Räknar ut kostnad per användare
- Sätter kvoter som skyddar marginalen
- Väljer prismodell efter kostnadsstruktur
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- Anthropic — Prompt caching — dokumentation, fri läsning
- Google — Rules of Machine Learning — CC BY 4.0
- Hugging Face — dokumentation (Apache-2.0) — Apache-2.0