跳到主要内容

摘要 Scorer

createSummarizationScorer() 函数创建一个从两个维度评估摘要的 Scorer:摘要中的每项声明是否都得到源文本支持,以及摘要是否保留了源文本陈述的信息。最终分数取两者中的较低值,因此摘要无法仅凭忠实但空洞,或全面但错误而通过评估。

摘要取自 Agent 最后一条包含文本的消息,源文本默认取自运行输入中的第一条用户消息。当待摘要文本位于其他位置(例如 Tool 结果)时,请传入 sourcesourceExtractor

用法示例
用法示例的直接链接

根据摘要所浓缩的文档对其评分。

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 需要浓缩文本时,请使用此 Scorer:

  • 文档和转录文本摘要
  • 支持工单对话和电子邮件摘要
  • 任何将长输入压缩为短输出的步骤

参数
参数的直接链接

model:

MastraModelConfig
用于判断声明和覆盖问题的语言模型

options?:

SummarizationMetricOptions
Scorer 的配置选项
SummarizationMetricOptions

source?:

string
用于评估摘要的文本。默认为运行输入中的用户消息

sourceExtractor?:

(input, output) => string
从运行输入和输出中提取源文本的函数。优先级高于 source

maxQuestions?:

number
从源文本生成的覆盖问题数量上限(默认为 10)

scale?:

number
最终分数所乘的缩放系数(默认为 1)

.run() 返回值
run-returns的直接链接

score:

number
介于 0 和 scale 之间的摘要分数(默认为 0-1),取 Alignment 与 Coverage 分数中的较低值

reason:

string
易于理解的说明,指出决定最终分数的维度及其相关声明或问题。文本中会显示两个维度的分数

preprocessStepResult:

object
Alignment 判定结果以及从源文本生成的问题
object

alignment:

{ claim: string; supported: boolean; reason: string }[]
摘要中的每项声明对应一个判定结果

questions:

string[]
从源文本生成的覆盖问题

analyzeStepResult:

object
Coverage 判定结果
object

coverage:

{ question: string; answered: boolean; reason: string }[]
每个问题对应一个仅根据摘要作出的判定结果

各维度分数根据这些判定结果计算,而非直接存储:Alignment 是 alignment 条目中 supported: true 所占的比例,Coverage 是 questions 中对应 coverage 条目为 answered: true 的比例。

评分详情
评分详情的直接链接

双维度评估
双维度评估的直接链接

该 Scorer 运行一个三步 pipeline:

  1. 源文本判断:提取摘要中的声明并根据源文本进行检查,同时从源文本生成封闭式问题。每个问题都会被设计成源文本可回答 "yes"。
  2. Coverage:仅根据摘要回答每个问题。
  3. 评分:计算两个比例,并取较低值作为分数。

Coverage 步骤作为单独的模型调用运行,并且绝不会接收源文本。如果 Judge 可以看到源文本,就会根据源文本而非摘要回答问题,从而掩盖该维度旨在衡量的遗漏。

评分公式
评分公式的直接链接

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: 摘要没有产生可供判断的内容,或未能支持任何声明。无法回答任何问题的摘要也会获得此分数

解读两个维度
解读两个维度的直接链接

两个维度都会在运行结果中留下判定结果:Alignment 判定结果位于预处理步骤,Coverage 判定结果位于分析步骤。每项判定结果都包含对应的声明或问题及其原因。Alignment 分数低与 Coverage 分数低的含义不同:

  • Alignment 分数低但 Coverage 分数高,表示摘要虚构或歪曲了细节
  • Coverage 分数低但 Alignment 分数高,表示摘要准确但遗漏过多

reason 字段会指出决定该分数的维度。

分数未涵盖的内容
分数未涵盖的内容的直接链接

长度不会影响分数。逐字重复源文本的摘要能够支持每项声明并回答每个问题,因此会得到 1 分。如果压缩程度是测试目标之一,请自行添加长度检查。

成本
成本的直接链接

每次评估会进行三次模型调用。maxQuestions 限制 Coverage 部分的工作量,否则工作量会随源文本长度增长。对于无法用十个问题充分呈现内容的长文档,请提高此值。

Scorer 配置
Scorer 配置的直接链接

对运行输入进行摘要
对运行输入进行摘要的直接链接

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 参考

要将此 Scorer 添加到 Agent,请参阅 Scorer 概述指南。

与 Faithfulness 的比较
与 Faithfulness 的比较的直接链接

使用场景SummarizationFaithfulness
衡量内容同时衡量支持度与覆盖度仅衡量支持度
判断依据待浓缩的源文本检索到的上下文或 Tool 结果
能否发现遗漏No
是否需要完整源文本否,仅上下文就足够

当需要判断答案是否以检索到的上下文为依据时,请使用 faithfulness。当输出旨在代替较长文本时,请使用 summarization