W moim produkcie każde pytanie do asystenta AI trafia do modelu razem z instrukcją i opisami narzędzi. We wrześniowym pomiarze ta stała część miała ponad 38 tysięcy tokenów: około 24 tysiące instrukcji i prawie 15 tysięcy opisów narzędzi. Zmienna część, czyli bieżąca rozmowa, jest dużo krótsza.
Kiedy stała część stoi na początku, Gemini może ją ponownie wykorzystać z cache. Model nadal dostaje cały kontekst, ale część tokenów jest rozliczana według niższej stawki.
Cache liczy się od początku
Długą, wspólną instrukcję umieszczam na początku zapytania, a wszystko, co zmienia się między zapytaniami, dopiero po niej. Jeśli zmienny fragment trafi w środek instrukcji, wspólny początek robi się krótszy. Odpowiedź modelu wygląda wtedy tak samo dobrze, więc po samym tekście tego nie widać.
Google zaleca taki układ dla implicit caching. Wspólny początek nie gwarantuje jednak trafienia w cache: liczą się też długość kontekstu i odstęp między zapytaniami. Dlatego liczbę tokenów z cache sprawdzam w metadanych odpowiedzi. Szczegóły: dokumentacja Gemini.
- 90%minimalny udział wspólnego początku w moim teścietest układu tekstu, nie wskaźnik trafień w cache
- 38,5 tys.tokenów w stałej części czatupomiar z września 2026
Pilnuje tego test, nie pamięć
Regułę, o której trzeba pamiętać, prędzej czy później ktoś złamie. U mnie dużą część kodu piszą agenci AI, a oni nie pamiętają niczego, czego nie mają zapisanego. Dlatego jest test: buduje prompt dla dwóch różnych zapytań i sprawdza, jaka część jest wspólna. Próg to 90%. Zmierzone wartości są wyższe, od 94 do 100%, bo zmienna część ma prawo urosnąć. Nie ma prawa tylko przewędrować na początek.
TypeScript
/** Share of the longer prompt covered by the common prefix (0–1). */
export const sharedPrefixRatio = (a: string, b: string): number => {
const longer = Math.max(a.length, b.length);
const limit = Math.min(a.length, b.length);
let i = 0;
while (i < limit && a[i] === b[i]) i++;
return longer === 0 ? 1 : i / longer;
};
Deno.test("two requests share the start of the prompt", () => {
const first = buildPrompt(requestA);
const second = buildPrompt(requestB);
assert(sharedPrefixRatio(first, second) >= 0.9);
});Dwie rzeczy przy okazji
Cennik modeli trzymam w kodzie z datami, bo dostawcy zmieniają stawki i zapowiadają podwyżki z wyprzedzeniem. Przy porządkowaniu go znalazłem błąd, przez który raport kosztów pokazywał dwa razy więcej, niż naprawdę płaciłem.
Druga sprawa to budżet na „myślenie” modelu. Ustawiłem go na podstawie 88 prawdziwych zapytań z produkcji, a nie na oko. Zniknęły puste odpowiedzi, a razem z nimi kosztowne ponowienia.
Jeśli używacie AI w firmie
Sprawdźcie, gdzie w waszych promptach stoi zmienna część: treść pytania, dokument do analizy albo opis produktu. Jeśli w środku instrukcji, prawdopodobnie płacicie kilka razy za to samo. Dostawcy zwracają w odpowiedzi liczbę tokenów, które przyszły z cache. Wystarczy ją zapisywać i co jakiś czas sprawdzać.
