Nasz test A/B, w pełni jawny. Zmierz nas.
Publikujemy każdy przebieg: cztery baterie na publicznych zbiorach danych, 10 modeli, a oba ramiona mierzone własnym licznikiem zużycia dostawcy. Każda liczba niesie swoje n, swój przedział i swoją datę. To, co nie oszczędza, też jest tutaj.
- baterie
- 4
- przetestowane modele
- 10
- modele z pomiarem
- 10
- raporty na żywo
- 15
- ostatni przebieg
- 29 wrz 2026
Co jest mierzone i jak
- Dwa ramiona, to samo żądanie. A trafia bezpośrednio do dostawcy, bez warstwy; B przechodzi przez warstwę z jej domyślną konfiguracją. Ten sam prompt, to samo próbkowanie, ten sam limit odpowiedzi.
- Koszt liczy dostawca. Każde ramię jest wyceniane na podstawie
usagezwracanego przez API przy każdym wywołaniu, w cenie cennikowej. Oszczędność to 1 − koszt(B) / koszt(A) tego samego przebiegu, a nie to, co warstwa mówi sama o sobie. - Przedziały na poziomie 95%. Oblicza je każdy harness (resampling całych rodzin pytań, Wilson dla odsetka odmów). Przedział przecinający zero oznacza „nieodróżnialne od zera” i tak to opisujemy.
- Pakiet, który instalujesz. Ramię B uruchamia źródło znacznika 0.4.31; jego
dist/index.jsjest identyczny bit po bicie z tym z paczki npm (sha256b52f99cacf9804ecd3153e56f26ec3adcdc2510d52a8446a369ecf914e0b5731). - Bez skrótów. Każdy harness obserwuje hosty, z którymi się komunikuje, i ma w kodzie zapisany limit wydatków na model. Model, którego nie udało się zmierzyć, jest raportowany jako „niezmierzony”, wraz z powodem.
Cztery baterie testów, publiczne zbiory danych, przypięte
| Bateria | Co sprawdza | Zbiór danych | Przypięte pliki | Licencja |
|---|---|---|---|---|
| GSM8K | Zadania tekstowe z matematyki z powtórzeniami i parafrazami: ile oszczędza pamięć podręczna i czy spada dokładność. | openai/grade-school-mathcommit 3101c7d5072418e28b9008a6636bde82a006892c | gsm8k-test sha256 3730d312f6e3440559ace48831e51066acaca737f6eabec99bccb9e4b3c39d14gsm8k-trainsha256 17f347dc51477c50d4efb83959dbb7c56297aba886e5544ee2aaed3024813465 | MIT |
| BFCL | Wywołania narzędzi: warstwa nie może zmienić żadnego z nich, a cały katalog musi dotrzeć. | ShishirPatil/gorillacommit f7cf7359b7ac615a0b294831c5ba2bc95ee4a000 | przypięte do commita | Apache-2.0 |
| XSTest | Odmowy: warstwa nie może zmienić momentu, w którym model odmawia, ani podać odmowy z pamięci podręcznej. | paul-rottger/exaggerated-safetycommit d7bb5bd738c1fcbc36edd83d5e7d1b71a3e2d84d | xstest_prompts.csv sha256 11783fb294ed017473ee53c207d71f2161c7672c8d0b037501e78387f801cb5a | CC-BY-4.0 |
| MT-Bench | Czat dwuturowy bez powtórzeń: warstwa nie może pogorszyć kosztu, opóźnienia ani jakości. | lm-sys/FastChatcommit 587d5cfa1609a43d192cedb8441cac3c17db105d | question.jsonl sha256 119565adbab82227089cefdb44c8d7e2cf04dc0a0ec233634c82e7d4e2a944f7gpt-4.jsonlsha256 f957a5bc977badb66885ec970e6cd08527845780313f0995764260e5777b9b3fjudge_prompts.jsonlsha256 fd283293406d024f44c174b094ef48031d0687a4682fd3a56b29b138f80281b6 | Apache-2.0 |
Zmierzona oszczędność na model
GSM8K, przy strumieniu żądań, w którym 30% to dokładne powtórzenia, a 20% to parafrazy. To bateria z powtarzającym się ruchem: twoja oszczędność zależy od tego, jak bardzo powtarza się twój ruch. Bez powtórzeń zobacz „To, co nie oszczędza”.
| Model | n | Zmierzona oszczędność [PU] | Z dokładnej pamięci podręcznej | W wywołaniach (prefiks) | Dokładność A → B | Wersja · data |
|---|---|---|---|---|---|---|
openai/gpt-4o-mini | 200 żądań · 100 unikalnych | 31,5% [25,7% – 36,7%] | 0,0124 USD | 0,0006 USD | 95,0% → 96,1%Δ +1,1 pp [0,0, +2,8] | 0.4.31 · 28 wrz 2026 |
openai/gpt-5.4-mini | 176 żądań · 88 unikalnych | 31,7% [25,6% – 37,6%] | 0,0734 USD | 0,0003 USD | 95,6% → 93,7%Δ -1,9 pp [-5,0, 0,0] | 0.4.31 · 28 wrz 2026 |
openai/gpt-5.5 | 22 żądań · 11 unikalnych | 33,4% [6,8% – 53,8%] | 0,0790 USD | -0,0023 USD | 100,0% → 100,0%Δ 0,0 pp [0,0, 0,0] | 0.4.31 · 28 wrz 2026 |
openai/gpt-5.6-sol | 32 żądań · 16 unikalnych | 29,2% [9,5% – 46,8%] | 0,0252 USD | -0,0003 USD | 100,0% → 100,0%Δ 0,0 pp [0,0, 0,0] | 0.4.31 · 28 wrz 2026 |
anthropic/claude-haiku-4-5 | 116 żądań · 58 unikalnych | 32,2% [23,6% – 40,2%] | 0,0773 USD | 0,0002 USD | 99,0% → 99,0%Δ 0,0 pp [0,0, 0,0] | 0.4.31 · 28 wrz 2026 |
anthropic/claude-opus-5-5 | 32 żądań · 16 unikalnych | 77,2% [67,1% – 83,9%] | 0,0974 USD | 0,1391 USD | 100,0% → 100,0%Δ 0,0 pp [0,0, 0,0] | 0.4.31 · 28 wrz 2026 |
anthropic/claude-sonnet-5 | 62 żądań · 31 unikalnych | 75,1% [69,3% – 79,6%] | 0,1054 USD | 0,1313 USD | 100,0% → 100,0%Δ 0,0 pp [0,0, 0,0] | 0.4.31 · 28 wrz 2026 |
anthropic/claude-sonnet-5-5 | 62 żądań · 31 unikalnych | 77,5% [72,0% – 81,7%] | 0,0924 USD | 0,1289 USD | 100,0% → 100,0%Δ 0,0 pp [0,0, 0,0] | 0.4.31 · 28 wrz 2026 |
google/gemini-3.1-pro-preview | warstwa zawiodła: żądania nie przeszły przez warstwę | 0.4.31 · 28 wrz 2026 | ||||
google/gemini-3.8-flash | warstwa zawiodła: żądania nie przeszły przez warstwę | 0.4.31 · 28 wrz 2026 | ||||
Skąd bierze się oszczędność, pozycja po pozycji: „z dokładnej pamięci podręcznej” to to, co zapłaciło A za żądania, które warstwa obsłużyła bez wywoływania dostawcy; „w wywołaniach” to różnica w tych, które faktycznie do niego dotarły, głównie dzięki pamięci podręcznej prefiksów dostawcy (plus trochę zmienności wyniku). Obie sumują się na całkowitą oszczędność.
Dokładność jest mierzona na pytaniach z opublikowaną odpowiedzią; warianty ze zmienioną liczbą służą wyłącznie do sprawdzenia, czy warstwa nigdy nie zwraca odpowiedzi z innego pytania.
Gwarancje, policzone
Warstwa nigdy nie zmieniła wywołania narzędzia
0 zmienionych wywołań w 1325 porównaniach BFCL, 6 modeli, od 0.4.31. Jeśli warstwa zawodzi (błąd w B, którego nie było w A), nie liczy się to tutaj: znajduje się w „Błędach znalezionych przez test”.
Żadnej odpowiedzi z innego pytania od 0.4.31
0 z 198 wariantów (to samo pytanie z inną liczbą, a więc inną odpowiedzią) podanych z odpowiedzią z innego pytania, na 8 modelach na żywo i we wszystkich zmierzonych konfiguracjach pamięci podręcznej.
Odtworzenie offline całego zbioru testowego GSM8K: 0 w 5813 żądaniach, w każdej z 5 konfiguracji pamięci podręcznej.
Ten sam odsetek odmów, z warstwą i bez niej
XSTest, zmierzono 10 modeli: brak różnicy A/B poniżej p = 0,05 (McNemar, sparowane prompty). Warstwa dostarczyła tekst 4668 odpowiedzi bez zmian (0 zmienionych).
| Model | Prompty | Odmowy, prompty bezpieczne (A → B) | Odmowy, prompty niebezpieczne (A → B) | Wersja · data |
|---|---|---|---|---|
openai/gpt-4o-mini | 450 | 5,2% → 5,2% (n = 250, p = 1,00) | 81,5% → 81,5% (n = 200, p = 1,00) | 0.4.31 · 28 wrz 2026 |
openai/gpt-5.4-mini | 441 | 11,0% → 9,8% (n = 245, p = 0,63) | 87,2% → 86,7% (n = 196, p = 1,00) | 0.4.31 · 28 wrz 2026 |
openai/gpt-5.5 | 120 | 6,3% → 4,7% (n = 64, p = 1,00) | 80,0% → 80,0% (n = 55, p = 1,00) | 0.4.31 · 29 wrz 2026 |
openai/gpt-5.6-sol | 199 | 2,7% → 2,7% (n = 111, p = 1,00) | 75,6% → 76,7% (n = 86, p = 1,00) | 0.4.31 · 29 wrz 2026 |
anthropic/claude-haiku-4-5 | 450 | 1,6% → 2,0% (n = 250, p = 1,00) | 42,5% → 42,5% (n = 200, p = 1,00) | 0.4.31 · 29 wrz 2026 |
anthropic/claude-opus-5-5 | 81 | — | 67,1% → 67,1% (n = 79, p = 1,00) | 0.4.31 · 29 wrz 2026 |
anthropic/claude-sonnet-5 | 264 | 2,7% → 2,0% (n = 147, p = 1,00) | 68,4% → 71,8% (n = 117, p = 0,34) | 0.4.31 · 29 wrz 2026 |
anthropic/claude-sonnet-5-5 | 311 | 1,5% → 0,0% (n = 135, p = 0,50) | 64,3% → 65,3% (n = 98, p = 1,00) | 0.4.31 · 29 wrz 2026 |
google/gemini-3.1-pro-preview | 58 | 0,0% → 0,0% (n = 32, p = 1,00) | 80,8% → 84,6% (n = 26, p = 1,00) | 0.4.31 · 29 wrz 2026 |
google/gemini-3.8-flash | 450 | 0,4% → 0,4% (n = 249, p = 1,00) | 67,8% → 66,8% (n = 199, p = 0,73) | 0.4.31 · 29 wrz 2026 |
To, co nie oszczędza
Bez powtórzeń oszczędność wynosi ≈ 0%. Publikujemy to mimo wszystko, ponieważ tak wygląda sytuacja, gdy twój ruch się nie powtarza.
MT-Bench to czat dwuturowy ze świeżą warstwą przy każdym pytaniu: nie ma nic, co pamięć podręczna mogłaby ponownie wykorzystać, a prompt niemal nigdy nie osiąga minimum wymaganego przez dostawcę do zapisania prefiksu w pamięci podręcznej. W BFCL każde wywołanie narzędzia jest inne. To, co mierzą te dwie baterie, to fakt, że warstwa niczego nie pogarsza; pozostała różnica kosztów to szum w wyniku modelu, a nie warstwa.
| Bateria | Model | n | Zmierzona oszczędność [PU] | Interpretacja | Wersja · data |
|---|---|---|---|---|---|
| BFCL | openai/gpt-4o-mini | 400 pozycji | 0,1% [0,0% – 0,3%] | nieodróżnialne od zera | 0.4.31 · 28 wrz 2026 |
| BFCL | openai/gpt-5.4-mini | 400 pozycji | -0,2% [-1,0% – 0,5%] | nieodróżnialne od zera | 0.4.31 · 28 wrz 2026 |
| BFCL | anthropic/claude-haiku-4-5 | 48 pozycji | 0,1% [0,0% – 0,2%] | nieodróżnialne od zera | 0.4.31 · 29 wrz 2026 |
| BFCL | anthropic/claude-sonnet-5 | 48 pozycji | 1,5% [-1,6% – 5,8%] | nieodróżnialne od zera | 0.4.31 · 29 wrz 2026 |
| BFCL | google/gemini-3.1-pro-preview | 97 pozycji | 4,8% [-6,6% – 15,6%] | nieodróżnialne od zera | 0.4.31 · 29 wrz 2026 |
| BFCL | google/gemini-3.8-flash | 324 pozycji | -10,7% [-27,8% – 3,2%] | nieodróżnialne od zera | 0.4.31 · 29 wrz 2026 |
| MT-Bench | openai/gpt-4o-mini | 80 pytań | 3,3% [0,8% – 6,0%] | oszczędność · nie do przypisania warstwie | 0.4.31 · 28 wrz 2026 |
| MT-Bench | openai/gpt-5.4-mini | 80 pytań | -3,5% [-8,6% – 1,6%] | nieodróżnialne od zera · nie do przypisania warstwie | 0.4.31 · 28 wrz 2026 |
| MT-Bench | openai/gpt-5.5 | 8 pytań | 2,1% [-4,4% – 9,7%] | nieodróżnialne od zera | 0.4.31 · 29 wrz 2026 |
| MT-Bench | openai/gpt-5.6-sol | 13 pytań | -0,4% [-21,2% – 13,5%] | nieodróżnialne od zera · nie do przypisania warstwie | 0.4.31 · 29 wrz 2026 |
| MT-Bench | anthropic/claude-haiku-4-5 | 80 pytań | -2,6% [-4,6% – -0,9%] | dodatkowy koszt · nie do przypisania warstwie | 0.4.31 · 28 wrz 2026 |
| MT-Bench | anthropic/claude-opus-5-5 | 18 pytań | 1,1% [-2,0% – 4,9%] | nieodróżnialne od zera | 0.4.31 · 29 wrz 2026 |
| MT-Bench | anthropic/claude-sonnet-5 | 23 pytań | 1,7% [-8,9% – 12,7%] | nieodróżnialne od zera | 0.4.31 · 28 wrz 2026 |
| MT-Bench | anthropic/claude-sonnet-5-5 | 37 pytań | -0,8% [-2,5% – 0,9%] | nieodróżnialne od zera | 0.4.31 · 29 wrz 2026 |
Status według modelu i baterii
Każda komórka pokazuje przebieg na najwyższej wersji warstwy. Jeśli modelu nie udało się zmierzyć, podajemy powód zamiast zostawiać puste miejsce.
| Model | GSM8K | BFCL | XSTest | MT-Bench |
|---|---|---|---|---|
openai/gpt-4o-mini | zmierzono · n = 200 0.4.31 · 28 wrz 2026 | zmierzono · n = 400 0.4.31 · 28 wrz 2026 | zmierzono · n = 450 0.4.31 · 28 wrz 2026 | zmierzono · n = 80 0.4.31 · 28 wrz 2026 |
openai/gpt-5.4-mini | zmierzono · n = 176 0.4.31 · 28 wrz 2026 | zmierzono · n = 400 0.4.31 · 28 wrz 2026 | zmierzono · n = 441 0.4.31 · 28 wrz 2026 | zmierzono · n = 80 0.4.31 · 28 wrz 2026 |
openai/gpt-5.5 | zmierzono · n = 22 0.4.31 · 28 wrz 2026 | niezmierzone: limit wydatków wyczerpany 0.4.31 · 29 wrz 2026 | zmierzono · n = 120 0.4.31 · 29 wrz 2026 | zmierzono · n = 8 0.4.31 · 29 wrz 2026 |
openai/gpt-5.6-sol | zmierzono · n = 32 0.4.31 · 28 wrz 2026 | niezmierzone: dostawca odrzucił żądanie w obu ramionach 0.4.31 · 29 wrz 2026 | zmierzono · n = 199 0.4.31 · 29 wrz 2026 | zmierzono · n = 13 0.4.31 · 29 wrz 2026 |
anthropic/claude-haiku-4-5 | zmierzono · n = 116 0.4.31 · 28 wrz 2026 | zmierzono · n = 48 0.4.31 · 29 wrz 2026 | zmierzono · n = 450 0.4.31 · 29 wrz 2026 | zmierzono · n = 80 0.4.31 · 28 wrz 2026 |
anthropic/claude-opus-5-5 | zmierzono · n = 32 0.4.31 · 28 wrz 2026 | niezmierzone: limit wydatków wyczerpany 0.4.31 · 29 wrz 2026 | zmierzono · n = 81 0.4.31 · 29 wrz 2026 | zmierzono · n = 18 0.4.31 · 29 wrz 2026 |
anthropic/claude-sonnet-5 | zmierzono · n = 62 0.4.31 · 28 wrz 2026 | zmierzono · n = 48 0.4.31 · 29 wrz 2026 | zmierzono · n = 264 0.4.31 · 29 wrz 2026 | zmierzono · n = 23 0.4.31 · 28 wrz 2026 |
anthropic/claude-sonnet-5-5 | zmierzono · n = 62 0.4.31 · 28 wrz 2026 | niezmierzone: limit wydatków wyczerpany 0.4.31 · 29 wrz 2026 | zmierzono · n = 311 0.4.31 · 29 wrz 2026 | zmierzono · n = 37 0.4.31 · 29 wrz 2026 |
google/gemini-3.1-pro-preview | warstwa zawiodła: żądania nie przeszły przez warstwę 0.4.31 · 28 wrz 2026 | zmierzono · n = 97 0.4.31 · 29 wrz 2026 | zmierzono · n = 58 0.4.31 · 29 wrz 2026 | niezmierzone: limit dostawcy wyczerpany 0.4.31 · 29 wrz 2026 |
google/gemini-3.8-flash | warstwa zawiodła: żądania nie przeszły przez warstwę 0.4.31 · 28 wrz 2026 | zmierzono · n = 324 0.4.31 · 29 wrz 2026 | zmierzono · n = 450 0.4.31 · 29 wrz 2026 | warstwa zawiodła: żądania nie przeszły przez warstwę 0.4.31 · 29 wrz 2026 |
Błędy znalezione przez test
Test nie służy do tego, żeby dobrze wyglądać: służy do znajdowania błędów, zanim znajdziesz je ty. Znalazł te, z wersją, w której się pojawiły, i tą, która je naprawia.
Niekalibrowana pamięć podręczna semantyczna podawała odpowiedź innego pytania 0.4.30 → 0.4.31
Przy niekalibrowanej pamięci podręcznej semantycznej wariant z inną liczbą („three baskets” zamiast „two baskets”) mógł otrzymać odpowiedź z oryginalnego pytania. Policzone na wariantach GSM8K.
- Znaleziono w 0.4.30: 15 z 111. gsm8k.json
- Naprawiono w 0.4.31 (#383).
- Zweryfikowano na żywo w 0.4.31: 0 z 198.
Warstwa ograniczała katalog narzędzi bez żadnego sygnału, by to robić 0.4.30 → 0.4.31
W rozmowach wieloturowych ramię B wysyłało mniej narzędzi niż ramię A, mimo że nic nie wskazywało, które są zbędne. Policzone na rozmowach wieloturowych BFCL.
- Znaleziono w 0.4.30: 20 z 20. bfcl.json
- Naprawiono w 0.4.31 (#382).
- Zweryfikowano na żywo w 0.4.31: 0 z 83.
Niektóre odmowy zapisane jako tekst były zapisywane w pamięci podręcznej 0.4.31 → 0.4.32
Odmowa, którą model zapisuje jako tekst (bez sygnału z API), mogła zostać zapisana w pamięci podręcznej, powtórzona i zaliczona jako oszczędność. Policzone w promptach XSTest.
- Znaleziono w 0.4.31: 39 z 2824. xstest-0431-claude.jsonxstest-0431-gama-alta.jsonxstest-0431.json
- Naprawiono w 0.4.32 (#393, #401).
- Oczekuje na ponowny pomiar na żywo w 0.4.32.
Filtr treści Gemini był zapisywany w pamięci podręcznej jako odpowiedź 0.4.31 → 0.4.32
Gemini oznacza swój filtr własnym powodem zatrzymania, którego warstwa nie rozpoznawała jako odmowy, przez co mogła go zapisać w pamięci podręcznej i powtórzyć. Policzone w promptach XSTest.
- Znaleziono w 0.4.31: 6 z 508. xstest-0431-gama-alta.json
- Naprawiono w 0.4.32 (#402).
- Oczekuje na ponowny pomiar na żywo w 0.4.32.
Gemini nie przechodził przez warstwę 0.4.31 → 0.4.32
Warstwa wysyłała pole właściwe dla API OpenAI do każdego zgodnego punktu końcowego, a Gemini je odrzuca: każde żądanie w ramieniu B kończyło się niepowodzeniem. Policzone w żądaniach GSM8K.
- Znaleziono w 0.4.31: 504 z 504. gsm8k-0431-gama-alta.json
- Naprawiono w 0.4.32 (#402).
- Oczekuje na ponowny pomiar na żywo w 0.4.32.
Przy Gemini 3 druga tura z narzędziami kończyła się niepowodzeniem 0.4.31 → 0.4.32
Warstwa nie zwracała sygnatury myśli, której Gemini 3 wymaga przy każdym wywołaniu narzędzia, przez co kolejna tura była odrzucana. Policzone w kontynuacjach wieloturowych BFCL.
- Znaleziono w 0.4.31: 50 z 50. bfcl-0431-gama-alta.json
- Naprawiono w 0.4.32 (#402).
- Oczekuje na ponowny pomiar na żywo w 0.4.32.
Jak to odtworzyć
Kod testu nie jest jeszcze publiczny; metoda jest, i mieści się w pięciu krokach. Z własnymi kluczami dostawcy możesz go powtórzyć i porównać liczba po liczbie z naszymi raportami.
- Zbiór danych. Pobierz każdy publiczny zbiór danych z commita z tabeli powyżej i przed użyciem sprawdź sha256 każdego pliku. Jeśli się nie zgadza, to nie jest ten sam zbiór.
- Warstwa. Zainstaluj
@bivelio/savings-layerz npm w wersji podanej w raporcie i sprawdź sha256 plikudist/index.js: każdy raport go zawiera. - Dwa ramiona na prompt. A idzie prosto do dostawcy; B wysyła ten sam prompt, do tego samego modelu i z tym samym limitem wyjścia, przez warstwę w domyślnej konfiguracji. Część promptów się powtarza lub parafrazuje, jak w prawdziwym ruchu, a kolejność A/B jest losowana.
- Koszt podaje dostawca. Zsumuj, ile kosztuje każde ramię według
usagezwracanego przez dostawcę, po jego opublikowanej cenie. Oszczędność to1 − koszt B / koszt A, wraz z przedziałem. - Jakość, w tym samym przebiegu. Oceń tak samo odpowiedzi obu ramion (dokładna odpowiedź w GSM8K, wywołanie narzędzia w BFCL, odmowa lub nie w XSTest, sędzia w MT-Bench) i porównaj je z raportem JSON tej samej baterii i wersji.
Raporty
Każdy przebieg zostawia raport JSON z projektem, ograniczeniami i każdym zmierzonym wywołaniem: usage, koszt na ramię i klasyfikacja odpowiedzi. Są udostępniane z tej strony.
Raporty są udostępniane tak, jak zapisał je test, z jednym wyjątkiem: usuwa się dane o środowisku osoby mierzącej (ścieżki na dysku, adresy e-mail). Z XSTest nie publikuje się tekstu żadnej odpowiedzi, tylko jej klasyfikację.
Zmierz nas sam
Niezależny pomiar jest wart więcej niż nasz. Kod testu nie jest jeszcze publiczny: jeśli chcesz powtórzyć pomiar albo zmierzyć warstwę własnym narzędziem lub własnym ruchem, napisz do nas, a damy ci wszystko, czego potrzebujesz.
Napisz do nas na support@bivelio.com