Na początku przygody z automatyzacją opartą o AI nikt nie liczy tokenów. Kilka wywołań dziennie, może kilkadziesiąt. Rachunek miesięczny mieści się w granicach kawy z croissantem. Człowiek macha ręką i wraca do kodowania.
Problem w tym, że dobre automatyzacje mają tendencję do rozrastania się jak bambus w ciepłe lato. To co zaczęło się od jednego agenta klasyfikującego maile, po pół roku zamienia się w orkiestrę dwudziestu procesów przetwarzających setki tysięcy rekordów. A potem OpenAI podnosi ceny o 40% i nagle zaczynasz się zastanawiać, czy naprawdę potrzebujesz flagowego modelu do sprawdzania, czy pracownik napisał „dziękuję" czy „dziekuje".
Przy zużyciu przekraczającym miliony tokenów miesięcznie taka podwyżka przestaje być abstrakcją. Staje się tematem rozmów na spotkaniach zarządu.
Cztery sposoby na odchudzenie rachunku
Zanim rzucisz się do refaktoryzacji całego systemu, rozważ kilka opcji - od najbardziej oczywistych po te, które wymagają chwili namysłu:
Klasyczne algorytmy zamiast AI. To tak naprawdę powinno być sprawdzone przed wdrożeniem, ale warto wrócić do tematu. Jeśli klasyfikujesz teksty po słowach kluczowych, a 80% przypadków to warianty „super", „ok" i „tragedia" - może wystarczy prosty regex? LLM to kombajn. Nie trzeba go używać do krojenia chleba.
Mniejszy model. Największy nie znaczy najlepszy do każdego zadania. Często dopiero po czasie orientujemy się, że armata była zbędna, a pistolecik dowozi wynik równie celnie, tyle że dziesięć razy taniej.
Optymalizacja promptów. Każde zbędne słowo to tokeny. Każdy token to pieniądze. Przejrzyj swoje instrukcje i wyrzuć akademickie ozdobniki. Model nie potrzebuje grzeczności.
Cache. I tu zatrzymajmy się na dłużej.
Cache, czyli pamięć słonia
Cacheowanie w kontekście AI działa na dwóch poziomach. Pierwszy to ten oczywisty - własna pamięć podręczna na wyniki.
Załóżmy, że masz agenta klasyfikującego wypowiedzi z ankiet satysfakcji. Każda wypowiedź leci do API, wraca kategoria. Proste. Ale jeśli przeanalizujesz dane, możesz odkryć, że „Wszystko super" pojawia się 47 razy, „Nie mam uwag" - 89 razy, a warianty „OK" z różną liczbą literek O i K stanowią osobną epidemię.
Po co płacić za analizę tego samego tekstu wielokrotnie? Wystarczy prosta tablica hash: klucz to znormalizowana wypowiedź, wartość to wynik klasyfikacji. Przed każdym wywołaniem sprawdzasz cache. Trafienie? Zwracasz natychmiast. Pudło? Wysyłasz do API i zapisujesz wynik na przyszłość.
Zysk jest podwójny: płacisz mniej i dostajesz odpowiedź szybciej. Pod warunkiem oczywiście, że twój cache nie kosztuje więcej niż zaoszczędzone tokeny - ale jeśli używasz Redis czy zwykłej bazy danych, ten warunek jest zazwyczaj spełniony z ogromnym zapasem.
Prompt cache - magia po stronie dostawcy
Drugi poziom to mechanizm wbudowany w API OpenAI i Anthropic. I tu robi się ciekawie.
Zauważ, że w typowej automatyzacji masz stały prompt systemowy (instrukcje dla agenta) i zmienne dane wejściowe. Przy każdym wywołaniu model musi przetworzyć całą instrukcję od nowa, nawet jeśli widział ją sekundę wcześniej.
Prompt cache rozwiązuje ten problem. Jeśli spełnisz warunki:
- prompt ma minimum 1024 tokeny,
- początek promptu jest identyczny między wywołaniami,
...to API może wykorzystać wcześniej przetworzoną wersję instrukcji. Nie dostajesz wyniku z cache - model wciąż analizuje twoje dane - ale wstępne przetwarzanie promptu jest szybsze i tańsze.
Jak tańsze? Tokeny cacheowane kosztują około dziesięć razy mniej niż standardowe. Przy dużej skali to różnica między „nieźle", a „wow".
Jak konstruować prompty pod cache
Zasada jest prosta: stałe na początku, zmienne na końcu.
[INSTRUKCJA SYSTEMOWA - stała, długa, powtarzalna]
[KONTEKST POMOCNICZY - jeśli potrzebny]
[DANE DO ANALIZY - zmienne]
Zwiększamy szanse na trafienie
Sam fakt spełnienia warunków nie gwarantuje, że każde wywołanie skorzysta z cache. Mechanizmy OpenAI nie zawsze mają nasz prompt w pamięci, a nawet jeśli mają - nie zawsze na niego trafią.
Możemy jednak pomóc:
Prompt key. Nadaj unikalny identyfikator dla każdego typu promptu i przekazuj go w polu prompt_key. Dla agenta klasyfikującego wypowiedzi może to być "kategoryzacja_wypowiedzi_v1". Dzięki temu API wie, że te wywołania należą do jednej rodziny i powinny współdzielić cache.
Czas retencji. Dla wybranych modeli (polecam sprawdzić w dokumentacji OpenAI) możesz określić, jak długo cache powinien być utrzymywany.
Czy to się opłaca?
Zależy od skali. Przy kilkuset wywołaniach dziennie różnica będzie symboliczna. Przy milionach - znacząca.
Ale nawet przy małej skali warto wyrobić sobie nawyk. Koszty API mają tendencję do zaskakiwania. Lepiej mieć system przygotowany na wzrost niż refaktoryzować w panice, gdy przyjdzie faktura z większą liczbą zer niż zwykle.
A przede wszystkim - cache to nie tylko oszczędność. To też szybkość. A szybkość w automatyzacjach to często różnica między „działa", a „działa i ludzie chcą tego używać".
Przy okazji: jeśli ktoś zna sposób na cache'owanie dziewczyny, żeby wyłączała światło - jestem otwarty na sugestie. 🤣


