原创

AI 总结质量怎么测?从人工评分到自动回归测试的完整方案

给出一套可重复的 AI 总结质量评估流程:固定测试集、人工评分量表、事实一致性检查、结构化断言、版本对比与发布门禁,帮助在模型、提示词或清洗规则变更后发现质量退化。

AI 内容工程专题 · 第 5/11 篇查看专题目录 →

AI 总结功能能返回文字,不等于它已经可用。模型更换、提示词调整、正文清洗规则变化,甚至同一模型的服务版本更新,都可能让总结悄悄变长、漏掉关键事实、混入原文没有的结论,或者破坏前端依赖的 JSON 格式。

因此,AI 总结不能只靠管理员偶尔阅读几条结果。更稳妥的方式是建立一套回归测试:固定一批有代表性的原文,为每篇文章保存人工评审依据,每次修改模型或提示词后重新生成,再比较质量与格式是否退步。

本文关注的是“怎样验证总结质量”,不重复讲抓取和任务调度。流水线拆分可先阅读Node.js AI 总结管线设计,多模型切换则参考Node.js 多模型轮询与故障切换。

一、先定义什么是合格总结

如果团队只说“读起来不错”,评审结果很难复现。可以把质量拆成六个可观察维度:

  1. 事实一致性:人物、产品、版本、时间和数字是否来自原文;
  2. 关键点覆盖:是否保留文章最重要的结论与限制条件;
  3. 信息密度:有没有重复、套话和不必要的背景;
  4. 表达清晰度:句子是否自然,主语和指代是否明确;
  5. 边界意识:原文不确定的内容,是否被模型写成确定事实;
  6. 格式合规:字段、长度、条目数量和数据类型是否符合程序约束。

其中,格式可以自动检查;事实一致性和关键点覆盖仍需要人工评审或有证据约束的辅助检查。不要把“模型自评 0.95”直接当作准确率。

二、建立固定且可追溯的测试集

测试集不应只选结构工整的短文。它需要覆盖线上真实会遇到的困难样本,例如:

  • 包含多个相近产品名或模型名;
  • 有版本号、日期、价格或百分比;
  • 标题带有夸张表述,但正文结论更克制;
  • 中文正文中混有英文代码和引用;
  • 页面正文很短,或抓取后残留导航文本;
  • 多个来源报道同一事件,但细节不同;
  • 原文明确表示尚未确认或仅为预测。

每个样本至少保存稳定 ID、原文快照、来源 URL、抓取时间、正文哈希、关键事实清单和人工参考摘要。保存原文快照很重要:如果只保留 URL,上游页面更新后,同一次回归测试的输入就已经不同。

{
  "id": "fixture-001",
  "sourceUrl": "https://example.com/article",
  "contentHash": "sha256:...",
  "mustInclude": ["产品名称", "主要变化"],
  "mustNotClaim": ["原文没有确认的发布日期"],
  "referenceSummary": "由编辑审核的参考摘要"
}

参考摘要不是唯一标准答案。它的作用是帮助评审者对齐关键事实,而不是要求模型逐字复现。

三、用评分量表减少主观差异

可以给每个维度设置 0 到 2 分:

分值 事实一致性 关键点覆盖 清晰度
0 存在关键事实错误或无依据结论 遗漏核心结论 难以理解或严重重复
1 次要表述不够准确 覆盖部分关键点 基本可读但需要编辑
2 未发现与原文冲突的陈述 覆盖人工清单中的关键点 简洁、明确、可直接使用

上线门禁不应只看总分。一个总结即使其他维度得分较高,只要出现关键事实错误,也应进入人工复核。具体分值、权重与通过条件必须用真实样本校准,本文不把示例阈值当作本站实测结论。

如果多人参与评审,先让两位评审者独立打分,再讨论差异较大的案例。这样比共同阅读后直接达成一个分数,更容易发现量表定义是否含糊。

四、把确定性规则变成自动断言

程序最适合检查明确约束,例如字段是否存在、摘要是否为空、条目数量是否越界、是否泄露 HTML、是否重复标题。

import assert from 'node:assert/strict';

export function assertSummaryShape(result) {
  assert.equal(typeof result.intro, 'string');
  assert.ok(result.intro.trim().length > 0, 'intro 不能为空');
  assert.ok(Array.isArray(result.picks), 'picks 必须是数组');
  assert.ok(result.picks.length >= 1, '至少需要一条精选');

  for (const item of result.picks) {
    assert.equal(typeof item.title, 'string');
    assert.equal(typeof item.summary, 'string');
    assert.ok(!/<script|<iframe/i.test(item.summary), '摘要包含危险 HTML');
  }
}

如果模型返回 JSON,还应使用 JSON Schema 或等价校验器约束类型、必填字段和额外属性。具体解析与修复策略可参考GLM-4.7-Flash 结构化 JSON 输出。

长度规则要以字符或分词后的单位明确计算,不能只在提示词里写“简短”。同样,不应自动断言某个总结必须包含全部原文数字,因为有些数字并非关键信息。适合写成规则的,必须是业务真正确定的约束。

五、记录每次生成的完整实验信息

如果只保存最终摘要,发生退化时很难定位原因。每次回归运行建议记录:

const runRecord = {
  runId: crypto.randomUUID(),
  fixtureId: fixture.id,
  inputHash: fixture.contentHash,
  provider: model.provider,
  model: model.name,
  promptVersion: 'summary-v3',
  configVersion: '2026-08-13',
  startedAt: new Date().toISOString(),
  output: result,
  validation: { passed: true, errors: [] },
  usage: response.usage ?? null
};

记录模型配置 ID 即可,不要保存 API Key。供应商名称、模型名、提示词版本、输入哈希和运行时间,都是复现问题所需的信息。后台显示“当前使用哪个模型总结”时,也应来自这份执行记录,而不是只读取当前配置,因为配置可能在任务完成后被修改。

六、比较候选版本,而不是覆盖基线

设当前线上组合为基线 baseline,待发布的模型或提示词为 candidate。对同一批固定输入分别生成结果,再按样本展示差异。

function compareRuns(baseline, candidate) {
  return candidate.map(next => {
    const prev = baseline.find(x => x.fixtureId === next.fixtureId);
    return {
      fixtureId: next.fixtureId,
      formatChanged: JSON.stringify(prev?.validation) !== JSON.stringify(next.validation),
      previousOutput: prev?.output ?? null,
      candidateOutput: next.output
    };
  });
}

纯文本 diff 能显示词句变化,却无法判断变化是否更准确。因此后台最好同时展示原文证据、旧总结、新总结、自动校验结果和人工评分。不要让候选结果直接覆盖基线;只有审核通过后,才更新生产配置和基线版本。

七、为事实核验建立证据链

完全依赖另一个模型判断“是否忠实”仍可能产生误判。更可审核的方式,是让总结中的关键陈述附带原文证据位置,然后由程序或人工核对。

{
  "summary": "某产品增加了结构化输出能力。",
  "claims": [
    {
      "text": "增加了结构化输出能力",
      "evidence": ["paragraph-12"]
    }
  ]
}

证据位置只能证明模型指向了某段原文,不能自动证明它理解正确,但能显著降低人工回查成本。涉及数字、否定词、时间范围和对比结论时,应优先进入严格核验。

八、设置分层发布门禁

一次回归测试可以分三层:

  1. 硬性失败:JSON 解析失败、必填字段缺失、关键事实冲突;
  2. 需要复核:输出变化明显、低把握样本、边界案例或新模型首次使用;
  3. 允许发布:自动规则通过,且抽样人工评审没有发现阻断问题。

“允许发布”不意味着总结永久正确。生产环境仍要保留人工编辑入口、失败重跑和旧版本回退。抓取与总结分开执行后,可以固定抓取结果,只重跑总结,从而避免上游内容变化干扰比较。

九、模型轮询场景要分别评估

如果网站支持多个模型轮询,不能只评估默认模型。每个可能承担总结任务的模型都需要跑同一测试集,并单独保存结果。故障切换后的备用模型还可能使用不同上下文长度、JSON 支持方式或敏感词策略。

建议把“模型配置 ID + 提示词版本”看作一个可发布单元。某个组合未通过回归时,即使 API 连通测试成功,也不应自动加入总结轮询池。多模型的重试、熔断和健康状态设计,可继续阅读Node.js 多模型轮询与故障切换。

十、推荐的最小落地顺序

对于刚开始建立原创内容系统的网站,可以按以下顺序实施:

  1. 从已人工审核的文章中选出一批不同类型样本;
  2. 固定原文快照,并写出关键事实清单;
  3. 保存当前模型、提示词和输出作为基线;
  4. 先实现 JSON、字段和长度等确定性断言;
  5. 在后台增加旧版与候选版并排审核;
  6. 记录人工评分、修改原因和最终决定;
  7. 模型或提示词变更前自动运行整套回归;
  8. 发布后持续收集失败案例,补充进测试集。

测试集不是一次性文件。每次遇到漏事实、错误归因、格式破坏或异常长文,都应把脱敏后的案例加入回归集,让同类问题以后更容易被发现。

上线前检查清单

  • 测试输入使用固定快照并保存哈希;
  • 测试集覆盖短文、长文、数字、否定与不确定表述;
  • 模型、提示词、参数和执行时间可追溯;
  • 格式错误与事实错误采用硬性门禁;
  • 候选输出不会覆盖线上基线;
  • 多模型轮询池中的每个模型分别通过评估;
  • API Key 不进入日志和测试夹具;
  • 未完成真实评估前,不对外宣称准确率或质量提升比例。

FAQ

可以只用另一个大模型当裁判吗?

可以把模型裁判作为筛查信号,但不应把它当作唯一真值。裁判模型也可能偏好特定文风、忽略细小事实错误,或受到输入顺序影响。关键样本仍应由人工结合原文证据审核。

每次运行结果不同,回归测试还有意义吗?

有意义。回归测试不是要求每个字完全相同,而是检查结构、事实边界和人工评分是否退化。固定输入、模型参数和提示词版本可以减少变量;对重要变更也可以重复运行,观察输出是否稳定。

自动测试通过后能直接发布吗?

不一定。格式断言只能证明输出符合程序约束,不能证明全部事实正确。高风险内容、新模型首次上线、明显变化和边界样本应进入人工复核。

应该先测模型还是先优化提示词?

先保存当前组合的基线,再一次只改变一个变量。否则模型和提示词同时更换,即使质量变化,也无法判断原因。

总结

可持续的 AI 总结系统,需要的不只是一个能返回文本的接口,而是一套能发现退化、保留证据并支持回退的质量流程。固定测试集让输入可复现,人工量表让质量有共同语言,自动断言守住格式底线,版本对比与发布门禁则避免未经审核的变化直接进入生产。

先从少量真实样本开始,把每次线上失败沉淀成新的测试夹具,比发布一个未经验证的“高准确率”数字更有价值。

让评估结果可以回到具体版本

质量回归必须绑定不可变的提示词版本和配置快照,才能判断变化来自模型还是 Prompt。可继续阅读 生产环境 Prompt 版本管理:灰度、评估与回滚 与 AI 内容管线可观测性。

实测与内容说明

实测记录

  • 本文给出可执行的评估框架和 Node.js 示例,但未在本站生产数据上得出准确率、通过率、耗时或成本结论,不提供未经验证的质量数字。
  • 文中的评分阈值、样本数量和权重均为演示配置;正式上线前需使用本站人工标注样本校准,并保存评审记录。
  • 示例代码按 Node.js ESM 语法进行静态审阅,模型输出仍具有非确定性,不能以单次运行代替持续回归。

参考资料

内容版本 1.1 · 审核:推荐智能手记 · 计划复审:2026-11-13