feat(experiments): ajoute 4 phrases de test hyper complexes au PoC LLM

Complète les 3 phrases initiales de TEST_SENTENCES avec 4 cas cherchant
volontairement le point de rupture (au lieu de juste confirmer le cas
courant) : actions simultanées plutôt que séquentielles ("pendant que..."),
action conditionnelle noyée dans des actions fermes, négation explicite
d'action ("sans jamais laisser bouillir"), fin de cuisson par état/test de
résultat plutôt que par durée, et un champ température qui désigne un seuil
de cuisson à cœur plutôt qu'un réglage de feu. README mis à jour (7 phrases,
4 FR + 3 EN).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Nicolas 2026-08-21 19:04:00 +02:00
parent 4c3e00a08a
commit 0c1743c614
2 changed files with 66 additions and 11 deletions

View file

@ -51,15 +51,20 @@ résolution/téléchargement Hugging Face.
pnpm bench pnpm bench
``` ```
Charge le modèle, puis lance 3 répétitions sur chacune des 3 phrases de test Charge le modèle, puis lance 3 répétitions sur chacune des 7 phrases de test
(2 FR + 1 EN, voir `TEST_SENTENCES` dans (4 FR + 3 EN, voir `TEST_SENTENCES` dans
[`src/llm-tech-step-poc.ts`](./src/llm-tech-step-poc.ts) — l'une d'elles est [`src/llm-tech-step-poc.ts`](./src/llm-tech-step-poc.ts)) — les 3 premières
délibérément le cas piège documenté dans le commentaire de couvrent le cas courant (actions enchaînées, dont le cas piège documenté dans
`tech-step-matcher.ts` lui-même : "jusqu'à ce que le beurre ait disparu dans `tech-step-matcher.ts` lui-même : "jusqu'à ce que le beurre ait disparu dans
la poêle", aucun verbe de cuisson littéral, seul le sens implique `COOK`). la poêle", aucun verbe de cuisson littéral, seul le sens implique `COOK`),
Imprime, par phrase : le JSON détaillé de chaque action détectée, puis un les 4 suivantes poussent délibérément plus loin pour chercher le point de
tableau récapitulatif (latence moyenne/min/max, delta RSS moyen, nombre rupture : actions simultanées plutôt que séquentielles, action conditionnelle
d'actions détectées). ("if the batter looks too thick..."), négation explicite d'action ("sans
jamais laisser bouillir"), fin de cuisson par état/test de résultat plutôt
que par durée fixe, et un champ température qui désigne un seuil de cuisson
à cœur plutôt qu'un réglage de feu. Imprime, par phrase : le JSON détaillé de
chaque action détectée, puis un tableau récapitulatif (latence moyenne/min/max,
delta RSS moyen, nombre d'actions détectées).
## Méthodologie de comparaison avec le pipeline `node-nlp` ## Méthodologie de comparaison avec le pipeline `node-nlp`
@ -91,7 +96,7 @@ piège FR sans verbe littéral.
## Limites de ce PoC ## Limites de ce PoC
- Pas de jeu d'évaluation étiqueté ni de métrique de précision automatisée - Pas de jeu d'évaluation étiqueté ni de métrique de précision automatisée
— les 3 phrases sont inspectées à l'œil, pas notées. — les 7 phrases sont inspectées à l'œil, pas notées.
- La grammaire GBNF ne garantit qu'une syntaxe JSON conforme au schéma, - La grammaire GBNF ne garantit qu'une syntaxe JSON conforme au schéma,
jamais la justesse sémantique du contenu (catégorie choisie, durée jamais la justesse sémantique du contenu (catégorie choisie, durée
correctement extraite...) — voir le commentaire sur correctement extraite...) — voir le commentaire sur

View file

@ -375,8 +375,12 @@ interface BenchmarkSentence {
} }
/** /**
* Trois phrases complexes, FR et EN, choisies pour couvrir des difficultés * Sept phrases complexes, FR et EN, choisies pour couvrir des difficultés
* différentes : * différentes les trois premières sont la base initiale du PoC, les
* 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 des deux pipelines, pas juste confirmer
* qu'ils gèrent le cas courant :
* *
* 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").
@ -390,6 +394,28 @@ interface BenchmarkSentence {
* point 3 de sa doc). Comparer les deux pipelines sur cette phrase * point 3 de sa doc). Comparer les deux pipelines sur cette phrase
* précise est le test le plus direct de "précision sémantique, pas * précise est le test le plus direct de "précision sémantique, pas
* seulement mot-clé" que ce PoC cherche à évaluer. * seulement mot-clé" que ce PoC cherche à évaluer.
* 4. FR, deux techniques qui se déroulent EN PARALLÈLE ("pendant que...")
* plutôt qu'en séquence un pipeline qui suppose un ordre strictement
* chronologique (comme le découpage en clauses de `splitIntoClauses`,
* voir `tech-step-matcher.ts`) peut mal restituer que les deux actions
* se chevauchent dans le temps plutôt que de se succéder.
* 5. EN, une action CONDITIONNELLE ("if the batter looks too thick, add a
* splash of milk") noyée entre des actions fermes, plus une fin de
* cuisson exprimée comme un test de résultat ("until a toothpick comes
* out clean") et non comme une durée fixe deux formes d'incertitude
* qu'un extracteur naïf a tendance à aplatir en une action normale.
* 6. FR, très technique (crème pâtissière) : une action MIX et une action
* COOK simultanées ("tout en fouettant" pendant qu'on verse le lait
* chaud), une NÉGATION explicite d'action ("sans jamais laisser
* bouillir" l'inverse d'une action à ne pas enregistrer comme une
* vraie étape), et une fin de cuisson par état ("jusqu'à épaississement")
* plutôt que par durée.
* 7. EN, deux occurrences de `REST` au sens différent (mariner au
* réfrigérateur vs. laisser revenir à température ambiante avant
* 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 un piège
* sémantique direct pour le champ `temperature` de {@link KitchenAction}.
*/ */
const TEST_SENTENCES: readonly BenchmarkSentence[] = [ const TEST_SENTENCES: readonly BenchmarkSentence[] = [
{ {
@ -410,6 +436,30 @@ const TEST_SENTENCES: readonly BenchmarkSentence[] = [
text: "Dans une poêle chaude, faites chauffer une noix de beurre jusqu'à ce qu'il ait disparu, puis ajoutez les échalotes ciselées.", text: "Dans une poêle chaude, faites chauffer une noix de beurre jusqu'à ce qu'il ait disparu, puis ajoutez les échalotes ciselées.",
note: "Cas piège documenté dans tech-step-matcher.ts : aucun verbe de cuisson littéral, seul le sens implique COOK (fonte du beurre).", note: "Cas piège documenté dans tech-step-matcher.ts : aucun verbe de cuisson littéral, seul le sens implique COOK (fonte du beurre).",
}, },
{
id: "fr-actions-paralleles",
locale: "fr",
text: "Pendant que les pâtes cuisent 8 à 10 minutes dans une grande casserole d'eau bouillante salée, faites revenir l'ail et les champignons émincés à la poêle avec un peu de beurre jusqu'à ce qu'ils soient dorés, puis égouttez les pâtes en réservant un peu d'eau de cuisson avant de tout mélanger ensemble hors du feu.",
note: "Deux COOK simultanés (pas séquentiels) + OTHER (égoutter/réserver) + MIX final 'hors du feu' — teste la simultanéité, pas juste l'enchaînement.",
},
{
id: "en-action-conditionnelle",
locale: "en",
text: "Whisk the eggs and sugar together until pale and fluffy, then gradually fold in the sifted flour; if the batter looks too thick, add a splash of milk, and bake at 350°F (175°C) for 25 to 30 minutes, or until a toothpick inserted in the center comes out clean.",
note: "Action conditionnelle ('if...') au milieu d'actions fermes + fin de cuisson par test de résultat plutôt que par durée fixe.",
},
{
id: "fr-simultaneite-et-negation",
locale: "fr",
text: "Faites chauffer le lait avec la gousse de vanille fendue en deux jusqu'à frémissement, puis versez-le progressivement sur le mélange jaunes d'œufs-sucre-maïzena tout en fouettant énergiquement, avant de reverser le tout dans la casserole et de cuire à feu doux en remuant sans arrêt jusqu'à épaississement, sans jamais laisser bouillir.",
note: "MIX+COOK simultanés ('tout en fouettant'), négation explicite d'action ('sans jamais laisser bouillir') et fin de cuisson par état, pas par durée.",
},
{
id: "en-double-rest-et-seuil-cuisson",
locale: "en",
text: "Marinate the chicken thighs in the yogurt mixture for at least 2 hours (overnight if possible), then remove them from the fridge 20 minutes before cooking, pat them dry, and grill over medium-high heat for 6-7 minutes per side until the internal temperature reaches 165°F, letting it rest for 5 minutes before slicing.",
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.",
},
]; ];
/** Nombre de répétitions mesurées par phrase — atténue le bruit d'une mesure isolée sans allonger excessivement le run. */ /** Nombre de répétitions mesurées par phrase — atténue le bruit d'une mesure isolée sans allonger excessivement le run. */