Savings Layer jest częścią platformy BiVelio
Test publiczny · odtwarzalny

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 usage zwracanego 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.js jest identyczny bit po bicie z tym z paczki npm (sha256 b52f99cacf9804ecd3153e56f26ec3adcdc2510d52a8446a369ecf914e0b5731).
  • 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

BateriaCo sprawdzaZbiór danychPrzypięte plikiLicencja
GSM8KZadania tekstowe z matematyki z powtórzeniami i parafrazami: ile oszczędza pamięć podręczna i czy spada dokładność.openai/grade-school-mathcommit 3101c7d5072418e28b9008a6636bde82a006892cgsm8k-test
sha256 3730d312f6e3440559ace48831e51066acaca737f6eabec99bccb9e4b3c39d14
gsm8k-train
sha256 17f347dc51477c50d4efb83959dbb7c56297aba886e5544ee2aaed3024813465
MIT
BFCLWywołania narzędzi: warstwa nie może zmienić żadnego z nich, a cały katalog musi dotrzeć.ShishirPatil/gorillacommit f7cf7359b7ac615a0b294831c5ba2bc95ee4a000przypięte do commitaApache-2.0
XSTestOdmowy: warstwa nie może zmienić momentu, w którym model odmawia, ani podać odmowy z pamięci podręcznej.paul-rottger/exaggerated-safetycommit d7bb5bd738c1fcbc36edd83d5e7d1b71a3e2d84dxstest_prompts.csv
sha256 11783fb294ed017473ee53c207d71f2161c7672c8d0b037501e78387f801cb5a
CC-BY-4.0
MT-BenchCzat dwuturowy bez powtórzeń: warstwa nie może pogorszyć kosztu, opóźnienia ani jakości.lm-sys/FastChatcommit 587d5cfa1609a43d192cedb8441cac3c17db105dquestion.jsonl
sha256 119565adbab82227089cefdb44c8d7e2cf04dc0a0ec233634c82e7d4e2a944f7
gpt-4.jsonl
sha256 f957a5bc977badb66885ec970e6cd08527845780313f0995764260e5777b9b3f
judge_prompts.jsonl
sha256 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”.

ModelnZmierzona oszczędność [PU]Z dokładnej pamięci podręcznejW wywołaniach (prefiks)Dokładność A → BWersja · data
openai/gpt-4o-mini200 żądań · 100 unikalnych31,5% [25,7% – 36,7%]0,0124 USD0,0006 USD95,0% → 96,1%Δ +1,1 pp [0,0, +2,8]0.4.31 · 28 wrz 2026
openai/gpt-5.4-mini176 żądań · 88 unikalnych31,7% [25,6% – 37,6%]0,0734 USD0,0003 USD95,6% → 93,7%Δ -1,9 pp [-5,0, 0,0]0.4.31 · 28 wrz 2026
openai/gpt-5.522 żądań · 11 unikalnych33,4% [6,8% – 53,8%]0,0790 USD-0,0023 USD100,0% → 100,0%Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 wrz 2026
openai/gpt-5.6-sol32 żądań · 16 unikalnych29,2% [9,5% – 46,8%]0,0252 USD-0,0003 USD100,0% → 100,0%Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 wrz 2026
anthropic/claude-haiku-4-5116 żądań · 58 unikalnych32,2% [23,6% – 40,2%]0,0773 USD0,0002 USD99,0% → 99,0%Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 wrz 2026
anthropic/claude-opus-5-532 żądań · 16 unikalnych77,2% [67,1% – 83,9%]0,0974 USD0,1391 USD100,0% → 100,0%Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 wrz 2026
anthropic/claude-sonnet-562 żądań · 31 unikalnych75,1% [69,3% – 79,6%]0,1054 USD0,1313 USD100,0% → 100,0%Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 wrz 2026
anthropic/claude-sonnet-5-562 żądań · 31 unikalnych77,5% [72,0% – 81,7%]0,0924 USD0,1289 USD100,0% → 100,0%Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 wrz 2026
google/gemini-3.1-pro-previewwarstwa zawiodła: żądania nie przeszły przez warstwę0.4.31 · 28 wrz 2026
google/gemini-3.8-flashwarstwa 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).

Odsetek odmów na model, bez warstwy (A) i z warstwą (B), na tych samych promptach.
ModelPromptyOdmowy, prompty bezpieczne (A → B)Odmowy, prompty niebezpieczne (A → B)Wersja · data
openai/gpt-4o-mini4505,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-mini44111,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.51206,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-sol1992,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-54501,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-581—67,1% → 67,1% (n = 79, p = 1,00)0.4.31 · 29 wrz 2026
anthropic/claude-sonnet-52642,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-53111,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-preview580,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-flash4500,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.

BateriaModelnZmierzona oszczędność [PU]InterpretacjaWersja · data
BFCLopenai/gpt-4o-mini400 pozycji0,1% [0,0% – 0,3%]nieodróżnialne od zera0.4.31 · 28 wrz 2026
BFCLopenai/gpt-5.4-mini400 pozycji-0,2% [-1,0% – 0,5%]nieodróżnialne od zera0.4.31 · 28 wrz 2026
BFCLanthropic/claude-haiku-4-548 pozycji0,1% [0,0% – 0,2%]nieodróżnialne od zera0.4.31 · 29 wrz 2026
BFCLanthropic/claude-sonnet-548 pozycji1,5% [-1,6% – 5,8%]nieodróżnialne od zera0.4.31 · 29 wrz 2026
BFCLgoogle/gemini-3.1-pro-preview97 pozycji4,8% [-6,6% – 15,6%]nieodróżnialne od zera0.4.31 · 29 wrz 2026
BFCLgoogle/gemini-3.8-flash324 pozycji-10,7% [-27,8% – 3,2%]nieodróżnialne od zera0.4.31 · 29 wrz 2026
MT-Benchopenai/gpt-4o-mini80 pytań3,3% [0,8% – 6,0%]oszczędność · nie do przypisania warstwie0.4.31 · 28 wrz 2026
MT-Benchopenai/gpt-5.4-mini80 pytań-3,5% [-8,6% – 1,6%]nieodróżnialne od zera · nie do przypisania warstwie0.4.31 · 28 wrz 2026
MT-Benchopenai/gpt-5.58 pytań2,1% [-4,4% – 9,7%]nieodróżnialne od zera0.4.31 · 29 wrz 2026
MT-Benchopenai/gpt-5.6-sol13 pytań-0,4% [-21,2% – 13,5%]nieodróżnialne od zera · nie do przypisania warstwie0.4.31 · 29 wrz 2026
MT-Benchanthropic/claude-haiku-4-580 pytań-2,6% [-4,6% – -0,9%]dodatkowy koszt · nie do przypisania warstwie0.4.31 · 28 wrz 2026
MT-Benchanthropic/claude-opus-5-518 pytań1,1% [-2,0% – 4,9%]nieodróżnialne od zera0.4.31 · 29 wrz 2026
MT-Benchanthropic/claude-sonnet-523 pytań1,7% [-8,9% – 12,7%]nieodróżnialne od zera0.4.31 · 28 wrz 2026
MT-Benchanthropic/claude-sonnet-5-537 pytań-0,8% [-2,5% – 0,9%]nieodróżnialne od zera0.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.

ModelGSM8KBFCLXSTestMT-Bench
openai/gpt-4o-minizmierzono · 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-minizmierzono · 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.5zmierzono · 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-solzmierzono · 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-5zmierzono · 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-5zmierzono · 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-5zmierzono · 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-5zmierzono · 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-previewwarstwa 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-flashwarstwa 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.

  1. 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.
  2. 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.
  3. 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.

  4. 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.

  5. 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.
  6. 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.

  1. 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.
  2. Warstwa. Zainstaluj @bivelio/savings-layer z npm w wersji podanej w raporcie i sprawdź sha256 pliku dist/index.js: każdy raport go zawiera.
  3. 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.
  4. Koszt podaje dostawca. Zsumuj, ile kosztuje każde ramię według usage zwracanego przez dostawcę, po jego opublikowanej cenie. Oszczędność to 1 − koszt B / koszt A, wraz z przedziałem.
  5. 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

Wyślij e-mail