El nostre banc A/B, obert. Mesura'ns.
Publiquem cada execució: quatre bateries amb conjunts de dades públics, 10 models, i els dos braços mesurats amb el comptador d'ús del mateix proveïdor. Cada xifra porta la seva n, el seu interval i la seva data. El que no estalvia també hi és.
- bateries
- 4
- models provats
- 10
- models amb alguna mesura
- 10
- informes en directe
- 15
- última execució
- 29 de set. 2026
Què es mesura i com
- Dos braços, la mateixa petició. A va directament al proveïdor, sense la capa; B passa per la capa amb la seva configuració per defecte. Mateix prompt, mateix mostreig i mateix límit de sortida.
- El cost el compta el proveïdor. Cada braç es valora amb l<code>usage</code> que retorna lAPI a cada crida, al preu de llista. L'estalvi és 1 − cost(B) / cost(A) de la mateixa execució, no el que la capa diu de si mateixa.
- Intervals al 95 %. Els calcula cada arnès (remostreig per famílies de preguntes, Wilson en les taxes de negativa). Un interval que travessa el zero és un «indistingible de zero», i així ho diem.
- El paquet, el que s'instal·la. El braç B executa la font de l'etiqueta 0.4.31; el seu
dist/index.jsés idèntic byte a byte al del tarball d'npm (sha256b52f99cacf9804ecd3153e56f26ec3adcdc2510d52a8446a369ecf914e0b5731). - Sense dreceres. Cada arnès vigila els hosts amb què parla i porta un límit de despesa per model escrit al codi. Un model que no s'ha pogut mesurar surt com a «no mesurat», amb el motiu.
Quatre bateries, conjunts de dades públics, fixats
| Bateria | Què comprova | Conjunt de dades | Fitxers fixats | Llicència |
|---|---|---|---|---|
| GSM8K | Problemes matemàtics amb repeticions i paràfrasis: quant estalvia la memòria cau i si es perd exactitud. | openai/grade-school-mathcommit 3101c7d5072418e28b9008a6636bde82a006892c | gsm8k-test sha256 3730d312f6e3440559ace48831e51066acaca737f6eabec99bccb9e4b3c39d14gsm8k-trainsha256 17f347dc51477c50d4efb83959dbb7c56297aba886e5544ee2aaed3024813465 | MIT |
| BFCL | Crides a eines: la capa no ha de canviar-ne cap, i el catàleg sencer ha d'arribar. | ShishirPatil/gorillacommit f7cf7359b7ac615a0b294831c5ba2bc95ee4a000 | fixat per commit | Apache-2.0 |
| XSTest | Negatives: la capa no ha de canviar quan el model es nega, ni servir una negativa de la memòria cau. | paul-rottger/exaggerated-safetycommit d7bb5bd738c1fcbc36edd83d5e7d1b71a3e2d84d | xstest_prompts.csv sha256 11783fb294ed017473ee53c207d71f2161c7672c8d0b037501e78387f801cb5a | CC-BY-4.0 |
| MT-Bench | Xat de dos torns sense repeticions: la capa no ha d'empitjorar el cost, la latència ni la qualitat. | lm-sys/FastChatcommit 587d5cfa1609a43d192cedb8441cac3c17db105d | question.jsonl sha256 119565adbab82227089cefdb44c8d7e2cf04dc0a0ec233634c82e7d4e2a944f7gpt-4.jsonlsha256 f957a5bc977badb66885ec970e6cd08527845780313f0995764260e5777b9b3fjudge_prompts.jsonlsha256 fd283293406d024f44c174b094ef48031d0687a4682fd3a56b29b138f80281b6 | Apache-2.0 |
Estalvi mesurat per model
GSM8K, amb un flux de peticions en què un 30 % són repeticions exactes i un 20 % paràfrasis. És la bateria amb trànsit repetit: el teu estalvi depèn de quant es repeteixi el teu. Sense repeticions, mira «El que no estalvia».
| Model | n | Estalvi mesurat [IC] | De la memòria cau exacta | A les crides (prefix) | Exactitud A → B | Versió · data |
|---|---|---|---|---|---|---|
openai/gpt-4o-mini | 200 peticions · 100 úniques | 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 de set. 2026 |
openai/gpt-5.4-mini | 176 peticions · 88 úniques | 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 de set. 2026 |
openai/gpt-5.5 | 22 peticions · 11 úniques | 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 de set. 2026 |
openai/gpt-5.6-sol | 32 peticions · 16 úniques | 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 de set. 2026 |
anthropic/claude-haiku-4-5 | 116 peticions · 58 úniques | 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 de set. 2026 |
anthropic/claude-opus-5-5 | 32 peticions · 16 úniques | 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 de set. 2026 |
anthropic/claude-sonnet-5 | 62 peticions · 31 úniques | 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 de set. 2026 |
anthropic/claude-sonnet-5-5 | 62 peticions · 31 úniques | 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 de set. 2026 |
google/gemini-3.1-pro-preview | la capa ha fallat: les peticions no han passat per la capa | 0.4.31 · 28 de set. 2026 | ||||
google/gemini-3.8-flash | la capa ha fallat: les peticions no han passat per la capa | 0.4.31 · 28 de set. 2026 | ||||
Origen de l'estalvi, posició a posició: «de la memòria cau exacta» és el que A va pagar en les peticions que la capa va servir sense trucar al proveïdor; «a les crides» és la diferència en les que sí que hi van arribar, sobretot memòria cau de prefix del proveïdor (més una mica de variació de la sortida). Les dues sumen l'estalvi total.
L'exactitud es mesura sobre les preguntes amb resposta publicada; les variants amb una xifra canviada només serveixen per comprovar que la capa no lliura la resposta d'una altra pregunta.
Garanties, comptades
La capa mai no ha canviat una crida a eines
0 crides alterades en 1.325 comparacions de BFCL, 6 models, des de 0.4.31. Si la capa falla (un error a B que A no tenia), no compta aquí: és a «Errors que el banc ha trobat».
Cap resposta d'una altra pregunta des de 0.4.31
0 de 198 variants (la mateixa pregunta amb un altre número, i per tant una altra resposta) servides amb la resposta d'una altra pregunta, en 8 models en directe i en totes les configuracions de memòria cau mesurades.
Rèplica fora de línia de tot el split de test de GSM8K: 0 en 5.813 peticions, en cadascuna de les 5 configuracions de memòria cau.
La mateixa taxa de negatives, amb i sense la capa
XSTest, 10 models mesurats: cap diferència A/B per sota de p = 0,05 (McNemar, prompts aparellats). La capa ha lliurat sense alterar el text de 4.668 respostes (0 alterades).
| Model | Prompts | Negatives, prompts segurs (A → B) | Negatives, prompts insegurs (A → B) | Versió · 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 de set. 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 de set. 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 de set. 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 de set. 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 de set. 2026 |
anthropic/claude-opus-5-5 | 81 | — | 67,1 % → 67,1 % (n = 79, p = 1,00) | 0.4.31 · 29 de set. 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 de set. 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 de set. 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 de set. 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 de set. 2026 |
El que no estalvia
Sense repeticions, l'estalvi és ≈ 0 %. El publiquem igualment, perquè és el que veuràs si el teu trànsit no es repeteix.
MT-Bench és xat de dos torns amb una capa nova per pregunta: no hi ha res que la memòria cau pugui reutilitzar, i el prompt gairebé mai arriba al mínim que el proveïdor exigeix per fer memòria cau d'un prefix. A BFCL cada crida a eines és diferent. El que mesuren aquestes dues bateries és que la capa no empitjori res; la diferència de cost que queda és soroll de la sortida del model, no la capa.
| Bateria | Model | n | Estalvi mesurat [IC] | Lectura | Versió · data |
|---|---|---|---|---|---|
| BFCL | openai/gpt-4o-mini | 400 ítems | 0,1 % [0,0 % – 0,3 %] | indistingible de zero | 0.4.31 · 28 de set. 2026 |
| BFCL | openai/gpt-5.4-mini | 400 ítems | -0,2 % [-1,0 % – 0,5 %] | indistingible de zero | 0.4.31 · 28 de set. 2026 |
| BFCL | anthropic/claude-haiku-4-5 | 48 ítems | 0,1 % [0,0 % – 0,2 %] | indistingible de zero | 0.4.31 · 29 de set. 2026 |
| BFCL | anthropic/claude-sonnet-5 | 48 ítems | 1,5 % [-1,6 % – 5,8 %] | indistingible de zero | 0.4.31 · 29 de set. 2026 |
| BFCL | google/gemini-3.1-pro-preview | 97 ítems | 4,8 % [-6,6 % – 15,6 %] | indistingible de zero | 0.4.31 · 29 de set. 2026 |
| BFCL | google/gemini-3.8-flash | 324 ítems | -10,7 % [-27,8 % – 3,2 %] | indistingible de zero | 0.4.31 · 29 de set. 2026 |
| MT-Bench | openai/gpt-4o-mini | 80 preguntes | 3,3 % [0,8 % – 6,0 %] | estalvi · no atribuïble a la capa | 0.4.31 · 28 de set. 2026 |
| MT-Bench | openai/gpt-5.4-mini | 80 preguntes | -3,5 % [-8,6 % – 1,6 %] | indistingible de zero · no atribuïble a la capa | 0.4.31 · 28 de set. 2026 |
| MT-Bench | openai/gpt-5.5 | 8 preguntes | 2,1 % [-4,4 % – 9,7 %] | indistingible de zero | 0.4.31 · 29 de set. 2026 |
| MT-Bench | openai/gpt-5.6-sol | 13 preguntes | -0,4 % [-21,2 % – 13,5 %] | indistingible de zero · no atribuïble a la capa | 0.4.31 · 29 de set. 2026 |
| MT-Bench | anthropic/claude-haiku-4-5 | 80 preguntes | -2,6 % [-4,6 % – -0,9 %] | sobrecost · no atribuïble a la capa | 0.4.31 · 28 de set. 2026 |
| MT-Bench | anthropic/claude-opus-5-5 | 18 preguntes | 1,1 % [-2,0 % – 4,9 %] | indistingible de zero | 0.4.31 · 29 de set. 2026 |
| MT-Bench | anthropic/claude-sonnet-5 | 23 preguntes | 1,7 % [-8,9 % – 12,7 %] | indistingible de zero | 0.4.31 · 28 de set. 2026 |
| MT-Bench | anthropic/claude-sonnet-5-5 | 37 preguntes | -0,8 % [-2,5 % – 0,9 %] | indistingible de zero | 0.4.31 · 29 de set. 2026 |
Estat per model i bateria
Cada cel·la mostra l'execució de la versió més alta de la capa. Si un model no s'ha pogut mesurar, es diu per què, en lloc de deixar el buit.
| Model | GSM8K | BFCL | XSTest | MT-Bench |
|---|---|---|---|---|
openai/gpt-4o-mini | mesurat · n = 200 0.4.31 · 28 de set. 2026 | mesurat · n = 400 0.4.31 · 28 de set. 2026 | mesurat · n = 450 0.4.31 · 28 de set. 2026 | mesurat · n = 80 0.4.31 · 28 de set. 2026 |
openai/gpt-5.4-mini | mesurat · n = 176 0.4.31 · 28 de set. 2026 | mesurat · n = 400 0.4.31 · 28 de set. 2026 | mesurat · n = 441 0.4.31 · 28 de set. 2026 | mesurat · n = 80 0.4.31 · 28 de set. 2026 |
openai/gpt-5.5 | mesurat · n = 22 0.4.31 · 28 de set. 2026 | no mesurat: límit de despesa exhaurit 0.4.31 · 29 de set. 2026 | mesurat · n = 120 0.4.31 · 29 de set. 2026 | mesurat · n = 8 0.4.31 · 29 de set. 2026 |
openai/gpt-5.6-sol | mesurat · n = 32 0.4.31 · 28 de set. 2026 | no mesurat: el proveïdor ha rebutjat la petició en els dos braços 0.4.31 · 29 de set. 2026 | mesurat · n = 199 0.4.31 · 29 de set. 2026 | mesurat · n = 13 0.4.31 · 29 de set. 2026 |
anthropic/claude-haiku-4-5 | mesurat · n = 116 0.4.31 · 28 de set. 2026 | mesurat · n = 48 0.4.31 · 29 de set. 2026 | mesurat · n = 450 0.4.31 · 29 de set. 2026 | mesurat · n = 80 0.4.31 · 28 de set. 2026 |
anthropic/claude-opus-5-5 | mesurat · n = 32 0.4.31 · 28 de set. 2026 | no mesurat: límit de despesa exhaurit 0.4.31 · 29 de set. 2026 | mesurat · n = 81 0.4.31 · 29 de set. 2026 | mesurat · n = 18 0.4.31 · 29 de set. 2026 |
anthropic/claude-sonnet-5 | mesurat · n = 62 0.4.31 · 28 de set. 2026 | mesurat · n = 48 0.4.31 · 29 de set. 2026 | mesurat · n = 264 0.4.31 · 29 de set. 2026 | mesurat · n = 23 0.4.31 · 28 de set. 2026 |
anthropic/claude-sonnet-5-5 | mesurat · n = 62 0.4.31 · 28 de set. 2026 | no mesurat: límit de despesa exhaurit 0.4.31 · 29 de set. 2026 | mesurat · n = 311 0.4.31 · 29 de set. 2026 | mesurat · n = 37 0.4.31 · 29 de set. 2026 |
google/gemini-3.1-pro-preview | la capa ha fallat: les peticions no han passat per la capa 0.4.31 · 28 de set. 2026 | mesurat · n = 97 0.4.31 · 29 de set. 2026 | mesurat · n = 58 0.4.31 · 29 de set. 2026 | no mesurat: quota del proveïdor exhaurida 0.4.31 · 29 de set. 2026 |
google/gemini-3.8-flash | la capa ha fallat: les peticions no han passat per la capa 0.4.31 · 28 de set. 2026 | mesurat · n = 324 0.4.31 · 29 de set. 2026 | mesurat · n = 450 0.4.31 · 29 de set. 2026 | la capa ha fallat: les peticions no han passat per la capa 0.4.31 · 29 de set. 2026 |
Errors que el banc ha trobat
El banc no hi és per quedar bé: hi és per trobar els errors abans que tu. Ha trobat aquests, amb la versió en què van aparèixer i la que els arregla.
La memòria cau semàntica sense calibrar servia la resposta d'una altra pregunta 0.4.30 → 0.4.31
Amb la memòria cau semàntica sense calibrar, una variant amb un altre número («three baskets» enfront de «two baskets») podia rebre la resposta de la pregunta original. Comptat sobre les variants de GSM8K.
- Trobat a la 0.4.30: 15 de 111. gsm8k.json
- Arreglat a la 0.4.31 (#383).
- Verificat en directe a la 0.4.31: 0 de 198.
La capa retallava el catàleg d'eines sense cap senyal per fer-ho 0.4.30 → 0.4.31
En converses de diversos torns, el braç B enviava menys eines que l'A tot i que res no indicava quines sobraven. Comptat sobre les converses multi-torn de BFCL.
- Trobat a la 0.4.30: 20 de 20. bfcl.json
- Arreglat a la 0.4.31 (#382).
- Verificat en directe a la 0.4.31: 0 de 83.
Algunes negatives escrites com a text es desaven a la memòria cau 0.4.31 → 0.4.32
Una negativa que el model escriu com a text (sense el senyal de l'API) podia desar-se a la memòria cau, repetir-se i acreditar-se com a estalvi. Comptat en prompts de XSTest.
- Trobat a la 0.4.31: 39 de 2.824. xstest-0431-claude.jsonxstest-0431-gama-alta.jsonxstest-0431.json
- Arreglat a la 0.4.32 (#393, #401).
- Pendent de tornar a mesurar en directe a la 0.4.32.
Un filtre de contingut de Gemini es desava a la memòria cau com a resposta 0.4.31 → 0.4.32
Gemini assenyala el seu filtre amb un motiu d'aturada propi que la capa no reconeixia com a negativa, així que podia desar-lo a la memòria cau i repetir-lo. Comptat en prompts de XSTest.
- Trobat a la 0.4.31: 6 de 508. xstest-0431-gama-alta.json
- Arreglat a la 0.4.32 (#402).
- Pendent de tornar a mesurar en directe a la 0.4.32.
Gemini no passava per la capa 0.4.31 → 0.4.32
La capa enviava un camp propi de l'API d'OpenAI a qualsevol endpoint compatible, i Gemini el rebutja: totes les peticions del braç B fallaven. Comptat en peticions de GSM8K.
- Trobat a la 0.4.31: 504 de 504. gsm8k-0431-gama-alta.json
- Arreglat a la 0.4.32 (#402).
- Pendent de tornar a mesurar en directe a la 0.4.32.
Amb Gemini 3, el segon torn amb eines fallava 0.4.31 → 0.4.32
La capa no retornava la signatura de pensament que Gemini 3 exigeix a cada crida a eines, així que el torn següent es rebutjava. Comptat en continuacions multi-torn de BFCL.
- Trobat a la 0.4.31: 50 de 50. bfcl-0431-gama-alta.json
- Arreglat a la 0.4.32 (#402).
- Pendent de tornar a mesurar en directe a la 0.4.32.
Com reproduir-ho
El codi del banc encara no és públic; el mètode sí, i cap en cinc passos. Amb les teves pròpies claus de proveïdor el pots repetir i comparar xifra a xifra amb els nostres informes.
- El dataset. Descarrega cada dataset públic al commit de la taula de dalt i comprova el sha256 de cada fitxer abans de fer-lo servir. Si no quadra, no és el mateix dataset.
- La capa. Instal·la
@bivelio/savings-layerdes de npm a la versió que diu l'informe i comprova el sha256 dedist/index.js: cada informe porta el seu. - Dos braços per prompt. A va directe al proveïdor; B envia el mateix prompt, al mateix model i amb el mateix límit de sortida, a través de la capa amb la configuració per defecte. Una part dels prompts es repeteix o es parafraseja, com en el trànsit real, i l'ordre A/B se sorteja.
- El cost el diu el proveïdor. Suma el que factura cada braç segons l<code>usage</code> que retorna el proveïdor, a la seva tarifa publicada. Lestalvi és
1 − cost B / cost A, amb el seu interval. - La qualitat, a la mateixa tirada. Puntua igual les respostes dels dos braços (resposta exacta a GSM8K, crida a eina a BFCL, negativa o no a XSTest, jutge a MT-Bench) i compara-les amb l'informe JSON de la mateixa bateria i versió.
Els informes
Cada tirada deixa un informe JSON amb el seu disseny, les seves limitacions i cada crida mesurada: usage, cost per braç i classificació de la resposta. Se serveixen des d'aquest web.
Els informes se serveixen tal com els va escriure el banc, amb una excepció: es treuen les dades de l'entorn de qui va mesurar (rutes de disc, correus). De XSTest no es publica el text de cap resposta, només la seva classificació.
Mesura'ns tu mateix
Una mesura independent val més que la nostra. El codi del banc encara no és públic: si vols repetir la mesura, o mesurar la capa amb el teu propi arnès o amb el teu trànsit, escriu-nos i et donarem el que necessitis per fer-ho.
Escriu-nos a support@bivelio.com