メインコンテンツへ移動

Summarization スコアラー

createSummarizationScorer() 関数は、要約を 2 つの軸で評価するスコアラーを作成します。1 つ目は要約内のすべての主張が元のテキストによって裏付けられているか、2 つ目は元のテキストに記載された情報を維持しているかです。最終スコアには 2 つのうち低い方が採用されるため、忠実でも内容が空の要約や、網羅的でも誤った要約は合格できません。

要約にはテキストを含む Agent の最後のメッセージが使用され、元のテキストにはデフォルトで実行入力の最初のユーザーメッセージが使用されます。要約対象のテキストが Tool の結果など別の場所にある場合は、source または sourceExtractor を渡します。

使用例
使用例への直接リンク

文書を要約した内容を、その文書と照らして採点します。

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)

要約の評価
要約の評価への直接リンク

Agent がテキストを要約する場合に、このスコアラーを使用します。

  • 文書や文字起こしの要約
  • サポートスレッドやメールのダイジェスト
  • 長い入力を短い出力に圧縮するあらゆるステップ

パラメーター
パラメーターへの直接リンク

model:

MastraModelConfig
主張とカバレッジに関する質問の判定に使用する言語モデル

options?:

SummarizationMetricOptions
スコアラーの設定オプション
SummarizationMetricOptions

source?:

string
要約の評価基準となるテキスト。デフォルトは実行入力のユーザーメッセージ

sourceExtractor?:

(input, output) => string
実行の入力と出力から元のテキストを導出する関数。source より優先されます

maxQuestions?:

number
元のテキストから作成するカバレッジに関する質問数の上限(デフォルト: 10)

scale?:

number
最終スコアに乗算するスケール係数(デフォルト: 1)

.run() の戻り値
run-returnsへの直接リンク

score:

number
0 から scale までの Summarization スコア(デフォルトでは 0〜1)。整合性とカバレッジのスコアのうち低い方

reason:

string
スコアの決定要因となった軸と、その根拠となる主張または質問を示す、人が読める説明。テキストには両方の軸のスコアが含まれます

preprocessStepResult:

object
整合性の判定結果と、元のテキストから作成された質問
object

alignment:

{ claim: string; supported: boolean; reason: string }[]
要約内の各主張に対する判定結果

questions:

string[]
元のテキストから作成されたカバレッジに関する質問

analyzeStepResult:

object
カバレッジの判定結果
object

coverage:

{ question: string; answered: boolean; reason: string }[]
要約だけを使用して回答した、各質問に対する判定結果

各軸のスコアは保存されるのではなく、これらの判定結果から算出されます。整合性は supported: true である alignment エントリの割合、カバレッジは対応する coverage エントリが answered: true である questions の割合です。

採点の詳細
採点の詳細への直接リンク

2 軸による評価
2 軸による評価への直接リンク

スコアラーは、次の 3 ステップのパイプラインを実行します。

  1. 元のテキストに基づく判定: 要約内の主張を抽出して元のテキストと照合し、元のテキストからクローズドクエスチョンを作成します。すべての質問は、元のテキストに基づく答えが「はい」になるように記述されます。
  2. カバレッジ: 要約だけを使用して各質問に回答します。
  3. 採点: 2 つの割合を計算し、低い方をスコアとします。

カバレッジのステップは、元のテキストを一切受け取らない独立したモデル呼び出しとして実行されます。判定モデルが元のテキストを参照できると、要約ではなく元のテキストから質問に回答してしまい、この軸が測定するために存在する情報の欠落が隠れてしまいます。

採点式
採点式への直接リンク

Alignment = supported_claims / total_claims
Coverage = answered_questions / total_questions
Summarization = min(Alignment, Coverage) × scale

要約から主張が得られない場合、または元のテキストから質問が得られない場合、スコアは 0 です。

スコアの解釈
スコアの解釈への直接リンク

次の範囲は、デフォルトの scale である 1 を前提としています。カスタムスケールを使用する場合は、それに応じて乗算してください。

  • 0.9-1.0: 元のテキストに忠実で、主要なポイントを網羅した優れた要約
  • 0.7-0.8: 小さな情報の欠落、または裏付けのない詳細がある良い要約
  • 0.4-0.6: 重要な情報が欠けている、または元のテキストから逸脱している中程度の要約
  • 0.1-0.3: 元のテキストの大部分が失われている、または矛盾している不十分な要約
  • 0.0: 要約に判定対象がないか、どの主張も裏付けられていません。どの質問にも答えていない要約もこのスコアになります

2 つの軸の読み方
2 つの軸の読み方への直接リンク

両方の軸の判定結果は実行結果に残ります。整合性の判定結果は前処理ステップ、カバレッジの判定結果は分析ステップにあります。各判定結果には、対応する主張または質問と、その判定理由が含まれます。整合性スコアが低い場合とカバレッジスコアが低い場合では、意味が異なります。

  • カバレッジが高く整合性スコアが低い場合、要約が詳細を捏造または歪曲しています
  • 整合性が高くカバレッジスコアが低い場合、要約は正確ですが、多くの情報が欠けています

reason フィールドには、スコアの決定要因となった軸の名前が示されます。

スコアに含まれない要素
スコアに含まれない要素への直接リンク

長さはスコアに一切影響しません。元のテキストを一語一句繰り返す要約は、すべての主張が裏付けられ、すべての質問に答えるため、スコアは 1 になります。圧縮の度合いもテスト対象に含める場合は、独自の長さチェックを追加してください。

コスト
コストへの直接リンク

各評価では、モデルが 3 回呼び出されます。maxQuestions はカバレッジに関する処理量の上限を設定します。この処理量は、上限がなければ元のテキストの長さに応じて増加します。10 個の質問では内容を表現できない長い文書の場合は、値を増やしてください。

スコアラーの設定
スコアラーの設定への直接リンク

実行入力を要約する
実行入力を要約するへの直接リンク

const scorer = createSummarizationScorer({
model: 'openai/gpt-5.6-sol',
})

別の場所にある文書を要約する
別の場所にある文書を要約するへの直接リンク

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,
},
})

例への直接リンク

一連の文書を使用して、要約 Agent を評価します。

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)

runEvals の詳細については、runEvals リファレンスを参照してください。

このスコアラーを Agent に追加する方法については、Scorers の概要ガイドを参照してください。

Faithfulness との比較
Faithfulness との比較への直接リンク

ユースケースSummarizationFaithfulness
測定対象裏付けとカバレッジの両方裏付けのみ
評価基準要約対象となる元のテキスト取得したコンテキストまたは Tool の結果
情報の欠落を検出はいいいえ
元のテキスト全体が必要はいいいえ。コンテキストだけで十分です

取得したコンテキストに回答が根拠付けられているかを確認する場合は、faithfulness を使用します。出力が長いテキストの代わりとなることを意図している場合は、summarization を使用します。