跳到主要内容
IM智引科技

研究 / 外贸与 B2B 增长

AI Skill:注册表健康度报告——全站 SEO 状态一键快照

前五个审计 Skill 各查一个维度,GEO 意图注册表补充覆盖、一致性与引用数据;这个 Skill 把它们编排成一条流水线,产出可直接汇报的季度健康度报告。

BLKTECH 编辑部2026年8月4日12 分钟难度 实战免费Node.jsAI Agent

健康度报告编排前五个专项审计,并读入 GEO 意图注册表提供的覆盖、一致性与引用数据,输出注册表完整性、页面覆盖率、内链闭环率和 GEO 就绪度四个指标,以及趋势对比和按 ROI 排序的行动清单。

AI Skill:注册表健康度报告——全站 SEO 状态一键快照

这个 Skill 和前面的关系

前五个 Skill 是专项检查,各查一个维度,输出的是问题清单。随后建立的 GEO 意图注册表,又补上了问题覆盖、一致性与引用实测三类站级数据。

这个 Skill 是编排层:按顺序调用专项审计,并读入 GEO 意图注册表的审计结果,把它们聚合成四个量化指标,输出一份可以直接给自己或团队看的季度报告。

第45篇 注册表审计       ─┐
第46篇 覆盖度审计       ─┤
第47篇 Cannibalization  ─┤
第48篇 内链流审计       ─┼─→ 本 Skill 编排 ─→ 健康度报告
第49篇 GEO 结构审计     ─┘    (聚合 + 量化 + 排序)
第73–79篇 GEO 站级控制层 ───→ 补充意图覆盖、一致性与引用数据

为什么需要单独一个编排 Skill:单个专项报告告诉你“哪里有问题”,健康度报告告诉你“整体状态如何、这个季度该优先做什么”。后者才是决策依据。


四个量化指标

指标的价值在于可对比——这个季度和上个季度比,是变好还是变差。

指标一:注册表完整性(Registry Integrity)

计算:(1 - error数 / 注册表行数) × 100%

数据来源:第45篇 registry-lint.mjs
目标值:100%(error 必须为 0)

指标二:页面覆盖率(Page Coverage)

计算:已建页面数 / 注册表规划页面数 × 100%

数据来源:第46篇 coverage-audit.mjs
目标值:≥ 85%(留 15% 作为规划中的增长空间)

附加指标:未纳管页面数(应为 0)
计算:有精准锚文本内链的 Cluster 数 / 总 Cluster 数 × 100%

数据来源:第48篇 link-flow-audit.mjs
目标值:100%(每个 Cluster 都必须有)

指标四:GEO 就绪度(GEO Readiness)

计算:加权评分
  致命项通过(robots + SSR):40 分(不通过则总分为 0)
  FAQ 规范符合率:20 分
  参数表规范符合率:20 分
  Schema 完整率:20 分

数据来源:第49篇 geo-audit.mjs
目标值:≥ 85 分

GEO 意图注册表现在是这项指标的正式期望值来源。

上面这个算的是“结构合规率”——它只能说明格式对不对,说明不了该答的问题答了没有。有了注册表当期望值之后,改成三个串联的比率:

GEO 就绪度 = 落地率 × 一致率 × 引用率

落地率 = 已落地的 active 意图 / 全部 active 意图(排除 self_answerable: false)
一致率 = 无 error 的意图 / 已落地意图
引用率 = 实测 cited 的意图 / 本季度实测集(20–40 条)

数据来源:第78篇 geo-registry-audit.mjs + 季度实测记录

为什么相乘而不是分开列:三者是串联关系——没落地就谈不上一致,不一致就大概率不会被引。任何一环塌了整体就塌了,相乘能反映这一点,分开列会掩盖它。详见GEO 审计升级。第 49 篇负责结构层,第 78 篇负责意图覆盖与一致性,二者的结果在这里汇总。


Skill 说明书

# Skill:注册表健康度报告

## 何时使用
- 每季度定期执行(推荐固定日期,如每季度首个周一)
- 需要向团队/管理层汇报 SEO 状态时
- 大版本改动后的整体验证

## 前置条件
以下五个脚本必须已就位:
- scripts/registry-lint.mjs(第45篇)
- scripts/coverage-audit.mjs(第46篇)
- scripts/cannibalization-detect.mjs(第47篇,需 GSC 数据)
- scripts/link-flow-audit.mjs(第48篇)
- scripts/geo-audit.mjs(第49篇)

## 执行步骤

### Step 1:按顺序执行五个脚本

执行 `scripts/health-report.mjs`,它会依次调用五个脚本
并把结果聚合到一个 JSON。

注意顺序不能变——GEO 审计的致命项如果不通过,
后续指标的意义会打折扣,报告中需要标注这一点。

### Step 2:读取历史数据做趋势对比

读取 `reports/health-history.json`(如存在),
取上一期的四个指标值,计算变化量。

首次运行时无历史数据,趋势列标注"首次"。

### Step 3:行动项排序(你来判断)

把五个专项报告的所有 error 和 warn 汇总,按以下规则排序:

**排序权重**
1. GEO 致命项(robots 屏蔽、客户端渲染)→ 最高优先级
2. 注册表 error(唯一性冲突)→ 高
3. 已确认的 Cannibalization(有 GSC 证据)→ 高
4. 内链完全断流的 Cluster → 中高
5. 未纳管页面 → 中高
6. 无效锚文本 → 中
7. FAQ/参数表格式问题 → 中
8. 部分匹配锚文本、缺英制单位 → 低

**只输出 Top 5**。超过 5 项的行动清单在实践中执行不完,
剩余项放在附录里列出数量即可。

每个行动项必须包含:
- 具体动作(可以直接执行的,不是"优化 XX")
- 涉及的文件数
- 预估工时
- 预期影响(哪个指标会改善多少)

### Step 4:说明不需要处理的项

这一节容易被省略,但很重要——避免下个季度重复分析同样的
假阳性。列出本次判定为"不需处理"的项及原因。

## 输出格式

SEO 健康度报告

生成日期:[YYYY-MM-DD] 对比基准:[上期日期 或 首次]

指标总览

指标 当前 上期 变化 目标 状态
注册表完整性 96% 88% ↑8 100% ⚠️
页面覆盖率 78% 65% ↑13 ≥85% ⚠️
内链闭环率 84% 72% ↑12 100% ⚠️
GEO 就绪度 92 70 ↑22 ≥85

整体判断:[一句话总结,如“三项改善,注册表完整性距目标仅差 2 项 error”]

本季度 Top 5 行动项

1. 修复注册表唯一性冲突(2 项 error)

  • 动作:
    • /about/ 移除 PKW centrifugal pump manufacturer, 改为 about aquaflow industrial,NKW 加入原词
    • /products/pump-factory/ 301 重定向到 /products/centrifugal-pumps/
  • 涉及:2 个页面 + 注册表 2 行
  • 预估工时:1 小时
  • 预期影响:注册表完整性 96% → 100%

2. 补充 5 个 Cluster 的 Pillar 内链

  • 动作:在以下页面正文第二段添加指向对应 Pillar 的内链, 锚文本使用 Pillar PKW:
    • /applications/centrifugal-pump-mining/
    • /applications/centrifugal-pump-hvac/
    • (其余 3 个列出)
  • 涉及:5 个页面
  • 预估工时:1.5 小时
  • 预期影响:内链闭环率 84% → 100%

3. 处理 3 个未纳管页面

(同样格式)

4. 建 Top 3 待建页面

(同样格式,附建议的 PKW 和内容要点)

5. FAQ 自包含性修复(8 处)

(同样格式)

Top 5 合计预估工时:[N] 小时

判定为不需处理([N] 项)

1. query industrial pump specifications 的多页面曝光

  • 判定:假阳性
  • 原因:CP-100 排名稳定 Top 5(4.1),CP-200 曝光占比仅 5%, 属正常的多型号覆盖
  • 下期处理:无需重复分析

2. Google-Extended 未在 robots.txt 显式声明

  • 判定:可接受
  • 原因:User-agent: * 允许,默认放行有效
  • 下期处理:可选优化,非必需

附录:剩余问题数量

  • 锚文本部分匹配:12 项(低优先级)
  • 参数表缺英制单位:18 项(低优先级)
  • 未被索引的已建页面:4 项(需再观察 4 周)

指标计算依据

[附上四个指标的原始数据,便于核对]


## 禁止行为
- Top 5 行动项不要超过 5 项
- 不要输出"建议持续优化"这类没有具体动作的行动项
- 不要跳过"判定为不需处理"这一节
- GEO 致命项不通过时,必须在报告开头醒目标注,
  且此时其他三个指标标注为"参考值"

编排脚本

// scripts/health-report.mjs
import { execSync } from 'child_process';
import fs from 'fs/promises';
import path from 'path';

const REPORTS_DIR = 'reports';
const HISTORY_FILE = path.join(REPORTS_DIR, 'health-history.json');

function run(script, args = '') {
  try {
    const out = execSync(`node ${script} ${args}`, {
      encoding: 'utf8',
      maxBuffer: 20 * 1024 * 1024,
    });
    return JSON.parse(out);
  } catch (e) {
    // geo-audit 在致命项失败时 exit(1),但 stdout 仍有内容
    if (e.stdout) {
      try { return JSON.parse(e.stdout); } catch {}
    }
    return { error: e.message, script };
  }
}

// 依次执行五个专项审计
const registry = run('scripts/registry-lint.mjs');
const coverage = run('scripts/coverage-audit.mjs');
const linkFlow = run('scripts/link-flow-audit.mjs');
const geo = run('scripts/geo-audit.mjs');

// Cannibalization 需要 GSC 数据,可能不存在
let cannibalization = null;
try {
  await fs.access('gsc-query-page.csv');
  cannibalization = run('scripts/cannibalization-detect.mjs');
} catch {
  cannibalization = { skipped: true, reason: 'gsc-query-page.csv not found' };
}

// ── 计算四个指标 ──

const registryIntegrity = registry.summary
  ? ((1 - registry.summary.errorCount / registry.summary.totalRows) * 100)
  : null;

const pageCoverage = coverage.summary
  ? (coverage.summary.covered / coverage.summary.registryPages * 100)
  : null;

const linkFlowIntegrity = linkFlow.summary
  ? (linkFlow.summary.clustersWithLink / linkFlow.summary.clusterCount * 100)
  : null;

// GEO 就绪度:加权评分
function calcGeoScore(geo) {
  if (geo.criticalFailure) return 0;
  const s = geo.summary;
  if (!s) return null;

  const faqScore = s.faqCount > 0
    ? (1 - s.faqHeadingIssues / s.faqCount) * 20 : 20;
  const tableScore = s.pagesChecked > 0
    ? (1 - s.tableCaptionIssues / s.pagesChecked) * 20 : 20;
  const schemaScore = s.pagesChecked > 0
    ? (1 - s.schemaIssues / s.pagesChecked) * 20 : 20;

  return Math.round(40 + faqScore + tableScore + schemaScore);
}

const metrics = {
  date: new Date().toISOString().split('T')[0],
  registryIntegrity: registryIntegrity?.toFixed(1),
  pageCoverage: pageCoverage?.toFixed(1),
  linkFlowIntegrity: linkFlowIntegrity?.toFixed(1),
  geoReadiness: calcGeoScore(geo),
};

// ── 读取历史数据做趋势对比 ──
let history = [];
try {
  history = JSON.parse(await fs.readFile(HISTORY_FILE, 'utf8'));
} catch {}

const previous = history[history.length - 1] ?? null;

// ── 追加本期数据到历史 ──
await fs.mkdir(REPORTS_DIR, { recursive: true });
history.push(metrics);
await fs.writeFile(HISTORY_FILE, JSON.stringify(history, null, 2));

// ── 输出聚合结果,交给模型生成报告 ──
console.log(JSON.stringify({
  metrics,
  previous,
  criticalFailure: geo.criticalFailure ?? false,
  details: {
    registry,
    coverage,
    linkFlow,
    geo,
    cannibalization,
  },
}, null, 2));

执行节奏建议

频率 执行内容 耗时
每次新建页面 只跑注册表审计(第45篇) 2 分钟
每月 覆盖度审计(第46篇) 10 分钟
每季度 完整健康度报告(本篇) 1 小时(含处理 Top 5)
排名异常时 Cannibalization 诊断(第47篇) 30 分钟

不要每周跑完整报告——SEO 的变化周期是月级的,周级数据噪音大于信号,反而会导致过度调整。


审计体系六篇完成。这六个 Skill 覆盖了从规划到发布到持续运营的全部检查点:

Skill 检查维度 频率
第45篇 注册表审计 规划一致性 每次建页
第46篇 覆盖度审计 规划 vs 实际 每月
第47篇 Cannibalization 实际竞争 排名异常时
第48篇 内链流审计 架构闭环 每季度
第49篇 GEO 覆盖审计 AI 可见性 每季度
第50篇 健康度报告 编排与决策 每季度

下一阶段是辅助 Skills(十一|51–56篇),从“发现问题”转向“生产内容”。

→ AI Skill:关键词聚类与商业/工程/知识意图分类

NEXT ACTION / 下一步

继续系列:AI 外贸站建设全系列

把读到的方法变成一个小行动,完成后再回来迭代。

继续

RELATED / 相关推荐

接着读这些

按同一分类、系列与标签为你挑选。