- Je reserveert het antwoord vóór je context selecteert.
- Je onderscheidt tokenbudget, cachetokens en een eenvoudig kostenmodel.
Een gesprek past pas wanneer de invoer én het gereserveerde antwoord in het contextvenster passen. De invoer omvat ook instructies, voorbeelden, rolmarkers en eventuele toolbeschrijvingen. Alleen de zichtbare vraag tellen onderschat dus de benodigde ruimte.
Gebruik in een echte toepassing de tokenizer en chattemplate van het gekozen model. De oefeningen krijgen al gemeten token-IDs of aantallen. Daardoor kun je het selectiebeleid precies narekenen zonder een gok zoals “vier tekens per token”.
1. Reserveer antwoordruimte vooraf
Noem het aantal prompttokens P, de maximale antwoordlengte R en de contextcapaciteit C. De voorwaarde is:
Bij drie prompttokens, drie gereserveerde antwoordtokens en capaciteit acht blijven twee tokens vrij. Het uiteindelijke antwoord kan korter zijn door een eindtoken. Dat verandert niets aan de ruimte die je vóór generatie nodig hebt gereserveerd.
r = context_budget([11,42,7],3,8)
print(r['prompt'],r['reserved']) # 3 3
print(r['free']) # 2
Maak context_budget met een niet-lege lijst echte gehele token-IDs tussen nul en 2³¹−1. Reserveer minstens één token en gebruik een venster van hoogstens 8192. Dit maximum is onze oefengrens en beschrijft niet de capaciteit van alle taalmodellen.
Als de prompt en reservering samen te groot zijn, geef je ValueError. Kap geen vraag of systeeminstructie stil af om de som te laten passen. Zo krijgt de aanroeper een duidelijke keuze: invoer verkorten of een andere passende configuratie gebruiken.
012. Verwijder complete oude berichtparen
Ons geschiedenisbeleid bewaart systeemcontext, huidige vraag en antwoordreservering altijd. Eerdere user/assistant-paren mogen vanaf de oudste worden verwijderd. Daardoor blijft één aaneengesloten recent deel over met bij elkaar horende vragen en antwoorden.
Neem vaste aantallen 2+3+4=9 en drie eerdere paren met samen 5, 6 en 4 tokens. Alles samen gebruikt 24 tokens. Bij capaciteit twintig valt het oudste paar weg: er blijven negentien gebruikte tokens en één vrij.
turns = [(3,2),(4,2),(2,2)]
r = choose_history(2,turns,3,4,20)
print(r['keep']) # [1, 2]
print(r['used_with_reply'],r['free'])
# 19 1
s = choose_history(2,turns,3,4,14)
print(s['keep']) # [2]
print(s['used_with_reply'],s['free'])
# 13 1
Maak choose_history voor maximaal honderd paren, elk als lijst of tuple met twee positieve gehele aantallen. Trek het oudste paar van het totaal af zolang dat totaal niet past. Rapporteer de behouden oorspronkelijke indices, het aantal verwijderde paren, totaal inclusief antwoord en vrije ruimte; wijzig de invoer niet.
Als zelfs de vaste basis niet past, geef je een fout. Het beleid is bovendien geen algemeen optimaal geheugen: een oude afspraak kan belangrijker zijn dan een recent praatje. We maken hier één eenvoudige, controleerbare keuze.
De aantallen moeten bij exact geserialiseerde tokenblokken horen, inclusief markers. Losse gewone tekstfragmenten apart tokeniseren en optellen kan door grenssamenvoegingen afwijken van de volledige tokenisatie. Controleer dat onderscheid wanneer je deze helper aan een echt model koppelt.
Vooraf gegeven tokenaantallen, inclusief markers. Verwijder de oudste hele paren; systeemcontext en huidige vraag blijven staan.
3. Tel cache-invoer één keer
Een eenvoudig kostenmodel verdeelt invoer in ongecachete tokens U en gecachete tokens K. De totale invoer I bevat K al, dus U=I−K. Uitvoer O krijgt een eigen tarief; alle tarieven zijn hier fictieve bedragen per miljoen tokens in dezelfde munteenheid.
Bij I=1000, K=400 en O=200, met tarieven 2, .5 en 6, is de gewogen som 600×2+400×.5+200×6=2600. Delen door een miljoen geeft .0026. Cached tokens nogmaals bij I optellen zou dubbel tellen.
prices = {'input':'2','cached':'0.5',
'output':'6'}
cost = token_cost(1000,200,400,prices)
print(cost) # 0.0026
print(token_cost(1,0,0,prices))
# 0.000002
Maak token_cost met Decimal uit de prijsstrings. Valideer gehele aantallen tot een miljard, cached hoogstens input, en exact drie niet-negatieve gewone prijsstrings met maximaal zes decimalen en waarde hoogstens 10000. Geef een Decimal terug en rond niet tussentijds af.
De tweede uitkomst toont waarom vroeg afronden kleine aanvragen gratis kan laten lijken. Dit model bevat geen cache-schrijfkosten, belastingen of minimumafname; de site gebruikt zelf geen betaalde model-API. Het model-lab toont wel echte lokale invoer- en uitvoertelling.
03Wat neem je mee?
- Antwoordreservering hoort vooraf in het contextbudget.
- Een expliciet beleid verwijdert complete oude paren.
- Cache-invoer wordt eenmaal geteld; Decimal bewaart de gekozen prijsprecisie.
Hierna beoordeel je of de inhoudelijke antwoorden van een LLM-toepassing ook kloppen.