NOLYN GEO 文章自动生成系统 — 策略与架构文档
存档日期:2026-04-24
系统状态:已上线运行,Layer 1 已生成,10K 扩展引擎已搭建
一、策略背景与目标
1.1 为什么做 GEO
GEO(Generative Engine Optimization)针对的是国内 AI 搜索引擎(百度AI、豆包、Kimi、通义千问、秘塔、知乎直答、夸克、讯飞星火)的引用机制。与传统 SEO 追求排名不同,GEO 的核心目标是让 AI 搜索引擎在回答用户问题时引用 NOLYN 的内容。
AI 搜索引擎优先引用的条件:
-
内容包含 FAQPage / HowTo 结构化数据 → AI 可直接提取问答对
-
导语首句是定义式结论(“XXX 是 XXX”)→ AI 可直接引用作为答案
-
段落首句是主题句 → AI 可快速判断段落相关性
-
包含具体数据和权威引用 → 提升可信度权重
-
内容覆盖长尾关键词 → 提升命中概率
1.2 策略核心:一个概念一个页面
借鉴 Obsidian.md 的文档策略——“一个 API 方法一个页面”,NOLYN 采用”一个珠宝知识点一个页面”的策略:
| Obsidian 策略 | NOLYN 对应策略 |
|--------------|---------------|
| 一个 API 方法一个页面 | 一个珠宝知识点一个页面 |
| Import 迁移指南(捕获竞品意图)| 材质对比、风格对比页面 |
| 500+ 开发者文档页 | 6000+ 珠宝知识/文化/指南页 |
| 扁平 URL(≤2 层)| /information/{slug} |
| FAQ 问答格式 | 每页含 FAQ schema |
1.3 当前规模
| 指标 | 数值 |
|------|------|
| 产品 SKU | 97 个 |
| 产品系列 | 19 个(定胜、山茶、扇、月亮门、枝梅、海棠、湖山、满觉陇、玉鸟、瓦、瓦当、窗、窗花、结、绿天、舟、蝶、踏、香糕砖 等) |
| 价格区间 | ¥609 – ¥4,999 |
| 关键词矩阵 | 6,188 条(keywords-merged.json) |
| 品类覆盖 | 项链、耳饰、耳钉、戒指、手链、手镯、毛衣链 |
1.4 核心原则(2026-04 修订)
基于 GEO/SEO/用户/商业四维评估,策略从”量优先”调整为”质优先”:
| | 原策略 | 修订后 |
|—|-------|--------|
| 目标 | 6,188 篇全量生成 | 分批上线,首批 500 篇验证 |
| 质量标准 | SEO 评分 ≥ 75 | SEO ≥ 75 + 品牌调性评分 + 去重检测 |
| 上线节奏 | 一次性全量导入 | 每批 100-200 篇,观察 2 周收录后放量 |
| 低质页处理 | 全部上线 | noindex 或不生成 |
| 品牌调性 | 快消口语(性价比/种草/避坑)| 文化珠宝语境(值得/恰如其分/不张扬的美) |
从”信息量”转向”信任感”: 珠宝是高客单价视觉品类,用户决策依赖真实感(真人佩戴 > 产品白底图 > 文字描述)、专业感(权威引用 > 品牌自述 > 口语化灌水)、文化认同(为什么值 > 多少钱 > 便宜吗)。
内容比例调整方向:
| 内容类型 | 现有占比 | 调整后占比 | 理由 |
|---------|---------|----------|------|
| 礼赠指南 C5 | 36% | 20% | 比价用户转化率低,同质化严重 |
| 价格指南 C3 | 11% | 5% | 教用户比价对品牌有害,应转向价值解读 |
| 场景搭配 C4 | 18% | 18% | 保持 |
| 文化风格 C2 | 12% | 25% | 品牌差异化核心,应大幅增加 |
| 系列故事 C6 | 13% | 20% | 品牌核心资产,应大幅增加 |
| 材质百科 C1 | 1% | 10% | 权威信息入口,需补齐 |
| 保养知识 C7 | 0.1% | 10% | 复购/口碑关键触点,需大幅补齐 |
| 对比评测 C8 | 2% | 5% | 聚焦材质科普而非比价 |
| 季节节日 C9 | 7% | 5% | 时效性强但生命周期短 |
| 热门趋势 C10 | 0.1% | 2% | 流量入口,需补齐 |
二、内容矩阵
2.0 分层架构:Layer × Category 双轴体系
内容矩阵采用双轴分类:Layer 1-5 决定页面深度与质量标准,C1-C10 决定内容主题与模板类型。
纵轴(深度)— Layer 1~5:
| Layer | 定位 | 维度组合 | 页面量级 | 目标字数 | 内链角色 | Sitemap Priority |
|-------|------|---------|---------|---------|---------|-----------------|
| Layer 1 | 单维度权威百科 | 1 个核心维度 | ~200 | ≥ 2000 | 顶层锚点,被大量引用 | 0.9 |
| Layer 2 | 双维度交叉指南 | 2 个维度组合 | ~1,200 | 1500-2000 | 承上启下,链接 L1 与 L3 | 0.7 |
| Layer 3 | 三维度长尾覆盖 | 3 个维度组合 | ~6,000 | 1200-1500 | 长尾收割,向 L2/L4 导流 | 0.6 |
| Layer 4 | 产品驱动页 | SKU 锚点 | ~2,000 | 800-1200 | 交易转化页 | 0.8 |
| Layer 5 | FAQ 问答矩阵 | 问题式长尾 | ~1,000 | 600-800 | 问答覆盖,补充 L1-L3 | 0.5 |
横轴(主题)— C1~C10:
| 类目 | 主题 | 搜索意图 | 目标 Schema | 覆盖 Layer |
|------|------|---------|-------------|-----------|
| C1 | 材质百科 | 了解材质特性 | Article + FAQ | L1, L2, L3, L5 |
| C2 | 文化风格 | 了解设计风格 | Article + FAQ | L1, L2, L3, L5 |
| C3 | 价格指南 | 价格对比、性价比决策 | Article + FAQ | L2, L3, L5 |
| C4 | 场景搭配 | 按场景选择 | Article + FAQ | L2, L3, L5 |
| C5 | 礼赠指南 | 送礼推荐(收礼人 × 场合 × 预算) | Article + FAQ | L2, L3, L5 |
| C6 | 系列故事 | 品牌系列深度 | Article + FAQ | L1, L2, L4, L5 |
| C7 | 保养知识 | 材质保养教程 | HowTo + FAQ | L1, L5 |
| C8 | 对比评测 | 材质/品牌/款式对比 | Article + FAQ | L1, L2, L5 |
| C9 | 季节节日 | 时效性推荐 | Article + FAQ | L2, L3, L5 |
| C10 | 热门趋势 | 趋势热点 | Article + FAQ | L2, L5 |
核心原则: Layer 决定”这篇文章多深、什么质量标准”,Category 决定”这篇文章写什么主题、用什么模板”。每条关键词同时拥有
layer和category两个属性。
2.1 Layer 1:单维度权威百科(~200 页)
定位: 每个核心概念的权威定义页,是内链网络的顶层锚点。AI 搜索引擎优先引用 Layer 1 页面作为”什么是 XXX”的答案源。
| 类型 | Category | 数量 | 示例关键词 | URL 模式 |
|------|----------|------|-----------|---------|
| 材质百科 | C1 | 15 | 白蝶贝是什么?、红玛瑙百科 | /information/{material-slug} |
| 产品品类指南 | C1 | 10 | 项链选购完全指南 | /information/{category-slug} |
| 系列故事 | C6 | 24 | 枝梅系列灵感、山茶系列设计理念(8 系列 × 3 角度) | /information/{collection-slug}-{angle} |
| 文化元素百科 | C2 | 20 | 梅花纹样寓意、瓦当文化溯源 | /information/{element-slug} |
| 保养教程 | C7 | 20 | 银饰怎么保养?、贝母饰品清洁方法 | /information/how-to-{topic} |
| 对比基础 | C8 | 50 | 银镀金 vs 18K金、白蝶贝 vs 珍珠 | /information/{a}-vs-{b} |
Layer 1 质量标准:
-
正文 ≥ 2000 字
-
至少 4 个 H2 + 2 个 H3
-
至少 2 个表格或列表
-
5 个 FAQ(定义式问答为主)
-
引用 ≥ 2 个权威来源
-
关联 3+ 个真实产品(97 SKU 白名单校验)
-
导语首句必须是定义式结论(“白蝶贝是一种 XXX”)
2.2 Layer 2:双维度交叉指南(~1,200 页)
定位: 两个维度的交叉页面,回答”XX 的 YY 怎么选/怎么搭”类问题。是内链网络的中层枢纽。
| 类型 | Category | 公式 | 数量 | 示例关键词 |
|------|----------|------|------|-----------|
| 材质 × 品类 | C1 | 8 材质 × 6 类型 | 48 | 白蝶贝项链选购、红玛瑙耳饰推荐 |
| 材质 × 场景 | C4 | 8 材质 × 10 场景 | 80 | 职场戴什么材质?、约会红玛瑙搭配 |
| 品类 × 场景 | C4 | 6 类型 × 10 场景 | 60 | 职场项链推荐、婚礼戒指怎么选 |
| 收礼人 × 场合 | C5 | 8 收礼人 × 14 节日 | 112 | 情人节送女友、母亲节送妈妈 |
| 价格 × 品类 | C3 | 5 价位 × 6 类型 | 30 | 千元项链推荐、500内耳钉 |
| 材质 × 对比 | C8 | C(8,2) × 4 维度 | 112 | 白蝶贝 vs 黑玛瑙耐久性 |
| 文化 × 品类 | C2 | 13 文化 × 6 类型 | 78 | 宋式项链、梅花纹样戒指 |
| 季节 × 品类 | C9 | 14 季节 × 6 类型 | 84 | 七夕项链推荐、春节送礼手链 |
| 人群 × 场景 | C4 | 10 人群 × 10 场景 | 100 | 小个子职场配饰、学生约会搭配 |
| 系列 × 角度 | C6 | 19 系列 × 6 角度 | 114 | 山茶系列选购、枝梅系列搭配 |
| SKU 深度 | C6 | 97 SKU × 4 角度 | 388 | 枝梅·白蝶贝项链搭配、玉鸟·黑玛瑙评测 |
Layer 2 质量标准:
-
正文 1500-2000 字
-
至少 3 个 H2 + 1 个 H3
-
至少 1 个表格或列表
-
3-5 个 FAQ(场景化问答为主)
-
关联 2+ 个真实产品
-
导语首句回答交叉问题(“白蝶贝项链最适合XXX场景”)
2.3 Layer 3:三维度长尾覆盖(~6,000 页)
定位: 三个维度的长尾组合页,目标是覆盖”XX 的 YY 在 ZZ 场景下怎么样”类问题。大规模批量生成,用数量换覆盖面。
| 类型 | Category | 公式 | 产出量级 | 示例关键词 |
|------|----------|------|---------|-----------|
| 材质 × 品类 × 场景 | C4 | 8×6×10 | 480 | 白蝶贝项链职场推荐 |
| 材质 × 品类 × 风格 | C2 | 8×6×8 | 384 | 宋式极简白蝶贝项链 |
| 收礼人 × 场合 × 预算 | C5 | 8×14×5 | 560 | 情人节送女友500元内 |
| 文化 × 品类 × 材质 | C2 | 13×6×8 | 624 | 梅花纹样银项链推荐 |
| 季节 × 收礼人 × 品类 | C9 | 14×8×6 | 672 | 七夕送闺蜜手链 |
| 人群 × 场景 × 品类 | C4 | 10×10×6 | 600 | 小个子职场项链 |
| 价格 × 材质 × 品类 | C3 | 5×8×6 | 240 | 千元白蝶贝项链 |
| 长尾问题模式 | C1/C5 | 材质 × 问题 × 类型 | 480 | 白蝶贝项链会掉色吗? |
| 省份 × 内容类型 | C4 | 34 × 内容类型 | 510 | 浙江中式珠宝实体店 |
| 系列 × 品类 × 材质 | C6 | 8×6×5 | 240 | 枝梅白蝶贝项链详解 |
| 其他三维/四维组合 | 多类 | 填充至 6K | ~1,210 | 按搜索量数据自动补充 |
Layer 3 质量标准:
-
正文 1200-1500 字
-
至少 2 个 H2
-
3 个 FAQ(口语化短问答为主)
-
关联 1+ 个真实产品
-
导语首句直接回答长尾问题
2.4 Layer 4:产品驱动页(~2,000 页)
定位: 以具体 SKU 为锚点的页面,服务交易型搜索意图,链接回产品详情页引导转化。
| 类型 | Category | 数量 | 示例 |
|------|----------|------|------|
| SKU 深度评测 | C6 | 388 | 枝梅·白蝶贝项链全面评测 |
| 产品搭配推荐 | C4 | 500 | 每个产品 × 搭配推荐页 |
| 产品保养指南 | C7 | 500 | 每个产品 × 专属保养指南 |
| 产品变体页 | C6 | 612 | 材质/颜色变体独立页面 |
Layer 4 质量标准:
-
正文 800-1200 字
-
至少 2 个 H2
-
2 个 FAQ(产品相关问答)
-
必须关联当前 SKU + 1-2 个互补产品
-
含产品参数表(材质/尺寸/重量/价格,对齐 brand.md)
2.5 Layer 5:FAQ 问答矩阵(~1,000 页)
定位: 纯问答驱动的薄内容页,目标是让 AI 搜索引擎直接引用答案。每页聚焦一组相关问题。
| 类型 | Category | 数量 | 示例 |
|------|----------|------|------|
| 分类 FAQ | 全 | 60 | 6 大分类 × 10 子分类 |
| 材质 FAQ | C1 | 300+ | 每个材质 20 个 Q&A |
| 送礼 FAQ | C5 | 150+ | 每个收礼人场景 Q&A |
| 产品 FAQ | C6 | 500+ | 每个品类 50+ 个 Q&A |
Layer 5 质量标准:
-
正文 600-800 字(以 FAQ 问答为主体)
-
5-8 个 FAQ(每个回答 50-100 字,口语化疑问句 ≤20 字)
-
FAQPage schema(必须)
-
关联 1+ 个真实产品
-
每条 FAQ 含疑问词(怎么/会不会/能不能/值不值得)
2.6 内容类型定位(按 Category)
| 内容类型 | Category | 定位 | 捕获意图 |
|---------|----------|------|---------|
| 材质百科 | C1 | “一个材质一个页面” | 信息型搜索(什么是白蝶贝?) |
| 保养教程 | C7 | HowTo 步骤式教程 | 操作型搜索(银饰怎么保养?) |
| 选购指南 | C3/C4 | 按场景/人群/预算推荐 | 交易型搜索(千元项链推荐?) |
| 文化故事 | C2/C6 | 品牌差异化内容 | 信息型搜索(宋代美学特点?) |
| 对比评测 | C8 | 材质/品牌/款式横向比较 | 比较型搜索(银镀金 vs 18K金?) |
| 礼赠指南 | C5 | 收礼人 × 场合 × 预算三维推荐 | 交易型搜索(送妈妈什么首饰?) |
| 系列故事 | C6 | 每个系列的设计灵感与文化背景 | 品牌搜索(枝梅系列灵感?) |
| 季节节日 | C9 | 时效性内容,按时间节点更新 | 季节型搜索(七夕礼物推荐?) |
三、GEO 优化原理
3.1 Schema 注入策略
每页必须包含的结构化数据组合:
| 页面类型 | Schema 组合 |
|---------|-------------|
| 知识文章页 | Article + BreadcrumbList + FAQPage |
| 教程页 | HowTo + BreadcrumbList + FAQPage |
| 对比页 | Article + BreadcrumbList + FAQPage |
| 系列故事页 | Article + BreadcrumbList + FAQPage |
FAQPage 是 AI 搜索引擎引用内容的最高优先级信号。 每页 3-5 个 FAQ × 6000+ 页 = 18,000+ 可被 AI 引用的问答对。
3.2 每页内容标准
每个 GEO 页面必须满足:
1. 标题 30-60 字符,含核心关键词
2. SEO 描述 120-160 字符
3. 正文 ≥ 1200 字(Layer 1 ≥ 2000 字)
4. 至少 2 个 H2 + 1 个 H3(正文从 H2 起,禁止 H1)
5. 至少 1 个表格或列表
6. 至少 1 张配图(缩略图 + 正文配图)
7. 3-5 个 FAQ(口语化问句,≤20字,含疑问词)
8. 关联 2+ 个真实产品(97 SKU 白名单校验)
9. OG 图片 + BreadcrumbList
10. 导语首句为定义式结论("XXX是XXX"或"XXX最适合XXX")
11. 引用至少 1 个权威来源(国检NGTC、GAC、天猫/京东消费报告等)
3.3 GEO 内容优化规则
在 System Prompt 中注入的 6 条 GEO 规则(针对国内 AI 搜索引擎):
-
权威引用 — 引用国检 NGTC、珠宝协会 GAC、天猫/京东消费报告、VOGUE/时尚芭莎中国版
-
统计数据本地化 — 人民币 ¥、亿元、Z 世代、90 后/00 后
-
AI 可引用格式 — 首句结论、段落首句主题句、“xxx是xxx”定义句式、数据和结论前置
-
FAQ 口语化 — “白蝶贝项链会不会掉色?“而非”白蝶贝的保养方式”
-
国内消费关键词 — 自然融入:性价比、种草、避坑、百搭神器、宝藏
-
禁止 H1 — 正文从 H2 起,页面模板已提供 H1
四、系统概览
本系统是一个 SEO/GEO 内容批量生成管道,服务于 NOLYN 诺麟珠宝品牌官网。目标是通过 AI 生成面向国内 AI 搜索引擎(百度AI、豆包、Kimi、通义千问、秘塔、知乎直答等)优化的长文内容,覆盖珠宝材质、选购指南、文化故事、送礼推荐等长尾搜索场景。
核心流程
品牌数据(brand.md + MySQL)
↓
关键词矩阵引擎 (31种维度组合器)
↓ 生成 ~10,000 条长尾关键词
关键词 JSON (keywords.json / keywords-10k.json)
↓
AI 生成管道 (DeepSeek V3.2)
↓ system prompt + user prompt → JSON 文章
后处理管道
↓ 链接校验 / 字段补全 / 摘要 / 缩略图 / 配图 / 质量评分
JSON 输出 (geo-output/)
↓
导入脚本 → MySQL news 表
五、文件结构
scripts/
├── geo-data/ # 数据源
│ ├── brand.md # 品牌产品目录(手动维护)
│ ├── keywords.json # Layer 1 关键词(~100条,手动策划)
│ ├── keywords-10k.json # Layer 2 关键词(~10,000条,自动扩展)
│ └── product-images.json # SKU → 产品图 URL 映射缓存
│
├── geo-lib/ # 核心模块库
│ ├── ai-client.ts # AI API 封装(DeepSeek/OpenAI/Anthropic)
│ ├── brand-loader.ts # 品牌数据加载(MySQL + brand.md)
│ ├── keyword-expander.ts # 31种维度关键词组合扩展引擎
│ ├── article-pipeline.ts # 单篇文章生成管道(核心)
│ ├── geo-content-optimizer.ts # GEO 内容优化(Prompt构建/字段补全/摘要生成)
│ ├── quality-check.ts # 质量检查(100分制 + GEO评分)
│ ├── thumbnail-generator.ts # 缩略图生成(Sharp合成)
│ └── content-images.ts # 正文配图插入策略
│
├── generate-geo-articles.ts # Layer 1 串行生成入口
├── generate-geo-articles-parallel.ts # 10K 并行生成入口(Worker Pool + 断点续传)
├── build-keywords-10k.ts # 关键词 10K 扩展构建脚本
├── import-geo-articles.ts # JSON → 数据库导入脚本(通过 API)
└── sync-geo-samples.ts # Markdown 样例 → 数据库同步脚本
docs/geo-samples/ # 精选样例文章(Markdown 格式)
scripts/geo-output/
├── layer1/ # Layer 1 输出(~100篇 JSON)
└── 10k/ # 10K 扩展输出(带 progress.json 断点文件)
六、数据源
3.1 品牌产品数据
双重来源,合并使用:
- brand.md(
geo-data/brand.md):手动维护的完整产品目录
-
19 个产品系列(扉系列、羽系列、山茶、枝梅、桂语传情、德寿宫联名等)
-
80+ 个 SKU(含产品编号、材质、价格、尺寸、重量、类型)
-
每个系列含灵感来源描述
-
价格区间:¥609 – ¥4,999
-
全系底材:S925 银镀 18K 金,链长 40+5cm
- MySQL 数据库(
brand-loader.ts)
-
从
products/collections表读取上架商品 -
通过 Drizzle ORM 操作
-
支持
getSkuById、getSkusBySeries、getSkusByMaterial、getSkusByPriceRange、matchSkusForTopic等查询 -
matchSkusForTopic:基于关键词对 SKU 的 name/description/series/material 做评分匹配
3.2 关键词数据
分层结构:
| 层级 | 文件 | 数量 | 维度组合深度 | 目标字数 | 索引优先级 |
|------|------|------|------------|---------|----------|
| Layer 1 | keywords.json | ~200 条 | 单维度深文 | ≥ 2000 | 0.9 |
| Layer 2 | keywords-10k.json (子集) | ~1,200 条 | 双维度交叉 | 1500-2000 | 0.7 |
| Layer 3 | keywords-10k.json (主体) | ~6,000 条 | 三维度长尾 | 1200-1500 | 0.6 |
| Layer 4 | keywords-10k.json (SKU) | ~2,000 条 | 产品锚点 | 800-1200 | 0.8 |
| Layer 5 | keywords-faq.json | ~1,000 条 | FAQ 问答 | 600-800 | 0.5 |
每条关键词包含:
{
id: string; // 如 "L1-C1-001", "L3-C5-E0001"
keyword: string; // 如 "白蝶贝项链"
intent: string; // 搜索意图
title: string; // 预设文章标题
slug: string; // URL 路径(英文)
relatedSkus: string[];// 关联产品编号
relatedSeries: string[];// 关联系列
layer: 1 | 2 | 3 | 4 | 5; // 层级(决定质量标准和字数要求)
category: string; // 内容分类 C1-C10(决定模板类型和 prompt 方向)
wordCount: number; // 目标字数(由 layer 决定默认值)
}
七、关键词矩阵引擎
keyword-expander.ts 通过 31 种维度组合器 批量生成长尾关键词。组合器按产出归属 Layer 1-5 分层。
4.1 维度定义
| 维度 | 数量 | 示例值 |
|------|------|--------|
| 宝石材质 (MATERIALS) | 8 | 白蝶贝、红玛瑙、孔雀石、黑玛瑙、粉贝、青金石、锆石、贝珠 |
| 产品类型 (PRODUCT_TYPES) | 6 | 项链、耳饰、耳钉、戒指、手链、手镯 |
| 佩戴场景 (SCENES) | 10 | 职场通勤、约会、年会、婚礼、日常、度假、拍照、见家长、面试、聚会 |
| 收礼人 (RECIPIENTS) | 8 | 女友、老婆、妈妈、闺蜜、婆婆、自己、姐姐、同事 |
| 季节/节日 (SEASONS) | 14 | 春节、情人节、三八节、520、七夕、中秋、国庆、圣诞、元旦、毕业季 等 |
| 人群 (DEMOGRAPHICS) | 10 | 学生、职场新人、轻熟女、文艺青年、小个子、圆脸、长脸、微胖、高个子、新手 |
| 价格区间 (PRICE_RANGES) | 5 | 500元内、500-1000、1000-1500、1500-2000、2000元以上 |
| 文化主题 (CULTURES) | 13 | 宋代美学、江南园林、新中式、旗袍、梅花、海棠、桂花、莲花、芭蕉、瓦当、窗花、玉鸟、极简中式 |
| 长尾问题模式 | 10 | 多少钱、会掉色吗、怎么保养、值得买吗、和XX哪个好 等 |
4.2 组合器 → Layer 映射
Layer 1 组合器(单维度,产出 ~200 条):
| # | 组合器 | 公式 | 产出量级 |
|---|--------|------|----------|
| 1 | materialEncyclopedia | 材质 × 深度百科模板 | 8 |
| 2 | categoryGuide | 产品类型 × 选购指南模板 | 6 |
| 3 | seriesAttributeCombinations | 系列 × 6 个角度 | 系列 × 6 |
| 4 | cultureElementDeep | 文化主题 × 深度百科模板 | 13 |
| 5 | careHowTo | 材质 × 保养教程模板 | 8 |
| 6 | comparisonCombinations | C(8,2) 材质对比 × 4 个维度 | C(8,2) × 4 |
Layer 2 组合器(双维度,产出 ~1,200 条):
| # | 组合器 | 公式 | 产出量级 |
|---|--------|------|----------|
| 7 | materialTypeGrid | 材质 × 类型 | 48 |
| 8 | materialSceneCombinations | 材质 × 场景 | 80 |
| 9 | categorySceneGrid | 类型 × 场景 | 60 |
| 10 | recipientSeasonGrid | 收礼人 × 季节/节日 | 112 |
| 11 | priceTypeGrid | 价格 × 类型 | 30 |
| 12 | cultureTypeGrid | 文化 × 类型 | 78 |
| 13 | seasonTypeGrid | 季节 × 类型 | 84 |
| 14 | demographicSceneGrid | 人群 × 场景 | 100 |
| 15 | seriesAngleCombinations | 系列 × 6 个角度 | 系列 × 6 |
Layer 3 组合器(三维度,产出 ~6,000 条):
| # | 组合器 | 公式 | 产出量级 |
|---|--------|------|----------|
| 16 | materialTypeSceneGrid | 材质 × 类型 × 场景 | 480 |
| 17 | materialTypeStyleGrid | 材质 × 类型 × 风格 | 384 |
| 18 | recipientSeasonBudgetGrid | 收礼人 × 季节 × 预算 | 560 |
| 19 | cultureTypeMaterialGrid | 文化 × 类型 × 材质 | 624 |
| 20 | seasonRecipientTypeGrid | 季节 × 收礼人 × 类型 | 672 |
| 21 | demographicSceneTypeGrid | 人群 × 场景 × 类型 | 600 |
| 22 | priceMaterialTypeGrid | 价格 × 材质 × 类型 | 240 |
| 23 | longTailQuestions | 材质 × 问题模式 × 类型 | 480 |
| 24 | provinceContentGrid | 省份 × 内容类型 | 510 |
| 25 | collectionTypeMaterialGrid | 系列 × 类型 × 材质 | 240 |
| 26-31 | 其他三维/四维组合 | 填充至 6K | ~1,210 |
Layer 4 组合器(SKU 锚点,产出 ~2,000 条):
| # | 组合器 | 公式 | 产出量级 |
|---|--------|------|----------|
| — | skuDeepArticles | SKU × 4 个角度 | 97 × 4 = 388 |
| — | skuStylingRecommend | SKU × 搭配推荐 | ~500 |
| — | skuCareGuide | SKU × 保养指南 | ~500 |
| — | skuVariantPages | SKU × 材质/颜色变体 | ~612 |
Layer 5 组合器(FAQ 矩阵,产出 ~1,000 条):
| # | 组合器 | 公式 | 产出量级 |
|---|--------|------|----------|
| — | materialFAQ | 材质 × 20 个常见问题 | 160 |
| — | recipientFAQ | 收礼人 × 场景问题 | 150 |
| — | productFAQ | 产品类型 × 50+ Q&A | 500+ |
| — | categoryFAQ | 6 大分类 × 10 子分类 | 60 |
注意: Layer 4/5 的组合器目前由独立脚本或模板生成,未纳入
keyword-expander.ts的 31 种组合器。后续可统一纳入。
4.3 后处理
-
Layer 标注:根据组合器类型自动标注
layer字段(1-5) -
Category 标注:根据主题维度自动标注
category字段(C1-C10) -
SKU 自动匹配:对每条关键词通过
matchSkusForTopic匹配最多 4 个相关 SKU -
去重:基于 slug 去重
-
排序:Layer 升序(L1 优先)→ 有关联 SKU 的优先 → 按 category 排序
-
重编号:统一
L{layer}-C{category}-{seq}格式(如L1-C1-001,L3-C5-E0420)
八、AI 生成管道
5.1 AI 客户端配置
当前配置:
-
模型:
deepseek-v3.2 -
网关:
https://ai-gateway.g2h3.com/v1(OpenAI 兼容接口) -
同时支持 Anthropic Claude API(代码内保留,未启用)
关键能力:
-
generateWithRetry:带重试的生成(最多 3 次,含 429 限速指数退避) -
RateLimiter:速率限制器(可配置 RPM) -
setRateLimiter/clearRateLimiter:动态开关
5.2 System Prompt 构建
两层叠加:
第一层:基础品牌 Prompt(buildSystemPrompt)
-
角色:中国新中式珠宝领域专业内容写手
-
文风:口语化接地气,用”你""咱们”,专业但不端着
-
结构要求:导语区 → 核心内容区(H2/H3) → 产品推荐区 → FAQ区
-
注入品牌背景、全部产品列表(名称/编号/材质/价格/重量/描述)
第二层:GEO 优化规则(enhanceSystemPrompt)
-
目标平台:百度AI、豆包、Kimi、通义千问、秘塔、知乎直答、夸克、讯飞星火
-
权威引用:国检NGTC、珠宝协会GAC、天猫/京东消费报告、VOGUE/时尚芭莎
-
统计数据本地化:人民币、亿元、Z世代
-
AI 可引用格式:首句结论式、段落首句主题句、“xxx是xxx”定义句式
-
FAQ 口语化:疑问词 + ≤20字 + 直接给结论
-
禁止 H1 标题(正文从 H2 开始)
5.3 User Prompt 构建
对每条关键词动态生成:
-
自动匹配 SKU:调用
matchSkusForTopic([keyword, ...relatedSeries], 4)获取最相关的 4 个产品 -
获取系列信息:从
data.series中取关联系列的设计灵感 -
组装写入指令:
-
目标字数
-
文章结构要求(导语200字 → 核心区3-5个H2 → 产品推荐 → FAQ 3-5个)
-
真实产品数据(编号/价格/材质/重量/尺寸/描述)
-
系列灵感素材
-
硬性要求:标题30-60字、SEO描述120-160字、关键词≥5个、引用权威来源、含具体数据
-
产品推荐区 HTML 格式示例
-
输出格式:严格 JSON
5.4 生成参数
| 参数 | Layer 1 | Layer 2 | Layer 3 | Layer 4 | Layer 5 |
|------|---------|---------|---------|---------|---------|
| 目标字数 | ≥ 2000 | 1500-2000 | 1200-1500 | 800-1200 | 600-800 |
| maxTokens | 4000 | 4000 | 6000 | 3000 | 3000 |
| temperature | 0.7 | 0.7 | 0.7 | 0.5 | 0.5 |
| 最大重试次数 | 2(字数不达标) | 2 | 2 | 1 | 1 |
| 最低字数 | 目标×0.7 | 目标×0.7 | 目标×0.7 | 目标×0.7 | 目标×0.7 |
| 最低 FAQ 数 | 5 | 3 | 3 | 2 | 5 |
| 最低关联产品 | 3 | 2 | 1 | 1(当前 SKU) | 1 |
| 质量通过分 | ≥ 80 | ≥ 75 | ≥ 75 | ≥ 70 | ≥ 70 |
5.5 JSON 输出结构
AI 被要求返回以下格式的 JSON:
{
"title": "30-60字中文标题",
"seoTitle": "SEO标题",
"seoDescription": "120-160字SEO描述",
"seoKeywords": "关键词1,关键词2,...",
"content": "HTML正文(含商品链接卡片)",
"summary": "150-200字摘要",
"faqs": [{"question": "口语化问句?", "answer": "回答"}],
"relatedProducts": ["productCode1", "productCode2"],
"relatedCollections": ["seriesId1"],
"tags": ["标签1", "标签2", "标签3"],
"schemaType": "Article | HowTo | FAQ",
"templateType": "guide | tutorial | knowledge | comparison",
"ogTitle": "社交分享标题",
"ogDescription": "社交分享描述"
}
九、后处理管道
生成后经过以下自动化处理步骤:
6.1 商品链接校验
validateProductLinks:
-
扫描 content 中所有
href="/products/{code}"链接 -
对照有效 SKU ID 白名单校验
-
无效链接:移除整个
product-carddiv 或仅移除<a>标签保留文字 -
有效链接的产品 code 合并到
relatedProducts
6.2 relatedProducts 白名单过滤
-
过滤掉 AI 编造的不存在的商品 code
-
如果过滤后为空,回退到关键词条目中预设的
relatedSkus
6.3 字段补全
enrichArticleFields:
-
wordCount:去除 HTML 标签计算纯文本字数 -
readingTime:字数 / 500 向上取整 -
ogTitle:回退链 ogTitle → seoTitle → title -
ogDescription:回退链 ogDescription → seoDescription -
ogImage:回退链 ogImage → image → thumbnail -
status:draft 或 published -
type:‘information’ -
date:当天日期 -
contentFormat:‘html’
6.4 摘要生成
ensureSummary(摘要 < 100 字时触发):
-
额外调用 AI,temperature 0.3
-
要求:150-200字、首句定义式结论、不复制原文、融入关键词
-
Fallback:截取正文前 200 字
6.5 Slug 校验
ensureValidSlug:
-
校验格式:
/^[a-z0-9]+(-[a-z0-9]+)*$/ -
无效时调用
generateEnglishSlug(异步 AI 翻译生成) -
强制覆盖:最终使用关键词条目中预设的英文 slug(
article.slug = entry.slug)
6.6 SEO 字段补全
-
标题太短(<30字):自动扩展为
{keyword}怎么选?{intent}全攻略 -
SEO描述太短(<120字):从正文截取前3句 + 固定结尾模板
-
SEO关键词不足(<5个):自动补充关键词、品牌名、关联SKU
-
摘要不足(<100字):截取正文前200字
6.7 缩略图生成
thumbnail-generator.ts:
-
使用 Sharp 库合成 1200x630 的封面图
-
组成:品牌渐变背景(品牌色 c3e3e7 系列) + 产品图(右侧400x400) + 标题文字(左侧) + NOLYN 品牌标识(左下角)
-
产品图从 URL 或本地路径获取
-
输出 WebP 格式 →
/media/thumbnails/{slug}.webp
6.8 正文配图插入
content-images.ts:
-
在第一个 H2 段落后插入第一张产品图
-
在”产品推荐”段前插入第二张产品图(或第三个 H2 前)
-
格式:Markdown 图片链接
[](/products/{skuId})
十、质量检查体系
7.1 基础质量评分(100分制)
| 检查项 | 扣分 | 阈值 |
|--------|------|------|
| 标题长度 | -10 | <30 或 >60 字符 |
| SEO描述长度 | -10 | <120 或 >160 字符 |
| 字数不足 | -5 | Layer1<1500, Layer2<800 |
| FAQ数量 | -15 | <3 个 |
| 关联产品 | -15 | <2 个 |
| 无效SKU ID | -10/个 | 不在白名单中 |
| 标签不足 | -3 | <3 个 |
| 缺少 schemaType | -10 | |
| 缺少 templateType | -5 | |
| 缺少 ogTitle | -5 | |
| 缺少 ogDescription | -5 | |
| SEO关键词不足 | -5 | <3 个 |
| 摘要不足 | -3 | <100 字符 |
| 正文包含 H1 | -10 | |
通过标准:分数 ≥ 75 且 errors = 0
7.2 GEO 质量评分(100分制,6个维度)
| 维度 | 满分 | 评分逻辑 |
|------|------|----------|
| 权威引用 | 25 | 引用权威来源(10) + 包含数据(10) + 多个来源(5) |
| 统计密度 | 20 | 含价格(5) + 含规格(5) + 含市场数据(5) + 多段含数字(5) |
| AI可引用性 | 20 | 导语结论句(8) + 段首主题句(6) + 定义句式(6) |
| 实体覆盖 | 15 | 关联产品(5) + 材质关键词(5) + 场景关键词(5) |
| FAQ口语化 | 10 | 含疑问词(5) + 短问句(5) |
| 结构化数据 | 10 | schemaType(4) + 产品(3) + FAQ(3) |
十一、运行入口
8.1 Layer 1 串行生成
# 生成 Layer 1 全部 100 篇
npx tsx scripts/generate-geo-articles.ts --layer 1
# 只生成前 5 篇
npx tsx scripts/generate-geo-articles.ts --layer 1 --limit 5
# 预览不调用 API
npx tsx scripts/generate-geo-articles.ts --layer 1 --dry-run
# 只生成 C1 类目
npx tsx scripts/generate-geo-articles.ts --layer 1 --category C1
# 生成并标记为 published
npx tsx scripts/generate-geo-articles.ts --layer 1 --publish
8.2 10K 并行生成
# 构建关键词库
npx tsx scripts/build-keywords-10k.ts --dry-run
npx tsx scripts/build-keywords-10k.ts
# 并行生成(8并发,30RPM)
npx tsx scripts/generate-geo-articles-parallel.ts \
--input scripts/geo-data/keywords-10k.json \
--concurrency 8 --rpm 30
# 断点续传
npx tsx scripts/generate-geo-articles-parallel.ts \
--input scripts/geo-data/keywords-10k.json \
--resume
# 只生成 100 篇
npx tsx scripts/generate-geo-articles-parallel.ts \
--input scripts/geo-data/keywords-10k.json \
--limit 100 --concurrency 4
并行版本特性:
-
Worker Pool 并发控制
-
断点续传(
progress.json记录 completed/failed/skipped) -
速率限制器(可配置 RPM)
-
每 30 秒自动保存 checkpoint
-
实时进度显示(完成数/速度/ETA)
-
失败条目最多重试 3 次
8.3 导入数据库
# 导入 Layer 1 输出到数据库
npx tsx scripts/import-geo-articles.ts --input scripts/geo-output/layer1/
# 预览
npx tsx scripts/import-geo-articles.ts --input scripts/geo-output/layer1/ --dry-run
导入流程:读取 JSON → 补全摘要 → 映射为 news 表字段 → 通过 /api/information/batch 批量 POST
8.4 Markdown 样例同步
# 将 docs/geo-samples/ 下的 .md 文件同步到数据库
npx tsx scripts/sync-geo-samples.ts
此脚本用于手动编写的样例文章:
-
解析文件名前缀匹配分类(文化故事/教程/选购指南/送礼指南/对比 等)
-
用 pinyin-pro 生成拼音 slug
-
AI 生成摘要(如不足)
-
自动匹配关联商品(基于内容中的系列名/关键词命中)
-
直接 INSERT 到 news 表
十二、内容模板类型映射
关键词 category → 模板类型
'material-type' → 'material-encyclopedia'
'scene-styling' → 'scene-outfit'
'price-guide' → 'price-guide'
'series-deep' → 'series-story'
'comparison' → 'review-comparison'
'season-gift' → 'season-holiday'
'season-gift-budget' → 'season-holiday'
'demographic-scene' → 'scene-outfit'
'culture-material' → 'style-culture'
'question' → 'material-encyclopedia'
'sku-deep' → 'series-story'
Category → 模板类型映射(适用于所有 Layer)
// Category(C1-C10)决定模板类型,Layer 决定内容深度
C1 → 'material-encyclopedia' // 材质百科
C2 → 'style-culture' // 风格文化
C3 → 'price-guide' // 选购指南
C4 → 'scene-outfit' // 场景搭配
C5 → 'scene-outfit' // 场景搭配(礼赠专题)
C6 → 'series-story' // 系列故事
C7 → 'style-culture' // 风格文化(保养教程)
C8 → 'review-comparison' // 对比评测
C9 → 'season-holiday' // 季节节日
C10 → 'trend-hot' // 趋势热门
Layer → 质量模板差异
// 同一 Category 在不同 Layer 下的质量参数调整
Layer 1: wordCount ≥ 2000, faqs ≥ 5, products ≥ 3, schema = Article + FAQ
Layer 2: wordCount ≥ 1500, faqs ≥ 3, products ≥ 2, schema = Article + FAQ
Layer 3: wordCount ≥ 1200, faqs ≥ 3, products ≥ 1, schema = Article + FAQ
Layer 4: wordCount ≥ 800, faqs ≥ 2, products ≥ 1, schema = Article + FAQ + Product
Layer 5: wordCount ≥ 600, faqs ≥ 5, products ≥ 1, schema = FAQPage
十三、辅助脚本
| 脚本 | 用途 |
|------|------|
| fix-information-seo.ts | 批量修复信息文章的 SEO 字段 |
| fix-information-images.ts | 批量修复文章图片 |
| fix-article-products.ts | 批量修复文章关联产品 |
| fix-information-summary.ts | 批量补全文章摘要 |
| backfill-tags.ts | 批量回填标签 |
| migrate-slugs.ts | Slug 迁移 |
十四、依赖关系
外部依赖
-
sharp:缩略图生成
-
drizzle-orm + mysql2:数据库操作
-
pinyin-pro:拼音 slug 生成(sync-geo-samples 使用)
-
dotenv:环境变量
内部依赖
-
src/db/schema:数据库 schema 定义 -
src/lib/slug-utils:generateEnglishSlug(AI 翻译英文 slug)
环境变量
-
DATABASE_URL:MySQL 连接串 -
OPENAI_API_KEY:AI API 密钥(硬编码了默认值) -
API 网关地址:
https://ai-gateway.g2h3.com/v1
十五、已知限制与待改进
-
AI API Key 硬编码:
ai-client.ts中有默认 key 值,应迁移到环境变量 -
产品图片获取不稳定:
fetchProductImageMap主要依赖本地缓存文件,API 端点未稳定 -
摘要生成额外 API 调用:每篇不达标的文章会多消耗一次 AI 调用
-
10K 关键词质量未验证:大量组合生成的关键词可能有语义重复或无实际搜索量
-
Markdown 样例与 JSON 输出格式不统一:geo-samples 是 .md,pipeline 输出是 JSON,两套入库逻辑
十六、效果预期
| 指标 | 当前 | 目标 |
|------|------|------|
| 索引页面数 | ~100(含 Layer 1) | 10,000+(L1: 200 + L2: 1,200 + L3: 6,000 + L4: 2,000 + L5: 1,000) |
| FAQPage schema 覆盖 | Layer 1 已有 | 全部文章页 + L5 FAQ 矩阵 |
| HowTo schema 覆盖 | 0 页 | L1 C7 保养教程 + L4 产品保养页 |
| Article schema 覆盖 | Layer 1 已有 | L1-L3 全部文章页 |
| 目标关键词覆盖 | ~100 个 | 10,000+ 个(按 Layer 递进覆盖) |
| AI 搜索引用预期 | 低 | 高(10,000+ 页面 × 每页 3-5 个 FAQ = 30,000-50,000 个可被 AI 引用的问答对) |
| 内链密度 | 低 | 高(L1-L5 纵向链接 + 同 Layer 横向链接 + 每页 2+ 产品关联) |
| 爬取预算利用 | 未优化 | 按 Sitemap Priority 分层引导(L1: 0.9 → L5: 0.5) |
核心原理: AI 搜索引擎优先引用有 FAQPage 和 HowTo schema 标记的内容。Layer 1-5 递进结构确保:
-
L1 权威页面作为 AI 引用的首选答案源(定义式结论 + 深度百科)
-
L2-L3 长尾覆盖捕获所有细分搜索意图
-
L4 产品页将流量转化为交易
-
L5 FAQ 矩阵补充问答覆盖,最大化 AI 引用概率
-
内链层级形成 L1 → L2 → L3 → L4 的自然引流路径