Kako jedan hardkodirani model name može potrošiti tisuće dolara
Dokumentacija je lagala. Ne ona službena, nego ona koja se šapće na daily standupovima. Jedan od naših inženjera, tip koji je pisao core routing layer za LLM pozive, imao je naviku hardkodirati nazive modela direktno u source code. Nije bilo zlonamjerno, nije bilo nemarno u klasičnom smislu. Bilo je praktično. U dev okruženju, na malom test setu, razlika između qwen3-32b i llama-3.1-8b-instant je bila zanemariva. Oba su vraćala smislene odgovore, oba su prolazila unit testove. Problem je što je ta praktičnost ušla u produkciju, i to ne kroz feature branch, nego kroz default parameter u konstruktoru klase koja se instancirala na tisuće puta dnevno. Nitko nije pitao zašto je baš taj model izabran. Bilo je očito: netko ga je jednostavno upisao.
Računica je brutalna, ali morate je vidjeti na papiru. Qwen3-32b, na standardnom hosting planu koji koristimo za serviranje većih modela, košta otprilike 12 dolara po milijun input tokena i 18 dolara po milijun output tokena. Llama-3.1-8b-instant, s druge strane, dolazi na 0.30 dolara za input i 0.60 dolara za output. To nije faktor dva ili tri. To je faktor 40 na inputu i faktor 30 na outputu. Kada vaš sustav procesira 500 tisuća upita mjesečno, s prosječnim promptom od 2000 tokena i odgovorom od 500 tokena, razlika između ta dva modela nije stotina dolara. Točno je 306 dolara mjesečno. Godišnje, to je 3.672 dolara. Za jedan tvrdo kodirani string. Bez ikakve dodane vrijednosti. Bez poboljšanja kvalitete odgovora. Samo zato što je netko, u trenutku lenjosti, napisao "qwen3-32b" umjesto da je izvukao varijablu iz okruženja.
Ovdje ne pričamo o optimizaciji na razini arhitekture. Ne pričamo o kvantizaciji, pruning modela, ili čak o biranju između različitih providera. Pričamo o fundamentalnom inženjerskom principu: ništa ne smije biti hardkodirano. To nije dogma, to je matematika. Svaka konstanta u kodu koja utječe na trošak izvršavanja je potencijalna bomba. U svijetu gdje jedan API poziv može koštati od frakcije centa do nekoliko dolara, ovisno o modelu koji odaberete, hardkodiranje imena modela je ekvivalentno ostavljanju otvorenog gasa u podatkovnom centru. Ne vidite dim, ne čujete buku, ali brojčanik na novčaniku se neumitno vrti. Mi smo to platili. Tri tisuće dolara godišnje, za jedan string od 10 znakova.
Rješenje koje smo implementirali zove se "Master Zakon". To je set pravila koja smo uklesali u temelj našeg deployment pipelinea, a prvo i najvažnije pravilo glasi: odabir modela uvijek dolazi iz environment varijable. Nikada iz koda. Nikada iz konfiguracijske datoteke koja se commit-a u repo. Nikada iz hardkodiranog stringa u bilo kojem jeziku, bilo da je Python, Go, ili Rust. Svaki servis koji šalje LLM poziv mora čitati MODEL_NAME iz env-a, a default vrijednost, ako postoji, mora biti najjeftiniji model koji još uvijek prolazi kvalitativne pragove. To nije tehnička preferencija. To je firewall protiv ljudske greške. Jer ljudska greška nije pitanje "hoće li se dogoditi", nego "kada će se dogoditi i koliko će koštati".
Ali env varijabla sama po sebi nije dovoljna. Mi smo dodali sloj enforcementa koji djeluje na razini pre-commit hookova. Svaki commit koji sadrži hardkodirani naziv modela, bilo u obliku string literala, bilo kroz regularni izraz koji matcha poznate providerske modele, biva odbijen. Ne prolazi. Inženjer dobiva poruku: "Pronađen hardkodirani model name. Koristi env varijablu LLM_MODEL_NAME." Ovo nije samo detekcija, ovo je edukacija kroz bol. Prvih tjedan dana, ljudi su psovali. Drugi tjedan, počeli su razumijevati. Treći tjedan, postalo je refleks. Danas, nitko ne razmišlja o tome. To je automatski dio procesa, kao što je provjera sintakse ili formatiranje koda. Cijena implementacije ovog hooka? Otprilike dva sata rada jednog inženjera. Povrat investicije? Manje od mjesec dana.
Gradimo ovo svaki dan. Ako tvoja institucija troši mjesece na taj problem — razgovaraj s nama.
Najzanimljiviji dio ove priče nije tehnički. To je psihološki. Ljudi hardkodiraju jer misle da štede vrijeme. "Samo ću ovo staviti privremeno, kasnije ću izvaditi u config." To "kasnije" nikad ne dođe. Ili dođe, ali nakon što je trošak već nastao. U svijetu LLM infrastrukture, gdje se trošak mjeri u tokenima, a tokeni u dolarima, "privremeno" rješenje je najskuplja stvar koju možete napraviti. Razlika između dev i prod okruženja nije samo u skaliranju. To je u ekonomskoj gravitaciji. Ono što u dev okruženju izgleda kao sitnica, u produkciji postaje crna rupa. I zato je jedini ispravan pristup tretirati svaki hardkodirani string kao potencijalnu sigurnosnu prijetnju. Ne sigurnosnu u smislu podataka, nego sigurnosnu u smislu budgeta.
Postoji još jedan sloj ove priče koji se tiče samih modela i njihove stvarne vrijednosti. Qwen3-32b je odličan model za specifične zadatke, posebno one koji zahtijevaju duboko razumijevanje konteksta ili generiranje dugačkih, koherentnih odgovora. Ali za 90% use caseva u modernoj aplikacijskoj infrastrukturi - klasifikaciju, ekstrakciju entiteta, jednostavne RAG upite, prevođenje - manji modeli poput Llame 3.1 8B rade posao jednako dobro, a koštaju djelić. Problem je što inženjeri često biraju model na temelju hypea, ili na temelju onoga što su zadnje čitali na Hacker Newsu, umjesto na temelju stvarnih metrika performansi za njihov specifični dataset. To je intelektualna lijenost, i ona se plaća.
Naš Master Zakon ne rješava samo problem hardkodiranja. On nameće disciplinu da se odabir modela radi svjesno, na razini deploymenta, a ne na razini koda. To znači da svaki put kada se servis pokreće, netko mora eksplicitno reći: "Za ovaj workload, koristim ovaj model, i evo zašto." Ta eksplicitnost tjera na promišljanje. A promišljanje, u svijetu token ekonomije, nije luksuz. To je jedini način da ostanete profitabilni. Jer LLM troškovi nisu linearni. Oni su eksponencijalni s obzirom na veličinu modela i količinu prometa. Jedna greška u konfiguraciji, jedan krivi string, i vaš mjesečni račun za inference može eksplodirati bez ikakvog upozorenja.
Danas, svaki novi servis koji puštamo u produkciju prolazi kroz cost review. Ne pitamo samo "radi li?" nego "koliko košta po upitu?" i "koji je najjeftiniji model koji to radi?" To je kultura koja se gradi polako, kroz incidente poput ovog. Nema sramote u grešci, ali postoji sramota u ponavljanju iste greške. Zato smo napisali pre-commit grep koji traži bilo koji string koji izgleda kao model name iz bilo kojeg većeg providera. OpenAI, Anthropic, Google, Mistral, Groq, svi su na listi. Ako grep nađe match, commit staje. To nije kontrola kvalitete, to je ekonomska samoobrana.
Na kraju, ova priča nije o tehnologiji. To je o ljudskom faktor u inženjeringu. Svi smo mi lijeni, svi tražimo prečace, svi mislimo da će "samo ovaj put" proći. Ali u svijetu gdje jedan string od 10 znakova može koštati 3.000 dolara godišnje, lijenost nije mana. To je luksuz koji si ne možemo priuštiti. Master Zakon nije napisan zato što volimo pravila. Napisan je zato što volimo novac koji ne moramo bacati kroz prozor. Ako vaš kod još uvijek sadrži hardkodirani model name, pitajte se koliko vas taj string zapravo košta. I nemojte brojati samo današnji dan. Brojite sljedećih dvanaest mjeseci. Jer brojke ne lažu, čak ni kad dokumentacija šuti.
Ovo gradimo svaki dan na RiNET-u.
Ako tvoja institucija, banka, osiguranje ili infrastrukturna firma rješava taj tip problema — zakaži razgovor. Pokazat ćemo ti arhitekturu, ne marketing.
Zanima vas ovakva AI tehnologija?
RiNET gradi sovereign AI rjesenja za javni sektor i poduzeca - od civic intelligence do automatizacije nabave.
Kontaktirajte nas →
Komentari