Optymalizacja kosztów API modeli AI - cache, dobór modelu, tryb wsadowy i kompresja kontekstu
POWRÓT_DO_BLOGA
Aktualizacja: AI & Automatyzacja 11 min

Optymalizacja kosztów API modeli AI - cache, dobór modelu, tryb wsadowy i kompresja kontekstu

Paweł Wiszniewski
Paweł Wiszniewski
Specjalista SEO & GEO · AI Engineer

Projekt AI działa, testy przeszły, wdrożenie na produkcję - i po miesiącu rachunek za API jest kilka razy wyższy niż w budżecie. Zwykle nie winna jest cena modelu, tylko to, co wysyłasz przy każdym wywołaniu: długi prompt systemowy, definicje narzędzi, rosnąca historia rozmowy i fragmenty dokumentów. Pięć technik - cache, dobór modelu do zadania, tryb wsadowy, kompresja kontekstu i limity - potrafi obniżyć rachunek o połowę albo bardziej bez pogorszenia jakości, a cache sam w sobie tnie koszt powtarzanego kontekstu o 90-97,5%.

Jak obniżyć rachunek za API OpenAI, Claude i Gemini bez utraty jakości: rozbicie kosztu jednego wywołania przed i po (-68%), cache u trzech dostawców, dobór modelu, tryb wsadowy i Flex, kompresja historii i plan na dwa tygodnie.

W tym wpisie pokazuję, skąd biorą się koszty, jak działa cache u OpenAI, Anthropic i Google, jak dobierać model do zadania, kiedy używać trybu wsadowego, jak kompresować historię rozmowy i jak monitorować wydatki. Na przykładzie jednego wywołania agenta rozkładam koszt przed i po optymalizacji.

Skąd biorą się koszty

Każde wywołanie to tokeny wejściowe (prompt systemowy, definicje narzędzi, historia, kontekst z bazy wiedzy, wiadomość użytkownika) i tokeny wyjściowe (odpowiedź). Wyjście jest zwykle około 5 razy droższe za token, ale w aplikacjach z czatem i agentami to wejście stanowi większość rachunku, bo te same elementy wysyłasz przy każdym kroku.

Typowy rozkład tokenów wejściowych w aplikacji agentowej:

  • Prompt systemowy - kilkaset do kilku tysięcy tokenów, taki sam przy każdym wywołaniu.
  • Definicje narzędzi - od 100 do kilkuset tokenów na narzędzie, wysyłane zawsze.
  • Historia rozmowy - rośnie z każdą turą.
  • Kontekst z bazy wiedzy - od kilkuset do kilku tysięcy tokenów.
  • Wiadomość użytkownika - zwykle najmniejsza część.

/// OPTYMALIZACJA KOSZTU WYWOŁANIA API

Koszt 1000 wywołań agenta na GPT-6.1 Sol - przed i po optymalizacji

PRZED OPTYMALIZACJĄ
Prompt systemowy (3000 tok)$6.00
Definicje 12 narzędzi (2400 tok)$4.80
Historia 9 tur (5400 tok)$10.80
Kontekst z bazy wiedzy (3000 tok)$6.00
Wiadomość i odpowiedź (100 + 500 tok)$5.20
SUMA / 1000 WYWOŁAŃ$32.80
PO OPTYMALIZACJI
Prompt systemowy z cachecached$0.30
4 potrzebne narzędzia z cachecached$0.10
Podsumowanie + 3 ostatnie tury (2200 tok)$4.40
3 najlepsze fragmenty (1200 tok)$2.40
Wiadomość i krótsza odpowiedź$3.20
SUMA / 1000 WYWOŁAŃ$10.40
-68%
REDUKCJA KOSZTÓW
95%
TANIEJ TOKENY Z CACHE
TEN SAM
MODEL BEZ ZMIAN

Rozbicie jednego wywołania - przed i po

Przykład: agent obsługi klienta na modelu GPT-6.1 Sol ($2 za milion tokenów wejścia, $10 za milion wyjścia, odczyt z cache $0,10). Dziesiąta tura rozmowy:

ElementTokeny przedKoszt przedPo optymalizacjiKoszt po
Prompt systemowy3 000$0,00603 000 z cache$0,0003
Definicje 12 narzędzi2 400$0,00484 potrzebne narzędzia, z cache$0,0001
Historia 9 tur5 400$0,0108podsumowanie 400 + ostatnie 3 tury 1 800$0,0044
Kontekst z bazy wiedzy3 000$0,00603 najlepsze fragmenty, 1 200$0,0024
Wiadomość i odpowiedź100 + 500$0,0052100 + 300 (limit długości)$0,0032
Razem14 400$0,0328$0,0104

Przy 100 000 takich wywołań miesięcznie to różnica między około $3 280 a $1 040 - o 68% mniej, bez zmiany modelu. Dodatkowe przejście prostych zapytań na tańszy model obniża rachunek jeszcze bardziej.

Cache - największa i najtańsza oszczędność

Cache pozwala nie płacić pełnej ceny za ten sam początek promptu w kolejnych wywołaniach. Działa u wszystkich trzech dużych dostawców, ale na różnych zasadach:

DostawcaJak włączyćMinimalna długośćCena odczytu z cacheJak długo działa
OpenAIAutomatycznie1 024 tokeny10% ceny wejścia (5% w GPT-6.1 Sol)Co najmniej 30 minut w najnowszych modelach, w starszych 5-10 minut lub do 24 godzin
AnthropicAutomatycznie albo przez cache_controlzależnie od modelu10% ceny wejścia (5% w Opus 5.5, 2,5% w Fable 5.1)5 minut lub 1 godzina
Google GeminiAutomatycznie w Gemini 2.5 i nowszych, ręcznie przez cache kontekstu2 048-4 096 tokenówniższa cena za tokeny z cachezależnie od ustawień

Zapis do cache bywa nieco droższy niż zwykłe wejście (u OpenAI i Anthropic 1,25 ceny), więc cache opłaca się już po pierwszym ponownym użyciu.

Najważniejsza zasada: stałe elementy na początku, zmienne na końcu. Kolejność w prompcie:

  1. 1.Prompt systemowy - stały dla całej aplikacji.
  2. 2.Definicje narzędzi - stałe.
  3. 3.Dokumenty kontekstowe - stałe w ramach sesji.
  4. 4.Historia rozmowy - zmienia się z każdą turą.
  5. 5.Wiadomość użytkownika - zawsze nowa.

Częsty błąd: wstawianie daty, identyfikatora sesji albo imienia użytkownika do promptu systemowego. Każda taka zmiana unieważnia cache. Przenieś te dane na koniec, do wiadomości użytkownika.

prompt_caching.py
from openai import OpenAIfrom anthropic import AnthropicSYSTEM_PROMPT = "Jesteś asystentem obsługi klienta firmy Acme. [...stały opis produktów, procedur i cennika...]"def chat_openai(history: list, message: str):    r = OpenAI().chat.completions.create(        model="gpt-6.1-sol",        messages=[{"role": "system", "content": SYSTEM_PROMPT}, *history, {"role": "user", "content": message}],    )    details = r.usage.prompt_tokens_details    return r.choices[0].message.content, {"input": r.usage.prompt_tokens, "cached": details.cached_tokens if details else 0}def chat_anthropic(history: list, message: str):    r = Anthropic().messages.create(        model="claude-sonnet-5-5",        max_tokens=1024,        system=[{"type": "text", "text": SYSTEM_PROMPT, "cache_control": {"type": "ephemeral"}}],        messages=[*history, {"role": "user", "content": message}],    )    return r.content[0].text, {"input": r.usage.input_tokens, "cached": r.usage.cache_read_input_tokens}

Loguj liczbę tokenów z cache przy każdym wywołaniu i licz odsetek trafień. Jeśli spada, zwykle ktoś dodał zmienny element na początek promptu.

Właściwy model do zadania

Najtańsze modele kosztują dziś 10-30 centów za milion tokenów wejściowych, a najmocniejsze 2-10 dolarów. W typowej aplikacji biznesowej większość zapytań to proste zadania - klasyfikacja, krótkie odpowiedzi z dostarczonego kontekstu, wyciąganie danych - które tani model wykona równie dobrze.

  • Tania półka (GPT-6 Luna, Gemini 3.1 Flash-Lite, Claude Haiku 4.5) - klasyfikacja, routing, proste FAQ, ekstrakcja danych ze schematem.
  • Środkowa półka (GPT-6.1 Sol, Claude Sonnet 5.5, Gemini 3.8 Flash) - analiza dokumentów, odpowiedzi wpływające na decyzję klienta, generowanie treści.
  • Najmocniejsze modele (GPT-6 Astra, Claude Opus 5.5, Gemini 3.1 Pro) - tylko najtrudniejsze, wieloetapowe kroki, gdzie błąd kosztuje więcej niż wywołanie.

Router, w którym tani model decyduje, która półka jest potrzebna, oraz test wyboru modelu na własnych danych opisuję szczegółowo we wpisie jak wybrać model LLM. Zanim przełączysz ruch na tańszy model, uruchom go przez tydzień w trybie cienia: odpowiedź nadal daje mocniejszy model, a tańszy generuje swoją w tle do porównania.

/// STRATEGIA ROUTINGU MODELI

Routing zapytań — rozkład ruchu w typowej aplikacji B2B

INPUT QUERY→CLASSIFIER (CHEAP MODEL, ~20 TOK)→ROUTE TO MODEL
65%
Proste zadania→GPT-6 Luna · Gemini 3.1 Flash-Lite · Claude Haiku 4.5$0.10-1 / 1M tok
FAQ, klasyfikacja, ekstrakcja, podsumowanie krótkich tekstów
30%
Złożone zadania→GPT-6.1 Sol · Claude Sonnet 5.5 · Gemini 3.8 Flash$0.75-2 / 1M tok
Analiza dokumentów, generowanie kodu, wieloetapowe instrukcje
5%
Najtrudniejsze kroki→GPT-6 Astra · Claude Opus 5.5 · Gemini 3.1 Pro$2-10 / 1M tok
Wieloetapowe zadania agentów, złożony kod, decyzje o wysokiej stawce
$1.17
ŚREDNI KOSZT 1M TOK. WEJŚCIA (Z ROUTINGIEM)
-42%
VS $2 ZA WSZYSTKO NA GPT-6.1 SOL
+1
TANIE WYWOŁANIE KLASYFIKATORA

Tryb wsadowy i Flex - połowa ceny za cierpliwość

Zadania, które nie muszą być wykonane od razu, możesz wysłać w trybie wsadowym (Batch API). OpenAI, Anthropic i Google dają w nim 50% zniżki, a wyniki zwykle wracają w ciągu doby. To dobre rozwiązanie do generowania opisów produktów, klasyfikacji archiwum dokumentów, nocnych raportów czy ewaluacji.

OpenAI ma też tryb Flex - pojedyncze zapytania w cenach trybu wsadowego, ale z dłuższym czasem odpowiedzi i ryzykiem chwilowej niedostępności. Pasuje do zadań w tle, które mogą poczekać i być ponowione.

Rabaty się sumują: zadanie w trybie wsadowym z promptem w cache kosztuje ułamek ceny standardowej.

Kompresja kontekstu - zatrzymaj rosnący rachunek

W agentach i czatach historia rośnie z każdą turą. Trzy strategie, od najprostszej:

  • Okno przesuwne. Wysyłasz tylko ostatnie N wiadomości. Zero dodatkowych kosztów, ale model zapomina początek rozmowy. Dobre, gdy starszy kontekst ma małe znaczenie.
  • Podsumowanie. Co kilka tur tani model streszcza starszą część rozmowy do kilkuset tokenów, a ostatnie tury zostają w całości. Zachowuje kluczowe fakty przy dużej oszczędności.
  • Wybór po trafności. Do kontekstu trafiają tylko te wcześniejsze fragmenty, które są najbliższe bieżącemu pytaniu (porównanie embeddingów). Najbardziej precyzyjne przy bardzo długich i różnorodnych sesjach.
context_compression.py
from openai import OpenAI

def compress_history(history: list[dict], keep_last: int = 6, max_words: int = 200) -> list[dict]: if len(history) <= keep_last: return history old, recent = history[:-keep_last], history[-keep_last:] text = "\n".join(f"{m['role']}: {m['content']}" for m in old) r = OpenAI().chat.completions.create( model="gpt-6-luna", messages=[ {"role": "system", "content": f"Streść rozmowę w maksymalnie {max_words} słowach. Zachowaj fakty, ustalenia i otwarte sprawy, pomiń powitania."}, {"role": "user", "content": text}, ], ) summary = r.choices[0].message.content return [{"role": "user", "content": f"[Podsumowanie wcześniejszej rozmowy] {summary}"}, *recent]

Podsumowanie wstawiaj po stałej części promptu, żeby nie psuć cache. Jakość sprawdzaj na zestawie testowym: porównaj odpowiedzi z pełną i skompresowaną historią. Więcej o zarządzaniu kontekstem agentów piszę we wpisie o context engineering.

Limity i monitoring

  • Limit długości odpowiedzi dopasowany do zadania, zamiast domyślnego.
  • Tylko potrzebne narzędzia w danym kroku - każda definicja to tokeny przy każdym wywołaniu.
  • Krótszy prompt systemowy - usuń powtórzenia i instrukcje, które nie zmieniają wyników.
  • Budżet na zadanie i na użytkownika - zabezpieczenie przed pętlą agenta, która w nocy wygeneruje wysoki rachunek.
  • Koszt na punkt końcowy - loguj tokeny i koszt każdego wywołania (własne logi albo narzędzia takie jak Helicone czy Langfuse) i ustaw alert, gdy koszt jednego zapytania przekroczy próg.

Plan na dwa tygodnie

KrokTrudnośćTypowa oszczędnośćCzas
Analiza logów - które 20% wywołań generuje 80% kosztówNiskaWskazuje, od czego zacząćpół dnia
Uporządkowanie promptu pod cacheNiskaDo 90% kosztu stałej części wejścia2-4 godziny
Limit długości odpowiedzi i usunięcie zbędnych narzędziNiska10-30%1-2 godziny
Kompresja historiiŚredniaZnaczna przy długich sesjach1 dzień
Tańszy model dla prostych zapytańŚredniaDuża na przeniesionych zapytaniach2-3 dni z testem w trybie cienia
Tryb wsadowy dla zadań w tleNiska50% na tych zadaniachkilka godzin
Monitoring kosztów z alertamiNiskaZapobiega niespodziankomkilka godzin

---

Przeprowadzam audyty kosztów AI: analizuję logi wywołań, wskazuję, gdzie ucieka budżet, i wdrażam cache, dobór modeli, kompresję kontekstu i monitoring. Robię to w ramach budowy aplikacji AI i doradztwa AI. Napisz do mnie - zaczynam od analizy Twoich logów API.

Warto przeczytać dalej:

/// AUTHOR
Paweł Wiszniewski – AI & Web Engineer

Paweł Wiszniewski

SEO & GEO Specialist & AI Engineer

Specjalista SEO/GEO (10 lat) i AI engineer (3 lata). Buduję widoczność w wyszukiwarkach, systemy AI i automatyzacje, które redukują koszty i zwiększają efektywność operacyjną firm.

Signal received?

Przerwij
Ciszę

Zainicjuj protokół. Nawiąż połączenie. Zbudujmy coś głośnego.

> OCZEKIWANIE_NA_SYGNAŁ...