Ugrás a tartalomra
16/3016/30. fejezet

A context window, a token és a számla mérve

Egy mért 40 körös beszélgetés input tokenben a saját hosszának 22-szeresébe kerül. A caching 68 %-ot vág le; egy rossz timestamp +20 %.

Ezen az oldalon

Íme egy negyvenkörös support beszélgetés, körönként számlázva. Semmi szokatlan nincs benne: egy fejlesztő egy API-ról kérdez, az assistant egy-két bekezdésben válaszol. A teljes párbeszéd 5 090 tokennyi szöveg — nagyjából nyolc oldal.

körprompt tokensúj szövegoutputennek a körnek a költségefutó összesen
121318183$0.002622$0.002622
589214123$0.003260$0.014354
101 65619114$0.004680$0.035530
202 86818103$0.006972$0.094426
303 9412099$0.009070$0.174170
404 94717142$0.011598$0.274386

Olvasd együtt a második és a harmadik oszlopot. A 40. körben a felhasználó tizenhét tokent írt be, és 4 947-ért fizetett. A kérdés nem volt nehezebb az elsőnél; rövidebb volt. Ami megváltozott: a kérés ismét magával vitte az egész beszélgetést, immár negyvenedszer.

A negyven hívás során számlázott teljes input tokens: 112 617. A beszélgetés 5 090 token hosszú. Huszonkétszeresen fizetted ki.

Ez a fejezet arról szól, miért történik ez, minek hívják az egyes szolgáltatók számláin, és az öt dolog közül, amiért fizetsz, melyikkel tudsz kezdeni valamit.

Részletek megjelenítése

Amire ennek a fejezetnek szüksége van a II. részből.

  • 7. fejezet felépítette a tokenizálót. Itt is a token az egység — ugyanaz az egység, most árazva.
  • 9. fejezet levezette a self-attentiont és annak O(n2)O(n^2) költségét az aszimptotikus jelölés dobozában. Ez a költség az oka annak, hogy egyáltalán létezik limit; ezért itt csak hivatkozunk rá, nem magyarázzuk el újra.
  • 13. fejezet megmérte a prefillinget a decode-hoz képest, és kiszámolta, mennyi helyet foglal a KV cache. A fenti input és output oszlopok valójában ezt a két fázist veszik meg.

Minden más TypeScript, mert ez egy távoli hívás könyvelése, nem pedig matematika egy modelről.

Ebben az üzletben a legdrágább félreértés az, hogy egy model emlékszik a beszélgetésre.

Nem emlékszik, és a 13. fejezet mechanizmusa pontosan megmondja, miért. Egy transformer állapota generálás közben a KV cache: a sorozat minden tokenjéhez kiszámolt kulcsok és értékek. Ez a cache egyetlen kérés idejéig él. Amikor a kérés véget ér, a folyamat, amely tartotta, szabadon kiszolgálhat valaki mást, a cache pedig eltűnik. A túloldalon nincs felhasználónkénti tároló, és nincs munkamenet.

Ezért a következő kérésnek magával kell hoznia mindent, amit a modelnek tudnia kell, a model pedig úgy építi újra ezt az állapotot, hogy lefuttat egy forward passt a teljes prompton, mielőtt egyetlen új tokent kibocsátana. A 15. fejezet a promptot „a teljes állapotnak” nevezte. Ez a fizikai oka: a prompt a teljes állapot, mert a hívás után semmi más nem marad meg.

A context window a prompt és a válasz maximális együttes hossza. Annak a felső határa, mennyi állapotot tudsz újraépíteni, nem pedig egy tároló, amely bármit megtartana a kérések között. Ha „a model memóriájának” nevezed, megfordítod az okozatiság irányát — nem egy memóriát töltesz fel, hanem azért fizetsz, hogy újra létrehozz egyet.

Innen jön a huszonkettes szorzó. A(z) nn. kör magával viszi az összes n1n-1 korábbi kört, így egy nn körös beszélgetés teljes inputja egy növekvő sorozat összege, vagyis négyzetes:

total input  =  i=1n(s+hi)  =  Θ(n2)\text{total input} \;=\; \sum_{i=1}^{n} \big(s + h_i\big) \;=\; \Theta(n^2)

ahol ss a system prompt, hih_i pedig az előzmények a(z) ii. körben. A mért kumulatív inputot a negyven körre an2+bnan^2 + bn alakra illesztve 60.22n2+432.25n60.22\,n^2 + 432.25\,n adódik, ami a 40. körre 113 645 tokent jósol a mért 112 617 helyett. A négyzetes tag dominál, a lineáris tag pedig az, amit a felhasználó ténylegesen begépelt.

A fejezet legfontosabb mondata ez: a számlád a beszélgetés négyzetével nő, nem az utolsó kérdéssel. Ugyanez a negyven kérdés előzmények nélkül $0.066036-ba került volna. Az előzmények megtartása $0.274386-ba került. Az előzmények 4,2-szeresére növelték a számlát, és továbbra is szorozni fogják, mert a szorzó maga a beszélgetés hossza.

A window két okból véges, és mindkettő ugyanabba az irányba húz. Az első a 9. fejezeté: az attention minden tokent minden más tokennel összehasonlít, ezért ennek a rétegnek a munkája a sorozathossz négyzetével nő. A második a memória: a KV cache lineárisan nő a sorozathosszal, és a 13. fejezet elvégezte ezt a számítást — hosszú sorozatoknál nagyobb, mint a súlyok.

Mindkét korlátot támadták már, de egyiket sem tüntették el. A FlashAttention1 úgy szervezi át a számítást, hogy sokkal kevesebbet olvasson és írjon a nagy sávszélességű memóriába, így a hosszú sorozatok praktikussá válnak anélkül, hogy az aszimptotikus költség változna. A Position Interpolation2 és a YaRN3 egy betanított model használható windowját azzal bővíti, hogy a 9. fejezetből ismert pozicionális kódolásokat skálázza át, nem pedig újratanít. Együtt ezek miatt jutottunk öt év alatt 2K-ról 1M-es windowig.

Amit nem tettek meg: nem tették ingyenessé a hosszú kontextusokat. Magasabbra emelték a plafont, és enyhítették a meredekséget. A meredekség továbbra is ott van, és ezt mérik a fejezet későbbi árazási sávjai.

Az interneten szinte minden költségkalkulátor úgy modellez egy API-hívást, hogy input tokens szorozva input árral, plusz output tokens szorozva output árral. Ez 2023-ban igaz volt. Ma már úgy téves, hogy mindkét irányba akár kétszeres vagy nagyobb eltérést is okozhat a számlában.

Öt számlázható token-kategória van:

kosármi eztipikus ár az inputhoz képest
uncached inputprompt tokens, amelyeket a modelnek frissen kellett feldolgoznia
cache readeltárolt prefixből kiszolgált prompt tokens0,1×
cache writeezen a híváson cache-be tárolt prompt tokens1,25×–2×
outputa model által generált és neked elküldött tokens5×–6×
reasoninga model által generált, de neked el nem küldött tokensoutput díj

Ebből az ötből három két éve még nem létezett külön sorként, és a két cache-sor az, amit az emberek félreértenek, mert a cache write többe kerül, mint a sima input, nem kevesebbe. Felárat fizetsz azért, hogy valamit eltárolj, hogy aztán kedvezménnyel olvashasd vissza; hogy ez megéri-e, teljesen attól függ, hányszor olvasod vissza.

A reasoning kosár a 12. fejezet témája, most árcédulával, és van benne egy részlet, amit érdemes világosan kimondani: a Google dokumentációja szerint az árazás „a model által generálandó teljes thought tokens alapján történik, annak ellenére, hogy az API csak az összefoglalót adja ki.”4 Olyan tokenekért fizetsz, amelyeket soha nem továbbítanak neked. Ez az egyetlen kosár, amelynek tartalmát nem tudod megszámolni, megvizsgálni vagy ellenőrizni.

Most jön az a rész, ami ezt normalizálási problémává teszi, nem szorzási problémává. Minden provider más néven jelenti ezeket a kosarakat, és — ez a csapda — ketten ugyanazt a szót két különböző mennyiségre használják.

Vegyünk egy hívást: 4 837 token cache-ből olvasva, 110 friss, 142 látható output token, 300 reasoning token.

three usage payloads, one callJSON
// OpenAI-compatible
{ "usage": { "prompt_tokens": 4947,
             "prompt_tokens_details": { "cached_tokens": 4837 },
             "completion_tokens": 442,
             "completion_tokens_details": { "reasoning_tokens": 300 } } }

// Anthropic
{ "usage": { "input_tokens": 110,
             "cache_read_input_tokens": 4837,
             "cache_creation_input_tokens": 0,
             "output_tokens": 442 } }

// Gemini
{ "usageMetadata": { "promptTokenCount": 4947,
                     "cachedContentTokenCount": 4837,
                     "candidatesTokenCount": 142,
                     "thoughtsTokenCount": 300 } }

Nézd meg a(z) prompt_tokens: 4947 és input_tokens: 110 mezőt. Mindkét mező ugyanannak a promptnak az input token száma. Az OpenAI-é tartalmazza a cached tokeneket; az Anthropicé nem — a dokumentációja explicit kimondja az azonosságot: total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens.5 Az Anthropic input_tokens mezője azt jelenti: „a legutóbbi cache breakpoint utáni tokenek”.

És nézd meg az outputot. Az OpenAI és az Anthropic is 442-t jelent, amely már tartalmazza a 300 reasoning tokent. A Gemini 142-t jelent, és a 300-at külön mezőbe teszi. A 12. fejezet ezt ugyanannak a munkának két eltérő számlálási módja közötti inkompatibilitásként jelölte meg; itt látszik, mennyibe kerül.

Egy normalizáló harminc sor, és nem opcionális:

normalise.tsTS
export interface Usage {
  promptTokens?: number;        // input, NOT cached
  cachedInputTokens?: number;   // read from cache
  cacheWriteTokens?: number;    // written to cache on this call
  completionTokens?: number;    // output
  reasoningTokens?: number;     // billed apart from output (Gemini only)
}

const num = (v: unknown) => (typeof v === "number" && isFinite(v) ? v : 0);

export const fromOpenAI = (raw: any): Usage => {
  const u = raw.usage ?? {}, d = u.prompt_tokens_details ?? {};
  const cached = num(d.cached_tokens), write = num(d.cache_write_tokens);
  return {
    promptTokens: Math.max(0, num(u.prompt_tokens) - cached - write), 
    cachedInputTokens: cached,
    cacheWriteTokens: write,
    completionTokens: num(u.completion_tokens),   // reasoning already inside
    reasoningTokens: 0,
  };
};

export const fromAnthropic = (raw: any): Usage => {
  const u = raw.usage ?? {};
  return {
    promptTokens: num(u.input_tokens),            // already excludes cache
    cachedInputTokens: num(u.cache_read_input_tokens),
    cacheWriteTokens: num(u.cache_creation_input_tokens),
    completionTokens: num(u.output_tokens),
    reasoningTokens: 0,
  };
};

export const fromGemini = (raw: any): Usage => {
  const m = raw.usageMetadata ?? {}, cached = num(m.cachedContentTokenCount);
  return {
    promptTokens: Math.max(0, num(m.promptTokenCount) - cached),
    cachedInputTokens: cached,
    cacheWriteTokens: 0,
    completionTokens: num(m.candidatesTokenCount), // EXCLUDES thinking
    reasoningTokens: num(m.thoughtsTokenCount),    // billed at output rate
  };
};

Futtasd át a fenti három payloadot a három readeren, és mindhárom ugyanazt a(z) Usage eredményt adja, ezért ugyanazt a számot: $0.006491. Ennek az egyezésnek az elérése az egész réteg megírásának lényege.

Ha elrontod, ennyibe kerül ugyanazon a híváson:

hibaszámlázvaeltérés
a(z) cached_tokens kezelése úgy, mintha hozzáadódna a(z) prompt_tokens értékhez$0.0161652,49× — kétszer számolod fel a promptot
cache readek ingyenesként kezelése 0,1× helyett$0.0055240,85× — lenyeled a 15 %-ot
a(z) candidatesTokenCount olvasása és a(z) thoughtsTokenCount figyelmen kívül hagyása$0.002891a hívás 55 %-a eltűnik

A harmadik veszélyes, mert csendben hibázik, mégpedig a jó hír irányába. A dashboardod azt mutatja, hogy egy reasoning model kevesebb mint feleannyiba kerül, mint valójában, és sehol sem keletkezik hiba.

Miután a kosarakat normalizáltuk, a költségfüggvény rövid. Az egyetlen nem magától értetődő rész a sávkeresés, amit a következő szakasz magyaráz:

cost.tsTS
export interface Tier { maxPromptTokens: number | null; price: number }
export interface Pricing {
  input: Tier[]; output: Tier[];
  cachedInput?: Tier[]; cacheWrite?: Tier[]; reasoning?: Tier[];
}

const tierPrice = (tiers: Tier[] | undefined, contextSize: number, fallback?: Tier[]) => {
  const table = tiers ?? fallback;
  if (!table?.length) return 0;
  const sorted = [...table].sort(
    (a, b) => (a.maxPromptTokens ?? Infinity) - (b.maxPromptTokens ?? Infinity));
  for (const t of sorted)
    if (t.maxPromptTokens === null || contextSize <= t.maxPromptTokens) return t.price;
  return sorted[sorted.length - 1].price;
};

export function computeCost(pricing: Pricing, usage: Usage): number {
  const fresh = usage.promptTokens ?? 0;
  const read  = usage.cachedInputTokens ?? 0;
  const write = usage.cacheWriteTokens ?? 0;
  const out   = usage.completionTokens ?? 0;
  const think = usage.reasoningTokens ?? 0;
  const contextSize = fresh + read + write;   // the tier depends on the WHOLE prompt
  return fresh * tierPrice(pricing.input, contextSize)
       + read  * tierPrice(pricing.cachedInput, contextSize, pricing.input)
       + write * tierPrice(pricing.cacheWrite,  contextSize, pricing.input)
       + out   * tierPrice(pricing.output, contextSize)
       + think * tierPrice(pricing.reasoning, contextSize, pricing.output);
}

Két tervezési döntést érdemes megvédeni. A fallbackek — cache-árak fallbackje inputra, reasoning fallbackje outputra — azt kódolják, mit jelent egy hiányzó tábla: a Gemini reasoning tokenjeit output díjon számlázzák, ezért egy hiányzó reasoning ár nem nulla, hanem az output ár. A(z) contextSize pedig mindhárom input kosarat összeadja, nem csak a frisseket, mert a sávot az választja ki, milyen hosszú a prompt, nem az, hogy mennyit számláztak belőle teljes áron.

Prompt caching, és mennyibe kerül az írás

Link a szakaszhoz: Prompt caching, és mennyibe kerül az írás

A prompt cache a modeled kiszámolt állapotát tárolja a promptod egy prefixére, így egy későbbi, ugyanazzal a prefixszel érkező kérés kihagyhatja az újraszámítást. A „prefix” szóból négy tulajdonság következik, és mind a négy meglepi az embereket.

A cache az összerenderelt prompt elejétől előre haladva illeszt, és az első eltérő byte-nál megáll. Nincs részleges jóváírás olyan tartalomért, amely később, más sorrendben megjelenik. Az OpenAI nyersen fogalmaz: „a cache reuse megköveteli, hogy a teljes renderelt prefix egyezzen.”6

Alatta semmi sem kerül cache-be, és hiba sem érkezik vissza. OpenAI-nál a minimum 1 024 token GPT-5.6 és későbbi modelleknél, és 2 048 a régebbieknél. Anthropicnál modelltől függően 512 és 4 096 között mozog — 1 024 Claude Sonnet 4.5-nél, 4 096 Claude Haiku 4.5-nél. Ha mindkét cache-mező nullával jön vissza, többnyire ez az oka.

Az írás többe kerül, mint az olvasás, és többe, mint a nem caching

Link a szakaszhoz: Az írás többe kerül, mint az olvasás, és többe, mint a nem caching

OpenAI-nál és Anthropicnál egy cache write a rövid életű cache esetén az uncached input díj 1,25-szöröse, Anthropic egyórás cache-e pedig 2×. Egy read 0,1×. A Google nem számít fel írási díjat, de bérbe adja a tárolást: $4.50 per millió token per óra Gemini 2.5 Pro esetén.

Az Anthropic alapértelmezett bejegyzése öt percig él, és minden találatnál ingyen frissül. Az OpenAI-é legalább harminc percig a legutóbbi írás vagy reuse után. Az OpenAI azt is megjegyzi, hogy a cached állapotok egyes gépeken élnek, így egy kérés csak akkor talál, ha arra a gépre kerül, amelyik tartja a bejegyzést — ezt befolyásolja a(z) prompt_cache_key, de nem garantálja.

A megtérülési pont elég kicsi ahhoz, hogy fejben tartsd, és az OpenAI dokumentációja elvégzi a számítást: egy prefix egyszeri írása és egyszeri újrafelhasználása a szokásos inputköltség 1,35-szörösébe kerül, szemben a kétszeri uncached feldolgozás 2× költségével; tíz kérésnél egy write és kilenc read 2,15×, szemben a 10× értékkel. Egyetlen reuse visszahozza az írás árát. Az Anthropic ugyanoda jut: egy read az ötperces cache-nél, kettő az egyórás cache-nél.

Most újra a negyvenkörös beszélgetés, bekapcsolt cachinggel és stabil prefixszel:

uncached inputcache readscache writesösszesen
cache nélkül112 617$0.274386
caching2 887104 7834 947$0.088250

Hatvannyolc százalékkal olcsóbb, és a táblázatban három szám megéri a figyelmet.

A cache csak a 6. körben lép működésbe. A prompt addig nem éri el az 1 024 tokent, ezért az első öt kört pontosan úgy számlázzák, mint korábban — a hatodikat pedig rosszabbul, az 1,25× write felárral, mert ez a kör tölti fel a cache-t. Az első read a 7. körben érkezik. A táblázat 2 887 uncached tokenje a számtan: öt környi, nem hat. A caching a hosszú promptok kedvezménye, egy rövid beszélgetés semmit sem nyer vele.

A write felár $0.002474, ami a cached számla 2,8 %-a. Minden kör megírja az új végét, negyvenszer, és a teljes write felár kerekítési hiba ahhoz képest, amit a readek megtakarítottak. A write díjat azért érdemes pontosan érteni, hogy ne aggódj miatta.

Csak 2 887 tokent számláztak teljes input áron a 112 617-ből. Így néz ki egy működő cache: szinte minden read.

A prompt sorrendje dönti el, megtörténik-e ebből bármi

Link a szakaszhoz: A prompt sorrendje dönti el, megtörténik-e ebből bármi

Íme a hiba, amely valódi pénzbe kerül, és egy egysoros bug.

Tegyél valamit a prompt elejére, ami minden hívásnál változik — timestampet, request id-t, a felhasználó nevét, egy „ma van” sort, egy frissen retrieved dokumentumot —, és a prefix már az első byte-tól eltér. Semmi sem illeszkedik. Minden hívás miss. És mivel minden hívás új prefixet mutat, minden hívás ír is.

Ugyanaz a beszélgetés, ugyanaz a negyven kör, bekapcsolt caching, de hívásonkénti timestamp a system prompt tetején:

összesenehhez képest
caching egyáltalán nincs$0.274386
caching, stabil prefix$0.088250−67,8 %
caching, változó prefix$0.329251+20,0 %

A prompt caching bekapcsolása húsz százalékkal drágábbá tette a beszélgetést annál, mintha be sem kapcsoltad volna. 109 730 tokenen fizetted meg az 1,25× write felárat, és nullát olvastál vissza. Nincs hiba, nincs figyelmeztetés, a funkció pedig be van kapcsolva.

Ezért a szabály — és ez a prompt caching egyetlen sorban: stabil tartalom előre, változó tartalom hátra. System utasítások, tool-definíciók és referencianyag először; timestamp, felhasználói identitás és az aktuális kérdés utoljára. Az Anthropic explicitté teszi a hierarchiát — a cache a(z) toolssystemmessages sorrendet követi, és bármely szinten bekövetkező változás érvényteleníti azt a szintet és mindent utána, így egyetlen tool-leírás szerkesztése az egész cache-t érvényteleníti.5

Két következményen sokan elcsúsznak. Ha változik, mely toolok vannak engedélyezve, változnak a tool-definíciók is, tehát egy feature flag, amely egyes felhasználóknak hozzáad egy toolt, kettévágja a cache-edet. Anthropicnál pedig a webes keresés vagy a hivatkozások kapcsolgatása módosítja a system promptot, ami érvényteleníti a system és message cache-eket anélkül, hogy a saját szövegedből akár egy sort megváltoztatnál.

Az előzmények csonkítása nem megoldás

Link a szakaszhoz: Az előzmények csonkítása nem megoldás

A négyzetesen növő számlára adódó kézenfekvő válasz, hogy ne küldd el a teljes előzményt: tartsd meg az utolsó tucat üzenetet, a többit dobd el. Ez csökkenti a számlát, és általában rossz lépés, a mérés pedig megmondja, miért.

stratégiaösszesenteljes előzmény + cache-hez képest
teljes előzmény, cache nélkül$0.274386+211 %
teljes előzmény, caching$0.088250
utolsó 12 üzenet, cache nélkül$0.118712+35 %
utolsó 12 üzenet, caching bekapcsolva$0.122546+39 %

A tizenkét üzenetes windowra csonkítás 57 %-kal olcsóbb, mint mindent uncached elküldeni — ezt az összehasonlítást teszi mindenki, és ezért népszerű a technika. De 39 %-kal drágább, mint mindent működő cache-sel elküldeni, és a caching bekapcsolása csonkítás mellett kicsit ront, nem javít.

A mechanizmus megint a prefix. Egy csúszó window minden körben eldobja a legrégebbi üzenetet, ezért a prompt már nem ott kezdődik, ahol legutóbb kezdődött, és minden kör új prefixet mutat. Az OpenAI útmutatása pontosan ezt mondja: „a summarisation, compaction vagy context truncation megváltoztathatja a prefixet, és lenullázhatja a cache reuse-t.”6 A 40. körre a windowed prompt 813 token, az 1 024 tokenes minimum alatt, így egyáltalán nem cache-elhető.

A pénz pedig a költség olcsóbbik fele. Amit eldobtál, az a felhasználó 2. körben adott utasítása, amelyre a modelnek a 40. körben szüksége volt. A truncation egy látható számlát cserél egy láthatatlan hibára, és ezt rendesen csinálni — compaction, a windowon kívül tartott strukturált jegyzetek, előzmények igény szerinti retrievalje — a 24. fejezet témája.

Egy sáv átlépése az egész kérést újraárazza

Link a szakaszhoz: Egy sáv átlépése az egész kérést újraárazza

A hosszú kontextusok nem pusztán azért drágábbak, mert hosszabbak. Egy küszöb felett tokenenként is drágábbak, és a küszöb visszamenőleg az egész promptra vonatkozik.

Az OpenAI gpt-5.6-terra modeloldala egyetlen mondatban kimondja: „A >272K input tokens promptok 2× input és 1,5× output áron kerülnek számlázásra a teljes kérésre.”7 Nem a többletre. Az egészre.

the most expensive token you will ever sendTEXT
prompt 271,999 + 500 output  ->  $0.5500
prompt 272,000 + 500 output  ->  $0.5500
prompt 272,001 + 500 output  ->  $1.0970

Egy token, ötvenöt cent. Ha a szolgáltatásod olyan retrieved dokumentumokból épít promptokat, amelyek méretét nem te kontrollálod, akkor van egy szakadék a költségmodelledben egy olyan határon, amelyet senki a csapatodból nem írt le.

A Google árazása ugyanígy működik 200 000 tokenes küszöbbel: a Gemini 2.5 Pro $1.25 per millió input token a legfeljebb 200K-s promptoknál, és $2.50 felette, az output pedig $10.00-ról $15.00-ra nő.8 Az Anthropic a másik irányba ment — 2026. szeptember 6-án a dokumentációja azt írta, hogy a Claude 4.6 és későbbi modellek a teljes egymillió-tokenes windowt standard árazással tartalmazzák, így „egy 900k-token request ugyanazon a tokenenkénti díjon kerül számlázásra, mint egy 9k-token request.”9 A korábbi modellek megtartották a felárat.

Ezért az ár nem egy szám. Az ár prompt-hossz alapján kulcsolt sávok táblázata; ezért van a(z) Tier[] a költségfüggvényben, és ezért választja ki a(z) computeCost a sávot a teljes prompt alapján, nem kosaranként külön.

Prefill, decode, és miért kerül az output hatszor annyiba, mint az input

Link a szakaszhoz: Prefill, decode, és miért kerül az output hatszor annyiba, mint az input

Az öt kosár a 13. fejezet két fázisára képezhető le, és ha ezt a leképezést meglátod, az árarányok már nem tűnnek önkényesnek.

Az input tokens a prefill. A teljes prompt egy menetben megy át a modellen, párhuzamos feldolgozással — nagy mátrixszorzások, compute-bound. A tokenenkénti költség alacsony, és ez a fázis határozza meg a time to first token értéket: egy 4 947 tokenes promptnál 4 947 tokennyi prefillt kell elvégezni, mielőtt az első szó megjelenik.

Az output tokens a decode. Egyenként keletkeznek, mindegyik egy teljes forward pass, amely beolvassa az egész KV cache-t, miközben a GPU többnyire memóriára vár, nem számol. Ez a fázis határozza meg a tokens per second értéket, egy válaszon belül nem párhuzamosítható, és ezért kerül az output körülbelül hatszor annyiba, mint az input az itt árazott modellen: $12.00 szemben $2.00 per millió tokennel.

Három következmény közvetlenül adódik. Egy cache read prefill munkát vált ki, tehát egyszerre vesz késleltetést és pénzt — ugyanaz a kedvezmény alacsonyabb számlában és rövidebb várakozásban jelenik meg az első tokenig. A reasoning tokens olyan decode, amit soha nem látsz, ezért egy reasoning model több másodpercig semmit sem streamel, majd gyorsan válaszol: a 12. fejezet az interfész-következményre figyelmeztetett, ez pedig a számla-következmény. És egy stream megszakítása nem állítja le a generálást — a 14. fejezet megépítette a lemondást, az árát erre a fejezetre hagyta, az ár pedig a teljes output count, mert a tokenek létrejönnek és számlázódnak, akár figyel valaki, akár nem. Ugyanez igaz arra a válaszra is, amelyet senki sem tart meg: egy 40. körös válasz ötszöri újragenerálása $0.057990-ba kerül azért az egyért, amely a képernyőn marad.

A 7. fejezet tokenizálója Python volt, és ott is maradt. A budgetelés abban a szerverben történik, amely a kérést összeállítja, ezért itt kell megtörténnie, és pontosan három pontossági szint létezik.

Első szint: számolj lokálisan. A(z) js-tiktoken ugyanazokat a BPE merge táblákat szállítja, mint a Python tiktoken, így OpenAI encodingoknál byte-ról byte-ra azonos countot ad hálózati hívás nélkül:

count.tsTS
import { getEncoding } from "js-tiktoken";

const enc = getEncoding("o200k_base");
const PER_MESSAGE = 4;   // role and delimiters added by the chat template
const PER_REPLY = 3;     // priming for the assistant turn

export function promptTokens(messages: { role: string; content: string }[]) {
  return messages.reduce(
    (sum, m) => sum + enc.encode(m.content).length + PER_MESSAGE, PER_REPLY);
}

A két konstans számít, és itt kezdenek elsodródni a lokális countok. Nem a szöveged kerül tokenizálásra — a 11. fejezet chat template-je előbb minden üzenetet role markerekkel csomagol be, és ezek olyan tokenek, amelyekért fizetsz. Üzenetenként négy, a reply priminghoz három a szokásos közelítés OpenAI chat modelleknél; a fenti beszélgetés nyolcvanegy üzenetén ezek 324 tokent adnak ki, a hossz 6,4 %-át. Az itteni countokat a 7. fejezet Python tiktoken kódjával keresztellenőriztük mind a nyolcvanegy stringen, és azonosak.

Második szint: kérdezd a providert. Az Anthropic /v1/messages/count_tokens végpontot, a Google count_tokens végpontot ad, mindkettő ugyanazt a request shape-et fogadja, mint egy valódi hívás, és ingyen input token countot ad vissza. Használd őket, amikor nem tudsz lokálisan számolni — és Anthropicnál nem tudsz lokálisan számolni, mert a tokenizálója nincs publikálva. Az Anthropic dokumentációja óvatosan fogalmaz arról, mit ad: a count „becslés”, és „tartalmazhat Anthropic által automatikusan hozzáadott tokeneket system optimalizációkhoz”, amelyekért „nem számláznak”.10

Harmadik szint: olvasd ki a(z) usage mezőt a válaszból. Ez az igazság, és azután érkezik, hogy a pénzt elköltötted. Pontosan ezért létezik az első két szint — hogy eldöntsd, elküldöd-e a kérést, nem azért, hogy számlázz.

Amiért fizetsz, de senki sem mutatja meg

Link a szakaszhoz: Amiért fizetsz, de senki sem mutatja meg

Négy tétel, amely nem jelenik meg tételként.

A system prompt, minden hívásnál fizetve. A fenti a template overheadjével együtt 192 token. Negyven híváson át ez 7 680 token — a beszélgetés teljes számlájának 5,6 %-a, nyolc egyszer megírt sorért. Egyben a lehető legjobb cache-jelölt is, mert stabil és első.

Tool-definíciók. Minden tool neve, leírása és JSON sémája minden kérésben kimegy, és a providerek erre még scaffoldingot is tesznek. Az Anthropic közzéteszi a számot: a toolok engedélyezése önmagában 496 tokennyi rejtett system promptot ad hozzá Claude Sonnet 4.5-nél, ha a(z) tool_choice értéke auto, vagy 588-at any, illetve named tool esetén.9 Ez még a saját sémáid előtt van. A 18. fejezet felépíti a katalógust; a 24. fejezet megméri, mit eszik meg.

Minden generálás, azok is, amelyeket eldobasz. Öt regenerálás ötször annyiba kerül. A chat egyet mutat.

Gondolatok, amelyeket nem mutatnak meg. A számlázás a teljes thought tokens alapján történik, bár csak összefoglaló tér vissza, és a saját könyvelésed nem tudja auditálni ezt a számot.

Az, hogy van 200K tokened, nem jelenti, hogy használod is őket

Link a szakaszhoz: Az, hogy van 200K tokened, nem jelenti, hogy használod is őket

Zárásként egy figyelmeztetés, mert ez a természetes következő gondolat, és a válasz nem az, ami kézenfekvő.

Az egymillió-tokenes window nem jelent egymillió használható tokent. A retrieval pontossága romlik a pozícióval: Liu és mtsai. azt találták, hogy a modellek megbízhatóan találják meg az információt egy hosszú input elején és végén, a közepén viszont jóval kevésbé.11 A nagyobb window azt veszi meg, hogy többet küldhetsz, nem azt, hogy biztosan el is olvassa.

Ezt a jelenséget a kurzus egyszer méri — a retrieval rate-et kilenc pozíción ugyanabban a 853 tokenes promptban —, és a 24. fejezethez tartozik, ahol megváltoztatja, mit csinál egy agent. Azért hivatkozunk rá itt, mert megváltoztatja, mit érdemes megvenned: a legolcsóbb token az, amit el sem küldtél.

Most már meg tudod jósolni, mennyibe fog kerülni egy hívás, mielőtt elküldöd, ki tudod olvasni utólag, mennyibe került, és meg tudod különböztetni a kettőt. Ez mindent lefed a kérésről, kivéve azt a részt, amihez még nem nyúltál: a tekerőket.

A 17. fejezet a sampling — temperature, top-p, top-k, a büntetések, és az a determinizmus, amid nincs. Azzal kezd, hogy lebontja a terület legelterjedtebb tévedését: hogy a temperature kreativitás-tekerő. Nem az: a temperature a 4. fejezet logitjait osztja el a softmax előtt, és ha növeled, nem kreatívabbá teszed a modelt, hanem növeled azoknak a tokeneknek a valószínűségét, amelyeket maga a model rosszabbnak pontozott. Innen jön, hogy a greedy decoding miért ad mérhetően rosszabb szöveget, mint a sampling, miért bukik el a top-k és a top-p ellentétes eloszlásformákon, és a fejezetet záró kísérlet: húsz azonos forward pass temperature 0 mellett bitről bitre azonosan tér vissza, amikor a model egyedül fut, és ugyanazt a promptot valaki más kérései mellé batchbe téve a logitok 97 %-a elmozdul.

Nem mind egyezik. Az ok a 2. fejezet lebegőpontos dobozával kezdődik.


A fejezetben szereplő összes árat, küszöböt és szorzót a providerek saját oldalairól olvastuk 2026. szeptember 6-án, és azért szerepel mellettük a dátum, mert változni fognak. A módszer fontosabb, mint a számok: a kosarak, a prefix-szabály és a sávszámítás két éve stabilak, miközben bennük minden szám megmozdult.

A Stanford CS336 2. előadása, Resource accounting, ennek az anyagnak a legközelebbi akadémiai feldolgozása és a megfelelő következő olvasmány: ugyanazt a számtant végzi el a training oldalon, amelyet ez a fejezet az inference oldalon. Az itteni token countokat a(z) js-tiktoken 1.0.21 készítette a(z) o200k_base és cl100k_base encodingokkal, egy 5 090 tokenes, negyvenkörös beszélgetésen; az üzenetenkénti template overhead a szokásos négy-plusz-három közelítés, és mindenhol jelezzük, ahol benne van. A cache-, sáv- és truncation-számok a dokumentált árazási szabályok alkalmazásai ezekre a mért token countokra, nem élő API-válaszok megfigyelései — a fejezet elkészítéséhez nem történt fizetős hívás, ami egyben az őszinte oka annak is, hogy a latency-állítások kvalitatívak, a költségállítások viszont nem.

  1. Dao, T., Fu, D. Y., Ermon, S., Rudra, A. and Ré, C. FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. arXiv:2205.14135 (2022). Miért mozdult el a plafon anélkül, hogy az aszimptotikus költség változott volna.

  2. Chen, S., Wong, S., Chen, L. and Tian, Y. Extending Context Window of Large Language Models via Positional Interpolation. arXiv:2306.15595 (2023).

  3. Peng, B., Quesnelle, J., Fan, H. and Shippole, E. YaRN: Efficient Context Window Extension of Large Language Models. arXiv:2309.00071 (2023).

  4. Google, Thinking, ai.google.dev/gemini-api/docs/thinking, és Token counting, ai.google.dev/gemini-api/docs/tokens, mindkettő hozzáférve: 2026-09-06. „Pricing is based on the full thought tokens the model needs to generate, despite only the summary being output from the API.” A usage object a(z) total_input_tokens, total_output_tokens, total_thought_tokens, total_cached_tokens, total_tool_use_tokens és total_tokens mezőket jelenti — hat kosarat, a gondolatokkal és tool use-szal az output counton kívül. Ugyanennek a mennyiségnek a korábbi mezőneve, amelyet a generateContent surface még visszaad, a(z) thoughtsTokenCount, egy harmadik oldalon dokumentálva: ai.google.dev/gemini-api/docs/generate-content/thinking.

  5. Anthropic, Prompt caching, docs.anthropic.com/en/docs/build-with-claude/prompt-caching, hozzáférés: 2026-09-06. Forrása a(z) toolssystemmessages érvénytelenítési hierarchiának és táblázatának; a modellenkénti minimális cache-elhető hosszoknak; a(z) total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens azonosságnak; valamint az ötperces alapértelmezett élettartamnak, amely minden hitnél díjmentesen frissül. 2

  6. OpenAI, Prompt caching, platform.openai.com/docs/guides/prompt-caching, hozzáférés: 2026-09-06. Forrása: a teljes renderelt prefix szabályának; a minimális cache-elhető prefixnek (1 024 látható input token GPT-5.6 és később, 2 048 korábban); az 1,25× write és 0,1× read szorzóknak, valamint annak, hogy GPT-5.5 és korábbi modelleken nincs write díj; a 30 perces élettartamnak; a kérésenkénti négy write és ötven breakpoint limitnek; a gépaffinitási megjegyzésnek és a(z) prompt_cache_key értéknek; az 1,35×, 2,15× és 10× break-even példáknak; valamint annak az állításnak, hogy a summarisation, compaction vagy truncation lenullázza a cache reuse-t. 2

  7. OpenAI, Pricing (platform.openai.com/docs/pricing) és a(z) gpt-5.6-terra modeloldala, mindkettő hozzáférve: 2026-09-06. gpt-5.6-terra, standard service tier, per millió token: input $2.00, cached input $0.20, cache writes $2.50, output $12.00; long context input $4.00, cached $0.40, writes $5.00, output $18.00; „prompts with >272K input tokens are priced at 2x input and 1.5x output for the full request”; context window 1 050 000 token, legfeljebb 922 000 input tokennel. Ugyanez a táblázat a(z) gpt-6-astra értékét $10.00/$1.00/$12.50/$50.00-ként, a(z) gpt-5.6-luna értékét pedig $0.20/$0.02/$0.25/$1.20-ként listázza. A fejezet minden kidolgozott költsége a(z) gpt-5.6-terra standard short-context díjait használja.

  8. Google, Gemini Developer API pricing, ai.google.dev/gemini-api/docs/pricing, hozzáférés: 2026-09-06. Gemini 2.5 Pro, per millió token: input $1.25 legfeljebb 200K-s promptoknál és $2.50 felette; output $10.00 és $15.00, mindkettő „including thinking tokens” címkével; context caching $0.125 és $0.25, plusz $4.50 per millió token per óra tárolási díj. A Gemini 3.1 Pro Preview ugyanazt a 200K-s küszöböt használja $2.00/$4.00 input és $12.00/$18.00 output díjakkal.

  9. Anthropic, Pricing, docs.anthropic.com/en/docs/about-claude/pricing, hozzáférés: 2026-09-06. Per millió token, alap input / 5 perces cache write / 1 órás cache write / cache read / output: Claude Sonnet 4.5 $3 / $3.75 / $6 / $0.30 / $15; Claude Haiku 4.5 $1 / $1.25 / $2 / $0.10 / $5; Claude Opus 5 $5 / $6.25 / $10 / $0.50 / $25. Szorzók: 1,25× az ötperces write-ra, 2× az egyórás write-ra, 0,1× egy readre. Szintén forrása a long-context állításnak („Claude 4.6 and later models... include the full 1M token context window at standard pricing”), a tool-use system prompt token countoknak (496 token Claude Sonnet 4.5-ön tool_choice = auto vagy none esetén, 588 any vagy named tool esetén), és annak a megjegyzésnek, hogy a Claude 4.7 és későbbi modellek újabb tokenizálót használnak, amely „approximately 30 % more tokens for the same text” állít elő. 2 3

  10. Anthropic, Token counting, docs.anthropic.com/en/docs/build-with-claude/token-counting, hozzáférés: 2026-09-06. A(z) /v1/messages/count_tokens endpoint ugyanazokat az inputokat veszi át, mint egy message, és input token countot ad vissza; a dokumentáció szerint a count becslés, tartalmazhat Anthropic által system optimalizációkhoz hozzáadott tokeneket, és ezekért nem számláznak.

  11. Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F. and Liang, P. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (2023). Itt idézve, a 24. fejezetben mérve.


Készítette

David Vicente Campos

A NeuraLIA Labs alapítója és a MyRealFood társalapítója

Mérnökinformatikus vagyok, a Leóni Egyetemen végeztem. Társalapítottam a MyRealFoodot, ahol CTO-ként felépítettem azt az alkalmazást, amelyet emberek milliói használtak arra, hogy egészségesebben táplálkozzanak, és megalapítottam a NeuraLIA Labst, ahol AI-termékeket fejlesztek. Itt arról írok, amit menet közben meg kellett értenem, úgy, ahogy szerettem volna, hogy valaki elmagyarázza nekem.

Továbbiak a szerzőről

Közzétette a NeuraLIA Labs.

Kapj új bejegyzéseket a postaládádba

AI-hírek, útmutatók és termékfrissítések — rövid email, amikor valami igazán hasznosat publikálunk.

Kurzusindex

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev11 perc olvasás

A Jev AI-modell döntésekre készült, nem prózára

A TypeSafe AI Jev modellje azért kap figyelmet, mert a szoftveres intelligenciát valószínűségi problémaként kezeli: válaszd ki a megfelelő ágat, rendelj hozzá bizalmi szintet, és ne fizess egy LLM-nek szövegírásért, amikor a kódnak döntésre van szüksége.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering11 perc olvasás

Kontextustervezés hosszú távú AI-ügynökökhöz

A hosszú ideig futó ügynökök nem csak azért vallanak kudarcot, mert kicsi az ablak. Akkor hibáznak, amikor a fájlok, eszközkimenetek és elavult előzmények kiszorítják azt a feladatot, amelyet az ügynöknek be kellett volna fejeznie.

Készen állsz, hogy a LIA válasszon helyetted?

Építs az összes AI-modellel egy helyen – kezdd el ma, ingyen.