From 9f274f9461dc6133943679e629dcee50d1910e87 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Fri, 21 Aug 2026 22:15:45 +0200 Subject: [PATCH] =?UTF-8?q?feat(experiments):=20ajoute=20une=20entr=C3=A9e?= =?UTF-8?q?=20de=20volum=C3=A9trie=20par=20locale=20(FR/EN)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../src/shared/test-sentences.ts | 70 ++++++++++++++++--- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/experiments/llm-tech-step-poc/src/shared/test-sentences.ts b/experiments/llm-tech-step-poc/src/shared/test-sentences.ts index dfa2cfa..62f0292 100644 --- a/experiments/llm-tech-step-poc/src/shared/test-sentences.ts +++ b/experiments/llm-tech-step-poc/src/shared/test-sentences.ts @@ -1,10 +1,12 @@ /** - * Les 7 phrases de test partagées par les trois moteurs de ce PoC — un seul - * jeu de phrases, importé par `llm-tech-step-poc.ts`, `nlp-tech-step-poc.ts` - * et `hybrid-tech-step-poc.ts`, pour que leurs runs soient directement - * comparables phrase par phrase sans risque de désynchronisation (un défaut - * de la toute première version de ce PoC, où le pendant `node-nlp` vivait - * dans `apps/api` et recopiait ces phrases à la main). + * Les 9 phrases de test partagées par les trois moteurs de ce PoC (7 phrases + * de complexité variable + 2 concaténations pour tester l'effet du volume, + * voir {@link TEST_SENTENCES}) — un seul jeu de phrases, importé par + * `llm-tech-step-poc.ts`, `nlp-tech-step-poc.ts` et `hybrid-tech-step-poc.ts`, + * pour que leurs runs soient directement comparables phrase par phrase sans + * risque de désynchronisation (un défaut de la toute première version de ce + * PoC, où 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). */ @@ -22,7 +24,14 @@ export interface BenchmarkSentence { * quatre suivantes poussent volontairement plus loin (simultanéité, * 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 - * 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 * 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 * 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. + * 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", 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.", }, ]; + +/** + * 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.`, + }, +];