> Discover all available pages from the documentation index: https://mastra.zisheng.pro/fr/llms.txt # Summarization Scorer La fonction `createSummarizationScorer()` crée un Scorer qui évalue un résumé selon deux axes : chacune de ses affirmations est-elle étayée par le texte source et conserve-t-il les informations que celui-ci contient ? Le score final correspond au plus faible des deux. Un résumé ne peut donc pas réussir en étant fidèle mais vide, ni complet mais erroné. Le résumé correspond au dernier message textuel de l'agent, tandis que le texte source correspond par défaut au premier message utilisateur de l'entrée d'exécution. Transmettez `source` ou `sourceExtractor` si le texte à résumer se trouve ailleurs, par exemple dans le résultat d'un Tool. ## Exemple d'utilisation Évaluez un résumé par rapport au document qu'il condense. ```typescript import { createSummarizationScorer } from '@mastra/evals/scorers/prebuilt' const scorer = createSummarizationScorer({ model: 'openai/gpt-5.6-sol', }) const result = await scorer.run({ input: { inputMessages: [{ id: '1', role: 'user', content: sourceDocument }], }, output: [{ id: '2', role: 'assistant', content: summary }], }) console.log(result.score) console.log(result.reason) ``` ## Évaluation de la synthèse Utilisez ce Scorer lorsqu'un agent condense du texte : - Résumé de documents et de transcriptions - Synthèse de threads d'assistance et d'e-mails - Toute étape qui compresse une longue entrée en une courte sortie ## Paramètres **model** (`MastraModelConfig`): Modèle de langage à utiliser pour juger les affirmations et les questions de couverture **options** (`SummarizationMetricOptions`): Options de configuration du Scorer **options.source** (`string`): Texte par rapport auquel le résumé est évalué. Correspond par défaut au message utilisateur de l’entrée d’exécution **options.sourceExtractor** (`(input, output) => string`): Fonction permettant de dériver le texte source de l’entrée et de la sortie d’exécution. Prévaut sur source **options.maxQuestions** (`number`): Limite supérieure du nombre de questions de couverture tirées de la source (valeur par défaut : 10) **options.scale** (`number`): Facteur d’échelle par lequel multiplier le score final (valeur par défaut : 1) ## Valeur renvoyée par `.run()` **score** (`number`): Score de synthèse compris entre 0 et scale (0-1 par défaut), correspondant au plus faible des scores d’alignement et de couverture **reason** (`string`): Explication lisible indiquant l’axe à l’origine du score ainsi que les affirmations ou questions qui le justifient. Les scores des deux axes figurent dans le texte **preprocessStepResult** (`object`): Verdicts d’alignement et questions tirées de la source **preprocessStepResult.alignment** (`{ claim: string; supported: boolean; reason: string }[]`): Un verdict par affirmation formulée dans le résumé **preprocessStepResult.questions** (`string[]`): Questions de couverture tirées du texte source **analyzeStepResult** (`object`): Verdicts de couverture **analyzeStepResult.coverage** (`{ question: string; answered: boolean; reason: string }[]`): Un verdict par question, fondé uniquement sur le résumé Les scores des axes sont calculés à partir de ces verdicts plutôt que stockés : l'alignement correspond à la proportion d'entrées `alignment` ayant la valeur `supported: true`, tandis que la couverture correspond à la proportion de `questions` dont l'entrée `coverage` a la valeur `answered: true`. ## Détails du scoring ### Évaluation selon deux axes Le Scorer exécute un pipeline en trois étapes : 1. **Évaluation de la source** : les affirmations du résumé sont extraites et vérifiées par rapport à la source, puis des questions fermées sont tirées de la source. Chaque question est formulée de sorte que la source y réponde « oui ». 2. **Couverture** : chaque question reçoit une réponse fondée uniquement sur le résumé. 3. **Scoring** : les deux ratios sont calculés et le plus faible devient le score. L'étape de couverture s'exécute sous la forme d'un appel de modèle distinct qui ne reçoit jamais le texte source. Un juge ayant accès à la source répondrait aux questions en s'appuyant sur celle-ci plutôt que sur le résumé, ce qui masquerait les omissions que cet axe vise précisément à mesurer. ### Formule de scoring ```text Alignment = supported_claims / total_claims Coverage = answered_questions / total_questions Summarization = min(Alignment, Coverage) × scale ``` Le score vaut 0 lorsque le résumé ne contient aucune affirmation ou que la source ne génère aucune question. ### Interprétation du score Ces plages supposent que `scale` conserve sa valeur par défaut de 1. Si vous utilisez une échelle personnalisée, multipliez les valeurs en conséquence. - **0.9-1.0** : excellent résumé, fidèle à la source et couvrant ses points principaux - **0.7-0.8** : bon résumé comportant une petite omission ou un détail non étayé - **0.4-0.6** : résumé moyen, auquel il manque des informations importantes ou qui s'écarte de la source - **0.1-0.3** : mauvais résumé, qui perd ou contredit l'essentiel de la source - **0.0** : le résumé n'a rien produit qui puisse être évalué ou n'a étayé aucune affirmation. Un résumé qui ne répond à aucune question reçoit également ce score ### Interpréter les deux axes Les deux axes ajoutent leurs verdicts au résultat de l'exécution : les verdicts d'alignement dans l'étape de prétraitement et les verdicts de couverture dans l'étape d'analyse. Chaque verdict contient l'affirmation ou la question correspondante ainsi que sa justification. Un faible score d'alignement n'a pas la même signification qu'un faible score de couverture : - Un faible score d'alignement avec une forte couverture signifie que le résumé invente ou déforme des détails - Un faible score de couverture avec un fort alignement signifie que le résumé est exact, mais omet trop d'informations Le champ reason indique l'axe à l'origine du score. ### Ce que le score ne prend pas en compte La longueur n'intervient pas dans le score. Un résumé qui répète mot pour mot la source étaye chaque affirmation et répond à chaque question ; il obtient donc un score de 1. Ajoutez votre propre contrôle de longueur lorsque la compression fait partie de ce que vous testez. ### Coût Chaque évaluation effectue trois appels de modèle. `maxQuestions` limite la partie du travail consacrée à la couverture, qui augmenterait sinon avec la longueur de la source. Augmentez cette valeur pour les documents longs dont le contenu ne peut pas être représenté par dix questions. ## Configuration du Scorer ### Résumer l'entrée d'exécution ```typescript const scorer = createSummarizationScorer({ model: 'openai/gpt-5.6-sol', }) ``` ### Résumer un document provenant d'une autre source ```typescript import { extractToolResults } from '@mastra/evals/scorers/utils' const scorer = createSummarizationScorer({ model: 'openai/gpt-5.6-sol', options: { sourceExtractor: (input, output) => { return extractToolResults(output) .filter(({ toolName }) => toolName === 'fetchDocument') .map(({ result }) => String(result)) .join('\n\n') }, maxQuestions: 20, }, }) ``` ## Exemple Évaluez un agent de synthèse par rapport à un ensemble de documents : ```typescript import { runEvals } from '@mastra/core/evals' import { createSummarizationScorer } from '@mastra/evals/scorers/prebuilt' import { summarizerAgent } from './agent' const scorer = createSummarizationScorer({ model: 'openai/gpt-5.6-sol', options: { maxQuestions: 10 }, }) const result = await runEvals({ target: summarizerAgent, scorers: [scorer], data: [ { input: 'The company was founded in 1995 by John Smith. It started with 10 employees and grew to 500 by 2020. The company is based in Seattle.', }, ], onItemComplete: ({ scorerResults }) => { console.log({ score: scorerResults[scorer.id].score, reason: scorerResults[scorer.id].reason, }) }, }) console.log(result.scores) ``` Pour en savoir plus sur `runEvals`, consultez la [référence runEvals](https://mastra.zisheng.pro/fr/reference/evals/run-evals). Pour ajouter ce Scorer à un agent, consultez le guide de [présentation des Scorers](https://mastra.zisheng.pro/fr/docs/evals/overview). ## Comparaison avec la fidélité | Cas d'utilisation | Synthèse | Fidélité | | -------------------------------- | --------------------------------------- | --------------------------------------- | | **Ce qui est mesuré** | Prise en charge et couverture combinées | Prise en charge uniquement | | **Élément de comparaison** | Texte source condensé | Contexte récupéré ou résultats de Tools | | **Détecte les omissions** | Oui | Non | | **Nécessite la source complète** | Oui | Non, le contexte seul suffit | Utilisez `faithfulness` lorsque vous cherchez à déterminer si une réponse reste ancrée dans le contexte récupéré. Utilisez `summarization` lorsque la sortie est destinée à remplacer un texte plus long. ## Ressources associées - [Faithfulness Scorer](https://mastra.zisheng.pro/fr/reference/evals/faithfulness) : mesure l'ancrage de la réponse dans le contexte - [Completeness Scorer](https://mastra.zisheng.pro/fr/reference/evals/completeness) : compare la couverture des éléments sans modèle - [Content Similarity Scorer](https://mastra.zisheng.pro/fr/reference/evals/content-similarity) : compare la similarité des textes sans modèle - [Scorers personnalisés](https://mastra.zisheng.pro/fr/docs/evals/custom-scorers) : créez vos propres métriques d'évaluation