Aller au contenu principal

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
Lien direct vers Exemple d'utilisation

Évaluez un résumé par rapport au document qu'il condense.

src/mastra/scorers/summarization.ts
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
Lien 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ètres
Lien direct vers 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
SummarizationMetricOptions

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

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

maxQuestions?:

number
Limite supérieure du nombre de questions de couverture tirées de la source (valeur par défaut : 10)

scale?:

number
Facteur d’échelle par lequel multiplier le score final (valeur par défaut : 1)

Valeur renvoyée par .run()
Lien direct vers run-returns

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
object

alignment:

{ claim: string; supported: boolean; reason: string }[]
Un verdict par affirmation formulée dans le résumé

questions:

string[]
Questions de couverture tirées du texte source

analyzeStepResult:

object
Verdicts de couverture
object

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
Lien direct vers Détails du scoring

Évaluation selon deux axes
Lien direct vers É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
Lien 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 score
Lien 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 axes
Lien 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 compte
Lien 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ût
Lien 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 Scorer
Lien direct vers Configuration du Scorer

Résumer l'entrée d'exécution
Lien 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 source
Lien 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,
},
})

Exemple
Lien direct vers Exemple

Évaluez un agent de synthèse par rapport à un ensemble de documents :

src/example-summarization.ts
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'utilisationSynthèseFidélité
Ce qui est mesuréPrise en charge et couverture combinéesPrise en charge uniquement
Élément de comparaisonTexte source condenséContexte récupéré ou résultats de Tools
Détecte les omissionsOuiNon
Nécessite la source complèteOuiNon, 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.