几周前,我偶然发现我们网站的一个目录模块压根就没渲染给任何读者看。代码在、CSS 也在,已经上线跑了几个月,但页面从不显示。原因是模板里用了 h2[id] 选择器,可我们 Markdown 渲染器只输出旧式锚点 ,标题本身没有 id。于是这个选择器一次都没匹配成功,每一篇文章都如此。没人发现,因为真的没人去扫那个地方。

我是为了查另一件事才撞上它的:为什么我们的内容在 AI 搜索里几乎完全消失——ChatGPT、Perplexity、Google 的 AI Overviews 都很少引用我们。站点发布了大约 1600 篇文章,历史流量不差,但在这些“答案引擎”的引用里几乎一片空白。这次排查后来花了我两周时间。真正起作用的因素、毫无影响的动作,以及我在路上踩的坑,都记录下来了。

网上随处可见的 AEO(答案引擎优化)清单,第一条永远是结构化数据标记。但它们从不先问那个真正卡脖子的问题:AI 爬虫到底能不能取到你的页面?现在就去检查你的 robots.txt。为答案引擎提供内容的那几个爬虫是:GPTBot、OAI-SearchBot、ClaudeBot、PerplexityBot、Google-Extended、CCBot。只要其中任何一个被禁止,后面所有优化都只是在演戏。

这里面还有一个非常隐蔽的陷阱。按照 robots 协议,如果你为某个爬虫单独写了一个 User-agent 块,它对那个爬虫就是完全替代通用 * 规则,而非合并。也就是说,你出于“好意”加了 User-agent: GPTBot 并 Allow: /,那么 GPTBot 就会忽略你原本在 * 块下写好的所有禁止目录,开始快乐地爬 /reactions、/admin 等任何路径。我们就因为这个原因,让 GPTBot 白白烧了大量抓取配额去撞管理后台和跟踪端点。解决办法是把所有单独命名的 bot 组全删掉,只保留一个 User-agent: *,允许内容爬取,只禁止垃圾路径。这么一来,所有爬虫都遵守同一条规则,统统不会跑偏。

清理完 robots.txt,再补一个 llms.txt。这是一个纯文本文件,里面手工列出你最好的 URL,每行附一句简介。它就是给模型看的“这里有你值得读的东西”。写它几乎零成本,但正在变成一种真实约定。

接入问题解决后,第二个关键点才真正凸显出来:让段落本身更“好引用”。答案引擎从来不是引用一个整页,而是引用一个段落。能被模型干净抓取的段落有几个特征:首先它必须处在一个能回答真实问题的标题下面,比如“跑 70B 模型需要多大显存?”而不是“硬件要求”;其次,答案要在前两句就给出,不能前面大段铺垫;最后,这个段落本身最好足够短,能独立作为一个信息块,大致在 500 token 左右。

比较类内容在这里格外能打,我到现在才真正想通为什么。这些系统使用的重排序模型对对比和否定十分敏感——“A 做了这件事,B 没有”。于是像“Cursor vs Copilot”这样直白的标题,下面再挂一张对比表格,对它们来说几乎已经是预消化好的食材。