工具箱含意图注册表模板(YAML 与 Airtable 两版)、六条校验规则、三条提示词(提问收集聚类/六分类与主答块归属/语义重复判定)、四个脚本(意图卡生成、四象限差集、复述渲染组件、llms.txt 生成)、实测记录表与挑选判据、工业 B2B 起步问题集 40 问、存量站四轮迁移清单。最小可用集只需注册表模板 + 聚类提示词 + 迁移第一轮三件。
GEO 意图注册表工具箱:模板、校验、提示词与起步问题集
前六篇正文(73–78)只讲思路、不放长代码。所有实现件收在这里。
怎么用这一篇:认同前六篇的思路,来这里取现成件;不认同,前六篇也照样成立。如果你只想拿三件东西就走,直接跳到最后一节「最小可用集」。
一、文件位置与目录结构
意图注册表适合放进 Git,比关键词注册表更适合——因为 canonical_answer 需要 diff(一句话改没改,一眼看得出来),而 Notion 看不出这个。
data/
├── products.yaml # 产品事实层(第 71 篇)
├── certificates.yaml # 证书(第 71 篇)
├── registry.json # 关键词注册表(第 01 篇)
└── geo-intents.yaml # ← 本篇,GEO 意图注册表
scripts/
├── geo-registry-audit.mjs # 主审计脚本(第 78 篇)
├── intent-card.mjs # 生成页面意图卡
├── intent-quadrant.mjs # 四象限差集
└── gen-llms-txt.mjs # 从注册表生成 llms.txt
src/components/
└── CanonicalAnswer.astro # 复述渲染组件
三张表并列放在 data/,因为它们互相引用:geo-intents.yaml 的 fact_refs 指向 products.yaml,seo_keyword_ref 指向 registry.json。放在一起,脚本读起来简单,人翻起来也知道去哪找。
二、模板:geo-intents.yaml
带注释的完整模板。每个字段的存在理由见第 74 篇,这里只给格式。
# GEO 意图注册表
# 一行 = 一个问题 → 一个主答块的绑定
# 约束:主答块唯一 · 复述必须派生 · 数字必须指回事实层
meta:
version: 1
updated: 2026-08-09
# 实测集上限,超过这个数就不要再加了(见第 77 篇)
test_set_limit: 40
intents:
# ── ④ 验证型:最容易做对、最容易被引用的一类 ──
- qid: Q-017
question: What is the maximum operating temperature of the CP-100 centrifugal pump?
variants:
- How hot can the CP-100 run?
- CP-100 temperature limit
- Can the CP-100 handle 130 degrees C?
intent_class: verification # 六类之一,单值
answer_unit: /products/cp-100/#max-operating-temperature
canonical_answer: >-
The CP-100 centrifugal pump operates from -20°C to 120°C
(-4°F to 248°F) in its standard configuration.
fact_refs:
- products.cp-100.temp_min
- products.cp-100.temp_max
evidence:
- "Supplier datasheet v3, p.2"
confidence: datasheet # measured | datasheet | verbal | estimated
restate_on:
- /applications/chemical-transfer-pump/#temperature-limits
- /blog/high-temp-pump-selection/#cp100-range
self_answerable: true
seo_keyword_ref: "cp100 operating temperature"
priority: 4
target_locale: [en]
citation_status: cited # cited | miscited | not_cited | untested
last_tested: 2026-07-12
status: active
# ── ② 条件选型型:AI 独有的一类,seo_keyword_ref 通常为空 ──
- qid: Q-034
question: What pump material should I use for 60% sulfuric acid at 80°C?
variants:
- Best wetted material for hot concentrated sulfuric acid
- Will SS316 work with 60% H2SO4 at 80C?
intent_class: conditional_selection
answer_unit: /applications/chemical-transfer-pump/#material-selection
canonical_answer: >-
For 60% sulfuric acid at 80°C, specify PVDF-lined or
high-silicon cast iron wetted parts; SS316 corrodes rapidly
at this concentration and temperature.
fact_refs: [] # 无硬参数,但 evidence 必填
evidence:
- "NACE corrosion data, H2SO4 60% @ 80C"
- "Supplier material compatibility chart rev.2025-03"
confidence: datasheet
restate_on:
- /products/cp-100/#chemical-compatibility
self_answerable: true
seo_keyword_ref: "" # 空值 = 关键词工具里看不见 = 壁垒
priority: 5
target_locale: [en, de]
citation_status: untested
last_tested: null
status: active
# ── ⑥ 供应商评估型:登记但不落地 ──
- qid: Q-041
question: Who are the most reliable centrifugal pump manufacturers in China?
intent_class: vendor_evaluation
answer_unit: null # 不可自答的意图没有主答块
canonical_answer: ""
self_answerable: false
# 交给站外提及,见第 44 篇
offsite_channels:
- "Eng-Tips 真实答题(署名工程师)"
- "行业媒体引用我们的实测报告"
- "Thomasnet / Europages 目录一致性"
priority: 3
target_locale: [en]
status: active
六类的枚举值
# intent_class 合法值(见第 75 篇)
definition # ① 定义型
conditional_selection # ② 条件选型型 ★
tradeoff # ③ 权衡型
verification # ④ 验证型
compliance # ⑤ 资格合规型
vendor_evaluation # ⑥ 供应商评估型(不可自答)
Notion / Airtable 字段版
不想用 YAML 的,字段照抄这份:
| 字段名 | Notion 类型 | 备注 |
|---|---|---|
| qid | Title | 主键,Q-001 起 |
| question | Text | 长文本,存问句原文 |
| variants | Text | 换行分隔 |
| intent_class | Select | 六个选项,不要用 Multi-select |
| answer_unit | URL | 填完整锚点地址 |
| canonical_answer | Text | 加一个 formula 字段显示字数,超 80 词标红 |
| fact_refs | Text | 换行分隔 |
| evidence | Text | |
| confidence | Select | 四级 |
| restate_on | Text | 换行分隔 |
| self_answerable | Checkbox | |
| seo_keyword_ref | Relation | 关联关键词注册表(如果也在 Notion) |
| priority | Number | 1–5 |
| target_locale | Multi-select | |
| citation_status | Select | 四值 |
| last_tested | Date | |
| status | Select | active / draft / deprecated |
Notion 用户必配的两个视图:
- 本季度实测集:筛
priority ≥ 4+self_answerable = true+status = active,按intent_class排序 - 待处理:筛
citation_status = miscited或last_tested超 90 天
intent_class 用 Select 不用 Multi-select,这是第 75 篇那条“不要多标签”的硬性落实——工具层面堵死,比写在规范里靠谱。
三、校验规则:让脏数据过不了构建
放进构建流程,bun run build 之前跑。规则和第 78 篇的审计脚本有分工:这里查表本身的合法性,那里查表和产物的一致性。
// scripts/validate-intents.mjs
import fs from 'fs/promises';
import YAML from 'yaml';
const CLASSES = ['definition', 'conditional_selection', 'tradeoff',
'verification', 'compliance', 'vendor_evaluation'];
const CONFIDENCE = ['measured', 'datasheet', 'verbal', 'estimated'];
const STATUS = ['active', 'draft', 'deprecated'];
const doc = YAML.parse(await fs.readFile('data/geo-intents.yaml', 'utf8'));
const intents = doc.intents ?? [];
const errors = [];
const seen = { qid: new Set(), unit: new Map() };
for (const it of intents) {
const at = `${it.qid ?? '(no qid)'}`;
// R1 · qid 唯一
if (seen.qid.has(it.qid)) errors.push(`${at}: qid 重复`);
seen.qid.add(it.qid);
// R2 · 枚举合法
if (!CLASSES.includes(it.intent_class)) errors.push(`${at}: intent_class 非法「${it.intent_class}」`);
if (it.status && !STATUS.includes(it.status)) errors.push(`${at}: status 非法`);
if (it.confidence && !CONFIDENCE.includes(it.confidence)) errors.push(`${at}: confidence 非法`);
// R3 · 问句必须是完整问句,不能是关键词
if (!/\?\s*$/.test(it.question ?? '')) {
errors.push(`${at}: question 不是问句(不要压缩成关键词)`);
}
// R4 · 不可自答的意图不该有主答块;可自答的必须有
if (it.self_answerable === false) {
if (it.answer_unit) errors.push(`${at}: self_answerable=false 却指定了 answer_unit`);
} else if (it.status === 'active') {
if (!it.answer_unit) errors.push(`${at}: active 意图缺 answer_unit`);
if (!/#[\w-]+$/.test(it.answer_unit ?? '')) {
errors.push(`${at}: answer_unit 缺锚点(必须精确到块,见第 74 篇)`);
}
// R5 · 主答块唯一
if (seen.unit.has(it.answer_unit)) {
errors.push(`${at}: answer_unit 与 ${seen.unit.get(it.answer_unit)} 冲突`);
}
seen.unit.set(it.answer_unit, it.qid);
}
// R6 · canonical_answer 长度上限(防退化成 CMS)
const words = (it.canonical_answer ?? '').trim().split(/\s+/).filter(Boolean).length;
if (it.self_answerable !== false && it.status === 'active') {
if (words === 0) errors.push(`${at}: canonical_answer 为空`);
if (words > 80) errors.push(`${at}: canonical_answer ${words} 词,超过 80(只存首句)`);
}
// R7 · 有数字就必须有 fact_refs;没数字就必须有 evidence
const hasNum = /\d/.test(it.canonical_answer ?? '');
const hasRefs = (it.fact_refs ?? []).length > 0;
const hasEvi = (it.evidence ?? []).length > 0;
if (hasNum && !hasRefs) errors.push(`${at}: 答案含数字但 fact_refs 为空`);
if (!hasNum && !hasEvi && it.self_answerable !== false && it.status === 'active') {
errors.push(`${at}: 既无 fact_refs 也无 evidence(一条无依据的断言)`);
}
// R8 · 合规型对可信度的额外要求
if (it.intent_class === 'compliance' && it.status === 'active') {
if (!['measured', 'datasheet'].includes(it.confidence)) {
errors.push(`${at}: 合规型意图的 confidence 必须是 measured 或 datasheet(见第 75 篇)`);
}
}
// R9 · 复述块不能等于主答块
if ((it.restate_on ?? []).includes(it.answer_unit)) {
errors.push(`${at}: restate_on 里包含了主答块自身`);
}
}
if (errors.length) {
console.error(`✗ 意图注册表校验失败(${errors.length} 项)\n` + errors.map(e => ' - ' + e).join('\n'));
process.exit(1);
}
console.log(`✓ 意图注册表校验通过(${intents.length} 条)`);
R8 值得单独说:它把第 75 篇那条“合规型问题 confidence 不够就不答”从一条建议变成了一道闸门。这类规则能写进脚本的,就不要写进规范文档——事实层的两种死法讲过,靠自觉维持的规则一定会失守。
接进 package.json:
{
"scripts": {
"validate:intents": "node scripts/validate-intents.mjs",
"build": "bun run validate:intents && astro check && astro build"
}
}
四、提示词一:真实提问收集与聚类
对应第 77 篇的第 ① ② 步。
你在帮我从原始记录里提炼真实的客户提问。
【输入】
以下是我们过去 18 个月的询盘往来 / 论坛帖子 / 销售记录节选:
<<<
[粘贴原始文本,不需要整理]
>>>
【任务】
1. 提取出其中所有客户真正在问的问题
2. 把语义相同的合并成一个聚类
3. 每个聚类输出:
- 标准问句(英文,完整句子,保留原有的约束条件)
- 客户的原始表述(原文摘录 2-3 条)
- 出现频次
- 出现在几个独立来源里
4. 按频次降序排列
【硬性要求】
- 保留约束条件。客户说"60% 硫酸 80 度",就不要简化成"硫酸泵材质"。
被压缩掉的约束条件正是这句话值钱的原因。
- 保留客户的原始用词。如果他们说 canned motor pump 而我们内部叫
shield pump,两个都要记下来。
- 只出现在 1 个来源里的,单独放到「待观察」区,不要混进主清单。
- 【禁止】回答任何技术问题。你的任务是提炼和归类,不是判断
某个技术说法对不对。
- 【禁止】编造问题。原文里没有的,不要"推测客户可能还会问"。
【输出格式】
## 主清单(≥3 个独立来源)
| # | 标准问句 | 原始表述 | 频次 | 来源数 |
## 待观察(1-2 个来源)
| # | 标准问句 | 原始表述 | 频次 | 来源数 |
## 术语差异
| 客户的说法 | 我们的说法 | 出现次数 |
最后那个「术语差异」区是顺手的收益:它直接产出术语表的更新项,而术语表归事实层管(见什么才算一条产品事实)。这是从 Reddit 挖真实用户问题里“最便宜的一类收益”。
五、提示词二:六分类与主答块归属
对应第 77 篇的第 ② ③ 步。这条提示词在人机闸门之前停下。
你在帮我把一批客户提问登记进 GEO 意图注册表。
【输入】
1. 待登记的问题清单:
<<<
[上一条提示词的主清单]
>>>
2. 现有意图注册表(用于去重):
<<<
[geo-intents.yaml 的 qid + question + answer_unit 三列]
>>>
3. 站点页面清单(用于建议归属):
<<<
[slug + page_type + 页面主题一句话]
>>>
【任务】
对每个问题:
1. 查重:是否与现有意图语义相同?
- 相同 → 标记 DUPLICATE + 对应 qid,建议加入该意图的 restate_on
- 不同 → 继续
2. 分类(单值,六选一):
- definition:零约束,问概念
- conditional_selection:带 2+ 约束条件,问「选哪个」
- tradeoff:两方案都可行,问「哪个划算」
- verification:已锁定对象,问某个具体数
- compliance:问能不能 / 符不符合 / 有没有证
- vendor_evaluation:问「谁靠谱」
3. 判断 self_answerable:
判据 = 这个问题的最佳答案,是不是必须由第三方说出口才可信?
是 → false(vendor_evaluation 一律 false)
4. 建议主答块归属:
判据 = 哪个页面的上下文最接近提问者当时的处境?
(不是哪个页面主题最相关,也不是哪个页面信息最全)
优先级:应用选型页 > 技术资源页 > SKU 页 > Pillar 页
5. 如果两个页面都合理,标记 CONFLICT,列出两个候选和各自理由,
不要自己选一个。
【硬性要求】
- intent_class 单值。看起来跨两类的,拆成两个问题。
- 【禁止】写 canonical_answer。这一步只做归类和归属。
- 【禁止】判断技术内容对错。
- 建议归属时,如果找不到合适的现有页面,标记 NEW_PAGE_NEEDED,
不要硬塞进一个不合适的页面。
【输出格式】
| # | 问题 | 判定 | intent_class | self_answerable | 建议主答块 | 备注 |
## 需要你裁决(CONFLICT / NEW_PAGE_NEEDED)
[逐条列出,给候选和理由]
闸门就设在这条提示词的输出上。 看一张十几行的清单,几分钟能判完;等生成了十几个页面块再审,就退化成走过场——这条原则见AI 的边界划在哪。
六、提示词三:语义重复判定(审计第二层的模型部分)
第 78 篇的脚本会输出一批「落地未登记」的块。判断它们是不是和已有意图重复,需要语义判断,交给模型。
你在检查我的站点上有没有同一个问题被回答了两遍。
【输入】
1. 未登记的问答块:
<<<
[脚本输出的 unregistered_block 列表:位置 + 问题 + 答案首句]
>>>
2. 现有意图注册表:
<<<
[qid + question + canonical_answer]
>>>
【任务】
对每个未登记块,判断:
- DUPLICATE:与某条已有意图问的是同一件事
→ 这是自相矛盾的来源。输出对应 qid,并**指出两处答案在
数字、工况、确定性措辞上有没有差异**
- NEW:是一个新意图
→ 建议 intent_class 和是否值得登记
- NOISE:不是一个真正的问答块(比如营销文案写成了问句形式)
→ 建议删除或改写
【硬性要求】
- 判断"是不是同一个问题",不判断"答案对不对"。
- 数字差异必须逐个列出,不要笼统说"内容相近"。
- 【禁止】建议为了提高覆盖率而批量登记。NOISE 就是 NOISE。
【输出格式】
| 位置 | 判定 | 对应 qid | 差异点 | 建议动作 |
七、脚本
第 78 篇已经给了主审计脚本 geo-registry-audit.mjs,这里补另外三个。
7.1 页面意图卡
// scripts/intent-card.mjs —— 用法:node scripts/intent-card.mjs /products/cp-100/
import fs from 'fs/promises';
import YAML from 'yaml';
const slug = process.argv[2];
if (!slug) { console.error('用法:node scripts/intent-card.mjs <slug>'); process.exit(1); }
const intents = YAML.parse(await fs.readFile('data/geo-intents.yaml', 'utf8')).intents ?? [];
const registry = JSON.parse(await fs.readFile('data/registry.json', 'utf8'));
const words = registry.filter(r => r.page_slug === slug && r.status === 'active');
const own = intents.filter(i => (i.answer_unit ?? '').startsWith(slug + '#'));
const restate = intents.filter(i => (i.restate_on ?? []).some(u => u.startsWith(slug + '#')));
const refuse = intents.filter(i => i.self_answerable === false && i.status === 'active');
const line = (s = '') => console.log(s);
line(`┌─ 页面意图卡 ${'─'.repeat(Math.max(0, 46 - slug.length))}`);
line(`│ ${slug}`);
line(`├─ SEO 侧(词)`);
for (const w of words) {
line(`│ PKW ${w.pkw}`);
line(`│ SKW ${(w.skw ?? []).join(' · ')}`);
line(`│ NKW ${(w.nkw ?? []).join(' · ')}`);
}
if (!words.length) line(`│ ⚠️ 注册表中无归属 —— 未纳管页面`);
line(`├─ GEO 侧(问)`);
for (const i of own) line(`│ 主答 ${i.qid} ${i.question} [${i.intent_class}]`);
for (const i of restate) line(`│ 复述 ${i.qid} ← 主答块 ${i.answer_unit}`);
if (!own.length) line(`│ ⚠️ 无主答块 —— AI 检索时本页不会被引用`);
line(`├─ 判定`);
line(`│ 词 ${words.length} : 主答 ${own.length}`);
const stale = own.filter(i => !i.last_tested ||
(Date.now() - new Date(i.last_tested)) / 864e5 > 90);
if (stale.length) line(`│ ⚠️ ${stale.length} 条超过 90 天未实测`);
const bad = own.filter(i => i.citation_status === 'miscited');
if (bad.length) line(`│ 🔴 ${bad.length} 条被引错 —— 最高优先级`);
line(`└${'─'.repeat(56)}`);
line(`\n不可自答(全站共 ${refuse.length} 条,见第 44 篇站外提及)`);
7.2 四象限差集
// scripts/intent-quadrant.mjs —— 全站诊断,对应第 76 篇
import fs from 'fs/promises';
import path from 'path';
import YAML from 'yaml';
const DIST = 'dist';
async function pages(dir, out = []) {
for (const e of await fs.readdir(dir, { withFileTypes: true })) {
const full = path.join(dir, e.name);
if (e.isDirectory()) await pages(full, out);
else if (e.name === 'index.html') {
out.push('/' + path.relative(DIST, full).replace(/index\.html$/, '').replace(/\\/g, '/'));
}
}
return out;
}
const intents = YAML.parse(await fs.readFile('data/geo-intents.yaml', 'utf8')).intents ?? [];
const registry = JSON.parse(await fs.readFile('data/registry.json', 'utf8'));
const hasWord = new Set(registry.filter(r => r.status === 'active').map(r => r.page_slug));
const hasQ = new Set(intents
.filter(i => i.status === 'active' && i.answer_unit)
.map(i => i.answer_unit.split('#')[0]));
// 只诊断内容页,排除列表页和功能页
const SKIP = /^\/(|search\/|start\/|guides\/|resources\/|practice\/|reviews\/)$/;
const all = (await pages(DIST)).filter(p => !SKIP.test(p));
const q = { healthy: [], seoOnly: [], geoOnly: [], ghost: [] };
for (const p of all) {
const w = hasWord.has(p), h = hasQ.has(p);
if (w && h) q.healthy.push(p);
else if (w) q.seoOnly.push(p);
else if (h) q.geoOnly.push(p);
else q.ghost.push(p);
}
console.log(`四象限诊断(共 ${all.length} 页)\n`);
console.log(`✅ 健康页 ${q.healthy.length}\t有词有问`);
console.log(`🟡 纯 SEO 页 ${q.seoOnly.length}\t有排名但 AI 不会引用 —— 补 2-4 个问答块`);
console.log(`🟡 纯 GEO 页 ${q.geoOnly.length}\t零搜索量但可能被引 —— 删之前先看 citation_status`);
console.log(`❌ 幽灵页 ${q.ghost.length}\t合并或 301 下线\n`);
for (const [k, label] of [['seoOnly','纯 SEO'],['geoOnly','纯 GEO'],['ghost','幽灵']]) {
if (!q[k].length) continue;
console.log(`── ${label} ──`);
q[k].forEach(p => console.log(' ' + p));
console.log();
}
7.3 复述渲染组件(Astro)
第 76 篇那条判据——「改一条标准答案,你要动几个文件」——的落地件。答案存一处,页面引用。
---
// src/components/CanonicalAnswer.astro
import fs from 'node:fs/promises';
import YAML from 'yaml';
interface Props {
qid: string;
mode?: 'primary' | 'restate'; // 主答块 or 复述块
}
const { qid, mode = 'primary' } = Astro.props;
const doc = YAML.parse(await fs.readFile('data/geo-intents.yaml', 'utf8'));
const intent = (doc.intents ?? []).find((i: any) => i.qid === qid);
if (!intent) throw new Error(`CanonicalAnswer: 找不到意图 ${qid}`);
if (intent.self_answerable === false) {
throw new Error(`CanonicalAnswer: ${qid} 标记为不可自答,不应渲染到页面`);
}
const anchor = intent.answer_unit.split('#')[1];
---
<h3 id={anchor}>{intent.question}</h3>
<p>
{intent.canonical_answer}
{mode === 'restate' && (
<a href={intent.answer_unit}>Full details →</a>
)}
</p>
<slot />{/* 各页自由发挥的展开段落,不参与一致性比对 */}
用法:
{/* 主答块 —— 在 /products/cp-100/ */}
<CanonicalAnswer qid="Q-017">
<p>For applications exceeding 120°C, the CP-100 HT version…</p>
</CanonicalAnswer>
{/* 复述块 —— 在 /applications/chemical-transfer-pump/ */}
<CanonicalAnswer qid="Q-017" mode="restate" />
改一次 YAML,三个页面同时变。审计脚本的「复述分叉」检查从此永远是 0——这就是用架构代替纪律。
7.4 从注册表生成 llms.txt
// scripts/gen-llms-txt.mjs —— 对应第 78 篇的副产品
import fs from 'fs/promises';
import YAML from 'yaml';
const SITE = 'https://example.com';
const doc = YAML.parse(await fs.readFile('data/geo-intents.yaml', 'utf8'));
const rows = (doc.intents ?? [])
.filter(i => i.status === 'active' && i.self_answerable !== false && i.answer_unit)
.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
const byClass = {
verification: 'Product specifications',
conditional_selection: 'Selection and sizing',
tradeoff: 'Engineering trade-offs',
compliance: 'Certifications and compliance',
definition: 'Technical concepts',
};
let out = `# AquaFlow Industrial\n\n`;
out += `> Industrial centrifugal, submersible and magnetic drive pumps.\n`;
out += `> Below are questions this site answers directly, with the exact\n`;
out += `> section that contains each answer.\n\n`;
for (const [cls, heading] of Object.entries(byClass)) {
const group = rows.filter(r => r.intent_class === cls);
if (!group.length) continue;
out += `## ${heading}\n\n`;
for (const r of group) out += `- [${r.question}](${SITE}${r.answer_unit})\n`;
out += `\n`;
}
await fs.writeFile('public/llms.txt', out);
console.log(`✓ llms.txt 已生成(${rows.length} 条意图)`);
按问题组织,比原来那份按页面组织的信息量大得多。但优先级依然低——它的确定性回报低于结构和内容本身,顺手做,不要当成重点。
八、实测记录表与挑选判据
挑选判据
priority >= 4
AND self_answerable == true
AND status == 'active'
AND (fact_refs 非空 OR evidence 非空)
ORDER BY intent_class = 'conditional_selection' DESC, priority DESC
LIMIT 30
记录表模板
## GEO 引用实测 · 2026 Q3
测试日期:2026-09-30 引擎:Perplexity / ChatGPT 搜索 / Google AI Overview
问题集:Q3 固定 30 条(与 Q2 相同,新增意图记在下方「集合外」)
| qid | 问题(用注册表原文提问) | PPLX | GPT | AIO | 引用 URL | 信息准确 | 备注 |
|-----|------------------------|------|-----|-----|---------|---------|------|
| Q-034 | What pump material for 60% H2SO4 at 80C? | ✅ | ✅ | ❌ | /applications/… | ✅ | |
| Q-017 | Max operating temp of CP-100? | ✅ | ❌ | ✅ | /products/cp-100/ | ⚠️ | 引了 120,事实层已改 118 |
| Q-004 | Is mag drive worth the cost? | ❌ | ❌ | ❌ | — | — | 结构合规,疑似证据不足 |
### 汇总
引用率:[N]/30 = [N]%(上季度 [N]%)
被引错:[N] 条 ← **最高优先级**
未引用:[N] 条
### 集合外(本季度新增,下季度并入固定集)
| qid | 问题 | 结果 |
变量必须固定:同一批问题、同一批引擎、同样的提问方式(用 question 原文,不要临场改写)。不固定就没法做季度对比,测了也是白测。
九、工业 B2B 起步问题集:40 问
改掉型号和介质就能用。按六分类分组,每类给的数量反映建议配比。
④ 验证型(12 条 · 最容易做对,先铺这一类)
1. What is the maximum operating temperature of the {MODEL}?
2. What is the flow rate range of the {MODEL}?
3. What is the maximum discharge pressure of the {MODEL}?
4. What materials is the {MODEL} casing available in?
5. What is the NPSH required for the {MODEL} at duty point?
6. What is the maximum solids content the {MODEL} can handle?
7. What seal options are available for the {MODEL}?
8. What is the inlet and outlet connection size of the {MODEL}?
9. What motor power is required for the {MODEL}?
10. What is the maximum viscosity the {MODEL} can handle?
11. What is the weight and footprint of the {MODEL}?
12. What is the typical lead time for the {MODEL}?
② 条件选型型(10 条 · 优先级最高,seo_keyword_ref 大多为空)
13. What pump material should I use for {CONC}% {CHEMICAL} at {TEMP}°C?
14. Which pump type is best for {APPLICATION} with {CONSTRAINT}?
15. How do I size a pump for {FLOW} at {HEAD} with {FLUID}?
16. What pump should I specify for intermittent duty on {FLUID}?
17. Which seal arrangement for {FLUID} at {TEMP}°C continuous duty?
18. What impeller type for {FLUID} containing {SOLIDS}% solids?
19. Do I need a VFD for {APPLICATION} with variable demand?
20. What pump for {FLUID} where NPSH available is only {N} m?
21. Which material for {FLUID} if the process may excurse to {TEMP}°C?
22. What pump configuration for {APPLICATION} in a {CLASSIFICATION} area?
③ 权衡型(8 条 · 最有价值,必须敢有立场)
23. Is a magnetic drive pump worth the cost over a double mechanical seal?
24. Should I oversize a clean-liquid pump or buy a slurry pump for light abrasive duty?
25. Is stainless steel worth the premium over coated carbon steel for {FLUID}?
26. Is it cheaper to run two smaller pumps or one large pump for variable demand?
27. When does a canned motor pump make more sense than a mag drive?
28. Is API 610 compliance worth it for non-refinery applications?
29. Should I stock a spare pump or a spare rotating assembly?
30. Is remanufacturing an old pump cheaper than replacement?
⑤ 资格合规型(6 条 · 证据要求最高)
31. Is the {MODEL} certified for ATEX Zone {N} installations?
32. Does the {MODEL} meet ISO 9906 Grade {N} performance testing?
33. Is the {MODEL} suitable for potable water per {STANDARD}?
34. What surface finish does the {MODEL} meet for 3-A sanitary compliance?
35. Does the {MODEL} comply with EU Regulation {N} on motor efficiency?
36. Is documentation available for {CERTIFICATION} audit purposes?
① 定义型(3 条 · 竞争最激烈,不指望靠它拿引用)
37. What is NPSH and why does it matter in pump selection?
38. What is the difference between a magnetic drive pump and a canned motor pump?
39. What does BEP mean and why should I stay near it?
⑥ 供应商评估型(1 条 · 登记但不落地)
40. Who are the reliable {CATEGORY} manufacturers in {REGION}?
→ self_answerable: false,交给站外提及(第 44 篇)
这份清单是起点不是终点。 它的作用是让你第一天就有 40 行数据可以跑通流程;真正值钱的意图来自你自己的询盘记录——那些带着客户具体工况的问题,这份通用清单里一条都没有。
十、存量站四轮迁移清单
对应第 76 篇。每轮只做一件事,做完跑一次四象限。
### 第一轮 · Pillar 页(通常 3–8 个)
□ 跑 intent-quadrant.mjs,记下当前四格数量作为基线
□ 每个 Pillar 页建意图卡(intent-card.mjs),确认它在哪一格
□ 从 40 问清单里挑 ② ③ 两类,每页配 2–4 条
□ 只填 5 个必填字段:qid / question / intent_class / answer_unit / canonical_answer
□ restate_on、citation_status 全部留空
□ 跑 validate-intents.mjs,确保表本身合法
□ 落地:加 id 属性 + 用 CanonicalAnswer 组件渲染
### 第二轮 · 应用选型页
□ 这类页最容易做成健康页,② 条件选型型天然归它
□ 开始填 restate_on:把 Pillar 页上的 ③ 权衡型答案复述过来
□ 跑 geo-registry-audit.mjs,第一次会有一批「落地未登记」,用提示词三处理
### 第三轮 · SKU 页
□ 只补 ④ 验证型和 ⑤ 资格合规型
□ ⚠️ 不要给 SKU 页补词。它的词少是设计使然
□ ④ 类的 fact_refs 必填 —— 这一轮同时是事实层的一次体检
□ ⑤ 类检查 confidence,不够 datasheet 的一律留 draft
### 第四轮 · 技术资源页 + 冲突仲裁
□ ① 定义型、③ 权衡型归位
□ 处理 CONFLICT:资源页很容易抢走应用页的 ② 类主答
□ 判据:谁的上下文更接近提问者的处境(不是谁信息更全)
□ 跑四象限,和第一轮的基线对比
### 收尾
□ 挑本季度实测集(30 条上限)
□ 跑一次实测,回写 citation_status
□ 把 validate:intents 接进 build
□ 把 geo-registry-audit 接进每周定时审计(第 63 篇)
进度看什么:不看“完成了百分之多少”,看**「纯 SEO」和「幽灵」两格的数量下降了多少**。前者是真实的可见性改善,后者只是填表进度。
十一、最小可用集:只拿三件
不想一次上全套的,拿这三件就能开始:
- 注册表模板(第二节)—— 删到只剩 5 个必填字段
- 提示词一(第四节)—— 把询盘记录倒进去,产出真实问题清单
- 迁移第一轮(第十节)—— 只做 Pillar 页
20 行意图就够。和注册表设计那篇一个口径:第一份不需要完整,真正的风险不是表不够大,是有了不执行。
跑通一轮之后再考虑加:校验脚本 → 渲染组件 → 审计脚本 → 实测。顺序反了(先上审计脚本再建表)会卡住,因为没有数据可审。
十二、和另外两个工具箱的分工
| 工具箱 | 管什么 | 何时用 |
|---|---|---|
| 全系列 AI Skills 工具箱 | 12 个 Skill 的 Prompt 合集 | 日常运营 |
| 产品事实层工具箱 | 数:产品事实、供应商、证书 | 往站里加产品时 |
| 本篇 | 问:意图索引、答案块、一致复述 | 决定站上该回答什么、怎么保持一致时 |
三者共用同一套约定:说明书 + 确定性脚本 + 参考资料三件套;确定性的事交给脚本,判断的事交给模型。
接口在两个地方:本篇的 fact_refs 指向事实层的字段,本篇的 seo_keyword_ref 指向关键词注册表的词。三张表不是三套系统,是同一份判断的三个切面。
相关文章
- 为什么关键词注册表管不了 AI 搜索:词与问的三层错位
- GEO 意图注册表设计:问题、答案块与一致复述约束
- GEO 意图分类:为什么不能照抄 SEO 三仓
- 双骨架:把词的地图和问的地图叠在同一张 slug 上
- 从问题到答案块:一条 GEO 意图的生命周期
- GEO 审计升级:从「结构合规」到「有没有被引用」
- 产品事实层工具箱
- 中央关键词注册表设计
意图注册表、覆盖与一致性审计现在都已就位。下一篇把它们与前五个专项审计汇总成全站健康度报告。
→ AI Skill:注册表健康度报告——全站 SEO 状态一键快照
RELATED / 相关推荐
接着读这些
按同一分类、系列与标签为你挑选。
全系列 AI Skills 工具箱汇总:Prompt 合集与使用指南
65 篇内容的收口。这篇把十二个 Skill 的说明书、脚本清单、以及贯穿全系列的执行顺序整理成一份可以直接照着用的索引,并给出三种落地路径——从零建站、已有站点改造、只用 Skills 工具箱。
产品事实层工具箱:结构模板、提示词与校验脚本
模块十四六篇正文的收口。正文只讲思路、不放长代码,所有实现件集中在这里——四份结构模板(YAML 版与 Airtable 版)、校验规则、三条提示词、三个脚本、中英术语表起步版、资产处理规范和三份检查清单。
GEO 意图注册表设计:问题、答案块与一致复述约束
这张表的一行不是关键词,是「一个问题 → 一个主答块」的绑定。主答块精确到 slug + anchor,标准答案只存一句话,句子里每个数字指回产品事实层。这篇讲全部字段的设计逻辑、一致复述的三条规矩、以及为什么必须有一个「这个问题我们赢不了」的标记位。