feat(experiments): ajoute une entrée de volumétrie par locale (FR/EN)

TEST_SENTENCES gagne 2 entrées dérivées (fr-concat-volumetrie,
en-concat-volumetrie) qui concatènent toutes les phrases de base d'une
même locale en un seul step géant, calculées depuis les phrases existantes
(jamais recopiées à la main) — pour isoler l'effet du seul volume de texte
sur la durée de traitement de chaque moteur, indépendamment de la
complexité déjà couverte par les 7 phrases existantes.

Vérifié via bench:nlp : la latence croît nettement avec le volume
(fr-concat ~2200ms vs 300-1100ms pour les phrases individuelles FR).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Nicolas 2026-08-21 22:15:45 +02:00
parent c73c62328d
commit 9f274f9461

View file

@ -1,10 +1,12 @@
/** /**
* Les 7 phrases de test partagées par les trois moteurs de ce PoC un seul * Les 9 phrases de test partagées par les trois moteurs de ce PoC (7 phrases
* jeu de phrases, importé par `llm-tech-step-poc.ts`, `nlp-tech-step-poc.ts` * de complexité variable + 2 concaténations pour tester l'effet du volume,
* et `hybrid-tech-step-poc.ts`, pour que leurs runs soient directement * voir {@link TEST_SENTENCES}) un seul jeu de phrases, importé par
* comparables phrase par phrase sans risque de désynchronisation (un défaut * `llm-tech-step-poc.ts`, `nlp-tech-step-poc.ts` et `hybrid-tech-step-poc.ts`,
* de la toute première version de ce PoC, le pendant `node-nlp` vivait * pour que leurs runs soient directement comparables phrase par phrase sans
* dans `apps/api` et recopiait ces phrases à la main). * risque de désynchronisation (un défaut de la toute première version de ce
* PoC, le pendant `node-nlp` vivait dans `apps/api` et recopiait ces
* phrases à la main).
*/ */
/** Une phrase de test, avec sa langue et ce qui la rend "complexe" (documentation, non exploité par le code). */ /** Une phrase de test, avec sa langue et ce qui la rend "complexe" (documentation, non exploité par le code). */
@ -22,7 +24,14 @@ export interface BenchmarkSentence {
* quatre suivantes poussent volontairement plus loin (simultanéité, * quatre suivantes poussent volontairement plus loin (simultanéité,
* conditions, négations, ambiguïté sémantique d'un même champ) pour * conditions, négations, ambiguïté sémantique d'un même champ) pour
* chercher le point de rupture de chaque moteur, pas juste confirmer qu'il * chercher le point de rupture de chaque moteur, pas juste confirmer qu'il
* gère le cas courant : * gère le cas courant. Deux entrées supplémentaires ({@link TEST_SENTENCES},
* items 8 et 9) concatènent ensuite toutes les phrases d'une même locale en
* un seul "step" géant, pour isoler l'effet du seul VOLUME de texte sur la
* durée de traitement les 7 phrases ci-dessous font varier la
* *complexité* à taille à peu près constante, elles ne disent rien sur
* comment chaque moteur se comporte face à un step simplement plus long
* (plus de tokens à faire générer/parcourir au LLM, plus de clauses à
* découper et classifier pour le NLP) :
* *
* 1. FR, plusieurs actions explicites enchaînées avec une durée et un * 1. FR, plusieurs actions explicites enchaînées avec une durée et un
* ingrédient qui change de forme grammaticale ("les" reprend "oignons"). * ingrédient qui change de forme grammaticale ("les" reprend "oignons").
@ -52,8 +61,13 @@ export interface BenchmarkSentence {
* cuisson) dans la même phrase, une durée "par face" (6-7 minutes per * cuisson) dans la même phrase, une durée "par face" (6-7 minutes per
* side, pas la durée totale), et un champ température qui désigne un * side, pas la durée totale), et un champ température qui désigne un
* SEUIL DE CUISSON à cœur (165°F) plutôt qu'un réglage de feu. * SEUIL DE CUISSON à cœur (165°F) plutôt qu'un réglage de feu.
* 8. FR, la concaténation des 4 phrases FR ci-dessus (1, 3, 4, 6) en un
* seul step même contenu, ~4x le volume de texte d'une phrase FR
* normale de ce jeu.
* 9. EN, la concaténation des 3 phrases EN ci-dessus (2, 5, 7) en un seul
* step même principe côté EN.
*/ */
export const TEST_SENTENCES: readonly BenchmarkSentence[] = [ const BASE_SENTENCES: readonly BenchmarkSentence[] = [
{ {
id: "fr-multi-action", id: "fr-multi-action",
locale: "fr", locale: "fr",
@ -97,3 +111,43 @@ export const TEST_SENTENCES: readonly BenchmarkSentence[] = [
note: "Deux REST de sens différent (marinade vs. retour à température ambiante) + durée 'par face' + température = seuil de cuisson à cœur, pas un réglage de feu.", note: "Deux REST de sens différent (marinade vs. retour à température ambiante) + durée 'par face' + température = seuil de cuisson à cœur, pas un réglage de feu.",
}, },
]; ];
/**
* Concatène les textes de {@link BASE_SENTENCES} d'une locale donnée,
* séparés par un espace, dans leur ordre d'apparition calculé plutôt que
* recopié à la main pour ne jamais désynchroniser le step géant du contenu
* réel des 7 phrases de base (si l'une d'elles change de texte, la
* concaténation suit automatiquement).
*/
function concatenateByLocale(locale: BenchmarkSentence["locale"]): string {
return BASE_SENTENCES.filter((sentence) => sentence.locale === locale)
.map((sentence) => sentence.text)
.join(" ");
}
const FR_SENTENCE_COUNT = BASE_SENTENCES.filter((sentence) => sentence.locale === "fr").length;
const EN_SENTENCE_COUNT = BASE_SENTENCES.filter((sentence) => sentence.locale === "en").length;
/**
* {@link BASE_SENTENCES} (7 phrases, complexité variable à taille à peu
* près constante) plus deux entrées dérivées par locale (items 8 et 9 du
* doc-comment ci-dessus) qui concatènent toutes les phrases de cette locale
* en un seul step pour isoler l'effet du VOLUME de texte sur la durée de
* traitement de chaque moteur, indépendamment de la complexité sémantique
* déjà couverte par les 7 premières.
*/
export const TEST_SENTENCES: readonly BenchmarkSentence[] = [
...BASE_SENTENCES,
{
id: "fr-concat-volumetrie",
locale: "fr",
text: concatenateByLocale("fr"),
note: `Concaténation des ${FR_SENTENCE_COUNT} étapes FR ci-dessus en un seul step — teste si la durée de traitement croît avec le volume de texte, indépendamment de sa complexité.`,
},
{
id: "en-concat-volumetrie",
locale: "en",
text: concatenateByLocale("en"),
note: `Concaténation des ${EN_SENTENCE_COUNT} étapes EN ci-dessus en un seul step — même test de volumétrie côté EN.`,
},
];