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'utilisationLien direct vers Exemple d'utilisation
Évaluez un résumé par rapport au document qu'il condense.
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èseLien direct vers É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ètresLien direct vers Paramètres
model:
options?:
source?:
sourceExtractor?:
maxQuestions?:
scale?:
Valeur renvoyée par .run()Lien direct vers run-returns
score:
reason:
preprocessStepResult:
alignment:
questions:
analyzeStepResult:
coverage:
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 scoringLien direct vers Détails du scoring
Évaluation selon deux axesLien direct vers Évaluation selon deux axes
Le Scorer exécute un pipeline en trois étapes :
- É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 ».
- Couverture : chaque question reçoit une réponse fondée uniquement sur le résumé.
- 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 scoringLien direct vers Formule de scoring
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 scoreLien direct vers 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 axesLien direct vers 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 compteLien direct vers 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ûtLien direct vers 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 ScorerLien direct vers Configuration du Scorer
Résumer l'entrée d'exécutionLien direct vers Résumer l'entrée d'exécution
const scorer = createSummarizationScorer({
model: 'openai/gpt-5.6-sol',
})
Résumer un document provenant d'une autre sourceLien direct vers Résumer un document provenant d'une autre source
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,
},
})
ExempleLien direct vers Exemple
Évaluez un agent de synthèse par rapport à un ensemble de documents :
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.
Pour ajouter ce Scorer à un agent, consultez le guide de présentation des Scorers.
Comparaison avec la fidélitéLien direct vers 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éesLien direct vers Ressources associées
- Faithfulness Scorer : mesure l'ancrage de la réponse dans le contexte
- Completeness Scorer : compare la couverture des éléments sans modèle
- Content Similarity Scorer : compare la similarité des textes sans modèle
- Scorers personnalisés : créez vos propres métriques d'évaluation