GEO 与 SEO:从排名到引用的工程化实践

文章目录
微信公众号二维码
本文已同步发布到微信公众号「人言兑」
👈 扫描二维码关注,第一时间获取更新!

如果你最近查看过站点的流量统计,可能会发现一个诡异的现象:核心关键词的排名没有明显下滑,甚至部分词还稳中有升,但有机流量却在持续走低。这不是你的内容出了问题,而是搜索结果的呈现方式正在发生结构性变化。

搜索引擎不再只是返回一组蓝色链接让用户自行挑选。当 Google AI Overviews、ChatGPT Search、DeepSeek 这类生成式搜索界面直接给出完整答案时,用户停留在搜索结果页就能解决问题,点击行为被大幅压缩。根据 SparkToro 与 Similarweb 的联合研究,目前约三分之二的 Google 搜索以无点击结束,其中信息类查询的无点击比例更高。与此同时,BrightEdge 的追踪数据显示,AI Overviews 已覆盖近半数的搜索查询。

这意味着,传统的搜索引擎优化(SEO)逻辑——「把页面做到前十,等待用户点击」——正在失去独占性。一种新的优化维度正在形成:生成式引擎优化(Generative Engine Optimization,GEO)。它的目标不是赢得排名,而是赢得被 AI 引用的权利。

SEO 与 GEO 的本质差异

从工程视角看,两者的区别体现在数据流的不同阶段。

SEO 解决的是索引与排序问题。搜索引擎爬虫抓取页面,建立倒排索引,通过数百个信号计算相关性,最终生成一个有序的链接列表。你的优化手段——关键词布局、外链建设、技术性能调优——本质上都在影响这个排序算法。

GEO 解决的是抽取与引用问题。生成式 AI 系统(大语言模型及其检索增强框架)在处理用户查询时,会先检索相关文档,再基于抽取出的内容片段生成答案。GEO 的核心任务是让你的内容在检索阶段被选中,在生成阶段被准确引用。

打个比方:SEO 让你在图书馆的目录里排在前面;GEO 让你的内容被写进读者最终拿走的那份摘要里。前者决定用户能否找到你,后者决定用户是否需要点击你。

这个差异直接影响了成功指标。SEO 的 KPI 是排名位置、点击率、自然流量;GEO 的 KPI 是品牌被引用的频率、引用上下文的相关性,以及内容在 AI 答案中的曝光位置。Seer Interactive 的研究发现,在 AI Overview 中被引用的品牌,其有机点击率比未被引用的品牌高出约三分之一。这说明 GEO 不仅不替代 SEO,反而能通过引用权反哺传统搜索表现。

为什么GEO和SEO两者必须同时存在

有一种常见的误解是 GEO 会取代 SEO。实际上,GEO 依赖 SEO 建立的基础设施。一个没有良好索引、加载缓慢、缺乏权威信号的站点,几乎不可能被 AI 系统视为可信引用源。

两者的交集在技术层面非常明显:

结构化内容。清晰的标题层级、短段落、有序列表和表格,既方便搜索引擎爬虫理解页面结构,也方便 AI 系统进行内容分块和语义抽取。研究表明,使用对比表格的内容被引用的概率比纯文本高出数倍。

E-E-A-T 信号。经验、专业性、权威性和可信度(Experience, Expertise, Authoritativeness, Trustworthiness)对两者都至关重要。具名作者、可验证的资质、透明的来源引用,这些元素同时服务于搜索质量评估和 AI 引用筛选。

技术基础。快速的加载速度、移动端适配、干净的 URL 结构和有效的内部链接,是任何优化策略的前提。值得注意的是,主流 AI 爬虫(包括 GPTBot、DeepSeekBot、KimiBot、ClaudeBot)目前都不执行 JavaScript,只读取原始 HTML。这意味着服务端渲染或静态生成不是可选项,而是必选项。

Schema 标记。这是连接两者的关键桥梁。通过 Schema.org 的 JSON-LD 格式,你可以把内容的语义显式地告诉机器,降低 AI 系统理解成本。

实战:构建SEO+GEO双重友好的内容体系

内容架构:从叙事驱动到答案驱动

传统 SEO 内容往往采用「背景-问题-分析-结论」的叙事结构。这种写法对人类读者友好,但对 AI 抽取不够高效。

GEO 友好的结构要求自包含的模块化内容。每个章节应该满足「孤岛测试」:单独抽离出来阅读时,依然能完整传达一个观点,不依赖上下文的指代词。

具体做法:

  • 将 H2/H3 标题写成用户实际会搜索的问题形式,例如「如何配置 Nginx 的 gzip 压缩?」而非「性能优化概述」。
  • 每个标题下的前两句直接给出结论,后续内容再展开论证。被 AI 引用的页面中,绝大多数在首段就给出了直接答案。
  • 使用编号列表描述流程,用项目符号列举特征,用表格呈现对比。避免把关键数据埋在长段落中间。
  • 每个主张尽量附带可验证的来源,特别是具体数字、百分比和工具名称。带有原始统计数据的页面在 AI 可见性上表现明显优于纯评论性内容。

技术实现:Schema、爬虫权限与 llms.txt

1. Schema.org JSON-LD 标记

JSON-LD 是目前最推荐的结构化数据格式,它将元数据与前端展示解耦,便于维护。以下是一个同时面向搜索引擎和 AI 系统的文章页标记示例:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Article",
      "@id": "https://example.com/blog/geo-seo-practice",
      "headline": "GEO 与 SEO:从排名到引用的工程化实践",
      "description": "探讨生成式引擎优化与传统搜索引擎优化的技术差异与协同策略。",
      "author": {
        "@type": "Person",
        "name": "作者姓名",
        "url": "https://example.com/about",
        "sameAs": [
          "https://github.com/username",
          "https://twitter.com/username"
        ]
      },
      "publisher": {
        "@type": "Organization",
        "name": "站点名称",
        "logo": {
          "@type": "ImageObject",
          "url": "https://example.com/assets/logo.png"
        }
      },
      "datePublished": "2025-08-15T08:00:00+08:00",
      "dateModified": "2025-09-01T14:30:00+08:00",
      "mainEntityOfPage": {
        "@type": "WebPage",
        "@id": "https://example.com/blog/geo-seo-practice"
      }
    },
    {
      "@type": "FAQPage",
      "mainEntity": [
        {
          "@type": "Question",
          "name": "GEO 会取代 SEO 吗?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "不会。GEO 建立在 SEO 的技术基础之上,两者是互补关系。SEO 确保内容被发现和索引,GEO 确保内容被 AI 系统引用和总结。"
          }
        },
        {
          "@type": "Question",
          "name": "如何衡量 GEO 的效果?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "核心指标包括品牌在 AI 生成答案中的引用频率、引用上下文的相关性,以及因 AI 引用带来的品牌搜索量增长和辅助转化。"
          }
        }
      ]
    }
  ]
}
</script>

关键字段说明:

  • dateModified 必须随内容实质性更新而更新。AI 系统明显偏好近期更新的材料,定期维护的内容在引用率上具有显著优势。
  • sameAs 用于将实体链接到权威外部标识(如 GitHub、Wikipedia、Wikidata),增强知识图谱中的可信度。
  • FAQPage 和 HowTo 类型的 Schema 尤其适合被 AI 直接抽取为问答片段。

验证工具:

# macOS / Linux
pip install PyLD requests

# Windows (PowerShell)
pip install PyLD requests
import json
from pyld import jsonld

doc = {
    "@context": "https://schema.org",
    "@type": "Article",
    "headline": "测试文章",
    "author": {"@type": "Person", "name": "Test Author"}
}

# 验证基本结构
compacted = jsonld.compact(doc, doc)
print(json.dumps(compacted, indent=2, ensure_ascii=False))

更多JSON-LD相关知识参考:

2. 允许 AI 爬虫访问

许多站点的 robots.txt 默认只考虑了传统搜索引擎爬虫,却屏蔽了 AI 系统的抓取代理。你需要显式放行主流 AI 爬虫:

User-agent: GPTBot
Allow: /

User-agent: OAI-SearchBot
Allow: /

User-agent: DeepSeekBot
Allow: /

User-agent: KimiBot
Allow: /

User-agent: ClaudeBot
Allow: /

User-agent: CCBot
Allow: /

如果你使用 Cloudflare 等 CDN,还需检查 WAF 规则是否误拦截这些 User-Agent。AI 爬虫对页面加载速度普遍敏感,超时阈值较低,TTFB(Time To First Byte)建议控制在 500 毫秒以内。

3. llms.txt:给 AI 的站点地图

llms.txt 是一个放置在站点根目录的文本文件,功能类似 robots.txt,但面向 AI 系统。它用简洁的 Markdown 格式告诉 AI 代理:哪些页面是站点的核心内容,每个页面的主题是什么,以及是否允许被用于训练。

格式示例:

# 站点名称

> 一句话描述站点定位。

## 核心内容

- [GEO 与 SEO 实践指南](https://example.com/blog/geo-seo): 生成式优化与传统搜索优化的协同策略
- [Nginx 性能调优手册](https://example.com/blog/nginx-tuning): 从内核参数到应用层的完整配置参考

## 可选内容

- [关于我们](https://example.com/about): 团队背景与联系方式

## 使用政策

允许用于回答用户查询时的实时检索与引用。
不允许用于模型训练或数据挖掘。

目前部分 AI 爬虫会主动检查根目录的 llms.txt,将其作为导航辅助。虽然这一规范尚未完全标准化,但提前布局没有坏处,且实现成本极低。

内容 freshness:对抗引用衰减

AI 系统会重新获取源内容以验证时效性。一个页面发布后如果长期不更新,其被引用的概率会随时间下降。建议建立内容维护周期:

  • 核心页面每 60 到 90 天进行一次实质性更新(更新数据、补充案例、修正过时链接),并同步更新 Schema 中的 dateModified。
  • 在页面顶部添加可见的「最后更新」时间戳,与结构化数据保持一致。
  • 建立内部链接网络,让高权重的枢纽页面向需要提升引用率的页面传递权重。

如何测量 GEO 效果

GEO 的测量比 SEO 更复杂,因为 AI 系统的输出不是公开的排名列表,而是动态生成的答案。目前可行的方法包括:

手动采样。针对业务相关的核心查询,定期在 ChatGPT、DeepSeek、Kimi、Google AI Mode 中检索,记录品牌是否被引用、引用位置、引用上下文是否准确。这个方法适合初期摸底,但不具备规模性。

自动化监控。可以编写简单的脚本定期调用 AI 平台的 API,监控特定查询下的引用情况。以下是一个基于 Python 的概念示例,使用 OpenAI API(兼容大多数国内代理服务)检查品牌在特定查询中的出现频率:

import os
import json
import requests
from datetime import datetime

# 配置
API_KEY = os.getenv("OPENAI_API_KEY")
BASE_URL = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
QUERIES = [
    "如何优化网站 SEO 结构",
    "GEO 与 SEO 有什么区别",
    "最好的 Python Web 框架是什么"
]
BRAND_KEYWORDS = ["example.com", "你的品牌名"]
OUTPUT_FILE = "geo_monitor.json"

def check_citations(query, brand_keywords):
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    payload = {
        "model": "gpt-4o-mini",
        "messages": [
            {"role": "system", "content": "请搜索网络并给出准确、简洁的回答,同时列出你参考的来源链接。"},
            {"role": "user", "content": query}
        ],
        "tools": [{"type": "web_search_preview"}],
        "tool_choice": {"type": "web_search_preview"}
    }

    try:
        resp = requests.post(
            f"{BASE_URL}/chat/completions",
            headers=headers,
            json=payload,
            timeout=60
        )
        data = resp.json()
        content = data["choices"][0]["message"]["content"]

        # 尝试提取引用链接(不同模型格式不同,这里做简化处理)
        citations = []
        message = data["choices"][0]["message"]
        if "annotations" in message:
            citations = [a.get("url", "") for a in message["annotations"] if a.get("type") == "url_citation"]

        # 检查品牌是否在引用链接或正文中出现
        matched = any(
            kw in str(citations) or kw in content
            for kw in brand_keywords
        )
        return {
            "query": query,
            "matched": matched,
            "citation_count": len(citations),
            "sample_text": content[:200]
        }
    except Exception as e:
        return {"query": query, "error": str(e)}

def main():
    results = []
    for q in QUERIES:
        print(f"Checking: {q}")
        results.append(check_citations(q, BRAND_KEYWORDS))

    record = {
        "checked_at": datetime.now().isoformat(),
        "results": results
    }

    # 追加到历史记录
    history = []
    if os.path.exists(OUTPUT_FILE):
        with open(OUTPUT_FILE, "r", encoding="utf-8") as f:
            history = json.load(f)

    history.append(record)
    with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
        json.dump(history, f, ensure_ascii=False, indent=2)

    print(f"Results saved to {OUTPUT_FILE}")

if __name__ == "__main__":
    main()

运行方式(macOS / Linux / Windows 通用):

# 设置环境变量后执行
export OPENAI_API_KEY="your_key"           # macOS/Linux
export OPENAI_BASE_URL="https://your-proxy.com/v1"  # 如需代理

# $env:OPENAI_API_KEY="your_key"           # Windows PowerShell
# $env:OPENAI_BASE_URL="https://your-proxy.com/v1"

python geo_monitor.py

这个脚本的核心逻辑是:对一组目标查询调用支持联网搜索的 AI API,分析返回的引用列表和正文中是否包含品牌关键词,并将结果持久化到 JSON 文件。通过长期运行,你可以观察到品牌引用频率的趋势变化。

如果你使用 DeepSeek、Kimi 等国内平台的 API,只需将 BASE_URL 和 model 替换为对应值即可。例如 DeepSeek:

BASE_URL = "https://api.deepseek.com"
# payload 中 model 改为 "deepseek-chat"

辅助指标。除了直接引用,还应关注:

  • 品牌搜索量(Users 直接搜索你的品牌名,说明 AI 答案产生了记忆效应)
  • 辅助转化(从 AI 引荐流量来的用户,其注册或付费转化率是否高于平均水平)
  • 站点被 AI 爬虫访问的频次(通过日志分析 GPTBot、DeepSeekBot 等 User-Agent 的请求量)

结语

GEO 与 SEO 不是对立选项,而是同一套内容基础设施在不同搜索范式下的表现。SEO 确保你的内容能被找到和索引;GEO 确保你的内容在 AI 直接给出答案的场景中依然拥有存在感。

从工程角度看,两者的优化成本高度重叠:良好的内容结构、清晰的 Schema 标记、开放的爬虫权限、持续的 freshness 维护,这些投入同时服务于传统搜索和生成式搜索。唯一需要改变的是思维模型——从「争夺前十名链接位置」转向「争取成为被引用的信源」。

相关阅读推荐: 如何让AI搜索引擎正确理解并推荐你的网站:AIO(AI Optimization)实战方法论

搜索行为的迁移已经发生。当用户习惯在搜索框里直接获得答案时,你的内容能否被写进那份答案,将决定你在这个新范式下的可见度。现在开始调整内容架构和技术基础,比等待行业成熟后再跟进要划算得多。


也可以看看