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.`, + }, +];