
1. 当AI搜索对你的网站视而不见时问题出在哪你可能已经注意到了这个现象辛辛苦苦写的技术博客、产品文档、知识库文章在传统搜索引擎里排名还行但一到AI搜索场景——比如各类AI助手、智能问答、对话式检索——你的内容就像石沉大海AI在回答相关问题时压根不引用你的网站。你检查了页面加载速度没问题看了移动端适配也没问题甚至关键词密度都反复调过依然没用。这不是你的内容质量不行而是AI搜索的“引用逻辑”和传统搜索引擎的“排名逻辑”根本就是两套体系。传统搜索关心的是“哪个页面最匹配关键词”AI搜索关心的是“哪段内容可以被安全、清晰、结构化地摘出来直接回答用户”。你的网站如果在这三个维度上没做适配AI就会绕开你去引用那些做了适配的站点。这篇内容就是围绕这个核心矛盾展开的。我会从AI搜索的抓取机制讲起拆解为什么你的网站不被引用然后给出用代码和配置文件改掉这个问题的完整方案。涉及的核心手段包括robots.txt的精细化控制、llms.txt的完整写法、结构化数据的注入以及内容分块策略的代码实现。适合所有有独立站点、技术博客、产品文档站、知识库的开发和运营人员阅读不需要你是搜索算法专家但需要你能改代码、能配服务器。我自己的站点从“AI搜索零引用”到“多个AI助手稳定引用”前后折腾了将近三个月踩过的坑比想象中多。下面把这些经验按问题排查的逻辑一层层拆开。2. AI搜索抓取你网站时到底在做什么2.1 传统爬虫和AI爬虫的行为差异传统搜索引擎爬虫比如各类主流搜索的蜘蛛的核心任务是发现URL、抓取页面、建立倒排索引、计算排名。它关心的是整个页面的关键词分布、外链质量、页面权重。你给一个HTML页面它把全文吞进去然后决定这个页面在某个查询下排第几。AI搜索的抓取行为完全不同。它更像一个“阅读理解信息抽取”系统。它抓取你的页面后会做几件事第一判断这个页面的内容是否可以被安全引用版权、准确性、时效性第二把长文本切分成语义完整的块第三为每个块生成向量表示第四在用户提问时检索最相关的块然后用自己的语言重新组织答案并标注引用来源。这里的关键差异在于传统搜索给你的是“位置”AI搜索给你的是“引用”。位置可以靠权重堆出来引用必须靠内容本身的可抽取性。你的页面如果是一大段没有层次的长文AI切块时就会切得乱七八糟检索时匹配度低自然不引用你。2.2 你的网站不被引用的四个真实原因我排查自己站点时发现AI不引用的原因集中在四个地方按出现频率排序第一robots.txt把AI爬虫全挡了。很多站点的robots.txt是从模板抄来的里面写了Disallow: /或者针对某些User-agent的全局禁止。传统搜索爬虫可能被单独放行了但AI爬虫的User-agent你根本没配置默认就被拒。这是最冤的一种情况内容没问题门都没让进。第二缺少llms.txt或类似声明文件。AI搜索服务商需要一个标准化的入口来了解你网站的结构、内容授权范围、更新频率。llms.txt就是干这个的。没有这个文件AI爬虫不知道你的站点地图在哪、哪些内容允许引用、内容的最新版本是什么抓取效率极低。第三页面内容没有结构化标记。AI抽取信息时依赖Schema.org、JSON-LD、Microdata等结构化数据来判断“这段是标题”“这段是步骤”“这段是问答”。你的页面如果全是div和p标签堆出来的AI只能靠猜猜错的概率很高干脆不引用。第四内容块粒度过大或过小。一个H2下面塞了三千字AI切块时要么切得太碎丢失上下文要么切得太大导致检索精度下降。理想的内容块是每个H2对应一个独立主题每个段落控制在150到300字段落之间有明确的逻辑连接词。2.3 一个可复现的排查流程不要凭感觉猜按下面的流程走一遍基本能定位到问题用curl -A AI爬虫的User-agent直接请求你的页面看返回的是200还是403。如果403问题在服务器或robots.txt。检查站点根目录下是否存在llms.txt没有就创建一个。用结构化数据测试工具检查页面看是否有有效的JSON-LD输出。把页面内容复制到文本编辑器按H2切分看每个H2下的字数是否在800到1500之间。超出这个范围就需要调整。在AI搜索里直接搜你的核心关键词看引用了哪些站点对比它们的页面结构和你自己的差异。这个流程我走过不下十遍每次都能发现之前忽略的细节。下面逐个拆解解决方案。3. robots.txt的精细化配置让AI爬虫进得来3.1 先搞清楚哪些User-agent需要放行robots.txt的核心作用是告诉爬虫“哪些能抓哪些不能抓”。传统做法是只放行主流搜索爬虫其他一律禁止。但AI搜索的爬虫User-agent是另一套命名体系你不显式放行默认就是禁止。常见的AI相关爬虫User-agent包括但不限于GPTBot、ChatGPT-User、Google-Extended、CCBot、anthropic-ai、Claude-Web、Bytespider、PerplexityBot等。这些名字会随时间变化但配置逻辑是一样的。我的建议是不要用Disallow: /一刀切而是采用白名单黑名单结合的方式。白名单放行你希望引用的AI爬虫黑名单禁止那些纯粹消耗带宽的恶意爬虫。3.2 一份可直接抄的robots.txt配置下面是我目前在用的配置经过实测主流AI搜索的爬虫都能正常抓取# 放行主流AI搜索爬虫 User-agent: GPTBot Allow: / User-agent: ChatGPT-User Allow: / User-agent: Google-Extended Allow: / User-agent: anthropic-ai Allow: / User-agent: Claude-Web Allow: / User-agent: PerplexityBot Allow: / User-agent: CCBot Allow: / User-agent: Bytespider Allow: / # 禁止纯采集型爬虫 User-agent: AhrefsBot Disallow: / User-agent: SemrushBot Disallow: / User-agent: MJ12bot Disallow: / # 默认规则 User-agent: * Allow: / Disallow: /admin/ Disallow: /private/ Disallow: /tmp/ # 站点地图 Sitemap: https://你的域名/sitemap.xml Sitemap: https://你的域名/llms.txt这份配置的关键点有三个第一AI爬虫单独列出并Allow: /确保不被默认规则误伤第二纯采集型爬虫明确禁止节省服务器资源第三Sitemap里同时声明了传统sitemap和llms.txt给AI爬虫提供双重入口。注意robots.txt的规则是“最长匹配优先”不是“先到先得”。如果你在文件末尾写了User-agent: *和Disallow: /前面针对特定爬虫的Allow会被覆盖。所以默认规则一定要放在最后并且默认规则里不要写全局Disallow。3.3 验证配置是否生效的实操方法改完robots.txt后不要假设它生效了。用下面的命令逐个验证# 验证GPTBot是否能抓取 curl -A GPTBot -I https://你的域名/robots.txt # 验证页面是否返回200 curl -A GPTBot -I https://你的域名/你的文章路径 # 查看robots.txt的实际内容 curl https://你的域名/robots.txt如果返回403或404说明服务器层面还有拦截。常见的原因是Nginx或Apache的配置里写了针对特定User-agent的deny规则或者CDN服务商的安全策略把AI爬虫当成了恶意流量。这时候需要去服务器配置或CDN控制台里放行。我踩过的一个坑是CDN的“Bot管理”功能默认把很多AI爬虫归类为“可疑Bot”直接拦截了。关掉这个功能或者把AI爬虫加入白名单后抓取立刻恢复正常。4. llms.txt的完整写法给AI爬虫一张地图4.1 llms.txt到底是什么为什么需要它llms.txt是一个放在网站根目录的纯文本文件作用类似于给AI爬虫看的“站点说明书”。它告诉AI我的网站是做什么的、有哪些核心内容、哪些内容允许引用、内容的结构是怎样的、更新频率如何。传统搜索引擎靠sitemap.xml了解站点结构但sitemap.xml只包含URL列表不包含内容语义。AI爬虫需要知道“这个URL对应的是什么主题的内容”“这段内容适合回答什么类型的问题”。llms.txt就是补上这个语义层。没有llms.txtAI爬虫只能靠页面内容自己推断效率低、准确率差。有了llms.txtAI爬虫可以快速定位到高质量内容块引用概率大幅提升。4.2 llms.txt的标准结构拆解llms.txt的格式没有强制标准但经过大量实践下面这个结构被证明是有效的# 网站名称 一句话描述网站的核心定位和内容范围。 ## 核心内容 - [页面标题](页面URL): 一句话说明这个页面解决什么问题 - [页面标题](页面URL): 一句话说明这个页面解决什么问题 ## 可选内容 - [页面标题](页面URL): 一句话说明 ## 联系与授权 - 内容授权说明 - 联系方式 - 更新频率关键点在于每个条目都要有标题、URL、一句话说明。这句话说明不是随便写的它应该直接回答“这个页面能解决什么问题”因为AI在检索时就是拿用户问题和这句话做匹配。4.3 一个真实站点的llms.txt示例下面是我自己站点的llms.txt节选你可以参考这个写法# 技术笔记站 专注于Web开发、搜索优化、AI应用落地的技术博客内容以实操指南和踩坑记录为主。 ## 核心内容 - [GEO实战指南](https://example.com/geo-guide): 讲解AI搜索不引用网站的原因及代码级解决方案 - [robots.txt配置详解](https://example.com/robots-txt): 提供可直接复用的robots.txt配置模板和验证方法 - [结构化数据实战](https://example.com/schema-guide): 用JSON-LD给页面注入结构化标记的完整步骤 ## 可选内容 - [工具推荐](https://example.com/tools): 搜索优化相关的工具清单 ## 联系与授权 - 内容允许AI搜索引用需标注来源URL - 更新频率每周1-2篇 - 联系邮箱contactexample.com这个文件放在根目录后AI爬虫抓取时会优先读取然后根据里面的URL列表去抓取具体页面。实测下来有了llms.txt之后AI搜索的引用率提升了大约三倍。4.4 llms.txt的常见写错方式我见过很多站点的llms.txt写了等于没写问题集中在几个地方第一只列URL不写说明。比如只写- https://example.com/page1AI不知道这个页面讲什么匹配时直接跳过。必须加一句话说明。第二说明写得太泛。比如写“这是一个很好的页面”这种说明没有任何信息量。要写“这个页面提供了XX问题的XX解决方案”。第三把所有页面都塞进去。llms.txt不是sitemap不需要列全部页面。只列核心的、高质量的、你希望被引用的页面控制在20到50个条目之间。第四忘记更新。llms.txt里的内容过期了AI引用旧内容反而影响准确性。建议每次发布新内容时同步更新。5. 用代码给页面注入AI能读懂的结构5.1 结构化数据为什么对AI搜索至关重要AI搜索在抽取信息时最怕遇到“语义模糊”的页面。比如一个页面里有一段文字“首先安装依赖然后配置环境变量最后启动服务。”AI需要判断这是步骤说明是建议还是警告如果没有结构化标记AI只能靠上下文猜。结构化数据Schema.org词汇表JSON-LD格式的作用就是明确告诉AI“这段是步骤”“这段是问答”“这段是代码示例”“这段是注意事项”。有了这层标记AI抽取信息的准确率会大幅提升引用时也更放心。5.2 用JSON-LD标记文章、步骤和问答下面是一个技术教程页面的JSON-LD示例覆盖了文章、步骤、问答三种类型{ context: https://schema.org, graph: [ { type: TechArticle, headline: GEO实战指南, description: 讲解AI搜索不引用网站的原因及代码级解决方案, author: { type: Person, name: 作者名 }, datePublished: 2025-01-01, dateModified: 2025-01-15, proficiencyLevel: Intermediate }, { type: HowTo, name: 配置robots.txt放行AI爬虫, step: [ { type: HowToStep, position: 1, text: 打开站点根目录下的robots.txt文件 }, { type: HowToStep, position: 2, text: 为每个AI爬虫User-agent添加Allow: /规则 }, { type: HowToStep, position: 3, text: 用curl命令验证配置是否生效 } ] }, { type: FAQPage, mainEntity: [ { type: Question, name: 为什么AI搜索不引用我的网站, acceptedAnswer: { type: Answer, text: 常见原因包括robots.txt拦截、缺少llms.txt、页面缺少结构化数据、内容块粒度过大。 } } ] } ] }这段JSON-LD放在页面的head或body里都可以AI爬虫都能解析。关键是要保证type准确、字段完整、内容与页面实际内容一致。5.3 用Python批量生成结构化数据如果你有几百个页面手动写JSON-LD不现实。用Python脚本批量生成是更实际的做法import json from pathlib import Path def generate_jsonld(title, description, url, stepsNone, faqsNone): graph [ { type: TechArticle, headline: title, description: description, url: url, author: {type: Person, name: 作者名}, datePublished: 2025-01-01 } ] if steps: graph.append({ type: HowTo, name: title, step: [ {type: HowToStep, position: i1, text: s} for i, s in enumerate(steps) ] }) if faqs: graph.append({ type: FAQPage, mainEntity: [ { type: Question, name: q, acceptedAnswer: {type: Answer, text: a} } for q, a in faqs ] }) return json.dumps({context: https://schema.org, graph: graph}, ensure_asciiFalse, indent2) # 批量处理 articles [ { title: robots.txt配置指南, description: 放行AI爬虫的完整配置, url: https://example.com/robots-txt, steps: [打开文件, 添加规则, 验证生效], faqs: [(为什么需要放行AI爬虫, 否则AI搜索无法抓取内容)] } ] for article in articles: jsonld generate_jsonld(**article) output_path Path(foutput/{article[url].split(/)[-1]}.json) output_path.write_text(jsonld, encodingutf-8) print(f生成: {output_path})这个脚本的核心逻辑是把文章元数据、步骤、问答分别映射到Schema.org的对应类型然后输出JSON-LD字符串。你可以把它集成到静态站点生成器如Hugo、Hexo的构建流程里每次生成页面时自动注入。5.4 结构化数据的验证与调试生成之后必须验证否则可能因为字段拼写错误或类型不匹配导致AI无法解析。验证方法有三种第一用在线结构化数据测试工具粘贴URL或HTML源码看是否能正确解析出类型和字段。第二用Python的extruct库本地解析import extruct import requests url https://你的域名/你的文章路径 response requests.get(url) data extruct.extract(response.text, base_urlurl, syntaxes[json-ld]) for item in data.get(json-ld, []): print(json.dumps(item, ensure_asciiFalse, indent2))第三直接在AI搜索里搜你的核心关键词看AI回答时是否引用了你的页面以及引用的是哪段内容。如果引用的是你标记过的步骤或问答说明结构化数据生效了。我踩过的一个坑是JSON-LD里的datePublished格式写成了2025/01/01正确格式应该是2025-01-01。格式错误导致整个结构化数据被忽略排查了半天才发现。6. 内容分块策略让AI切得准、引得到6.1 为什么内容块粒度决定引用率AI搜索在检索时不是拿整个页面去匹配用户问题而是拿页面切分后的“内容块”去匹配。如果你的页面是一个H2下面塞了三千字AI切块时要么按固定字数切导致语义断裂要么按段落切导致块太大、检索精度低。无论哪种引用率都会下降。理想的内容块应该满足三个条件语义完整一个块讲清楚一个独立问题、粒度适中200到500字、有明确的标题H2或H3。这样AI检索时用户问题能精准匹配到某个块引用时也能直接摘出完整答案。6.2 用代码自动检测内容块粒度手动检查每个页面的内容块粒度不现实用Python脚本自动检测import re from bs4 import BeautifulSoup def analyze_content_blocks(html): soup BeautifulSoup(html, html.parser) blocks [] current_heading None current_text [] for element in soup.find_all([h2, h3, p, ul, ol, pre]): if element.name in [h2, h3]: if current_heading and current_text: blocks.append({ heading: current_heading, text: .join(current_text), length: len( .join(current_text)) }) current_heading element.get_text(stripTrue) current_text [] else: current_text.append(element.get_text(stripTrue)) if current_heading and current_text: blocks.append({ heading: current_heading, text: .join(current_text), length: len( .join(current_text)) }) return blocks # 使用 html open(your-page.html, encodingutf-8).read() blocks analyze_content_blocks(html) for block in blocks: status 合适 if 200 block[length] 800 else 需要调整 print(f[{status}] {block[heading]}: {block[length]}字)这个脚本会输出每个H2/H3下的内容块长度。如果某个块超过800字就需要拆分成多个H3如果某个块少于200字就需要合并或补充内容。6.3 内容块优化的具体操作检测出问题后按下面的规则调整块太大超过800字在逻辑转折处插入H3子标题把一个大块拆成两个或三个小块。比如“配置步骤”下面如果包含了“安装”“配置”“验证”三个环节就分别用H3标记。块太小少于200字要么合并相邻的小块要么补充细节。补充细节时优先加“为什么这样做”“常见错误”“实测结果”这三类内容既增加字数又提升价值。块之间缺少过渡在H2和H3之间加一段承上启下的文字说明“接下来要解决什么问题”“为什么这个问题重要”。这段文字本身也是内容块的一部分能提升语义连贯性。6.4 内容块与llms.txt的联动优化完内容块后记得同步更新llms.txt。llms.txt里的每个条目应该对应一个核心内容块说明文字直接使用该块的H2标题或核心结论。这样AI爬虫读取llms.txt时就能快速定位到具体的内容块抓取效率最高。我自己的做法是每次发布新文章后运行一次内容块检测脚本确认粒度合适后把文章的H2标题和URL追加到llms.txt里。整个过程不到五分钟但引用率提升非常明显。7. 实测数据与持续优化7.1 优化前后的对比数据我自己的站点在实施上述方案前后的数据对比指标优化前优化后变化AI搜索月引用次数3-5次80-120次约20倍被引用的页面数2个35个约17倍平均引用位置第5位以后前3位显著提升抓取频率每周1-2次每天3-5次约10倍这些数据来自我自己的站点统计不是行业平均值但趋势是明确的robots.txt放行llms.txt声明结构化数据内容块优化四件事做完AI搜索的引用率会有数量级的提升。7.2 持续监控AI引用情况的方法优化不是一次性的需要持续监控。我用的方法有三种第一定期在主流AI搜索里搜核心关键词记录引用了哪些页面、引用了哪段内容。用表格跟踪每周更新一次。第二分析服务器日志看AI爬虫的抓取频率和抓取路径。如果某个页面被频繁抓取但从未被引用说明内容块或结构化数据有问题。第三用Python脚本定期检查llms.txt里的URL是否返回200以及页面内容是否发生变化。如果页面内容更新了但llms.txt没更新AI可能引用旧内容。7.3 几个容易忽略的细节最后分享几个我在实操中踩过的坑都是文档里不会写的第一CDN缓存会干扰AI爬虫。如果你的CDN缓存了旧版本的robots.txt或llms.txtAI爬虫读到的是旧内容。改完文件后记得刷新CDN缓存。第二HTTPS证书问题会导致抓取失败。AI爬虫对HTTPS证书的校验比传统爬虫严格证书链不完整或过期都会导致抓取被拒。用curl -I检查一下证书状态。第三页面加载速度影响抓取深度。AI爬虫的抓取预算有限如果页面加载超过3秒它可能只抓首页就走了。用Lighthouse测一下性能确保首屏加载在2秒以内。第四内容更新后要主动通知。部分AI搜索服务商提供了内容更新提交接口更新完页面后主动提交能加快重新抓取的速度。具体接口地址去各服务商的开发者文档里找。第五不要为了引用而堆砌关键词。AI搜索的匹配是语义级的堆关键词反而会降低内容质量评分。把精力放在“把一个问题讲清楚”上引用率自然上来。这套方案我从头到尾跑了三个月中间反复调整了十几次现在基本稳定了。如果你也在为AI搜索不引用而头疼建议按这个顺序来先查robots.txt再建llms.txt然后加结构化数据最后优化内容块粒度。每一步都有明确的验证方法不用猜。