SEO

用 AI 做程序化 SEO:做出 500 个不会被 Google 判为 thin 的页面

用 AI 做程序化 SEO:做出 500 个不会被 Google 判为 thin 的页面
目录

2023 年底,有个 SaaS 客户找到我,让我在 3 周内交付 500 个「[竞品] 的 [行业] 替代方案」落地页。竞品清单 12 个,行业清单 40 多个,一乘就是 480+ 个页面。他们的理由很直白:「我们已经手工写了 30 个,这些页面在出排名。规模化就行。」

我跟他们说了实话:那 30 个手工页面之所以有排名,是因为有人真的用过那款竞品、形成了判断、写出了具体的对比。模板一旦替换掉人的那一步,页面就成了老虎机。Google 把这种内容叫做 thin content(内容稀薄);客户的支持邮箱则管它叫「信誉问题」。

我们最终还是交付了 500 个页面——但用了一套我那时没命名、现在回想起来很想给一套名字的系统。系统有三层:数据层(一张装满事实的电子表格,不是空格子)、模板层(直接用 HTML,不只是文本)、提示词层(给 Claude 的指令:从数据层里抽取真实信号,并且拒绝编造)。系统里还有五道护栏,我会逐一拆解——因为护栏才是把「程序化 SEO」和「换了马甲的垃圾内容」区分开的部分。

如果只能让你记住一句话,就这一句:thin content 不是字数问题,是信号问题。1200 字的页面,如果每个段落换到任何页面都成立,它就是薄的;600 字的页面,如果告诉了我在竞品官网上都拿不到的信息,它就不薄。程序化 SEO 的本事,就是让 500 个页面都拥有第二种密度,又不用你手写 500 次。

老实说,这个账怎么算

在动手搭系统之前,我得先把预期校准。我在网上看到的大多数「AI + 程序化 SEO」建议,要么让人丧气,要么就是在说谎。丧气版:「直接用 ChatGPT 加模板就行了!」(结果就是:页面排上去 30 天,然后蒸发。)说谎版:「我搭了 1000 个页面,现在每月 20 万流量!」(作者背后要么有 14 条来自 Forbes、TechCrunch 的外链,要么在某个 DR 90 的清单页上买了坑位。)

老实版是这样的。对一个真实的中等竞争 B2B SaaS 站点,一个执行到位的 300-500 页程序化项目,6-9 个月内能稳定带来每月 5,000-15,000 的自然搜索增量会话,前提是:

  • 站点自身至少有 DR 30-40 的基础权重
  • 模板锁定的关键词都是长尾、搜索意图清晰(平均 4 个词以上)
  • 每个生成的页面有 3-5 个独有的、非模板化的数据点
  • 内链是有意搭的,不是剩下的边角料
  • 站点本身的抓取/收录系统没毛病,没有技术债拖后腿

这就是现实的区间。那些你看到的「20 万/月」案例,要么是 DR 70+ 的站点(随便发个页面就出排名)、要么是锁定了零竞争关键词、要么就是在吹牛。

把系统搭起来,按上面的区间对一下预期,你就不会跑偏。

数据层:所有人都跳过的部分

网上大多数「AI + 程序化 SEO」教程从模板讲起。顺序就错了。模板反而是最简单的部分。数据层——你的模板要渲染的真实事实——才是真正吃功夫的地方。如果你的电子表格只有「竞品名」和「行业名」两列,那你规模化产出的就一定是薄内容。

以「[竞品] 的 [行业] 替代方案」为例,数据层应该长这样。一行一个页面,一列一个页面要主张的独有事实:

page_slug competitor industry industry_team_size primary_pain missing_feature pricing_tier integration_count public_review_snippet migration_time
mailchimp-alternative-saas Mailchimp SaaS 5-50 自动化能力有限 基于事件的触发器 $13-$800/月 300+ "联系人超过 25k 之后,定价开始变惩罚性。" 1-2 周
mailchimp-alternative-dental Mailchimp 牙科诊所 1-10 HIPAA 合规顾虑 BAA 协议支持 价格不一 120 "牙科诊所需要的是 HIPAA,不是送达率。" 1 周
... ... ... ... ... ... ... ... ... ...

注意表里有什么没什么。没有 intro_paragraph(引言段落)列。没有 body_text(正文)列。没有任何 AI 生成的总结。每一格都是一个事实——一个数字、一个名字、一句引用、一个具体观察。有些格子是你从真实研究中手工填的;有些是 Claude 在你提供的资料里抽取的;有些是你从公开评测站点上抓的,然后人工核对过。

数据层,正是让「Mailchimp 替代方案:牙科诊所」和「Mailchimp 替代方案:SaaS 公司」读起来完全不同的东西。没有它,你的模板就是 480 个页面共穿的一件衣服。

这张表怎么填?两遍。第一遍:手工填 10-15 行。这是最痛苦的部分。去读 G2 上竞品的评论,去读他们的定价页,去读 3 个目标行业从业者的 Reddit 帖子。用你自己的语气填,不是模板的语气。第二遍:有了 10-15 行高质量样本后,把这些行作为 few-shot(少样本)示例给 Claude,让它一次填一行,填剩下的表,并且每个事实都要给出来源链接。任何 Claude 给不出来源的行,直接丢掉。最终你会得到 60-70% 填好的表,剩下的手工补完。

模板层:用 HTML,不是用英语

模板应该是 HTML,不是 Markdown 大纲。这听起来很学究,但它重要,原因有二。第一,模板可以有条件块({% if industry == "dental" %}...{% endif %}),根据数据层的值切换内容,这正是让每个页面形状略有不同的方式。第二,模板里可以直接塞 schema(结构化数据,见下文)、内链、面包屑导航——这些在写散文的时候特别容易忘。

下面是一个能跑通的「竞品替代方案」页模板。挑出来的是真正在承重的部分。

html

{{competitor}} 在 {{industry}} 团队的替代方案 ({{year}})

{# 简短结论 —— 只会渲染其中一段,由数据层选定 #} {% if primary_pain == "pricing" %}

如果 {{competitor}} 的定价曲线已经开始割到你, 简短结论是:我们接触的多数 {{industry}} 团队,是在跨过 {{pricing_tier}} 这个门槛时切换的,迁移大概 {{migration_time}}。

{% elif primary_pain == "automation limits" %}

{{industry}} 团队用 {{competitor}} 用到天花板,几乎都是同一面墙:{{missing_feature}}。我们看到的太多了。

{% endif %} {# 「为什么切换」小节 —— 从数据层取,不是凭空造 #}

为什么 {{industry}} 团队会离开 {{competitor}}

最显眼的是 {{primary_pain}}。配套的事实是:集成数量停在 {{integration_count}}, 这是同类工具中位数水平的 {{relative_to_category}}。一个能上生产的 {{industry}} 流程,通常至少需要其中 4-6 个就绪。

{{public_review_snippet}}
{# 对比表 —— 每个格子都来自数据层 #}

{{competitor}} vs. {{industry}} 替代方案

维度{{competitor}}我们
入门价{{competitor_pricing_entry}}$0(免费版)
集成数量{{integration_count}}1,200+
{{industry}} 场景工作流{{workflows_supported}}{{our_workflows_supported}}
{# 行业专属 FAQ —— 从数据层取,不现编 #}

常见问题:在 {{industry}} 从 {{competitor}} 切换过来

{% for faq in industry_specific_faqs %}
{{faq.question}}

{{faq.answer}}

{% endfor %}

值得注意的几点。结论段是三个候选之一,由数据层选定。对比表中,竞品那侧的格子来自数据层,我们这侧的格子是固定主张(由你这个营销负责人一次性定下来)。FAQ 是一组从数据层来的列表,不是从零生成。

你看不到的部分:千篇一律的开场白、「我们是行业领先」的自我吹嘘、CTA 按钮区。薄内容最爱藏在这些地方。

提示词层:大部分团队都写错的地方

现在轮到 Claude 登场。这里最容易犯的错,是写一个「写一篇关于 X 的 Y 替代方案的博客文章」这样的提示词。不要这么写。提示词的角色,是数据层和模板层之间的胶水。它一次接收数据层的一行作为输入,产出的要么是一个 JSON 对象(填齐这一行里还空的格子),要么是一小段条件渲染的散文(模板里需要的那几段)。

下面是我在用的 system prompt。拿去改,不要照抄——每个项目的细节会变。

text你的任务是填齐程序化 SEO 数据表里的一行。你会收到:
1. 一个 page slug(例如 "mailchimp-alternative-dental")
2. 竞品名和他们官网的 URL
3. 行业名,以及该行业 3-5 家代表性公司的清单
4. 这一行已经填好的列(用它们,不要矛盾)
5. 这一行还空的列(这些是你要填的)

你的工作只填那些空列。对你新增的每一个事实:
- 如果是数字(定价、集成数等),必须给出 URL 来源。
- 如果是引用,必须给出 G2/Capterra/Reddit 帖子的 URL。
- 如果找不到来源,格子留空,写 "NO_SOURCE"。
- 不要编造。事实查不到,格子就空着。

输出格式:一个 JSON 对象,key 对应列名。JSON 外不要写任何散文。

然后对每一行,你把上面的 prompt 加上这一行的上下文一起发出去。对于模板里需要条件渲染的散文段(结论段、「为什么切换」开场、FAQ 答案),你会用第二个 prompt,把现在已经填齐的行作为输入,生成这些段。

text你的任务是为一个程序化 SEO 页面写 2-3 段短散文。你会收到:
1. 一行已经填齐的数据(JSON)
2. 散文要插入的 HTML 模板
3. 要写的小节标签列表:["verdict_paragraph", "why_switch_intro", "faq_answers"]

硬性规则:
- 每个主张都必须有数据行里的某个格子支撑。行里写 integration_count 是 120,
  你可以写「120 个集成」。行里没说的事,你不能写。
- 永远不要用「行业领先」、「前沿」、「在这个快节奏的时代」这种词。
  这些是模板味的词,细心的读者(以及越来越聪明的算法)会因此把页面判为薄。
- 长度:verdict_paragraph 35-55 词,why_switch_intro 50-80 词,
  每个 faq_answer 30-50 词。
- 输出:一个 JSON 对象,key 对应小节标签。

两段式 prompt 是真正承重的部分。Prompt 1 产出事实(低温度、要有引用);Prompt 2 产出散文(温度稍高,但所有事实必须回到 Prompt 1 的结果)。事实生成和散文生成永远不在同一次调用里发生,这正是阻止模型为了凑句子而编一个数字的关键。

五道护栏

哪怕数据层和提示词层都做到位了,500 个页面铺开之后,一定会出问题。这五道护栏就是用来抓这些问题的。

1. 每个页面的独有数据。 在任何页面上线之前,用一个脚本读取该页面渲染后的 HTML,抽出里面所有的数字、所有引用、所有专有名词,再去跟数据层做比对。如果两个页面有超过 60% 的独有数据点重合,脚本就标出来,人工复审。这是对抗「500 个页面读起来都一个样」最有效的一道闸。

2. 标题和 Meta 与搜索意图对齐。 「Mailchimp 替代方案:牙科诊所」是对比型查询,不是「什么是 XX」型查询。页面的 title、h1、meta description 必须传达「我们是要来回答对比问题的」——而不是「让我给你讲讲邮件营销」。对每一种程序化模板,把 title 和 meta 写一次,固定在模板里,然后用该模式搜索结果前三名页面去验证。如果前三名都是「vs」结构而你是「指南」结构,那你就错了。

3. 内链不是事后补丁。 每个程序化页面都应该链向:(a) 上层分类页,(b) 2-3 个同行业的兄弟页(同行业的其他「[行业] 替代方案」页),(c) 1-2 个支柱页(pillar page,即围绕核心主题写的长篇权威文章)。兄弟页之间的互链是简单红利——500 个「[竞品] 的 [行业] 替代方案」天然形成了一张交叉网,几乎不费力气就能渲染出来。支柱页是难点,你需要 3-5 个,而且必须是真正写过的文章,不是更大的模板。

4. schema,每次都要有。 每个页面都要有:SoftwareApplication schema(软件应用结构化数据;aggregateRating 聚合评分如果能合规拿到就加上——这本身是一个真实存在的考量)、FAQPage schema(和 FAQ 区块严格对齐,不要扩写)、BreadcrumbList schema(面包屑导航结构化数据)。JSON-LD 必须在服务端渲染,不是客户端,这样 Googlebot 在首字节就能看到。Rich Results Test(Google 的结构化数据校验工具)要在每个页面上通过。你交付 500 个页面,至少要手测 20 个。

5. 抽检,不是全检。 你不可能读完 500 个页面。但你应该读 25 个:开头的 5 个、中间的 5 个、结尾的 5 个、数据层去重脚本标出的 5 个、再随机抽 5 个。这 25 个没问题,基本就稳了。如果随机抽的 5 个里有两个出现编造的事实,说明提示词层有 bug,马上停手。

不是清单,是一句话的提醒

大多数程序化 SEO 的文章结尾都是一张清单。我换个说法:程序化 SEO 项目不是内容项目,是一个数据项目,内容是它的输出。你的数据层是薄的,Claude 提示词写得再花也救不回那个页面。数据层是厚的,你用个普通模板都能出排名,因为事实在替页面工作。

我见过最多团队栽的坑,正好是反过来的:花一周把模板做得漂漂亮亮,花一下午把数据层糊弄过去,然后纳闷为什么 500 个页面读起来像同一页改写了 500 次。把时间调过来。模板是一周的工作量,数据层是一个月的工作量,提示词层再花一周。预算按这个配。

最后一句话,给几年前的我自己:程序化页面不是手工内容的替代品,是补充。你团队一个季度能手工写出来的 30 篇,仍然是 ROI 最高的资产;500 个程序化页面是长尾。把它们当同一类东西、用同一个 ROI 模型、同一个时间表来衡量,本身就是个错误。系统搭起来,预期校准,长尾交付——同时,手写的内容也得继续写。