Summarization scorer
createSummarizationScorer() 函數會建立一個 scorer,從兩個維度評估摘要:當中的每項陳述是否都獲來源文字支持,以及摘要是否保留來源所述的資料。最終分數取兩者中較低者,因此摘要不能單靠忠於來源但內容空泛,或內容全面但不正確而通過評估。
摘要是 Agent 最後一則包含文字的訊息,而來源文字預設為執行輸入中的第一則用戶訊息。如果要摘要的文字位於其他地方(例如 Tool 結果),請傳入 source 或 sourceExtractor。
使用範例使用範例 的直接連結
根據摘要所濃縮的文件為摘要評分。
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:
options?:
source?:
sourceExtractor?:
maxQuestions?:
scale?:
.run() 傳回值run-returns 的直接連結
score:
reason:
preprocessStepResult:
alignment:
questions:
analyzeStepResult:
coverage:
各維度的分數會從這些判定結果推算,而不會儲存:一致性是 alignment 項目中 supported: true 所佔的比例,而覆蓋範圍則是 questions 中其 coverage 項目為 answered: true 的比例。
評分詳情評分詳情 的直接連結
雙維度評估雙維度評估 的直接連結
此 scorer 會執行三步驟流程:
- 來源判斷:擷取摘要中的陳述並對照來源檢查,同時從來源擬定封閉式問題。每條問題都會以來源答案為「yes」的方式撰寫。
- 覆蓋範圍:只使用摘要回答每條問題。
- 評分:計算兩個比例,並以較低者作為分數。
覆蓋範圍步驟會以獨立的模型呼叫執行,而且絕不會接收來源文字。如果判斷模型能看到來源,就會根據來源而非摘要回答問題,因而掩蓋此維度旨在衡量的遺漏。
評分公式評分公式 的直接連結
Alignment = supported_claims / total_claims
Coverage = answered_questions / total_questions
Summarization = min(Alignment, Coverage) × scale
如果摘要沒有產生任何陳述,或來源沒有產生任何問題,分數便是 0。
分數解讀分數解讀 的直接連結
以下範圍假設使用預設的 scale 值 1。使用自訂 scale 時,請相應地相乘。
- 0.9-1.0:出色的摘要,忠於來源並涵蓋其要點
- 0.7-0.8:良好的摘要,只有少量遺漏或一項缺乏支持的細節
- 0.4-0.6:一般的摘要,遺漏重要資料或偏離來源
- 0.1-0.3:欠佳的摘要,來源的大部分內容都已遺失或被否定
- 0.0:摘要沒有產生可供判斷的內容,或未能支持任何陳述。沒有回答任何問題的摘要亦會獲得此分數
解讀兩個維度解讀兩個維度 的直接連結
兩個維度的判定結果都會保留在執行結果中:一致性判定結果位於預處理步驟,覆蓋範圍判定結果則位於分析步驟。每個判定結果都會包含其所屬的陳述或問題,以及背後的原因。一致性分數低與覆蓋範圍分數低所代表的意思不同:
- 一致性分數低但覆蓋範圍高,表示摘要虛構或扭曲了細節
- 覆蓋範圍分數低但一致性高,表示摘要準確,但遺漏了太多內容
reason 欄位會列明哪個維度產生該分數。
分數沒有考慮的因素分數沒有考慮的因素 的直接連結
長度不會影響分數。逐字重複來源的摘要會支持每項陳述並回答每條問題,因此得分為 1。如果壓縮程度是測試的一部分,請自行加入長度檢查。
成本成本 的直接連結
每次評估都會進行三次模型呼叫。maxQuestions 會限制覆蓋範圍部分的工作量;否則工作量會隨來源長度增加。對於無法以十條問題代表內容的長篇文件,請提高此值。
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:
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 比較 的直接連結
| 使用情境 | Summarization | Faithfulness |
|---|---|---|
| 衡量內容 | 同時衡量支持程度及覆蓋範圍 | 只衡量支持程度 |
| 評判依據 | 被濃縮的來源文字 | 擷取的上下文或 Tool 結果 |
| 能否偵測遺漏 | 可以 | 不可以 |
| 是否需要完整來源 | 需要 | 不需要,只有上下文亦足夠 |
如果問題在於答案是否以擷取的上下文為依據,請使用 faithfulness。如果輸出旨在代替較長的文字,請使用 summarization。
相關內容相關內容 的直接連結
- Faithfulness Scorer:衡量答案以相關上下文為依據的程度
- Completeness Scorer:在不使用模型的情況下比較元素覆蓋範圍
- Content Similarity Scorer:在不使用模型的情況下比較文字相似度
- Custom Scorer:建立你自己的評估指標