<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>DevNotes</title>
  
  <subtitle>AI 周边实践笔记</subtitle>
  <link href="https://devnotes.cuiyuehui.cn/atom.xml" rel="self"/>
  
  <link href="https://devnotes.cuiyuehui.cn/"/>
  <updated>2026-09-17T09:00:00.000Z</updated>
  <id>https://devnotes.cuiyuehui.cn/</id>
  
  <author>
    <name>五五班班长</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>内容被 AI 改写后传播，该如何处理</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/content-rewritten-by-ai/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/content-rewritten-by-ai/</id>
    <published>2026-09-17T09:00:00.000Z</published>
    <updated>2026-09-17T09:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：先分清三种情况——<strong>有出处的引用</strong>（想要的结果）、<strong>无出处的改写</strong>（最常见，也是最难处理的）、<strong>整篇搬运</strong>（可以投诉）。三种情况的目标不同：引用要争取更多，改写要靠溯源能力化解，搬运才需要动用投诉渠道。<strong>与其防止被抄，不如让愿意查证的人能轻松找到源头。</strong></p><span id="more"></span><h2 id="三种情况要分开看"><a href="#三种情况要分开看" class="headerlink" title="三种情况要分开看"></a>三种情况要分开看</h2><p>很多人把这几件事混在一起，于是处理方式也就不对了。先分类：</p><div class="md-table-scroll"><table><thead><tr><th>情况</th><th>表现</th><th>合理目标</th></tr></thead><tbody><tr><td>有出处的引用</td><td>答案里标注了你的站点或作者</td><td>争取更多，属于正向结果</td></tr><tr><td>无出处的改写</td><td>观点、结构、数据出现在别处，但没有署名</td><td>让溯源变容易，降低洗稿收益</td></tr><tr><td>整篇搬运</td><td>全文复制到其他站点</td><td>走投诉渠道，同时做技术标记</td></tr></tbody></table></div><p><strong>第一种是你想要的</strong>，所以别把它和侵权混为一谈——有人因为 AI 回答里的引用而找到你，这是引用的价值所在。</p><h2 id="无出处的改写为什么最难处理"><a href="#无出处的改写为什么最难处理" class="headerlink" title="无出处的改写为什么最难处理"></a>无出处的改写为什么最难处理</h2><p>这是最常见的形态：内容被重新组织、换了措辞，观点和结论还是你的，但没有任何指向你的线索。</p><p>它的特点是：</p><ul><li><strong>难以举证</strong>：改写过后的文字不构成逐字复制</li><li><strong>数量庞大</strong>：可能是模型生成的答案，也可能是其他站点二次加工</li><li><strong>无处投诉</strong>：内容可能出现在你无法触达的渠道里</li></ul><p>在这种情况下，<strong>追求"阻止它发生"是不现实的，能改变的是"它发生后别人能否找到你"。</strong></p><h2 id="让溯源变容易，比防止被抄有效"><a href="#让溯源变容易，比防止被抄有效" class="headerlink" title="让溯源变容易，比防止被抄有效"></a>让溯源变容易，比防止被抄有效</h2><p>核心思路是：<strong>当有人看到被改写的内容、想确认原始出处时，能不能顺利找到你。</strong></p><p>能做到这一点的内容，即使被大量改写，也会有一部分读者最终回流到源头。具体可以做四件事：</p><div class="md-table-scroll"><table><thead><tr><th>做法</th><th>作用</th></tr></thead><tbody><tr><td>结构化数据声明作者与站点</td><td>让模型在引用时能拿到归属信息</td></tr><tr><td>建立作者页，集中说明身份与方向</td><td>给"这是谁写的"一个可验证的落点</td></tr><tr><td>在文末加固定署名与出处提示</td><td>被摘录时有机会带上一行来源</td></tr><tr><td>发布 <code>llms.txt</code> 声明站点内容导览</td><td>向模型明确站点结构与主要文章</td></tr></tbody></table></div><p>前三项的做法分别见<a href="/posts/structured-data-for-geo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《结构化数据怎么做才对 GEO 有用》</a>与<a href="/posts/llms-txt-guide/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《llms.txt 完全指南》</a>。</p><p>**一个反直觉但重要的判断：被改写传播本身不完全是坏事。**它意味着你的观点进入了更大的流通范围。真正让你损失的是"流通了但没人知道是你"——所以重点在于降低这种匿名流通的比例。</p><h2 id="许可声明要说清楚，但别指望它能拦住谁"><a href="#许可声明要说清楚，但别指望它能拦住谁" class="headerlink" title="许可声明要说清楚，但别指望它能拦住谁"></a>许可声明要说清楚，但别指望它能拦住谁</h2><p>在页脚或文章末尾声明许可方式（比如 CC BY-NC-SA、或"转载请注明出处"）是标准做法：</p><ul><li>它<strong>能</strong>让愿意遵守规则的人明确知道该怎么做</li><li>它<strong>不能</strong>拦住不打算遵守的人</li></ul><p>所以值得写，但不要把它当成保护手段。<strong>声明的真正价值在于降低"善意使用者"的犯错概率</strong>，而不是威慑恶意搬运。</p><h2 id="现实中的边界，要提前知道"><a href="#现实中的边界，要提前知道" class="headerlink" title="现实中的边界，要提前知道"></a>现实中的边界，要提前知道</h2><p>这一部分需要诚实说明，避免预期错位：</p><ul><li><strong>识别与举证成本高</strong>：改写后的内容很难自动匹配到原文，靠人力搜索覆盖面有限</li><li><strong>跨平台投诉效率不一</strong>：不同渠道的处理速度与标准差别很大</li><li><strong>法律途径成本高</strong>：适合处理影响大、证据明确的个案，不适合日常纠纷</li><li><strong>AI 生成的答案无处投诉</strong>：模型输出不是可投诉的对象，能做的只有影响它的检索来源</li></ul><p>**结论是：把主要精力放在"可被溯源"，而不是"追究责任"。**涉及严重侵权、商业损失的情况，建议咨询专业人士，而不是自己耗在投诉流程里。</p><h2 id="一个更实际的判断标准"><a href="#一个更实际的判断标准" class="headerlink" title="一个更实际的判断标准"></a>一个更实际的判断标准</h2><p>遇到内容被改写传播时，先问自己一个问题：</p><blockquote><p><strong>读者如果想核实这段话，能不能在三步之内找到我？</strong></p></blockquote><p>如果答案是"能"，那这件事的危害有限。如果答案是"不能"，那么真正要修的是溯源链路，而不是去追那一个改写者。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="被-AI-回答引用但没给链接，算侵权吗？"><a href="#被-AI-回答引用但没给链接，算侵权吗？" class="headerlink" title="被 AI 回答引用但没给链接，算侵权吗？"></a>被 AI 回答引用但没给链接，算侵权吗？</h3><p>通常不算，但也没达到你想要的效果。**模型提到你的观点却不给出处，属于"提及"，价值低于"引用"。**能改善的方向是让归属信息更容易被读取——结构化数据和作者页就是为此服务的。</p><h3 id="要不要用技术手段禁止内容被采集？"><a href="#要不要用技术手段禁止内容被采集？" class="headerlink" title="要不要用技术手段禁止内容被采集？"></a>要不要用技术手段禁止内容被采集？</h3><p>代价通常高于收益。加固反爬、限制访问会影响正常读者和搜索引擎，而这些渠道恰恰是引用的来源。<strong>除非内容本身有商业独占要求，否则不建议以牺牲可抓取性为代价做防护。</strong></p><h3 id="需要给每篇文章加水印或指纹吗？"><a href="#需要给每篇文章加水印或指纹吗？" class="headerlink" title="需要给每篇文章加水印或指纹吗？"></a>需要给每篇文章加水印或指纹吗？</h3><p>可以有，但要理解它的作用边界：水印能帮助<strong>事后举证</strong>，不能阻止改写。对大多数内容站点来说，把同样的精力用在结构化数据与作者页上，实际收益更直接。</p><h3 id="读者把内容转发到别的平台，要处理吗？"><a href="#读者把内容转发到别的平台，要处理吗？" class="headerlink" title="读者把内容转发到别的平台，要处理吗？"></a>读者把内容转发到别的平台，要处理吗？</h3><p>转发通常有利于传播，只要不冒充原创、不篡改结论，一般不必处理。<strong>可以提前在文末写清转载规则</strong>，让愿意遵守的人有章可循，比事后沟通省事。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>分清引用、改写、搬运三种情况，它们的目标完全不同。</li><li>有出处的引用是正向结果，不要和侵权混为一谈。</li><li>无出处改写难以追责，能改变的是让溯源更简单。</li><li>四项措施：结构化数据、作者页、文末署名、<code>llms.txt</code>。</li><li>判断标准：读者想在三步之内核实一段话，能不能找到你。</li></ul><p>如果对这些概念的来龙去脉还不熟，建议先看<a href="/posts/what-is-geo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《什么是 GEO》</a>。</p><hr><p>如果你遇到过内容被改写传播的情况，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>说说你是怎么处理的，这类经验对其他人很有参考价值。</p>]]></content>
    
    
    <summary type="html">把&quot;被 AI 用了&quot;分成三种情况：有出处的引用、无出处的改写、整篇搬运。三种情况的目标完全不同，处理方式也不同。重点讲怎么让溯源变容易，以及哪些事其实做不到。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="内容写作" scheme="https://devnotes.cuiyuehui.cn/tags/%E5%86%85%E5%AE%B9%E5%86%99%E4%BD%9C/"/>
    
    <category term="版权" scheme="https://devnotes.cuiyuehui.cn/tags/%E7%89%88%E6%9D%83/"/>
    
    <category term="AI 引用" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E5%BC%95%E7%94%A8/"/>
    
  </entry>
  
  <entry>
    <title>中文内容在 AI 搜索里的表现比英文差吗</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/chinese-content-ai-search/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/chinese-content-ai-search/</id>
    <published>2026-09-17T08:30:00.000Z</published>
    <updated>2026-09-17T08:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：不是笼统的"差"，而是三个具体差异在起作用——<strong>中文优质内容更多被关在禁止抓取的平台里、中文检索依赖分词且术语变体更多、训练语料里中文占比更低</strong>。前两项有明显的应对办法，第三项超出个人能改变的范围，但它不是决定性的。</p><span id="more"></span><h2 id="差异一：大量中文内容根本不在可抓取范围里"><a href="#差异一：大量中文内容根本不在可抓取范围里" class="headerlink" title="差异一：大量中文内容根本不在可抓取范围里"></a>差异一：大量中文内容根本不在可抓取范围里</h2><p>这是三个差异中<strong>最容易被忽略、也最容易验证</strong>的一个。</p><p>中文互联网的优质内容很大一部分沉淀在需要登录或明确禁止抓取的产品里。实测几个平台的 <code>robots.txt</code>（2026 年 9 月 17 日）：</p><div class="md-table-scroll"><table><thead><tr><th>平台</th><th>抓取策略</th></tr></thead><tbody><tr><td>知乎</td><td>通配组基本 <code>Disallow: /</code>，并单独声明 <code>Google-Extended</code> 禁止</td></tr><tr><td>微信公众号</td><td>通配组仅放行少数路径，其余 <code>Disallow: /</code></td></tr><tr><td>CSDN、博客园、掘金、简书</td><td>允许抓取</td></tr></tbody></table></div><p>对比英文互联网：个人站点和独立博客是主流形态，绝大多数默认允许抓取。<strong>所以中文内容"表现差"的第一层原因不是质量问题，而是可检索的供给量本来就少。</strong></p><p><strong>这一项恰恰是个人可以改变的</strong>：把内容放在自有域名上，而不是只沉淀在禁止抓取的平台里。平台策略的完整实测见<a href="/posts/which-platform-ai-cites-most/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《博客、公众号、知乎，哪个更容易被 AI 引用》</a>。</p><h2 id="差异二：中文检索对术语一致性更敏感"><a href="#差异二：中文检索对术语一致性更敏感" class="headerlink" title="差异二：中文检索对术语一致性更敏感"></a>差异二：中文检索对术语一致性更敏感</h2><p>检索系统处理英文时按词切分，处理中文时要先分词——<strong>这一步会放大术语变体带来的损耗。</strong></p><p>英文里"GEO"和"generative engine optimization"是两个明确的字符串；中文里同一个概念可能是：</p><ul><li>GEO</li><li>生成式引擎优化</li><li>生成式引擎优化（GEO）</li><li>AI 搜索优化</li><li>大模型优化</li></ul><p>不同作者各用各的写法，读者的提问又是第六种说法。<strong>分词之后，这些变体之间并不天然等价</strong>，命中率因此下降。</p><p>还有一层：中文没有空格，切分歧义更多。"生成式引擎优化"可能被切成"生成/式/引擎/优化"或"生成式/引擎/优化"，不同切法对应的语义略有差别。</p><p><strong>可执行的对策有两条：</strong></p><ol><li><strong>标题用最主流的叫法</strong>，正文第一段补上括注的同义解释。比如"GEO（生成式引擎优化，也叫 AI 搜索优化）"。</li><li><strong>在整篇文章里保持术语统一</strong>，不要同义词交替使用。同义词对读者友好，对检索不友好。</li></ol><h2 id="差异三：语料分布确实不均衡，但它不是决定因素"><a href="#差异三：语料分布确实不均衡，但它不是决定因素" class="headerlink" title="差异三：语料分布确实不均衡，但它不是决定因素"></a>差异三：语料分布确实不均衡，但它不是决定因素</h2><p>训练语料里英文占比高于中文，这是公开可观察的事实。<strong>但我没有可靠的中文占比统计数据，所以不在这里给具体数字</strong>——网上流传的比例多有引用错误，不适合当作依据。</p><p>需要理解的是这个差异的实际影响边界：</p><ul><li>它影响的是<strong>模型对中文内容的"熟悉度"</strong>，以及某些领域中文资料是否足够</li><li>它<strong>不影响</strong>你的内容能否被检索、能否被切分、能否被归属</li><li>引用发生在检索环节，决定因素是内容与问题的匹配度，而不是语言的先天权重</li></ul><p>换句话说：**语料分布是背景条件，不是你能操作的变量。**把注意力放在能改变的部分更实际。</p><h2 id="三个差异里，你能改变两个"><a href="#三个差异里，你能改变两个" class="headerlink" title="三个差异里，你能改变两个"></a>三个差异里，你能改变两个</h2><p>把三件事分开看，优先级就清楚了：</p><div class="md-table-scroll"><table><thead><tr><th>差异</th><th>能改变吗</th><th>怎么做</th></tr></thead><tbody><tr><td>平台禁止抓取</td><td>✅ 可以</td><td>内容放在自有域名，平台只做分发</td></tr><tr><td>术语变体多</td><td>✅ 可以</td><td>标题用主流叫法，正文补同义解释并保持统一</td></tr><tr><td>语料分布不均</td><td>❌ 不能</td><td>作为背景接受，不据此调整策略</td></tr></tbody></table></div><p>**结论是：中文内容做 GEO 的可行空间并没有想象中那么小。**真正的瓶颈通常在第一项——内容放错了地方。</p><h2 id="怎么验证自己的情况"><a href="#怎么验证自己的情况" class="headerlink" title="怎么验证自己的情况"></a>怎么验证自己的情况</h2><p>与其相信概括性结论，不如测自己的题材。方法很简单：</p><ol><li>选 5 个你关心的真实问题</li><li>每个问题准备中英文两个版本</li><li>在 3 到 4 个平台各问一遍，记录<strong>是否引用、引用了哪个来源、来源是中文还是英文</strong></li><li>两周后重复一次</li></ol><p>这样得到的是<strong>你自己领域里的实际差异</strong>，比任何通用结论都有参考价值。记录方式可以沿用<a href="/posts/measure-geo-results/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《怎么衡量 GEO 有没有效果》</a>里的采样表。</p><p>一个常见的实测结果是：<strong>技术类问题里，英文来源的引用占比确实更高；但如果中文侧存在结构清晰、术语统一的独立站点内容，被引用的概率会明显高于平台内容。</strong></p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="中文站点是不是应该改成英文？"><a href="#中文站点是不是应该改成英文？" class="headerlink" title="中文站点是不是应该改成英文？"></a>中文站点是不是应该改成英文？</h3><p>不建议。语言选择应该由读者决定，而不是由检索偏好决定——**你的内容是写给谁看的，比它能不能被某个模型引用更重要。**中英双版本是可行方案，但要确保两个版本各自完整、不要互相稀释。</p><h3 id="中文术语一定要用英文缩写吗？"><a href="#中文术语一定要用英文缩写吗？" class="headerlink" title="中文术语一定要用英文缩写吗？"></a>中文术语一定要用英文缩写吗？</h3><p>建议中英并列而不是只写缩写。首次出现时写"GEO（生成式引擎优化）"，之后统一用其中一个。<strong>读者里既有搜英文缩写的，也有搜中文全称的，两者都覆盖到最稳妥。</strong></p><h3 id="把内容翻译成英文发布，会有额外收益吗？"><a href="#把内容翻译成英文发布，会有额外收益吗？" class="headerlink" title="把内容翻译成英文发布，会有额外收益吗？"></a>把内容翻译成英文发布，会有额外收益吗？</h3><p>可能有，但要权衡成本。翻译版本要能被正确归属、要指向原作者、地址要稳定，否则容易被当成重复内容。<strong>如果精力有限，把中文内容的质量和结构做好，收益通常高于多语言扩张。</strong></p><h3 id="中文内容要多久才能看到引用？"><a href="#中文内容要多久才能看到引用？" class="headerlink" title="中文内容要多久才能看到引用？"></a>中文内容要多久才能看到引用？</h3><p>与新站被引用的周期一致，通常是被正常抓取之后的两周到几个月。语言本身不会显著拉长这个周期，<strong>决定因素仍然是抓取、索引与内容增量。</strong></p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>中文内容的劣势可以拆成三个具体差异，而不是一个笼统印象。</li><li>最大的一项差异是可抓取供给少——大量优质内容被关在禁止抓取的平台里。</li><li>中文检索依赖分词，术语保持统一能明显降低损耗。</li><li>语料分布不均属于背景条件，不可控，也不该成为放弃的理由。</li><li>三个差异里有两个可以自己改变，先做这两件。</li></ul><p>想从整体上理解这套机制，可以从<a href="/posts/what-is-geo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《什么是 GEO》</a>读起。</p><hr><p>如果你测过中英文内容在你领域里的引用差异，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>分享结果，这类样本目前很缺。</p>]]></content>
    
    
    <summary type="html">把&quot;中文内容吃亏&quot;这个模糊感受拆成三个可以验证的具体差异：可抓取比例、检索分词方式、语料分布。其中第一项恰恰是个人能改变的，并给出同一问题中英文对比的采样方法。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="AI 搜索" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E6%90%9C%E7%B4%A2/"/>
    
    <category term="中文" scheme="https://devnotes.cuiyuehui.cn/tags/%E4%B8%AD%E6%96%87/"/>
    
    <category term="抓取" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%8A%93%E5%8F%96/"/>
    
  </entry>
  
  <entry>
    <title>小团队做 GEO 的第一个月该做什么</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/geo-first-month/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/geo-first-month/</id>
    <published>2026-09-17T08:00:00.000Z</published>
    <updated>2026-09-17T08:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：第一个月的目标不是"提升引用率"，而是<strong>把链路打通并留下一个可对比的基线</strong>。四周分别是：确认抓取与索引、改造内容结构、补齐信任信号、建立采样机制。做完这四件事，你才知道后面该往哪里使劲。</p><span id="more"></span><h2 id="为什么第一个月不要盯着引用率"><a href="#为什么第一个月不要盯着引用率" class="headerlink" title="为什么第一个月不要盯着引用率"></a>为什么第一个月不要盯着引用率</h2><p>引用率的反馈周期是几周到几个月。<strong>如果第一个月就拿它当指标，你会得到一堆噪声，然后开始乱改。</strong></p><p>这一个月真正要拿到的是两样东西：</p><ul><li>一条确认畅通的链路（抓得到、进得了索引、切得出片段）</li><li>一份基线数据（现在被引用了几次、哪些问题命中）</li></ul><p>有了基线，之后的每一点变化才有参照。</p><h2 id="第一周：确认抓取与索引是通的"><a href="#第一周：确认抓取与索引是通的" class="headerlink" title="第一周：确认抓取与索引是通的"></a>第一周：确认抓取与索引是通的</h2><p>这一周不做内容，只做检查。<strong>因为后面所有工作都建立在这条链路之上。</strong></p><div class="md-table-scroll"><table><thead><tr><th>动作</th><th>通过标准</th></tr></thead><tbody><tr><td>用爬虫 UA 请求首页与两篇文章</td><td>全部返回 200 且含正文</td></tr><tr><td>查服务器日志里的 AI 爬虫</td><td>最近两周有访问记录</td></tr><tr><td>确认 <code>robots.txt</code> 放行检索类爬虫</td><td>没有通配 <code>Disallow: /</code></td></tr><tr><td>提交 <code>sitemap.xml</code></td><td>提交成功，抓取量有变化</td></tr><tr><td>搜 <code>site:你的域名</code></td><td>主要页面已被收录</td></tr></tbody></table></div><p>如果日志里从来没有出现过 AI 爬虫，先解决这一层，别急着写新内容。具体排查顺序见<a href="/posts/why-ai-never-cites-my-site/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《为什么 AI 从来不提我的网站》</a>。</p><h2 id="第二周：把内容结构改成-可切分-的"><a href="#第二周：把内容结构改成-可切分-的" class="headerlink" title="第二周：把内容结构改成&quot;可切分&quot;的"></a>第二周：把内容结构改成"可切分"的</h2><p>这一周做改造，不写新内容——<strong>优先改那些已经有人访问、主题明确的旧文章。</strong></p><p>四个动作，按重要性排序：</p><ol><li><strong>每篇文章开头加一句"直接回答"</strong>。把最核心的结论压缩成两三句放在最前面，这是最容易被摘取的片段。</li><li><strong>把 <code>h2</code> 改成判断句</strong>。片段脱离上下文时，标题是它唯一的语义锚点。对比一下："优化建议"和"标题用主流叫法，正文补同义解释"。</li><li><strong>单节控制在 200 到 500 字</strong>，超过就拆。切分粒度太粗会让片段语义混杂。</li><li><strong>补齐 FAQ 小节</strong>。用 <code>### 问题</code> 加一段答案的形式，写成真实会被问到的问题。</li></ol><p><strong>验收标准很简单</strong>：随便挑一节单独摘出来，看它能不能不依赖上下文独立成立。</p><h2 id="第三周：补上信任信号"><a href="#第三周：补上信任信号" class="headerlink" title="第三周：补上信任信号"></a>第三周：补上信任信号</h2><p>模型在挑选来源时会判断可信度。<strong>这一周补的是"这段内容由谁负责"的信息。</strong></p><ul><li>写一个真实的<strong>作者页</strong>：在做什么、关注什么方向，不要写成简历</li><li>给文章加<strong>结构化数据</strong>，至少要有 <code>BlogPosting</code> 和作者信息</li><li>统一全站的<strong>站点名、简介、头像</strong>，各平台说法保持一致</li><li>检查每个页面<strong>能否明确看出所属站点</strong></li></ul><p>结构化数据的落地方式见<a href="/posts/structured-data-for-geo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《结构化数据怎么做才对 GEO 有用》</a>，加完不生效的排查见<a href="/posts/structured-data-not-working/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《结构化数据加了但没效果？先检查这四处》</a>。</p><h2 id="第四周：建立采样机制，留下基线"><a href="#第四周：建立采样机制，留下基线" class="headerlink" title="第四周：建立采样机制，留下基线"></a>第四周：建立采样机制，留下基线</h2><p>最后一周不做优化，做<strong>度量</strong>。没有基线，后面所有判断都是感觉。</p><p>具体做法：</p><ol><li>准备 20 到 30 个<strong>真实用户会问的问题</strong>，覆盖三层：品牌类（"某某是谁"）、主题类（"什么是 GEO"）、长尾类（"小网站值得做吗"）</li><li>在 4 到 5 个平台各问一遍：ChatGPT、Perplexity、豆包、元宝、Kimi</li><li>记录三列信息：<strong>是否被引用、是否被提及、引用的是哪一篇</strong></li><li>之后每两周重复一次，<strong>看趋势不看单点</strong></li></ol><p>指标设计可以参考<a href="/posts/measure-geo-results/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《怎么衡量 GEO 有没有效果》</a>。<strong>第一轮记录下来的就是基线</strong>，它的价值在第两次采样之后才显现。</p><h2 id="第一个月不要做的三件事"><a href="#第一个月不要做的三件事" class="headerlink" title="第一个月不要做的三件事"></a>第一个月不要做的三件事</h2><p>**不要为了"优化"改 URL 结构。**地址变动的代价是几周内的引用失效，而结构调整带来的收益远小于这个损失。</p><p>**不要批量生成内容。**一个月产出几十篇同质文章，只会稀释站点的整体可信度。四到八篇有信息增量的内容，效果更好。</p><p>**不要只看流量。**AI 引用带来的很大一部分是零点击曝光——用户在答案里看到了你的名字就离开了，这不会出现在流量统计里。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="一个月能看到效果吗？"><a href="#一个月能看到效果吗？" class="headerlink" title="一个月能看到效果吗？"></a>一个月能看到效果吗？</h3><p>看不到引用率明显上升是正常的，反馈周期通常要两三个月。第一个月的产出是<strong>确认链路通畅</strong>和<strong>拿到基线数据</strong>，这两件事决定了后面几个月有没有优化空间。</p><h3 id="没有技术人员能做吗？"><a href="#没有技术人员能做吗？" class="headerlink" title="没有技术人员能做吗？"></a>没有技术人员能做吗？</h3><p>可以。第一周和第四周主要是检查与记录，第二周和第三周是写内容与填信息，都不需要写代码。唯一涉及配置的是结构化数据，静态博客和主流 CMS 都有现成的插件或模板可用。</p><h3 id="需要买监测工具吗？"><a href="#需要买监测工具吗？" class="headerlink" title="需要买监测工具吗？"></a>需要买监测工具吗？</h3><p>第一个月不需要。手动在四五个平台采样 20 多个问题，半小时能完成一轮，信息量比工具生成的报告更贴合你的实际情况。等采样变成负担了，再考虑自动化——本站的监测模块就是这么演变来的，见<a href="/posts/geo-platform-visibility-monitor/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《自建 GEO 平台的收录监测模块》</a>。</p><h3 id="团队里应该由谁负责这件事？"><a href="#团队里应该由谁负责这件事？" class="headerlink" title="团队里应该由谁负责这件事？"></a>团队里应该由谁负责这件事？</h3><p>第一个月建议由<strong>一个人统筹</strong>，避免职责分散导致没人真正推进。内容结构改造需要写作者参与，抓取与索引的检查需要能接触服务器或站点后台的人。两边沟通成本不高，但必须有明确的负责人。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>第一个月的目标是打通链路加上拿到基线，不是提升引用率。</li><li>第一周查抓取与索引，问题在这一层时后面都白做。</li><li>第二周改造旧文章的结构，比写新内容见效更快。</li><li>第三周补作者页与结构化数据，解决"由谁负责"的问题。</li><li>第四周建立 20 条问题集与双周采样，后续所有判断都依赖这份基线。</li></ul><hr><p>如果你正准备开始，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>说说你的站点类型和现状，可以一起看看第一个月该从哪一步入手。</p>]]></content>
    
    
    <summary type="html">把第一个月拆成四周：确认抓取与索引、改内容结构、补信任信号、建立采样基线。每周都有明确的动作和验收标准，不依赖任何付费工具。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="内容写作" scheme="https://devnotes.cuiyuehui.cn/tags/%E5%86%85%E5%AE%B9%E5%86%99%E4%BD%9C/"/>
    
    <category term="行动指南" scheme="https://devnotes.cuiyuehui.cn/tags/%E8%A1%8C%E5%8A%A8%E6%8C%87%E5%8D%97/"/>
    
    <category term="排查" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%8E%92%E6%9F%A5/"/>
    
  </entry>
  
  <entry>
    <title>用 AI 写的内容，能不能被 AI 引用</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/ai-written-content-cited/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/ai-written-content-cited/</id>
    <published>2026-09-17T07:30:00.000Z</published>
    <updated>2026-09-17T07:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：能被引用。**模型不关心内容是人写的还是 AI 写的，它关心的是这段内容有没有别处拿不到的可用信息。**所以真正的问题不是"用了 AI"，而是内容同质化——当同一套观点在每个站点都以相似措辞出现时，任何一篇都不再是必要的引用来源。</p><span id="more"></span><h2 id="模型不会去检测-这段是不是-AI-写的"><a href="#模型不会去检测-这段是不是-AI-写的" class="headerlink" title="模型不会去检测&quot;这段是不是 AI 写的&quot;"></a>模型不会去检测"这段是不是 AI 写的"</h2><p>先澄清一个常见误解：<strong>AI 搜索在挑选引用来源时，并不执行"AI 内容检测"这一步。</strong></p><p>它做的事情可以概括成三件：</p><ol><li>这段内容是否<strong>回答了当前问题</strong></li><li>这段内容<strong>是否可靠</strong>（有没有来源、作者、上下文）</li><li>这段内容<strong>是否提供了别处没有的信息</strong></li></ol><p>所谓"AI 检测工具"是另一套技术，用于判断文本的生成特征，它既不在检索链路上，也不影响引用决策。</p><p>所以**"我用 AI 写的内容会不会被识别出来然后被降权"这个担心，方向是错的。**真正让你被忽略的，是第三个问题——你没有提供增量。</p><h2 id="真正的障碍是同质化"><a href="#真正的障碍是同质化" class="headerlink" title="真正的障碍是同质化"></a>真正的障碍是同质化</h2><p>AI 生成内容的典型特征是：<strong>结构工整、措辞得体、但可以替换。</strong></p><p>比如问"怎么做 GEO"，AI 通常会给出这样一套答案：优化内容质量、提升权威性、建立外链、做好结构化数据。正确，但没有区分度——<strong>这段话能出现在一万个站点上。</strong></p><p>当检索系统面对一万篇内容相同的页面时，它只需要引用一篇，选择哪一篇带有随机性。你被引用的概率就是万分之一。</p><p>反过来，如果某篇文章写着：</p><blockquote><p>我们在 12 个站点上测试了 robots.txt 配置，其中 3 个站点的 CDN 在 robots 允许的情况下仍然返回 403，原因是 WAF 把不带 cookie 的请求判定为爬虫。</p></blockquote><p>**这段话只有这一个出处。**它不可替换，因此更容易成为被引用的那一个。</p><p>所以判断标准很清晰：<strong>你的文章里，有多少句子是"只有你能写"的？</strong></p><h2 id="AI-写不出来的四类信息"><a href="#AI-写不出来的四类信息" class="headerlink" title="AI 写不出来的四类信息"></a>AI 写不出来的四类信息</h2><p>不需要文笔，只需要有别人拿不到的东西。四类最容易积累的：</p><div class="md-table-scroll"><table><thead><tr><th>类型</th><th>说明</th><th>例子</th></tr></thead><tbody><tr><td>一手实测</td><td>自己跑过的结果，包含具体数字</td><td>"实测 480 字的片段检索命中率最高"</td></tr><tr><td>失败与弯路</td><td>走不通的路径，比成功经验更稀缺</td><td>"用 X 方案处理 3 万条数据时内存溢出"</td></tr><tr><td>具体环境与版本</td><td>让结论可复现的关键细节</td><td>"MySQL 8.0.34 + mysql_native_password"</td></tr><tr><td>时间敏感的一手观察</td><td>你在某个时间点实际看到的现象</td><td>"2026 年 9 月实测，知乎全站禁止抓取"</td></tr></tbody></table></div><p>这四类的共同点是：**AI 可以推理，但无法替你去做。**它们必须来自真实的操作、观察和记录。</p><h2 id="务实的用法：AI-起草，人工注入"><a href="#务实的用法：AI-起草，人工注入" class="headerlink" title="务实的用法：AI 起草，人工注入"></a>务实的用法：AI 起草，人工注入</h2><p>完全拒绝 AI 不现实，完全交给 AI 也写不出有增量的内容。可执行的组合是：</p><p>**第一步：用 AI 搭骨架。**让它列出这个主题应该覆盖哪些方面、常见的误解是什么。这一步能省下大量时间。</p><p>**第二步：逐节填入自己的东西。**每一节至少要有一处来自你实测、你的环境、或你的失败记录的具体信息。<strong>这是文章有没有价值的决定性环节。</strong></p><p>**第三步：让 AI 挑毛病，而不是替你下结论。**用它检查逻辑漏洞、术语不一致、表述歧义；不要用它来"把内容说得更漂亮"——那正是同质化的来源。</p><p>**第四步：把无法验证的说法删掉。**AI 生成的文字里常有一些听起来合理但没有依据的判断，比如"研究表明大多数站点……"。没有出处就删，别留着。</p><h2 id="怎么判断自己的内容有没有信息增量"><a href="#怎么判断自己的内容有没有信息增量" class="headerlink" title="怎么判断自己的内容有没有信息增量"></a>怎么判断自己的内容有没有信息增量</h2><p>写完一篇文章，用四个问题自查：</p><div class="md-table-scroll"><table><thead><tr><th>问题</th><th>不通过的表现</th></tr></thead><tbody><tr><td>有没有具体数字？</td><td>通篇"很多""通常""大部分"</td></tr><tr><td>有没有环境或版本信息？</td><td>读者无法复现你的结论</td></tr><tr><td>有没有失败记录？</td><td>只讲成功路径，像产品说明书</td></tr><tr><td>换个人能不能写出一样的内容？</td><td>能，说明没有增量</td></tr></tbody></table></div><p><strong>最后一个问题最有效：如果任何人都能写出完全相同的文章，它就不具备被引用的价值。</strong></p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="用-AI-生成的内容会被搜索引擎惩罚吗？"><a href="#用-AI-生成的内容会被搜索引擎惩罚吗？" class="headerlink" title="用 AI 生成的内容会被搜索引擎惩罚吗？"></a>用 AI 生成的内容会被搜索引擎惩罚吗？</h3><p>主流平台的态度是<strong>惩罚低质量内容，而不是惩罚生成方式</strong>。判断依据是内容是否对读者有价值、是否提供了独特信息。所以问题不在于"用没用 AI"，而在于产出内容是否只是既有信息的重组。</p><h3 id="我把-AI-写的内容改一改再发，可以吗？"><a href="#我把-AI-写的内容改一改再发，可以吗？" class="headerlink" title="我把 AI 写的内容改一改再发，可以吗？"></a>我把 AI 写的内容改一改再发，可以吗？</h3><p>改措辞不解决问题。同质化的本质是<strong>信息相同</strong>，不是表达相同——换一套说法，内容对检索系统来说依然是重复的。有效的做法是补充 AI 拿不到的信息，而不是替换表达方式。</p><h3 id="完全人工写的内容就一定能被引用吗？"><a href="#完全人工写的内容就一定能被引用吗？" class="headerlink" title="完全人工写的内容就一定能被引用吗？"></a>完全人工写的内容就一定能被引用吗？</h3><p>不一定。人工写的内容同样可能同质化——如果只是复述别人已有的观点，处境和 AI 生成内容一样。<strong>决定因素是信息增量，不是写作主体。</strong></p><h3 id="怎么积累-只有我能写-的素材？"><a href="#怎么积累-只有我能写-的素材？" class="headerlink" title="怎么积累&quot;只有我能写&quot;的素材？"></a>怎么积累"只有我能写"的素材？</h3><p>养成两个习惯就够了：<strong>做事的时候顺手记下数字和异常</strong>，以及<strong>把走不通的尝试也记下来</strong>。多数人只记录成功的结论，而失败路径、环境细节和具体数字恰好是最稀缺的内容。这些素材积累起来后，写作速度会明显变快，因为可写的东西变多了。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>模型不检测"是否 AI 生成"，它判断内容的可用性、可靠性与增量。</li><li>同质化才是根本障碍：能出现在一万个站点上的内容，被引用的概率极低。</li><li>AI 写不出来的四类信息：一手实测、失败路径、环境细节、时间敏感观察。</li><li>务实做法是 AI 搭骨架、人工注入一手信息、AI 挑毛病而非代下结论。</li><li>最有效的自查问题：换个人能不能写出完全一样的内容？</li></ul><p>如果还没弄清 GEO 的整体思路，可以先看<a href="/posts/what-is-geo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《什么是 GEO》</a>。</p><hr><p>如果你在琢磨怎么给自己的内容加上一手信息，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>聊聊你的领域，也许能一起找出几个可写的角度。</p>]]></content>
    
    
    <summary type="html">AI 检测工具不是障碍，同质化才是。本文说明模型判断内容可不可用的真实依据，列出 AI 写不出来的四类信息，并给出&quot;AI 起草 + 人工注入&quot;的实操方法。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="AI 搜索" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E6%90%9C%E7%B4%A2/"/>
    
    <category term="内容写作" scheme="https://devnotes.cuiyuehui.cn/tags/%E5%86%85%E5%AE%B9%E5%86%99%E4%BD%9C/"/>
    
    <category term="AI 生成" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E7%94%9F%E6%88%90/"/>
    
  </entry>
  
  <entry>
    <title>博客、公众号、知乎，哪个更容易被 AI 引用</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/which-platform-ai-cites-most/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/which-platform-ai-cites-most/</id>
    <published>2026-09-17T07:00:00.000Z</published>
    <updated>2026-09-17T07:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：内容能不能被 AI 引用，<strong>第一道门槛是平台允不允许抓取，而不是内容写得好不好</strong>。实测结果是：知乎和微信公众号基本全站禁止爬虫，CSDN、博客园、掘金、简书允许抓取。所以更稳妥的做法是——<strong>自有域名当主阵地，平台账号只做分发和引流。</strong></p><span id="more"></span><h2 id="平台之间的差别，先看-robots-txt"><a href="#平台之间的差别，先看-robots-txt" class="headerlink" title="平台之间的差别，先看 robots.txt"></a>平台之间的差别，先看 robots.txt</h2><p><code>robots.txt</code> 是站点对爬虫的公开声明，可以直接读到。<strong>如果一个平台在文件里写了 <code>Disallow: /</code>，那么无论内容多好，主流爬虫都不会去抓。</strong></p><p>以下是 2026 年 9 月 17 日实测的结果：</p><div class="md-table-scroll"><table><thead><tr><th>平台</th><th>robots.txt 策略</th><th>抓取结论</th></tr></thead><tbody><tr><td>知乎 <code>zhihu.com</code></td><td>通配组只放行一个路径，其余 <code>Disallow: /</code>；并单独声明 <code>Google-Extended</code> 禁止</td><td>❌ 基本禁止</td></tr><tr><td>微信公众号 <code>mp.weixin.qq.com</code></td><td>通配组仅放行登录页、小程序等少数路径，其余 <code>Disallow: /</code></td><td>❌ 基本禁止</td></tr><tr><td>CSDN <code>blog.csdn.net</code></td><td><code>Allow: /</code></td><td>✅ 允许</td></tr><tr><td>博客园 <code>cnblogs.com</code></td><td><code>Allow: /</code>，并声明了 sitemap</td><td>✅ 允许</td></tr><tr><td>掘金 <code>juejin.cn</code></td><td>仅屏蔽订阅页与设置页</td><td>✅ 允许</td></tr><tr><td>简书 <code>jianshu.com</code></td><td>仅屏蔽搜索页、私信、笔记</td><td>✅ 允许</td></tr></tbody></table></div><p>这张表解释了一个常见困惑：**为什么在知乎写了很多，AI 却从来没提过你。**不是内容不行，是内容根本没进入可检索的范围。</p><p>需要说明的是，平台的策略会调整，上面的结论有明确的时间点。<strong>判断方法比结论更重要</strong>，可以自己复核：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -s https://www.zhihu.com/robots.txt | <span class="built_in">head</span> -20</span><br></pre></td></tr></tbody></table></figure><h2 id="robots-txt-允许不等于内容一定能被抓到"><a href="#robots-txt-允许不等于内容一定能被抓到" class="headerlink" title="robots.txt 允许不等于内容一定能被抓到"></a>robots.txt 允许不等于内容一定能被抓到</h2><p>过了第一道门还有第二道：<strong>技术上允许抓取，不代表抓取会成功。</strong></p><p>常见的额外阻力：</p><ul><li><strong>登录墙</strong>：不登录看不到正文，爬虫自然拿不到</li><li><strong>频率限制</strong>：短时间内请求多了会被降速或拒绝</li><li><strong>反爬识别</strong>：验证码、JS 挑战、UA 校验</li><li><strong>内容异步加载</strong>：正文靠前端渲染，抓到的 HTML 是空的</li></ul><p>可以用爬虫身份请求一次，看返回的是正文还是验证页：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">curl -s -o /dev/null -w <span class="string">"%{http_code}\n"</span> \</span><br><span class="line">  -A <span class="string">"Mozilla/5.0 (compatible; Googlebot/2.1)"</span> \</span><br><span class="line">  https://example.com/some-article/</span><br></pre></td></tr></tbody></table></figure><p>返回 200 只是第一步，<strong>还要看返回内容里有没有正文</strong>，而不是只有"请登录后查看"。</p><h2 id="即使都能抓取，可归属性也完全不同"><a href="#即使都能抓取，可归属性也完全不同" class="headerlink" title="即使都能抓取，可归属性也完全不同"></a>即使都能抓取，可归属性也完全不同</h2><p>第三个差别更隐蔽，但影响最大：<strong>内容能不能明确归属到你。</strong></p><div class="md-table-scroll"><table><thead><tr><th>维度</th><th>自有域名</th><th>平台账号</th></tr></thead><tbody><tr><td>作者实体</td><td>可以完整声明（作者页、结构化数据）</td><td>受平台模板限制</td></tr><tr><td>地址稳定性</td><td>完全可控</td><td>平台改版就可能变</td></tr><tr><td>内容结构</td><td>自由组织</td><td>平台决定排版与切分</td></tr><tr><td>变更与下线</td><td>自己说了算</td><td>平台说了算</td></tr></tbody></table></div><p>对 AI 引用来说，**"这是谁写的、在哪个站点"是可信度判断的一部分。**平台内容往往缺少作者实体信息，即使被抓到，模型也更难把它归到某个可靠来源上。</p><h2 id="一个务实的组合策略"><a href="#一个务实的组合策略" class="headerlink" title="一个务实的组合策略"></a>一个务实的组合策略</h2><p>基于上面三点，建议这样分配精力：</p><p>**主阵地放在自有域名。**内容首发在自己站点，拥有完整控制权：地址稳定、结构化数据完整、可以在文章里建立主题聚类和内链。</p><p><strong>平台账号做分发，不做存档。<strong>把文章的核心结论摘出来发平台，引导感兴趣的人回到原站看完整版。这样做有两个好处：平台带来曝光和外部链接，而</strong>引用归因落回你自己的域名</strong>。</p><p>**不要只在一个禁止抓取的平台积累内容。**如果某天想搬到自有域名，你会发现所有历史内容的权重和引用都没法迁移——平台的域名不属于你。</p><h2 id="怎么判断一个平台值不值得投入"><a href="#怎么判断一个平台值不值得投入" class="headerlink" title="怎么判断一个平台值不值得投入"></a>怎么判断一个平台值不值得投入</h2><p>四个问题，按顺序问：</p><div class="md-table-scroll"><table><thead><tr><th>问题</th><th>怎么查</th></tr></thead><tbody><tr><td>允许抓取吗</td><td>读它的 <code>robots.txt</code></td></tr><tr><td>正文能抓到吗</td><td>用爬虫 UA 请求一个具体页面</td></tr><tr><td>内容归属于谁</td><td>页面能不能标注作者与原始出处</td></tr><tr><td>地址稳定吗</td><td>平台是否常用无意义 ID，且历史上有过改版</td></tr></tbody></table></div><p>四个都是"是"，就值得投入；前两个是"否"，写再多也很难被 AI 引用。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="在知乎写内容完全没有意义吗？"><a href="#在知乎写内容完全没有意义吗？" class="headerlink" title="在知乎写内容完全没有意义吗？"></a>在知乎写内容完全没有意义吗？</h3><p>不是。知乎的价值在于<strong>读者获取和领域影响力</strong>——有人看到、有人讨论、有人因此找到你的站点。它只是不适合作为"被 AI 引用"的载体。把知乎当分发渠道，而不是唯一阵地。</p><h3 id="公众号文章为什么很难被-AI-引用？"><a href="#公众号文章为什么很难被-AI-引用？" class="headerlink" title="公众号文章为什么很难被 AI 引用？"></a>公众号文章为什么很难被 AI 引用？</h3><p>公众号内容主要被设计为在微信生态内流转，<code>mp.weixin.qq.com</code> 的 <code>robots.txt</code> 对绝大多数路径声明了禁止抓取。也就是说，主流搜索引擎和 AI 爬虫按规则不会抓取这些页面，内容自然不会出现在它们的检索结果里。</p><h3 id="自有域名没有流量，写在那里有人看吗？"><a href="#自有域名没有流量，写在那里有人看吗？" class="headerlink" title="自有域名没有流量，写在那里有人看吗？"></a>自有域名没有流量，写在那里有人看吗？</h3><p>短期确实不如平台。但 AI 引用依赖的是被抓取、被索引、被归属，这三件事自有域名都占优。<strong>更实际的路径是：平台负责让人看到，自有域名负责被长期引用，两边内容有取舍地同步。</strong></p><h3 id="平台上的内容可以搬到自己的站点吗？"><a href="#平台上的内容可以搬到自己的站点吗？" class="headerlink" title="平台上的内容可以搬到自己的站点吗？"></a>平台上的内容可以搬到自己的站点吗？</h3><p>可以，而且建议做。<strong>关键是搬运后在自己的域名上要有独立价值</strong>：补充更完整的版本、更新数据、加上内链。如果只是复制粘贴，两处内容高度重复，反而会分散权重。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>平台能不能被引用，第一道门槛是 <code>robots.txt</code>，不是内容质量。</li><li>实测：知乎与公众号基本禁止抓取，CSDN、博客园、掘金、简书允许。</li><li><code>robots.txt</code> 允许只是及格线，登录墙、反爬、异步渲染仍会拦住抓取。</li><li>自有域名在作者实体、地址稳定性、内容结构上都有明显优势。</li><li>务实策略：自有域名做阵地，平台做分发，不要只押注在禁止抓取的平台上。</li></ul><hr><p>如果你在纠结内容该放在哪个平台，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>说说你的场景，可以一起判断值不值得投入。</p><p>平台选定之后，中文内容在检索环节的额外差异见<a href="/posts/chinese-content-ai-search/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《中文内容在 AI 搜索里的表现比英文差吗》</a>。</p>]]></content>
    
    
    <summary type="html">决定内容能否被 AI 引用的第一道门槛不是内容质量，而是平台允不允许抓取。本文实测六个中文内容平台的 robots.txt 策略，并给出主阵地与分发渠道的组合建议。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="AI 搜索" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E6%90%9C%E7%B4%A2/"/>
    
    <category term="抓取" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%8A%93%E5%8F%96/"/>
    
    <category term="渠道" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%B8%A0%E9%81%93/"/>
    
  </entry>
  
  <entry>
    <title>站点改版后 URL 变了，怎么保住已有的引用</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/url-change-keep-ai-citations/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/url-change-keep-ai-citations/</id>
    <published>2026-09-17T06:00:00.000Z</published>
    <updated>2026-09-17T06:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：URL 变更不会让引用立刻消失，伤害是滞后的——模型和索引里存的还是旧地址，等它们重新抓取时才发现内容已经不在了。保住引用只需要三件事：<strong>每一条旧地址都有 301 指向新地址、跳转链不超过一跳、sitemap 与站内链接同步更新并保留至少一年。</strong></p><span id="more"></span><h2 id="伤害是滞后的，所以最容易误判"><a href="#伤害是滞后的，所以最容易误判" class="headerlink" title="伤害是滞后的，所以最容易误判"></a>伤害是滞后的，所以最容易误判</h2><p>改完 URL 的当天，你去看 AI 搜索，往往会发现引用还在——因为索引里存的还是旧地址。<strong>真正的下滑出现在之后的两到六周</strong>，那时爬虫重新访问旧地址，发现是 404，才把记录清掉。</p><p>这种滞后带来一个典型误判：改完没出问题，就以为不用管了，等发现问题时已经过去一个月，旧地址的外部链接和引用记录都失效了。</p><p>所以判断标准很简单：<strong>改 URL 之后，旧地址必须永远有效，只是把用户和爬虫送到新地方。</strong></p><h2 id="301-是唯一正确的迁移手段"><a href="#301-是唯一正确的迁移手段" class="headerlink" title="301 是唯一正确的迁移手段"></a>301 是唯一正确的迁移手段</h2><p>几种常见做法的差别：</p><div class="md-table-scroll"><table><thead><tr><th>做法</th><th>效果</th></tr></thead><tbody><tr><td>301 永久跳转</td><td>✅ 传递权重与引用，标准做法</td></tr><tr><td>302 临时跳转</td><td>⚠️ 短期可用，长期会被当作临时状态</td></tr><tr><td>直接返回 404</td><td>❌ 引用与权重丢失</td></tr><tr><td>新旧地址都返回 200 同一内容</td><td>❌ 重复内容，两个地址互相稀释</td></tr><tr><td>用 JavaScript 跳转</td><td>❌ 抓取阶段经常执行不到</td></tr></tbody></table></div><p>**只有 301 是明确告诉对方"这个地址永久搬走了"的信号。**其他方式要么不传递权重，要么在抓取环节就直接断掉。</p><p>第五种情况值得单独说：把新旧两个地址都保留、都返回 200，看起来"两边都能访问"，实际是让两个地址争夺同一份内容，最终两个都受损。</p><h2 id="旧地址映射要写进配置文件，长期保留"><a href="#旧地址映射要写进配置文件，长期保留" class="headerlink" title="旧地址映射要写进配置文件，长期保留"></a>旧地址映射要写进配置文件，长期保留</h2><p>在 nginx 里做逐条映射是最直接的方式：</p><figure class="highlight nginx"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 旧文章地址 → 新地址</span></span><br><span class="line"><span class="section">location</span> = /old-post-title.html {</span><br><span class="line">    <span class="attribute">return</span> <span class="number">301</span> /posts/new-post-title/;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"># 整段路径迁移</span></span><br><span class="line"><span class="section">location</span><span class="regexp"> ^~</span> /blog/ {</span><br><span class="line">    <span class="attribute">return</span> <span class="number">301</span> /posts/<span class="variable">$1</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"># 分类页结构变化</span></span><br><span class="line"><span class="section">location</span> = /category/geo/ {</span><br><span class="line">    <span class="attribute">return</span> <span class="number">301</span> /categories/geo/;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>地址多的时候，用 <code>map</code> 集中管理更清晰：</p><figure class="highlight nginx"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">map</span> <span class="variable">$request_uri</span> <span class="variable">$redirect_target</span> {</span><br><span class="line">    <span class="attribute">default</span>            <span class="string">""</span>;</span><br><span class="line">    /old-a/            /posts/a/;</span><br><span class="line">    /old-b/            /posts/b/;</span><br><span class="line">    /old-c/            /posts/c/;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="section">server</span> {</span><br><span class="line">    <span class="attribute">if</span> (<span class="variable">$redirect_target</span> != <span class="string">""</span>) {</span><br><span class="line">        <span class="attribute">return</span> <span class="number">301</span> <span class="variable">$redirect_target</span>;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>几个要点：</p><ul><li><strong>用 <code>location =</code> 做精确匹配</strong>，避免规则互相干扰</li><li>映射表放在配置文件里，<strong>不要放在数据库或脚本里</strong>——它需要长期存在</li><li>改完必须实际请求一遍旧地址，看返回的 <code>Location</code> 是否正确</li></ul><h2 id="跳转链必须控制在一次以内"><a href="#跳转链必须控制在一次以内" class="headerlink" title="跳转链必须控制在一次以内"></a>跳转链必须控制在一次以内</h2><p><code>A → B → C</code> 这种多级跳转是常见的隐性损耗：每多一跳，抓取预算和权重传递都会被削弱，部分爬虫在第二跳就放弃了。</p><p>自查方法：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -sI https://example.com/old-url/ | grep -iE <span class="string">"^(HTTP|location)"</span></span><br></pre></td></tr></tbody></table></figure><p>如果返回的 <code>Location</code> 指向的地址<strong>还会再跳一次</strong>，就把映射直接改成指向最终地址，把中间那一环删掉。</p><h2 id="内部改写会让跳转规则陷入死循环"><a href="#内部改写会让跳转规则陷入死循环" class="headerlink" title="内部改写会让跳转规则陷入死循环"></a>内部改写会让跳转规则陷入死循环</h2><p>本站做过一次地址规范化：把 <code>/topic/index.html</code> 这类带文件名的地址统一跳到目录形式 <code>/topic/</code>。第一版配置是这样写的：</p><figure class="highlight nginx"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ❌ 有问题的写法</span></span><br><span class="line"><span class="section">location</span> <span class="regexp">~ ^(?&lt;dir&gt;/.*)/index\.html$</span> {</span><br><span class="line">    <span class="attribute">return</span> <span class="number">301</span> <span class="variable">$dir</span>/;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>上线后除首页外全站瘫痪——访问 <code>/topic/</code> 会无限跳转。</p><p>原因是 nginx 在处理目录请求时，会<strong>在内部把 <code>/topic/</code> 改写成 <code>/topic/index.html</code></strong>，改写后的地址又匹配了这条 <code>location</code> 规则，于是 <code>/topic/</code> 被要求跳到 <code>/topic/</code>，形成死循环。</p><p>正确的做法是判断<strong>客户端原始请求</strong>，而不是内部改写后的地址：</p><figure class="highlight nginx"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ✅ 正确写法</span></span><br><span class="line"><span class="attribute">if</span> (<span class="variable">$request_uri</span> <span class="regexp">~ ^(/(?:[^?]*/)?)index\.html(?:\?|$))</span> {</span><br><span class="line">    <span class="attribute">return</span> <span class="number">301</span> <span class="variable">$1</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p><code>$request_uri</code> 保存的是浏览器实际请求的地址，不受内部改写影响，因此不会自我循环。</p><p><strong>这个坑靠本地静态预览完全看不出来</strong>——静态服务器没有内部改写行为。涉及跳转规则时，一定要在真实 nginx 环境（哪怕是临时实例）验证，而不是只在本地看页面能不能打开。</p><h2 id="迁移完成后有四件事必须做"><a href="#迁移完成后有四件事必须做" class="headerlink" title="迁移完成后有四件事必须做"></a>迁移完成后有四件事必须做</h2><div class="md-table-scroll"><table><thead><tr><th>动作</th><th>原因</th></tr></thead><tbody><tr><td>重新生成并提交 <code>sitemap.xml</code></td><td>让爬虫尽快发现新地址</td></tr><tr><td>更新站内所有指向旧地址的链接</td><td>内链走旧地址会持续产生跳转</td></tr><tr><td>检查 <code>robots.txt</code> 里的地址是否过期</td><td>站点地图声明指向旧文件会失效</td></tr><tr><td>保留 301 至少一年</td><td>外部链接与索引的更新周期可能很长</td></tr></tbody></table></div><p>另外注意：**已经发布过的地址尽量不要再改。**迁移本身是有成本的，规划阶段多想一步，比事后修补省事得多。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="换了域名，旧域名的-301-要保留多久？"><a href="#换了域名，旧域名的-301-要保留多久？" class="headerlink" title="换了域名，旧域名的 301 要保留多久？"></a>换了域名，旧域名的 301 要保留多久？</h3><p>建议长期保留，至少一年，有条件就一直保留。旧域名的外部链接不会因为你换了域名就消失，只要旧域名还在解析，就应该继续把访问者送到新站。域名到期前记得续费——<strong>域名过期是唯一无法用 301 挽回的情况。</strong></p><h3 id="用-JavaScript-跳转能替代-301-吗？"><a href="#用-JavaScript-跳转能替代-301-吗？" class="headerlink" title="用 JavaScript 跳转能替代 301 吗？"></a>用 JavaScript 跳转能替代 301 吗？</h3><p>不能。搜索引擎和 AI 爬虫在抓取阶段经常不执行 JavaScript，看到的是一个内容为空的页面；即使执行了，权重传递效果也远不如 301。JS 跳转只适合作为辅助手段，不能作为迁移方案。</p><h3 id="只改文件名不改目录结构，也需要-301-吗？"><a href="#只改文件名不改目录结构，也需要-301-吗？" class="headerlink" title="只改文件名不改目录结构，也需要 301 吗？"></a>只改文件名不改目录结构，也需要 301 吗？</h3><p>需要。任何已发布地址的变化都算迁移，哪怕只是去掉了结尾的 <code>.html</code>。判断标准是"这个地址之前有没有对外出现过"，而不是"改动大不大"。</p><h3 id="迁移后引用掉了，还能恢复吗？"><a href="#迁移后引用掉了，还能恢复吗？" class="headerlink" title="迁移后引用掉了，还能恢复吗？"></a>迁移后引用掉了，还能恢复吗？</h3><p>如果旧地址返回 301 并且新地址内容一致，引用通常会随着重新抓取逐步恢复，周期几周到几个月。如果旧地址返回 404，或者新地址内容被大改，恢复就很困难——这也说明迁移时要尽量保持内容主体不变。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>URL 变更的伤害滞后 2–6 周出现，别因为当天没问题就放心。</li><li>每一条旧地址都要有 301，跳转链控制在一跳以内。</li><li>新旧地址同时返回 200 是收益最差的做法。</li><li>nginx 里判断跳转要看 <code>$request_uri</code>，否则可能被内部改写拖进死循环。</li><li>迁移后同步更新 sitemap、内链与 <code>robots.txt</code>，并把 301 保留一年以上。</li></ul><p>迁移只是 GEO 工作里的一环，整体思路见<a href="/posts/what-is-geo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《什么是 GEO》</a>。</p><hr><p>如果你正在做站点迁移，拿不准某条跳转规则会不会出问题，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>贴出配置，一起看看。</p>]]></content>
    
    
    <summary type="html">换域名、改链接结构之后，AI 搜索的引用不会立刻消失，而是在几周内慢慢失效。本文给出 301 映射、跳转链控制与内链修正的完整做法，并记录一个真实的死循环事故。</summary>
    
    
    
    <category term="建站与部署" scheme="https://devnotes.cuiyuehui.cn/categories/%E5%BB%BA%E7%AB%99%E4%B8%8E%E9%83%A8%E7%BD%B2/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="Nginx" scheme="https://devnotes.cuiyuehui.cn/tags/Nginx/"/>
    
    <category term="URL 迁移" scheme="https://devnotes.cuiyuehui.cn/tags/URL-%E8%BF%81%E7%A7%BB/"/>
    
    <category term="301" scheme="https://devnotes.cuiyuehui.cn/tags/301/"/>
    
  </entry>
  
  <entry>
    <title>结构化数据加了但没效果？先检查这四处</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/structured-data-not-working/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/structured-data-not-working/</id>
    <published>2026-09-17T05:00:00.000Z</published>
    <updated>2026-09-17T05:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：结构化数据加了没效果，绝大多数情况不是类型选错，而是四个基础问题之一——<strong>页面根本没被索引、JSON-LD 格式让解析器读不到、地址用的是示例域名、数据与页面可见内容对不上</strong>。这四项按顺序查一遍，比研究 Schema.org 的细节有用得多。</p><span id="more"></span><h2 id="结构化数据不负责-被收录-，先确认页面能被抓到"><a href="#结构化数据不负责-被收录-，先确认页面能被抓到" class="headerlink" title="结构化数据不负责&quot;被收录&quot;，先确认页面能被抓到"></a>结构化数据不负责"被收录"，先确认页面能被抓到</h2><p>一个前提要先说清楚：结构化数据的作用是<strong>把页面里已经存在的信息表达得更明确</strong>，它不会让一个没被收录的页面变得可检索。</p><p>所以排查的第一步不是看代码，而是确认：</p><ul><li>页面能被爬虫抓取（返回 200，没有被 <code>robots.txt</code> 或 CDN 拦）</li><li>页面已经进入索引（搜 <code>site:域名</code> 能找到）</li><li>内容本身回答了某个真实问题</li></ul><p>**这三条不成立时，结构化数据写得再标准也没有意义。**前两条的验证方法见<a href="/posts/why-ai-never-cites-my-site/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《为什么 AI 从来不提我的网站》</a>。</p><h2 id="检查点一：格式错误的-JSON-LD-会被静默忽略"><a href="#检查点一：格式错误的-JSON-LD-会被静默忽略" class="headerlink" title="检查点一：格式错误的 JSON-LD 会被静默忽略"></a>检查点一：格式错误的 JSON-LD 会被静默忽略</h2><p>格式错误的 JSON-LD 会被解析器直接忽略，而且<strong>不会在页面上显示任何异常</strong>——这是最容易被漏掉的一类问题。</p><p>常见错误：</p><figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- 错误一：多了一段多余的花括号，JSON 不合法 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"application/ld+json"</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">{</span></span><br><span class="line"><span class="language-javascript">  <span class="string">"@context"</span>: <span class="string">"https://schema.org"</span>,</span></span><br><span class="line"><span class="language-javascript">  <span class="string">"@type"</span>: <span class="string">"BlogPosting"</span></span></span><br><span class="line"><span class="language-javascript">}}</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 错误二：引号被模板转义，输出成了 &amp;quot; --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"application/ld+json"</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">{&amp;quot;@type&amp;quot;: &amp;quot;<span class="title class_">BlogPosting</span>&amp;quot;}</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><p>第二种情况在静态站点生成器里很常见：模板引擎对字符串做了 HTML 转义，结果 <code>"</code> 变成了 <code>&amp;quot;</code>，JSON 直接失效。</p><p><strong>验证方式</strong>：直接查看页面源码，把 <code>&lt;script type="application/ld+json"&gt;</code> 里的内容复制出来跑一次解析：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">curl -s https://example.com/posts/hello/ \</span><br><span class="line">  | python3 -c <span class="string">"</span></span><br><span class="line"><span class="string">import sys, re, json</span></span><br><span class="line"><span class="string">html = sys.stdin.read()</span></span><br><span class="line"><span class="string">blocks = re.findall(r'&lt;script type=\"application/ld\+json\"[^&gt;]*&gt;(.*?)&lt;/script&gt;', html, re.S)</span></span><br><span class="line"><span class="string">print('找到', len(blocks), '个 JSON-LD 块')</span></span><br><span class="line"><span class="string">for i, b in enumerate(blocks, 1):</span></span><br><span class="line"><span class="string">    try:</span></span><br><span class="line"><span class="string">        json.loads(b); print(f'  第 {i} 个：合法')</span></span><br><span class="line"><span class="string">    except Exception as e:</span></span><br><span class="line"><span class="string">        print(f'  第 {i} 个：解析失败 →', e)</span></span><br><span class="line"><span class="string">"</span></span><br></pre></td></tr></tbody></table></figure><p>输出里有任何一个"解析失败"，就先修这个，别的都不用看。</p><h2 id="检查点二：-id-和-url-必须是真实的绝对地址"><a href="#检查点二：-id-和-url-必须是真实的绝对地址" class="headerlink" title="检查点二：@id 和 url 必须是真实的绝对地址"></a>检查点二：<code>@id</code> 和 <code>url</code> 必须是真实的绝对地址</h2><p><strong>这是从教程里复制代码时最容易埋下的坑。</strong></p><p>大多数示例代码用 <code>example.com</code> 占位，直接复制就会得到这样的输出：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"WebPage"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"@id"</span><span class="punctuation">:</span> <span class="string">"https://example.com/posts/structured-data/"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p>后果是<strong>实体标识指向了别人的域名</strong>：模型在理解"这篇文章属于谁"时拿到的是错误信息，等于白写。更隐蔽的情况是同一页面里混用相对路径和绝对路径，导致同一个实体有两个标识。</p><p>规则很简单：</p><ul><li><code>@id</code> 和 <code>url</code> 一律写<strong>完整的绝对地址</strong>，包含 <code>https://</code> 和域名</li><li><strong>所有出现的地方必须完全一致</strong>，包括结尾有没有斜杠</li><li>上线前全局搜一次 <code>example.com</code>，确保没有残留</li></ul><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在构建产物里搜占位域名</span></span><br><span class="line">grep -rn <span class="string">"example.com"</span> public/ | <span class="built_in">head</span></span><br></pre></td></tr></tbody></table></figure><h2 id="检查点三：数据只能声明页面上真实存在的信息"><a href="#检查点三：数据只能声明页面上真实存在的信息" class="headerlink" title="检查点三：数据只能声明页面上真实存在的信息"></a>检查点三：数据只能声明页面上真实存在的信息</h2><p>结构化数据有一条硬规则：<strong>它只能声明页面上真实存在的信息。</strong></p><p>声明了页面上没有的内容，属于误导性标记，轻则被忽略，重则影响整个站点的可信度。常见的不一致：</p><div class="md-table-scroll"><table><thead><tr><th>不一致的情况</th><th>后果</th></tr></thead><tbody><tr><td><code>headline</code> 和页面标题不一样</td><td>标题信息不被采信</td></tr><tr><td><code>datePublished</code> 与页面上显示的日期不同</td><td>时效性判断出错</td></tr><tr><td><code>author</code> 指向一个访问不了的作者页</td><td>作者实体无法建立</td></tr><tr><td>声明了 <code>FAQPage</code>，页面上却没有对应问答</td><td>该块整体被忽略</td></tr><tr><td><code>image</code> 地址返回 404</td><td>图片相关字段失效</td></tr></tbody></table></div><p><strong>验证方式</strong>：把 JSON-LD 里的字段和页面上肉眼可见的内容逐项对一遍，尤其是标题、日期、作者、图片这四项。图片地址还要单独确认能打开。</p><h2 id="检查点四：单条数据不够，要声明实体之间的关系"><a href="#检查点四：单条数据不够，要声明实体之间的关系" class="headerlink" title="检查点四：单条数据不够，要声明实体之间的关系"></a>检查点四：单条数据不够，要声明实体之间的关系</h2><p>单打独斗的一条 <code>BlogPosting</code> 信息量有限。<strong>让模型理解"这篇文章属于哪个站点、由谁写的、在什么位置"，需要多条数据互相引用。</strong></p><p>四种最有价值的关系（详细写法见<a href="/posts/structured-data-for-geo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《结构化数据怎么做才对 GEO 有用》</a>）：</p><div class="md-table-scroll"><table><thead><tr><th>类型</th><th>回答的问题</th></tr></thead><tbody><tr><td><code>BlogPosting</code></td><td>这是什么内容</td></tr><tr><td><code>BreadcrumbList</code></td><td>它属于哪个主题路径</td></tr><tr><td><code>FAQPage</code></td><td>它直接回答了哪些问题</td></tr><tr><td><code>Person</code></td><td>作者是谁，可信度如何</td></tr></tbody></table></div><p>如果只加了 <code>BlogPosting</code> 就发现没效果，问题往往在这里——<strong>不是数据错了，而是信息量不够支撑一次"引用决策"。</strong></p><h2 id="用工具验证，别靠肉眼判断"><a href="#用工具验证，别靠肉眼判断" class="headerlink" title="用工具验证，别靠肉眼判断"></a>用工具验证，别靠肉眼判断</h2><p>排查完上面四项后，用官方工具做一次确认：</p><div class="md-table-scroll"><table><thead><tr><th>工具</th><th>用途</th></tr></thead><tbody><tr><td>Google 富结果测试</td><td>检查能否被解析、哪些字段缺失</td></tr><tr><td>Schema Markup Validator</td><td>校验语法与类型是否规范</td></tr><tr><td>搜索平台的抓取统计</td><td>确认页面确实被收录</td></tr></tbody></table></div><p>注意工具的作用边界：**它们能验证"数据是否合法"，不能验证"是否会被 AI 引用"。**后者只能通过在多个平台上用固定问题采样来观察，方法见<a href="/posts/measure-geo-results/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《怎么衡量 GEO 有没有效果》</a>。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="结构化数据加完多久能看到变化？"><a href="#结构化数据加完多久能看到变化？" class="headerlink" title="结构化数据加完多久能看到变化？"></a>结构化数据加完多久能看到变化？</h3><p>没有固定周期，取决于页面是否被重新抓取。通常几周到一两个月。<strong>如果页面本身没被索引，等多久都不会有变化</strong>——这也是为什么排查要从抓取和索引开始。</p><h3 id="加了-FAQPage-但搜索结果里没显示问答，是失败了吗？"><a href="#加了-FAQPage-但搜索结果里没显示问答，是失败了吗？" class="headerlink" title="加了 FAQPage 但搜索结果里没显示问答，是失败了吗？"></a>加了 FAQPage 但搜索结果里没显示问答，是失败了吗？</h3><p>不一定。FAQPage 结构化数据对 GEO 的价值在于<strong>让模型更容易提取问答对</strong>，而不仅仅是搜索结果的富摘要展示。两个平台的展示策略也各不相同，不展示不代表数据没被使用。</p><h3 id="多个-JSON-LD-块放在同一个页面会不会冲突？"><a href="#多个-JSON-LD-块放在同一个页面会不会冲突？" class="headerlink" title="多个 JSON-LD 块放在同一个页面会不会冲突？"></a>多个 JSON-LD 块放在同一个页面会不会冲突？</h3><p>不会。解析器会把同一页面里的多个块合并理解。实践中更推荐用 <code>@graph</code> 把相关内容组织在一个块里，便于维护，但分开放多个块同样有效。真正的问题不是块的数量，而是<strong>实体之间有没有互相引用、标识是否一致</strong>。</p><h3 id="用了-WordPress-或-Hexo-的插件，还需要自己检查吗？"><a href="#用了-WordPress-或-Hexo-的插件，还需要自己检查吗？" class="headerlink" title="用了 WordPress 或 Hexo 的插件，还需要自己检查吗？"></a>用了 WordPress 或 Hexo 的插件，还需要自己检查吗？</h3><p>需要。插件保证的是"输出格式"，不保证"内容正确"——尤其是 <code>@id</code> 指向的域名、作者页地址、日期格式这些需要结合站点实际情况调整的字段。<strong>插件装完必须抽查两三个页面的源码。</strong></p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>结构化数据不负责收录，先确认页面能被抓取和索引。</li><li>JSON-LD 格式错误会被静默忽略，上线前跑一次解析验证。</li><li><code>@id</code> 和 <code>url</code> 必须是真实绝对地址，且全局统一。</li><li>数据只能声明页面上真实存在的信息。</li><li>单条 <code>BlogPosting</code> 信息量不足，需要多条数据互相引用。</li></ul><hr><p>如果你加了结构化数据还是不生效，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>贴出页面地址和 JSON-LD 片段，一起看看卡在哪一项。</p>]]></content>
    
    
    <summary type="html">加完 JSON-LD 却发现 AI 搜索没有任何变化，通常不是类型选错，而是数据没被抓到、解析失败、地址写错或与页面内容不一致。本文按四个检查点排查，并给出验证工具。</summary>
    
    
    
    <category term="GEO 工具箱" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%B7%A5%E5%85%B7%E7%AE%B1/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="排查" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%8E%92%E6%9F%A5/"/>
    
    <category term="结构化数据" scheme="https://devnotes.cuiyuehui.cn/tags/%E7%BB%93%E6%9E%84%E5%8C%96%E6%95%B0%E6%8D%AE/"/>
    
    <category term="JSON-LD" scheme="https://devnotes.cuiyuehui.cn/tags/JSON-LD/"/>
    
  </entry>
  
  <entry>
    <title>robots.txt 里的 AI 爬虫该怎么配</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/robots-txt-ai-crawlers/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/robots-txt-ai-crawlers/</id>
    <published>2026-09-17T03:00:00.000Z</published>
    <updated>2026-09-17T03:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：面向 AI 搜索的 <code>robots.txt</code>，正确做法是<strong>默认放行、按用途分类、只精确屏蔽你确实不想给的那一类</strong>。绝大多数站点不需要拦任何爬虫；而用一条 <code>Disallow: /</code> 一刀切，会把检索和引用链路一起切断。</p><span id="more"></span><h2 id="默认放行，除非你有明确理由"><a href="#默认放行，除非你有明确理由" class="headerlink" title="默认放行，除非你有明确理由"></a>默认放行，除非你有明确理由</h2><p>先说一个前提：<code>robots.txt</code> 是<strong>君子协定</strong>，靠爬虫自行遵守，没有强制力。它拦不住不守规矩的采集者，也拦不住已经部署在 CDN 层的拦截规则。</p><p>它真正的作用是<strong>表达意图</strong>：告诉守规矩的爬虫"这里欢迎你，那里请不要来"。</p><p>对一个以内容为主的站点，合理的默认姿态是放行。理由有三个：</p><ul><li>你希望内容被引用，而引用依赖检索，检索依赖抓取</li><li>训练类抓取即使拦掉，也无法验证效果，收益不明确</li><li>规则越多，写错的机会越大——一条写错的规则可能同时挡掉好几个爬虫</li></ul><p>**只有当你有明确诉求时，才需要精确屏蔽。**比如站点包含内部文档、付费内容目录，或者公司对内容用途有明确规定。</p><h2 id="爬虫要先按用途分类，再决定放不放"><a href="#爬虫要先按用途分类，再决定放不放" class="headerlink" title="爬虫要先按用途分类，再决定放不放"></a>爬虫要先按用途分类，再决定放不放</h2><p>同样叫"AI 爬虫"，职责差别很大。三类爬虫的作用范围见<a href="/posts/ai-citation-vs-ai-training/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《AI 引用和 AI 训练是两件事》</a>，这里只给配置结论：</p><div class="md-table-scroll"><table><thead><tr><th>类别</th><th>配置建议</th><th>原因</th></tr></thead><tbody><tr><td>检索 / 索引类（<code>OAI-SearchBot</code>、<code>PerplexityBot</code>、<code>Googlebot</code>、<code>Bingbot</code>）</td><td><strong>必须放行</strong></td><td>直接决定能否被 AI 引用</td></tr><tr><td>用户触发类（<code>ChatGPT-User</code>、<code>Perplexity-User</code>）</td><td><strong>放行</strong></td><td>代表真实用户正在读你的页面</td></tr><tr><td>训练类（<code>GPTBot</code>、<code>CCBot</code>、<code>Google-Extended</code>、<code>Bytespider</code>）</td><td>默认放行，有诉求再单独屏蔽</td><td>不影响引用，但同样无法验证收益</td></tr></tbody></table></div><p>**判断顺序是：先问"拦掉它我会损失什么"，再问"拦掉它我能得到什么"。**如果损失是确定的、收益是不确定的，就不要拦。</p><h2 id="一份可以照抄的配置"><a href="#一份可以照抄的配置" class="headerlink" title="一份可以照抄的配置"></a>一份可以照抄的配置</h2><p>下面这份配置可以做起点，把域名换成你自己的：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"># 站点地图写在这里，方便爬虫一次找到</span><br><span class="line">Sitemap: https://example.com/sitemap.xml</span><br><span class="line"></span><br><span class="line"># 默认全站放行</span><br><span class="line">User-agent: *</span><br><span class="line">Allow: /</span><br><span class="line"></span><br><span class="line"># 只屏蔽确实不该被索引的路径</span><br><span class="line">Disallow: /search/</span><br><span class="line">Disallow: /preview/</span><br><span class="line"></span><br><span class="line"># ---- 明确放行 AI 相关爬虫 ----</span><br><span class="line"></span><br><span class="line"># OpenAI</span><br><span class="line">User-agent: GPTBot</span><br><span class="line">Allow: /</span><br><span class="line">User-agent: OAI-SearchBot</span><br><span class="line">Allow: /</span><br><span class="line">User-agent: ChatGPT-User</span><br><span class="line">Allow: /</span><br><span class="line"></span><br><span class="line"># Anthropic</span><br><span class="line">User-agent: ClaudeBot</span><br><span class="line">Allow: /</span><br><span class="line">User-agent: Claude-User</span><br><span class="line">Allow: /</span><br><span class="line"></span><br><span class="line"># Perplexity</span><br><span class="line">User-agent: PerplexityBot</span><br><span class="line">Allow: /</span><br><span class="line">User-agent: Perplexity-User</span><br><span class="line">Allow: /</span><br><span class="line"></span><br><span class="line"># 传统搜索爬虫：AI 检索层常常依赖它们的索引</span><br><span class="line">User-agent: Googlebot</span><br><span class="line">Allow: /</span><br><span class="line">User-agent: Bingbot</span><br><span class="line">Allow: /</span><br></pre></td></tr></tbody></table></figure><p>几点说明：</p><ul><li><strong><code>Sitemap:</code> 是唯一写绝对地址的指令</strong>，其他规则写路径即可</li><li>路径区分大小写，<code>/Search/</code> 和 <code>/search/</code> 是两条规则</li><li>每条 <code>User-agent</code> 后面跟的规则属于这一组，<strong>组之间要有明确的空行分隔</strong>（严格来说是靠 <code>User-agent</code> 行划分，空行只是可读性）</li><li>想屏蔽某个爬虫，把 <code>Allow: /</code> 换成 <code>Disallow: /</code> 即可，其他组不受影响</li></ul><p>本站的配置就是按这个思路生成的，完整内容可以直接访问 <a href="/robots.txt" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span><code>/robots.txt</code></a> 对照。</p><h2 id="五条最容易写错的规则"><a href="#五条最容易写错的规则" class="headerlink" title="五条最容易写错的规则"></a>五条最容易写错的规则</h2><p><strong>第一，<code>User-agent: *</code> 里的 <code>Disallow: /</code> 会误伤一大片。</strong> 通配组是所有没被单独列出的爬虫的默认行为。你只想屏蔽某个采集者，却让几十个爬虫一起出局，这是最常见的事故。</p><p>**第二，匹配规则是"最长匹配优先"，不是"先写先算"。**同一组里有多条规则时，路径匹配最长的那条生效；长度相同时 <code>Allow</code> 优先。所以 <code>Allow: /blog/</code> 和 <code>Disallow: /blog/draft/</code> 同时存在时，草稿目录仍然会被挡住——这符合直觉，但很多人以为后面的规则会覆盖前面的。</p><p><strong>第三，<code>robots.txt</code> 必须放在域名根目录。</strong> <code>https://example.com/robots.txt</code> 有效，<code>https://example.com/blog/robots.txt</code> 对主站无效。子目录站点（比如托管在二级路径下的博客）没有独立的 <code>robots.txt</code> 可用。</p><p><strong>第四，规则是路径前缀匹配，不是正则。</strong><code>*</code> 是通配符、<code>$</code> 表示结尾，这两个的支持比较普遍，但更复杂的表达式（比如带括号、量词的写法）各爬虫支持程度不一，不要依赖。</p><p><strong>第五，爬虫名拼错等于没写。</strong><code>PerplexityBot</code> 写成 <code>Perplexity-Bot</code>、<code>ClaudeBot</code> 写成 <code>Claude-Bot</code>，规则就不会被匹配。名称大小写不敏感，但拼写必须准确。</p><h2 id="配置写完，一定要验证"><a href="#配置写完，一定要验证" class="headerlink" title="配置写完，一定要验证"></a>配置写完，一定要验证</h2><p>写完不验证，等于没写。三步走：</p><p><strong>第一步，确认文件本身可访问、内容正确：</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -s https://example.com/robots.txt | <span class="built_in">head</span> -40</span><br></pre></td></tr></tbody></table></figure><p>返回 404 或返回了 HTML，说明文件位置或服务器配置有问题。</p><p><strong>第二步，用爬虫身份请求一个内容页，确认没有被服务器层拦住：</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">curl -s -o /dev/null -w <span class="string">"%{http_code}\n"</span> \</span><br><span class="line">  -A <span class="string">"Mozilla/5.0 (compatible; OAI-SearchBot/1.0)"</span> \</span><br><span class="line">  https://example.com/posts/hello/</span><br></pre></td></tr></tbody></table></figure><p>返回 200 才算真正放行。<strong><code>robots.txt</code> 允许不代表能访问</strong>——CDN 的防机器人模式、WAF 规则、限速配置都可能在这一层把请求挡下来。</p><p>**第三步，过一段时间回来看日志。**只有日志里出现真实的爬虫访问，才说明整条链路是通的：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 统计最近访问过的 AI 爬虫与次数</span></span><br><span class="line">grep -ioE <span class="string">"GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|PerplexityBot|Bytespider"</span> \</span><br><span class="line">  /var/log/nginx/access.log | <span class="built_in">sort</span> | <span class="built_in">uniq</span> -c | <span class="built_in">sort</span> -rn</span><br></pre></td></tr></tbody></table></figure><p>如果某个爬虫一次都没出现，回到第一步重新验证，别急着改内容。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="不写-robots-txt-会怎样？"><a href="#不写-robots-txt-会怎样？" class="headerlink" title="不写 robots.txt 会怎样？"></a>不写 robots.txt 会怎样？</h3><p>等同于默认全部允许。搜索引擎和多数 AI 爬虫在没有该文件时按"可以抓取"处理。所以不写文件本身没有风险，但你会失去表达意图的能力——比如声明站点地图、屏蔽搜索结果页这类不该被索引的地址。</p><h3 id="我想屏蔽-AI-训练，应该只加一条-Disallow-GPTBot-吗？"><a href="#我想屏蔽-AI-训练，应该只加一条-Disallow-GPTBot-吗？" class="headerlink" title="我想屏蔽 AI 训练，应该只加一条 Disallow: GPTBot 吗？"></a>我想屏蔽 AI 训练，应该只加一条 Disallow: GPTBot 吗？</h3><p>只针对你想屏蔽的对象配置，别用通配规则。需要注意训练语料来源不止一家：<code>CCBot</code>（Common Crawl）的数据常被多个模型复用，屏蔽了 OpenAI 却放行 <code>CCBot</code>，内容仍可能间接进入训练集。如果你的诉求是"尽量不被用于训练"，需要把这一类别里的主要爬虫逐条列出。</p><h3 id="robots-txt-能阻止内容被抓取吗？"><a href="#robots-txt-能阻止内容被抓取吗？" class="headerlink" title="robots.txt 能阻止内容被抓取吗？"></a>robots.txt 能阻止内容被抓取吗？</h3><p>只能阻止<strong>愿意遵守规则的爬虫</strong>。它没有技术强制力，对不守规矩的采集者无效。如果你的诉求是"技术上不被抓"，需要靠服务器层的鉴权、频次限制或访问控制，而那些手段同样会影响正常读者和搜索引擎。</p><h3 id="改了-robots-txt-多久生效？"><a href="#改了-robots-txt-多久生效？" class="headerlink" title="改了 robots.txt 多久生效？"></a>改了 robots.txt 多久生效？</h3><p>爬虫通常会在下次抓取时重新读取该文件，时间从几小时到几天不等。如果之前已经被屏蔽，恢复抓取往往还需要额外几周——<strong>这也是不要随意屏蔽的原因：一次误操作的成本可能是一个月。</strong></p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>默认放行、按用途分类、只精确屏蔽必要的对象，是稳妥的默认姿态。</li><li>检索类爬虫直接决定能否被引用，用户触发类代表真实读者，这两类都别拦。</li><li>通配组里的 <code>Disallow: /</code> 是误伤重灾区，精确屏蔽优于一刀切。</li><li>规则是路径前缀匹配、最长匹配优先，且必须放在域名根目录。</li><li>写完必须验证：文件可访问、爬虫 UA 能拿到 200、日志里能看到真实访问。</li></ul><hr><p>如果你的 <code>robots.txt</code> 配置完还是不见爬虫来，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>贴出配置和日志片段，一起看看卡在哪一层。</p>]]></content>
    
    
    <summary type="html">一份面向 AI 搜索的 robots.txt 配置指南：哪些爬虫影响引用、哪些只影响训练，规则怎么写才有效，以及五条最容易踩的语法坑和验证方法。</summary>
    
    
    
    <category term="GEO 工具箱" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%B7%A5%E5%85%B7%E7%AE%B1/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="抓取" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%8A%93%E5%8F%96/"/>
    
    <category term="robots.txt" scheme="https://devnotes.cuiyuehui.cn/tags/robots-txt/"/>
    
    <category term="AI 爬虫" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E7%88%AC%E8%99%AB/"/>
    
  </entry>
  
  <entry>
    <title>AI 引用和 AI 训练是两件事，别再搞混了</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/ai-citation-vs-ai-training/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/ai-citation-vs-ai-training/</id>
    <published>2026-09-17T02:00:00.000Z</published>
    <updated>2026-09-17T02:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：AI 训练是把内容吃进模型参数，滞后又不可追踪；AI 引用是模型回答时实时检索、当场标注来源，可以优化也可以度量。**这两条链路用的是不同的爬虫、不同的机制，收益也完全不同。**把它们混为一谈，很容易做出恰好相反的错误决策。</p><span id="more"></span><h2 id="两条链路的机制完全不同"><a href="#两条链路的机制完全不同" class="headerlink" title="两条链路的机制完全不同"></a>两条链路的机制完全不同</h2><p>先看一张对照表，这是后面所有判断的基础：</p><div class="md-table-scroll"><table><thead><tr><th>维度</th><th>AI 训练</th><th>AI 引用</th></tr></thead><tbody><tr><td>发生时机</td><td>离线、周期性，模型训练时</td><td>实时，用户提问时</td></tr><tr><td>内容去哪了</td><td>融进模型参数</td><td>作为答案来源被标注</td></tr><tr><td>生效速度</td><td>滞后几个月到数年</td><td>收录后通常几天到数周</td></tr><tr><td>能否撤回</td><td>基本不能</td><td>改内容或下线页面即可</td></tr><tr><td>能否追踪</td><td>几乎无法验证</td><td>可以用固定问题集采样</td></tr><tr><td>能否优化</td><td>只能决定"给不给"</td><td>可以从结构、术语、信任逐项优化</td></tr><tr><td>收益形式</td><td>模型"知道"这件事</td><td>用户看到你的名字和链接</td></tr></tbody></table></div><p>一句话概括：<strong>训练影响的是模型的"记忆"，引用影响的是用户的"当下决策"。</strong></p><p>你真正想要的通常是后者——有人因为 AI 的回答而知道你的站点。但很多人把力气全花在了前者上。</p><h2 id="混淆会让你做出相反的错误决策"><a href="#混淆会让你做出相反的错误决策" class="headerlink" title="混淆会让你做出相反的错误决策"></a>混淆会让你做出相反的错误决策</h2><p>两种典型错误，方向正好相反：</p><p><strong>错误一：想被推荐，却把所有 AI 爬虫都拦了。</strong></p><p>有人担心内容被拿去训练，于是在 <code>robots.txt</code> 里写下 <code>User-agent: *</code> + <code>Disallow: /</code>，或者逐个屏蔽带 AI 字样的爬虫。结果连负责检索的爬虫一起挡在门外，AI 搜索再也看不到这个站点。</p><p><strong>错误二：以为被训练了就会被推荐。</strong></p><p>另一种常见误解是"我的文章被模型学过了，那它应该会推荐我"。实际上训练数据里的内容是<strong>没有署名、没有链接</strong>的——模型只是"知道"了这件事，回答时不会说这是谁写的。<strong>没有引用链路，就没有归属。</strong></p><p>判断标准很简单：</p><ul><li>想要<strong>有人看到你</strong> → 要的是引用，重点是抓取、索引、结构、信任</li><li>想要<strong>模型记住这件事</strong> → 要的是训练，但收益不可控、不可度量</li></ul><p>大多数做内容的人，目标都是前者。</p><h2 id="AI-爬虫至少分三类，用途各不相同"><a href="#AI-爬虫至少分三类，用途各不相同" class="headerlink" title="AI 爬虫至少分三类，用途各不相同"></a>AI 爬虫至少分三类，用途各不相同</h2><p>把爬虫按用途分开看，配置才不会出错：</p><div class="md-table-scroll"><table><thead><tr><th>类别</th><th>典型爬虫</th><th>影响什么</th></tr></thead><tbody><tr><td>训练类</td><td><code>GPTBot</code>、<code>CCBot</code>、<code>Google-Extended</code>、<code>Applebot-Extended</code>、<code>Bytespider</code>、<code>meta-externalagent</code></td><td>内容是否进入训练语料</td></tr><tr><td>检索 / 索引类</td><td><code>OAI-SearchBot</code>、<code>PerplexityBot</code>、<code>ClaudeBot</code>、<code>Googlebot</code>、<code>Bingbot</code></td><td>能否出现在 AI 搜索的答案里</td></tr><tr><td>用户触发类</td><td><code>ChatGPT-User</code>、<code>Perplexity-User</code>、<code>Claude-User</code></td><td>用户主动让 AI 打开某个网址时能否读到</td></tr></tbody></table></div><p>三点需要特别注意：</p><p><strong>第一，<code>Google-Extended</code> 不影响 Google 搜索排名。</strong> 它只控制内容是否用于 Gemini 的训练与相关用途，屏蔽它不会让站点在搜索里消失。这是个常见误解。</p><p><strong>第二，传统搜索爬虫仍然重要。</strong> 很多 AI 检索层依赖已有的网页索引，把 <code>Googlebot</code>、<code>Bingbot</code> 挡住，等于同时放弃了大部分引用机会。</p><p><strong>第三，用户触发类的爬虫最好放行。</strong> 它代表的是一个真实的人在读你的页面，拦住它没有任何好处。</p><p>具体到每个爬虫该怎么写配置，见<a href="/posts/robots-txt-ai-crawlers/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《robots.txt 里的 AI 爬虫该怎么配》</a>。</p><h2 id="引用可以优化，训练只能选择给不给"><a href="#引用可以优化，训练只能选择给不给" class="headerlink" title="引用可以优化，训练只能选择给不给"></a>引用可以优化，训练只能选择给不给</h2><p>这是两个机制最本质的差别，也决定了该把精力放在哪。</p><p><strong>引用是可以被工程化的。</strong> 你能做的事情包括：</p><ul><li>让页面被抓到、进索引（前提）</li><li>把内容切成语义完整的片段</li><li>让标题的用词和真实提问对齐</li><li>补齐作者与站点信息，提高可信度</li><li>用固定问题集定期采样，看引用率的变化</li></ul><p>这几件事都有明确的动作和可观察的结果，属于可以迭代的工作。</p><p><strong>训练则基本是单向开关。</strong> 你能决定的只有"给不给"，给完之后：内容怎么被用、用多少次、有没有影响到具体回答，都无从得知。中间的反馈是断的。</p><p>所以从投入产出看，<strong>做内容的人应该把引用链路当成主战场，训练当成顺带的结果。</strong></p><h2 id="引用可以验证，训练几乎无法验证"><a href="#引用可以验证，训练几乎无法验证" class="headerlink" title="引用可以验证，训练几乎无法验证"></a>引用可以验证，训练几乎无法验证</h2><p>验证手段的差别，进一步说明了该关注哪一个：</p><div class="md-table-scroll"><table><thead><tr><th>想验证的事</th><th>可行的方法</th></tr></thead><tbody><tr><td>有没有被引用</td><td>用固定问题集在多个平台采样，记录引用与提及</td></tr><tr><td>抓取是否正常</td><td>查服务器日志里 AI 爬虫的访问记录</td></tr><tr><td>内容是否进索引</td><td>搜 <code>site:域名</code>，观察抓取量趋势</td></tr><tr><td>是否被用于训练</td><td>没有可靠手段，最多只能间接观察模型输出</td></tr></tbody></table></div><p>最后一行是关键：<strong>训练这件事无法验证，也就无法优化。</strong> 一个既不能度量、也不能迭代的方向，不适合作为主要目标。</p><p>引用侧的采样方法，可以照搬<a href="/posts/measure-geo-results/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《怎么衡量 GEO 有没有效果》</a>里的那套指标设计。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="我的文章被模型学过了，为什么它不推荐我？"><a href="#我的文章被模型学过了，为什么它不推荐我？" class="headerlink" title="我的文章被模型学过了，为什么它不推荐我？"></a>我的文章被模型学过了，为什么它不推荐我？</h3><p>因为训练数据进入模型后不再携带出处。模型可能"知道"这个知识点，但回答时不会说出作者或链接。要被推荐，需要的是引用链路——模型在回答时实时检索到你的页面并标注来源，这与训练是两条独立的路径。</p><h3 id="屏蔽-GPTBot-会影响-ChatGPT-引用我的网站吗？"><a href="#屏蔽-GPTBot-会影响-ChatGPT-引用我的网站吗？" class="headerlink" title="屏蔽 GPTBot 会影响 ChatGPT 引用我的网站吗？"></a>屏蔽 GPTBot 会影响 ChatGPT 引用我的网站吗？</h3><p>这两个爬虫的职责不同，理论上可以分别配置。但在实际操作中，很多人用一条通配规则把所有 AI 爬虫一起拦掉，结果连带影响检索与用户触发的抓取。如果你担心的是训练用途，就精确地只针对训练类爬虫配置，不要用一刀切规则。</p><h3 id="怎么确认自己的内容有没有被用于训练？"><a href="#怎么确认自己的内容有没有被用于训练？" class="headerlink" title="怎么确认自己的内容有没有被用于训练？"></a>怎么确认自己的内容有没有被用于训练？</h3><p>没有可靠办法。你能观察到的只是模型输出是否表现出相关知识，但无法证明来源是你的页面，也无法确认具体版本。这也是"训练不可度量"的直接体现——把精力放在可验证的引用链路上更划算。</p><h3 id="那还需要在意训练吗？"><a href="#那还需要在意训练吗？" class="headerlink" title="那还需要在意训练吗？"></a>那还需要在意训练吗？</h3><p>值得在意的只有一件事：<strong>你是否有明确的理由不希望内容被用于训练。</strong> 如果没有特别诉求，放行训练类爬虫的成本很低，而它可能带来的长期曝光是有价值的。有诉求时，也建议只做精确屏蔽，不动检索链路。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>训练进参数、滞后、不可追踪；引用在实时检索里发生，可优化、可度量。</li><li>混淆会同时导致两种反向错误：该放行的拦了，或者以为被学会就会被推荐。</li><li>AI 爬虫至少分训练、检索、用户触发三类，要分开对待。</li><li><code>Google-Extended</code> 不影响搜索排名，这是最容易搞错的一条。</li><li>想要有人找到你，主战场是引用链路，不是训练。</li></ul><hr><p>如果你在配置爬虫时拿不准某个 UA 该不该放行，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>说说你的场景，一起判断。</p>]]></content>
    
    
    <summary type="html">被大模型学会和被 AI 搜索推荐是两条不同的链路：一条影响模型参数、滞后且无法追踪，另一条实时检索、可以优化也可以度量。混为一谈会让你做出相反的错误决策。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="AI 搜索" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E6%90%9C%E7%B4%A2/"/>
    
    <category term="爬虫" scheme="https://devnotes.cuiyuehui.cn/tags/%E7%88%AC%E8%99%AB/"/>
    
    <category term="概念" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%A6%82%E5%BF%B5/"/>
    
  </entry>
  
  <entry>
    <title>为什么 AI 从来不提我的网站？六个常见原因</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/why-ai-never-cites-my-site/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/why-ai-never-cites-my-site/</id>
    <published>2026-09-17T01:00:00.000Z</published>
    <updated>2026-09-17T01:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：AI 搜索不引用你的站点，多数时候不是内容质量问题，而是链路中间某一环断了——<strong>爬虫被拦住、页面没进索引、内容切不出好片段、术语跟提问对不上、缺少可验证的身份、或者只是时间不够</strong>。按这个顺序排查，比反复改文章有效得多。</p><span id="more"></span><h2 id="排查要按链路顺序来，别从改文章开始"><a href="#排查要按链路顺序来，别从改文章开始" class="headerlink" title="排查要按链路顺序来，别从改文章开始"></a>排查要按链路顺序来，别从改文章开始</h2><p>一个页面被 AI 引用，要依次经过六个环节。任何一环断掉，后面做得再好都不起作用：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">① 能被抓取    →  ② 进入索引    →  ③ 切成片段</span><br><span class="line">                                        ↓</span><br><span class="line">⑥ 有对应需求  ←  ⑤ 通过信任判断  ←  ④ 语义匹配提问</span><br></pre></td></tr></tbody></table></figure><p>多数人一发现问题就回去改文章，等于只盯着最后一步。先确认前面五步有没有断，再决定要不要动内容。</p><div class="md-table-scroll"><table><thead><tr><th>环节</th><th>断掉时的典型表现</th><th>怎么验证</th></tr></thead><tbody><tr><td>抓取</td><td>服务器日志里看不到 AI 爬虫</td><td>用爬虫的 UA 手工请求一次</td></tr><tr><td>索引</td><td>搜站点名都搜不到</td><td>提交 sitemap，观察抓取日志</td></tr><tr><td>切片</td><td>抓了但从不被引用</td><td>检查小标题与段落长度</td></tr><tr><td>术语</td><td>长尾问题从不命中</td><td>对比标题用词与真实提问</td></tr><tr><td>信任</td><td>偶尔被抓但从不出现</td><td>补齐作者页与结构化信息</td></tr><tr><td>需求</td><td>内容对但没人问</td><td>换选题，不是换写法</td></tr></tbody></table></div><p>下面逐条展开。</p><h2 id="原因一：爬虫被-robots-txt-或服务器挡在门外"><a href="#原因一：爬虫被-robots-txt-或服务器挡在门外" class="headerlink" title="原因一：爬虫被 robots.txt 或服务器挡在门外"></a>原因一：爬虫被 robots.txt 或服务器挡在门外</h2><p><strong>这是最容易验证、也最常见的一条。</strong> 内容再好，抓不到就等于不存在。</p><p>三种典型情况：</p><ul><li><code>robots.txt</code> 里写了 <code>Disallow: /</code>，或者把 AI 相关爬虫单独屏蔽了</li><li>服务器或 CDN 拦截了不认识的 User-Agent，直接返回 403</li><li>站点挂了 WAF 的"防机器人"模式，把正常抓取一并拦掉</li></ul><p>验证方法很直接，用爬虫自己的身份请求一次：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 换成你自己域名，观察返回码</span></span><br><span class="line">curl -s -o /dev/null -w <span class="string">"%{http_code}\n"</span> \</span><br><span class="line">  -A <span class="string">"Mozilla/5.0 AppleWebKit/537.36; compatible; GPTBot/1.2"</span> \</span><br><span class="line">  https://example.com/</span><br></pre></td></tr></tbody></table></figure><p>返回 200 说明放行，403 或 503 就是被拦了。同样的方法可以依次测试其他爬虫。</p><p>再看一眼服务器访问日志里有没有这些 UA——<strong>如果日志里从来没有出现过它们，问题就在这一层：</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -iE <span class="string">"GPTBot|ClaudeBot|PerplexityBot|Bytespider"</span> /var/log/nginx/access.log | <span class="built_in">tail</span> -20</span><br></pre></td></tr></tbody></table></figure><p>关于哪些爬虫该放、哪些可以拦，见<a href="/posts/robots-txt-ai-crawlers/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《robots.txt 里的 AI 爬虫该怎么配》</a>。</p><h2 id="原因二：页面没有进入索引，AI-根本搜不到"><a href="#原因二：页面没有进入索引，AI-根本搜不到" class="headerlink" title="原因二：页面没有进入索引，AI 根本搜不到"></a>原因二：页面没有进入索引，AI 根本搜不到</h2><p>抓取不等于收录。<strong>AI 搜索的检索层通常依赖一套网页索引</strong>，页面进不去索引，就等于没被写过。</p><p>常见原因：</p><ul><li>新域名，还没有任何外部链接指向你</li><li><code>sitemap.xml</code> 没提交，或者里面的地址和实际地址不一致</li><li>页面头部误加了 <code>noindex</code>，或者被 <code>robots.txt</code> 屏蔽后又忘了恢复</li><li>站点用了大量 JavaScript 渲染，抓取到的正文是空的</li></ul><p>验证与处理：</p><ol><li>用搜索引擎的 <code>site:你的域名</code> 查一下有没有页面被收录</li><li>在搜索平台的后台提交 <code>sitemap.xml</code>，观察抓取量的变化</li><li>确认页面源码里能看到完整正文，而不是只有一句"正在加载"</li></ol><p><strong>分类页、标签页也别忘。</strong> 这些聚合页往往是模型理解"这个站点在讲什么主题"的重要入口。</p><h2 id="原因三：内容被切成了没有主语的碎片"><a href="#原因三：内容被切成了没有主语的碎片" class="headerlink" title="原因三：内容被切成了没有主语的碎片"></a>原因三：内容被切成了没有主语的碎片</h2><p>索引会把页面切成若干片段再向量化。<strong>如果你的文章是一整坨没有小标题的长段落，每个片段都会语义混杂，跟任何具体问题的相似度都不高。</strong></p><p>判断标准很朴素：把任意一段单独摘出来，它还成立吗？</p><p>不成立的反例：</p><blockquote><p>综上所述，前面提到的这些方法在实践中都很重要，具体使用时还需要结合实际情况来判断。</p></blockquote><p>成立的正例：</p><blockquote><p>每个 <code>h2</code> 都写成一个判断句。片段脱离上下文时，标题是它唯一的语义锚点。</p></blockquote><p>可执行的做法：</p><ul><li>用 <code>h2</code> / <code>h3</code> 切分语义，<strong>单节控制在 200 到 500 字</strong></li><li>每节第一句就是这一节的结论，不要用"话不多说""众所周知"开场</li><li>一节只讲一件事，混装两个主题会让片段向量变得"平均"</li></ul><h2 id="原因四：你用的词和用户问的话对不上"><a href="#原因四：你用的词和用户问的话对不上" class="headerlink" title="原因四：你用的词和用户问的话对不上"></a>原因四：你用的词和用户问的话对不上</h2><p>检索的第一步是把用户的口语问题改写成多个检索式。<strong>如果你的用词和改写结果不一致，内容根本进不了候选集。</strong></p><p>同一个概念，用户可能说：</p><ul><li>GEO</li><li>生成式引擎优化</li><li>AI 搜索优化</li><li>让 AI 推荐我的网站</li></ul><p>如果你的文章标题只用其中一种，正文里也只出现一次，命中概率就只剩一份。</p><p>处理方式是统一但不生造：**标题用最主流的叫法，正文开头补上同义解释。**比如"GEO（生成式引擎优化，也叫 AI 搜索优化）"。别为了显得专业自创术语——除非你打算同时把定义写清楚。</p><h2 id="原因五：缺少可验证的身份和一致性"><a href="#原因五：缺少可验证的身份和一致性" class="headerlink" title="原因五：缺少可验证的身份和一致性"></a>原因五：缺少可验证的身份和一致性</h2><p>模型在生成答案时倾向于选择<strong>来源明确、可核查</strong>的内容。匿名站点不是不能引用，但需要更强的其他信号。</p><p>最低配的三件事：</p><ul><li>一个<strong>作者页</strong>，写清楚你是谁、在做什么</li><li>页面上的<strong>结构化数据</strong>，把文章、作者、站点关系显式声明</li><li>全站的<strong>名称、简介、头像保持一致</strong>，别每个平台一个说法</li></ul><p>三件事都不需要技术门槛，但很多人一个都没做。具体做法见<a href="/posts/structured-data-for-geo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《结构化数据怎么做才对 GEO 有用》</a>。</p><h2 id="原因六：时间不够，抓取和索引都需要周期"><a href="#原因六：时间不够，抓取和索引都需要周期" class="headerlink" title="原因六：时间不够，抓取和索引都需要周期"></a>原因六：时间不够，抓取和索引都需要周期</h2><p>**新域名从上线到稳定被抓取，通常要 2 到 6 周。**更新后的内容重新进入索引，也常常需要几天到几周。</p><p>这一点上最常见的错误是频繁改版：地址结构改了、标题改了、内容大改，等于让之前的抓取记录全部作废，周期从头开始。</p><p>如果前面五条都排查过没问题，剩下的通常就是等。<strong>稳定输出会比反复修改更快见效。</strong></p><h2 id="一张可以照着走的排查清单"><a href="#一张可以照着走的排查清单" class="headerlink" title="一张可以照着走的排查清单"></a>一张可以照着走的排查清单</h2><div class="md-table-scroll"><table><thead><tr><th>顺序</th><th>做什么</th><th>通过标准</th></tr></thead><tbody><tr><td>1</td><td>用 AI 爬虫 UA 请求首页和文章页</td><td>全部返回 200</td></tr><tr><td>2</td><td>查访问日志里的 AI 爬虫痕迹</td><td>最近两周有记录</td></tr><tr><td>3</td><td>搜 <code>site:你的域名</code></td><td>主要页面已被收录</td></tr><tr><td>4</td><td>检查小标题密度与段落长度</td><td>单节 200–500 字，首句是结论</td></tr><tr><td>5</td><td>对比标题用词与真实提问</td><td>主流叫法出现在标题或首段</td></tr><tr><td>6</td><td>检查作者页、结构化数据</td><td>存在且信息一致</td></tr><tr><td>7</td><td>记录时间</td><td>距离发布已超过 6 周再评估</td></tr></tbody></table></div><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="屏蔽了-GPTBot，会影响-ChatGPT-引用我的网站吗？"><a href="#屏蔽了-GPTBot，会影响-ChatGPT-引用我的网站吗？" class="headerlink" title="屏蔽了 GPTBot，会影响 ChatGPT 引用我的网站吗？"></a>屏蔽了 GPTBot，会影响 ChatGPT 引用我的网站吗？</h3><p>会，而且这是最常见的自伤操作。GPTBot 与 ChatGPT 的搜索抓取是两回事，用一条 <code>Disallow</code> 把整个 OpenAI 的爬虫拦掉，等于同时放弃了被引用的机会。正确做法是分开配置，只拦你确实不想被用于训练的那一类。</p><h3 id="内容质量明明不错，为什么还是不被引用？"><a href="#内容质量明明不错，为什么还是不被引用？" class="headerlink" title="内容质量明明不错，为什么还是不被引用？"></a>内容质量明明不错，为什么还是不被引用？</h3><p>先看抓取和索引，再看结构。实际排查中，卡在"抓不到"和"进不了索引"的比例远高于卡在"写得不好"。内容质量只有在前面几步都通了之后才会成为决定性因素。</p><h3 id="我的网站被引用过，但引用的是旧版本内容，怎么办？"><a href="#我的网站被引用过，但引用的是旧版本内容，怎么办？" class="headerlink" title="我的网站被引用过，但引用的是旧版本内容，怎么办？"></a>我的网站被引用过，但引用的是旧版本内容，怎么办？</h3><p>说明链路是通的，只是索引还没更新。更新文章时保留原地址、在显著位置标注更新时间，比新建一篇替换它更容易让索引快速刷新——新建地址会让已有引用断掉。</p><h3 id="需要多久才能看到效果？"><a href="#需要多久才能看到效果？" class="headerlink" title="需要多久才能看到效果？"></a>需要多久才能看到效果？</h3><p>新域名给自己 6 到 8 周，期间保持稳定输出、不要改地址结构。已有一定抓取量的站点，更新内容通常几天到两周内会反映在引用结果里。想系统跟踪这件事，可以参考<a href="/posts/measure-geo-results/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《怎么衡量 GEO 有没有效果》</a>。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>排查顺序是<strong>抓取 → 索引 → 切片 → 术语 → 信任 → 需求</strong>，别从改文章开始。</li><li>前两条能用命令直接验证，先验证再动手。</li><li>内容结构决定片段质量，单节 200–500 字、首句给结论。</li><li>用词跟主流叫法对齐，比自创术语更容易被检索到。</li><li>前面都通的情况下，剩余变量是时间。</li></ul><hr><p>如果你在自己站点上排查时卡在某一步，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>把现象和已经试过的方法写出来，一起看看更可能是哪一环断了。</p>]]></content>
    
    
    <summary type="html">内容写得不错，AI 搜索却从不引用你的站点。本文按抓取、索引、切片、术语、信任、时间六个环节逐一排查，每个原因都给出可以自己动手验证的方法。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="AI 搜索" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E6%90%9C%E7%B4%A2/"/>
    
    <category term="排查" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%8E%92%E6%9F%A5/"/>
    
    <category term="收录" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%94%B6%E5%BD%95/"/>
    
  </entry>
  
  <entry>
    <title>把 Hexo 博客部署到阿里云 ECS：Nginx + HTTPS 完整流程</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/deploy-hexo-to-aliyun/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/deploy-hexo-to-aliyun/</id>
    <published>2026-09-16T01:00:00.000Z</published>
    <updated>2026-09-16T01:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：把 Hexo 博客部署到阿里云 ECS 需要四步——<strong>域名解析到服务器、服务器装好 Nginx、本地构建后用 rsync 同步静态文件、申请 HTTPS 证书</strong>。整个过程可以固化成一个脚本，之后每次发布只需要一条命令。</p><span id="more"></span><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>开始之前需要确认四件事：</p><div class="md-table-scroll"><table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>一台 ECS 实例</td><td>1 核 2G 起步；系统选 Ubuntu 22.04 或 Alibaba Cloud Linux</td></tr><tr><td>备案</td><td>域名指向中国大陆服务器需要完成 ICP 备案</td></tr><tr><td>安全组</td><td>放行 80 和 443 端口（22 用于 SSH）</td></tr><tr><td>本地环境</td><td>能正常 <code>npm run build</code> 生成 <code>public/</code> 目录</td></tr></tbody></table></div><p><strong>备案是最容易被忽略的时间成本。</strong> 如果还没备案，建议先去走流程，等备案通过期间可以先把博客搭起来。</p><h2 id="一、域名解析"><a href="#一、域名解析" class="headerlink" title="一、域名解析"></a>一、域名解析</h2><p>在域名管理后台为博客添加一条记录：</p><div class="md-table-scroll"><table><thead><tr><th>记录类型</th><th>主机记录</th><th>记录值</th></tr></thead><tbody><tr><td>A</td><td><code>devnotes</code></td><td>你的 ECS 公网 IP</td></tr></tbody></table></div><p>生效后本机验证：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dig +short devnotes.cuiyuehui.cn</span><br><span class="line"><span class="comment"># 应该输出你的服务器 IP</span></span><br></pre></td></tr></tbody></table></figure><h2 id="二、服务器初始化"><a href="#二、服务器初始化" class="headerlink" title="二、服务器初始化"></a>二、服务器初始化</h2><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 Nginx 与同步工具</span></span><br><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install -y nginx rsync</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建站点目录</span></span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">mkdir</span> -p /var/www/devnotes</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">chown</span> -R <span class="variable">$USER</span>:<span class="variable">$USER</span> /var/www/devnotes</span><br><span class="line"></span><br><span class="line"><span class="comment"># 放行防火墙端口</span></span><br><span class="line"><span class="built_in">sudo</span> ufw allow <span class="string">'Nginx Full'</span></span><br><span class="line"><span class="built_in">sudo</span> ufw allow OpenSSH</span><br></pre></td></tr></tbody></table></figure><blockquote><p>阿里云还需要在控制台的<strong>安全组</strong>里放行 80 / 443，只配服务器内的防火墙是不够的。</p></blockquote><h2 id="三、Nginx-配置"><a href="#三、Nginx-配置" class="headerlink" title="三、Nginx 配置"></a>三、Nginx 配置</h2><p>创建 <code>/etc/nginx/conf.d/devnotes.conf</code>：</p><figure class="highlight nginx"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> {</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> devnotes.cuiyuehui.cn;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">root</span> /var/www/devnotes;</span><br><span class="line">    <span class="attribute">index</span> index.html;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 静态资源压缩，减少传输体积</span></span><br><span class="line">    <span class="attribute">gzip</span> <span class="literal">on</span>;</span><br><span class="line">    <span class="attribute">gzip_vary</span> <span class="literal">on</span>;</span><br><span class="line">    <span class="attribute">gzip_min_length</span> <span class="number">1024</span>;</span><br><span class="line">    <span class="attribute">gzip_types</span> text/plain text/css application/javascript application/json</span><br><span class="line">               application/xml image/svg+xml;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> / {</span><br><span class="line">        <span class="attribute">try_files</span> <span class="variable">$uri</span> <span class="variable">$uri</span>/ <span class="variable">$uri</span>/index.html =<span class="number">404</span>;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 带指纹的静态资源长期缓存，HTML 不缓存</span></span><br><span class="line">    <span class="section">location</span> <span class="regexp">~* \.(css|js|woff2?|png|jpg|jpeg|gif|svg|webp|ico)$</span> {</span><br><span class="line">        <span class="attribute">expires</span> <span class="number">30d</span>;</span><br><span class="line">        <span class="attribute">add_header</span> Cache-Control <span class="string">"public, immutable"</span>;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> <span class="regexp">~* \.html$</span> {</span><br><span class="line">        <span class="attribute">add_header</span> Cache-Control <span class="string">"no-cache"</span>;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 评论服务反向代理（可选，见第六节）</span></span><br><span class="line">    <span class="section">location</span> /comments/ {</span><br><span class="line">        <span class="attribute">proxy_pass</span> http://127.0.0.1:8360/;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Host <span class="variable">$host</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-Proto <span class="variable">$scheme</span>;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>检查并生效：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> nginx -t</span><br><span class="line"><span class="built_in">sudo</span> systemctl reload nginx</span><br></pre></td></tr></tbody></table></figure><h3 id="关于缓存的一个教训"><a href="#关于缓存的一个教训" class="headerlink" title="关于缓存的一个教训"></a>关于缓存的一个教训</h3><p>我一开始给所有文件都加了长缓存，结果每次发布新文章，读者看到的还是旧的首页。<strong>HTML 必须不缓存，带指纹的资源才应该长缓存。</strong> 上面配置里把 <code>.html</code> 单独设成 <code>no-cache</code>，就是踩了这个坑之后加上去的。</p><h2 id="四、申请-HTTPS-证书"><a href="#四、申请-HTTPS-证书" class="headerlink" title="四、申请 HTTPS 证书"></a>四、申请 HTTPS 证书</h2><p>用 Certbot 自动申请并配置续期：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install -y certbot python3-certbot-nginx</span><br><span class="line"><span class="built_in">sudo</span> certbot --nginx -d devnotes.cuiyuehui.cn</span><br></pre></td></tr></tbody></table></figure><p>Certbot 会自动改写 Nginx 配置、加上跳转，并注册一个定时续期任务。验证续期是否正常：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> certbot renew --dry-run</span><br></pre></td></tr></tbody></table></figure><p>也可以使用阿里云签发的免费证书，在控制台下载后手动配置 <code>ssl_certificate</code> 与 <code>ssl_certificate_key</code>，效果相同。</p><h2 id="五、部署脚本"><a href="#五、部署脚本" class="headerlink" title="五、部署脚本"></a>五、部署脚本</h2><p>在博客目录创建 <code>tools/deploy.sh</code>：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/usr/bin/env bash</span></span><br><span class="line"><span class="built_in">set</span> -euo pipefail</span><br><span class="line"></span><br><span class="line">SERVER=<span class="string">"root@your-server-ip"</span></span><br><span class="line">TARGET=<span class="string">"/var/www/devnotes/"</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"==&gt; 本地构建"</span></span><br><span class="line">npm run clean</span><br><span class="line">npm run build</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"==&gt; 同步到服务器"</span></span><br><span class="line">rsync -avz --delete \</span><br><span class="line">  --exclude <span class="string">'.DS_Store'</span> \</span><br><span class="line">  public/ <span class="string">"<span class="variable">${SERVER}</span>:<span class="variable">${TARGET}</span>"</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"==&gt; 完成，访问 https://devnotes.cuiyuehui.cn"</span></span><br></pre></td></tr></tbody></table></figure><p>几个关键参数：</p><div class="md-table-scroll"><table><thead><tr><th>参数</th><th>作用</th></tr></thead><tbody><tr><td><code>--delete</code></td><td>删除服务器上本地已不存在的文件，避免旧页面残留</td></tr><tr><td><code>-z</code></td><td>传输压缩，提升跨地域同步速度</td></tr><tr><td><code>--exclude</code></td><td>排除系统残留文件</td></tr></tbody></table></div><p>第一次部署前先做一次<strong>空跑</strong>确认删除范围：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rsync -avz --delete --dry-run public/ <span class="string">"<span class="variable">${SERVER}</span>:<span class="variable">${TARGET}</span>"</span></span><br></pre></td></tr></tbody></table></figure><p><code>--dry-run</code> 会列出所有将被删除的文件。<strong>在没有确认之前不要去掉这个参数</strong>——路径写错一个字符，可能删光整个目录。</p><h2 id="六、评论服务（可选）"><a href="#六、评论服务（可选）" class="headerlink" title="六、评论服务（可选）"></a>六、评论服务（可选）</h2><p>如果希望读者能直接留言，可以在同一台服务器上用 Docker 跑一套 Waline + MySQL。一份 <code>docker-compose.yml</code> 同时拉起两个容器，MySQL 不对外暴露端口：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># docker-compose.yml</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">db:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">mysql:8.0</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">    <span class="attr">command:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">--character-set-server=utf8mb4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">--collation-server=utf8mb4_unicode_ci</span></span><br><span class="line">      <span class="comment"># Waline 的 MySQL 驱动不支持 MySQL 8 默认的 caching_sha2_password 认证，</span></span><br><span class="line">      <span class="comment"># 不加这一行会报 ER_NOT_SUPPORTED_AUTH_MODE</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">--default-authentication-plugin=mysql_native_password</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="attr">MYSQL_ROOT_PASSWORD:</span> <span class="string">${MYSQL_ROOT_PASSWORD}</span></span><br><span class="line">      <span class="attr">MYSQL_DATABASE:</span> <span class="string">waline</span></span><br><span class="line">      <span class="attr">MYSQL_USER:</span> <span class="string">waline</span></span><br><span class="line">      <span class="attr">MYSQL_PASSWORD:</span> <span class="string">${MYSQL_PASSWORD}</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./mysql-data:/var/lib/mysql</span></span><br><span class="line">      <span class="comment"># 首次启动自动导入表结构</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./waline.sql:/docker-entrypoint-initdb.d/10-waline.sql:ro</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">waline:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">lizheming/waline:latest</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="attr">db:</span></span><br><span class="line">        <span class="attr">condition:</span> <span class="string">service_healthy</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"127.0.0.1:8360:8360"</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="attr">SITE_NAME:</span> <span class="string">DevNotes</span></span><br><span class="line">      <span class="attr">SITE_URL:</span> <span class="string">https://devnotes.cuiyuehui.cn</span></span><br><span class="line">      <span class="attr">MYSQL_HOST:</span> <span class="string">db</span></span><br><span class="line">      <span class="attr">MYSQL_PORT:</span> <span class="string">"3306"</span></span><br><span class="line">      <span class="attr">MYSQL_DB:</span> <span class="string">waline</span></span><br><span class="line">      <span class="attr">MYSQL_USER:</span> <span class="string">waline</span></span><br><span class="line">      <span class="attr">MYSQL_PASSWORD:</span> <span class="string">${MYSQL_PASSWORD}</span></span><br><span class="line">      <span class="comment"># 必填，否则容器起不来。生成方式：openssl rand -hex 24</span></span><br><span class="line">      <span class="attr">JWT_TOKEN:</span> <span class="string">${JWT_TOKEN}</span></span><br><span class="line">      <span class="attr">SECURE_DOMAINS:</span> <span class="string">devnotes.cuiyuehui.cn</span></span><br></pre></td></tr></tbody></table></figure><p>密码不要写在 compose 文件里，放在同目录的 <code>.env</code>（记得加进 <code>.gitignore</code>）：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">MYSQL_ROOT_PASSWORD=随机串</span><br><span class="line">MYSQL_PASSWORD=另一个随机串</span><br><span class="line">JWT_TOKEN=随机串</span><br></pre></td></tr></tbody></table></figure><p><strong>Waline 自己不会建表。</strong> 需要把官方的 <a href="https://github.com/walinejs/waline/blob/main/assets/waline.sql" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>waline.sql</a>放在 compose 同目录，MySQL 首次初始化时会自动导入，建出<code>wl_Comment</code> / <code>wl_Counter</code> / <code>wl_Users</code> 三张表。少了它，接口会直接返回<code>500 no such table: wl_Comment</code>——这是我在本地实测时踩到的第一个坑。</p><p>配合前面 Nginx 里的 <code>/comments/</code> 反代，前端配置只需要填：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">comments:</span></span><br><span class="line">  <span class="attr">provider:</span> <span class="string">waline</span></span><br><span class="line">  <span class="attr">waline:</span></span><br><span class="line">    <span class="attr">serverURL:</span> <span class="string">https://devnotes.cuiyuehui.cn/comments</span></span><br></pre></td></tr></tbody></table></figure><p><strong>同域反代的好处是不用处理跨域，也不需要再申请一个子域名和证书。</strong></p><p>部署完记得打开 <code>https://devnotes.cuiyuehui.cn/comments/ui/register</code> 注册管理员账号——<strong>第一个注册的账号自动成为管理员</strong>，注册后建议关闭注册入口。</p><h2 id="七、备份"><a href="#七、备份" class="headerlink" title="七、备份"></a>七、备份</h2><p>静态站点本身不需要备份（源文件在 Git 里），但有两样东西要定期备份：评论数据库、Nginx 与证书配置。</p><p>留言在 MySQL 里，用 <code>mysqldump</code> 导出成压缩文件，每天备份一次并只保留最近 14 天。<code>--single-transaction</code> 保证备份期间不锁表，服务不用停：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/usr/bin/env bash</span></span><br><span class="line"><span class="built_in">set</span> -euo pipefail</span><br><span class="line"></span><br><span class="line"><span class="built_in">source</span> /opt/waline/.env          <span class="comment"># 读取 MYSQL_USER / MYSQL_PASSWORD / MYSQL_DB</span></span><br><span class="line">BACKUP_DIR=<span class="string">"/backup/waline"</span></span><br><span class="line"><span class="built_in">mkdir</span> -p <span class="string">"<span class="variable">${BACKUP_DIR}</span>"</span></span><br><span class="line"></span><br><span class="line">TARGET=<span class="string">"<span class="variable">${BACKUP_DIR}</span>/waline-<span class="subst">$(date +%F_%H%M)</span>.sql.gz"</span></span><br><span class="line">docker <span class="built_in">exec</span> devnotes-waline-mysql \</span><br><span class="line">  mysqldump -u<span class="string">"<span class="variable">${MYSQL_USER}</span>"</span> -p<span class="string">"<span class="variable">${MYSQL_PASSWORD}</span>"</span> \</span><br><span class="line">  --single-transaction --default-character-set=utf8mb4 <span class="string">"<span class="variable">${MYSQL_DB}</span>"</span> \</span><br><span class="line">  | gzip &gt; <span class="string">"<span class="variable">${TARGET}</span>"</span></span><br><span class="line"></span><br><span class="line">find <span class="string">"<span class="variable">${BACKUP_DIR}</span>"</span> -<span class="built_in">type</span> f -name <span class="string">'waline-*.sql.gz'</span> -mtime +14 -delete</span><br></pre></td></tr></tbody></table></figure><p>恢复时把备份解开灌回去即可：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">gunzip -c /backup/waline/waline-2026-09-20_0300.sql.gz \</span><br><span class="line">  | docker <span class="built_in">exec</span> -i devnotes-waline-mysql mysql -uwaline -p你的密码 waline</span><br></pre></td></tr></tbody></table></figure><blockquote><p><code>waline.sql</code>、<code>docker-compose.yml</code>、<code>backup-waline.sh</code> 这几个文件在仓库的 <code>deploy/waline/</code> 目录里都有现成的，不用自己敲。</p></blockquote><h2 id="踩坑记录"><a href="#踩坑记录" class="headerlink" title="踩坑记录"></a>踩坑记录</h2><div class="md-table-scroll"><table><thead><tr><th>现象</th><th>原因</th><th>解决</th></tr></thead><tbody><tr><td>部署后访问 403</td><td>目录权限或 SELinux 限制</td><td>确认 Nginx 用户可读；必要时调整 SELinux 策略</td></tr><tr><td>首页一直是旧内容</td><td>HTML 被长缓存</td><td>对 <code>.html</code> 设置 <code>no-cache</code></td></tr><tr><td>新文章 404</td><td>构建失败或同步遗漏</td><td>检查 <code>public/</code> 里是否真的生成了文件</td></tr><tr><td>证书续期失败</td><td>80 端口被别的服务占用</td><td>释放 80 端口后重跑 <code>certbot renew</code></td></tr><tr><td>部署很慢</td><td>每次都全量传输</td><td>使用 <code>-z</code> 并确认增量同步生效</td></tr><tr><td>留言接口返回 500 <code>ER_NOT_SUPPORTED_AUTH_MODE</code></td><td>MySQL 账号用了 <code>caching_sha2_password</code> 认证，Waline 的驱动不支持</td><td>MySQL 启动参数加上 <code>--default-authentication-plugin=mysql_native_password</code></td></tr><tr><td>留言接口返回 500 <code>no such table</code></td><td>没有导入建表脚本</td><td>把官方 <code>waline.sql</code> 放进 compose 同目录，MySQL 首次启动会自动导入</td></tr></tbody></table></div><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="静态博客需要多大配置的服务器？"><a href="#静态博客需要多大配置的服务器？" class="headerlink" title="静态博客需要多大配置的服务器？"></a>静态博客需要多大配置的服务器？</h3><p>1 核 2G 足够。Nginx 服务静态文件的资源消耗极低，一台最低配的 ECS 可以轻松支撑每天数千次访问。真正吃资源的是评论服务，如果需要自建 Waline 并启用数据库，建议 2 核 4G 起步。</p><h3 id="为什么要用-rsync-而不是直接覆盖目录？"><a href="#为什么要用-rsync-而不是直接覆盖目录？" class="headerlink" title="为什么要用 rsync 而不是直接覆盖目录？"></a>为什么要用 rsync 而不是直接覆盖目录？</h3><p>rsync 只传输变化过的文件，一次增量发布通常只需要几秒，而且不会把没在本地生成的文件误删。直接覆盖目录在文件多的时候会明显变慢，也容易留下旧文件。</p><h3 id="部署后访问出现-403-或-404-是什么原因？"><a href="#部署后访问出现-403-或-404-是什么原因？" class="headerlink" title="部署后访问出现 403 或 404 是什么原因？"></a>部署后访问出现 403 或 404 是什么原因？</h3><p>绝大多数是 Nginx 的 <code>root</code> 路径指向错误，或者文件权限不对。先确认 <code>root</code> 指向的目录里确实有 <code>index.html</code>，再确认 Nginx 运行用户对该目录有读取权限。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>顺序是：解析 → 装 Nginx → 同步文件 → 上证书。</li><li>缓存策略记住一条：<strong>HTML 不缓存，带指纹的资源长缓存</strong>。</li><li>用 rsync 增量同步，改动后用 <code>--dry-run</code> 确认。</li><li>同域反代评论服务，省掉跨域和第二个证书。</li></ul><p>完整的配置文件和脚本都在本站的 <code>deploy/</code> 与 <code>tools/</code> 目录里，可以直接取用。部署过程中卡在哪一步，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>说说具体报错。</p><p>如果站点还没搭起来，先看<a href="/posts/build-geo-blog-with-hexo-stellar/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《用 Hexo + Stellar 搭一个对 AI 友好的技术博客》</a>；如果之后要改地址结构，注意看<a href="/posts/url-change-keep-ai-citations/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《站点改版后 URL 变了，怎么保住已有的引用》</a>。</p>]]></content>
    
    
    <summary type="html">从域名解析、服务器初始化，到 Nginx 配置、HTTPS 证书、一键部署脚本与自动备份，一份可以直接照着做的部署清单，包含全部配置文件和踩坑记录。</summary>
    
    
    
    <category term="建站与部署" scheme="https://devnotes.cuiyuehui.cn/categories/%E5%BB%BA%E7%AB%99%E4%B8%8E%E9%83%A8%E7%BD%B2/"/>
    
    
    <category term="阿里云" scheme="https://devnotes.cuiyuehui.cn/tags/%E9%98%BF%E9%87%8C%E4%BA%91/"/>
    
    <category term="Nginx" scheme="https://devnotes.cuiyuehui.cn/tags/Nginx/"/>
    
    <category term="HTTPS" scheme="https://devnotes.cuiyuehui.cn/tags/HTTPS/"/>
    
    <category term="部署" scheme="https://devnotes.cuiyuehui.cn/tags/%E9%83%A8%E7%BD%B2/"/>
    
  </entry>
  
  <entry>
    <title>用 Hexo + Stellar 搭一个 GEO 友好的技术博客</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/build-geo-blog-with-hexo-stellar/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/build-geo-blog-with-hexo-stellar/</id>
    <published>2026-09-14T01:00:00.000Z</published>
    <updated>2026-09-14T01:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：本站用 Hexo 8 + Stellar 主题搭建，GEO 相关的关键改动只有三处——<strong>用英文固定链接保证 URL 可引用、用生成脚本自动产出 <code>llms.txt</code> 与结构化数据、用清晰的分类和专栏构建主题聚类</strong>。主题本身不需要改源码。</p><span id="more"></span><h2 id="为什么是-Hexo-Stellar"><a href="#为什么是-Hexo-Stellar" class="headerlink" title="为什么是 Hexo + Stellar"></a>为什么是 Hexo + Stellar</h2><p>选型理由其实很简单：</p><div class="md-table-scroll"><table><thead><tr><th>需求</th><th>Hexo + Stellar 的处理方式</th></tr></thead><tbody><tr><td>输出必须是纯静态 HTML</td><td>Hexo 生成的 <code>public/</code> 就是静态文件</td></tr><tr><td>要能写作、要好看</td><td>Stellar 提供完整的排版、代码块、图片灯箱、搜索</td></tr><tr><td>希望长期可维护</td><td>全部是 Markdown + YAML，没有数据库</td></tr><tr><td>部署到自己的服务器</td><td>生成后直接同步目录即可</td></tr></tbody></table></div><p>我不需要 CMS，也不需要在线编辑。<strong>写作流程应该只有一件事：新建一个 Markdown 文件，写完推送。</strong></p><h2 id="目录结构"><a href="#目录结构" class="headerlink" title="目录结构"></a>目录结构</h2><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">blog/</span><br><span class="line">├── _config.yml              站点配置（网址、链接格式、插件）</span><br><span class="line">├── _config.stellar.yml      主题配置（布局、颜色、评论、注入）</span><br><span class="line">├── scripts/</span><br><span class="line">│   └── geo.js               GEO 生成器：robots.txt / llms.txt / 结构化数据</span><br><span class="line">├── source/</span><br><span class="line">│   ├── _posts/              文章</span><br><span class="line">│   ├── _data/</span><br><span class="line">│   │   ├── authors.yml      作者档案</span><br><span class="line">│   │   ├── widgets.yml      自定义侧栏组件</span><br><span class="line">│   │   └── topic/           专栏定义</span><br><span class="line">│   ├── about/index.md       关于页</span><br><span class="line">│   ├── message/index.md     留言板</span><br><span class="line">│   └── images/              图片资源</span><br><span class="line">└── tools/                   部署与辅助脚本</span><br></pre></td></tr></tbody></table></figure><p><strong>把内容、配置、脚本分开放，是长期维护的前提。</strong> 主题升级时只需要替换 <code>node_modules</code> 里的包，自己的内容一点不受影响。</p><h2 id="三处对-GEO-真正有影响的设置"><a href="#三处对-GEO-真正有影响的设置" class="headerlink" title="三处对 GEO 真正有影响的设置"></a>三处对 GEO 真正有影响的设置</h2><h3 id="一、固定链接改成英文路径"><a href="#一、固定链接改成英文路径" class="headerlink" title="一、固定链接改成英文路径"></a>一、固定链接改成英文路径</h3><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># _config.yml</span></span><br><span class="line"><span class="attr">permalink:</span> <span class="string">posts/:title/</span></span><br><span class="line"><span class="attr">pretty_urls:</span></span><br><span class="line">  <span class="attr">trailing_index:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">trailing_html:</span> <span class="literal">false</span></span><br></pre></td></tr></tbody></table></figure><p>文章文件名用英文，标题仍写中文：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">source/_posts/what-is-geo.md   → https://devnotes.cuiyuehui.cn/posts/what-is-geo/</span><br></pre></td></tr></tbody></table></figure><p>这样做的好处：</p><ul><li>URL 里没有中文编码，复制、分享、被引用时不会出错。</li><li>去掉 <code>index.html</code> 和 <code>.html</code> 后缀，链接更短。</li><li>路径稳定，<strong>已发布的 URL 不再改动</strong>，避免丢失已有的引用积累。</li></ul><h3 id="二、用脚本自动生成-llms-txt"><a href="#二、用脚本自动生成-llms-txt" class="headerlink" title="二、用脚本自动生成 llms.txt"></a>二、用脚本自动生成 llms.txt</h3><p>手工维护 <code>llms.txt</code> 一定会忘记更新。本站的做法是在 <code>scripts/geo.js</code> 里注册一个生成器：</p><figure class="highlight js"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">hexo.<span class="property">extend</span>.<span class="property">generator</span>.<span class="title function_">register</span>(<span class="string">"geo_llms_txt"</span>, <span class="keyword">function</span> (<span class="params">locals</span>) {</span><br><span class="line">  <span class="keyword">const</span> posts = locals.<span class="property">posts</span>.<span class="title function_">sort</span>(<span class="string">"-date"</span>).<span class="title function_">toArray</span>();</span><br><span class="line">  <span class="comment">// ... 组装标题、简介、分组链接</span></span><br><span class="line">  <span class="keyword">return</span> { <span class="attr">path</span>: <span class="string">"llms.txt"</span>, <span class="attr">data</span>: lines.<span class="title function_">join</span>(<span class="string">"\n"</span>) };</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><p>每次构建都会重新生成，同时输出完整正文版的 <code>llms-full.txt</code>。效果可以直接查看 <a href="/llms.txt" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>llms.txt</a>。</p><h3 id="三、结构化数据自动注入"><a href="#三、结构化数据自动注入" class="headerlink" title="三、结构化数据自动注入"></a>三、结构化数据自动注入</h3><p>主题已经输出了 <code>BlogPosting</code>。我在 <code>scripts/geo.js</code> 里补了两类：</p><ul><li><strong>BreadcrumbList</strong>：让机器知道这篇文章属于哪个分类。</li><li><strong>FAQPage</strong>：文章的问答对直接写在前面的 front matter 里。</li></ul><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">faq:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">q:</span> <span class="string">为什么用静态博客而不是</span> <span class="string">WordPress？</span></span><br><span class="line">    <span class="attr">a:</span> <span class="string">静态博客输出纯</span> <span class="string">HTML，不依赖后端渲染，抓取时不会出现空壳页面。</span></span><br></pre></td></tr></tbody></table></figure><h2 id="站点结构：为-GEO-设计的信息架构"><a href="#站点结构：为-GEO-设计的信息架构" class="headerlink" title="站点结构：为 GEO 设计的信息架构"></a>站点结构：为 GEO 设计的信息架构</h2><p>内容组织方式对 GEO 的影响经常被忽略。本站的结构是：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">/                       首页（文章列表）</span><br><span class="line">/categories/            分类</span><br><span class="line">/tags/                  标签</span><br><span class="line">/topic/                 专栏索引</span><br><span class="line">/topic/geo/             GEO 方法论专栏</span><br><span class="line">/topic/geo-platform/    GEO 平台搭建专栏</span><br><span class="line">/about/                 关于作者</span><br><span class="line">/message/               留言板</span><br><span class="line">/llms.txt               给模型的站点导览</span><br><span class="line">/sitemap.xml            站点地图</span><br></pre></td></tr></tbody></table></figure><p>三个设计考量：</p><ol><li><strong>专栏承担主题聚类。</strong> 同类文章聚在一个专栏下，比散落在时间线里更容易被识别为完整主题。</li><li><strong>作者页负责说清楚"这是谁写的"。</strong> 读者看完一篇有用的文章，通常会想确认作者靠不靠谱，作者页要能正面回答这件事。</li><li><strong>留言板是唯一的交流入口。</strong> 不加复杂的表单，减少放弃率。</li></ol><h2 id="内容写作规范（本站自用）"><a href="#内容写作规范（本站自用）" class="headerlink" title="内容写作规范（本站自用）"></a>内容写作规范（本站自用）</h2><p>写每篇文章时遵守这几条，已经固化成模板：</p><div class="md-table-scroll"><table><thead><tr><th>规则</th><th>原因</th></tr></thead><tbody><tr><td>开头 3 行给完整结论</td><td>这是最容易被摘取的片段</td></tr><tr><td>每个 <code>h2</code> 都是判断句</td><td>让每个片段自带语义锚点</td></tr><tr><td>一节只讲一件事</td><td>避免切分时主题混杂</td></tr><tr><td>写清适用边界</td><td>提升可信度与可核查性</td></tr><tr><td>文末附 FAQ</td><td>直接产出可被引用的问答对</td></tr><tr><td>引用外部来源</td><td>让结论有路标</td></tr></tbody></table></div><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="为什么用静态博客而不是-WordPress？"><a href="#为什么用静态博客而不是-WordPress？" class="headerlink" title="为什么用静态博客而不是 WordPress？"></a>为什么用静态博客而不是 WordPress？</h3><p>静态博客的输出就是纯 HTML，不依赖后端渲染和数据库，抓取时不会出现空壳页面，正好满足 GEO 的第一层要求。同时部署简单、成本低、几乎没有被打穿的风险，对个人技术博客足够。</p><h3 id="Stellar-主题需要改很多代码吗？"><a href="#Stellar-主题需要改很多代码吗？" class="headerlink" title="Stellar 主题需要改很多代码吗？"></a>Stellar 主题需要改很多代码吗？</h3><p>基本不需要。它提供了完整的配置项，布局、颜色、侧栏组件都可以用 YAML 配置完成。本站只额外写了一个构建脚本用来生成 <code>llms.txt</code> 和注入结构化数据，没有修改主题源码，这样主题升级时不会有冲突。</p><h3 id="文章链接该用什么形式？"><a href="#文章链接该用什么形式？" class="headerlink" title="文章链接该用什么形式？"></a>文章链接该用什么形式？</h3><p>用英文文件名的固定链接，例如 <code>/posts/what-is-geo/</code>。中文标题不变但路径保持 ASCII，既避免编码问题，也让链接更短、更容易被引用。已发布文章的路径不要改动。</p><h2 id="下一篇"><a href="#下一篇" class="headerlink" title="下一篇"></a>下一篇</h2><p>站点生成好之后，就该放到服务器上了：<a href="/posts/deploy-hexo-to-aliyun/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《把 Hexo 博客部署到阿里云 ECS：Nginx + HTTPS 完整流程》</a>。</p>]]></content>
    
    
    <summary type="html">本站的完整搭建记录：站点结构怎么规划、Stellar 主题怎么配置、llms.txt 与结构化数据怎么自动生成，以及哪些设置对 GEO 真正有影响。</summary>
    
    
    
    <category term="建站与部署" scheme="https://devnotes.cuiyuehui.cn/categories/%E5%BB%BA%E7%AB%99%E4%B8%8E%E9%83%A8%E7%BD%B2/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="Hexo" scheme="https://devnotes.cuiyuehui.cn/tags/Hexo/"/>
    
    <category term="Stellar" scheme="https://devnotes.cuiyuehui.cn/tags/Stellar/"/>
    
    <category term="建站" scheme="https://devnotes.cuiyuehui.cn/tags/%E5%BB%BA%E7%AB%99/"/>
    
  </entry>
  
  <entry>
    <title>自建 GEO 平台（三）：AI 收录监测与效果度量</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/geo-platform-visibility-monitor/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/geo-platform-visibility-monitor/</id>
    <published>2026-09-12T01:00:00.000Z</published>
    <updated>2026-09-15T06:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：AI 收录监测的可行做法只有一条——<strong>用固定问题集在多个平台定期采样，解析答案中的引用与提及，再做趋势分析</strong>。难点不在调用接口，而在问题集设计、判定规则和长期一致性。</p><span id="more"></span><h2 id="为什么这件事必须自己建"><a href="#为什么这件事必须自己建" class="headerlink" title="为什么这件事必须自己建"></a>为什么这件事必须自己建</h2><p>搜索引擎有 Search Console 这类工具告诉你"被展示了多少次、被点击了多少次"。<strong>AI 搜索目前没有等价物。</strong></p><p>这意味着两件事：</p><ol><li>你无法直接知道自己的内容有没有进过 AI 的答案。</li><li>唯一的办法是<strong>站到用户的位置去提问</strong>，然后看模型回答里有没有你。</li></ol><p>这本质上是抽样统计。抽样就要接受误差，所以设计上必须保证：样本固定、周期固定、判定规则固定。</p><h2 id="监测链路"><a href="#监测链路" class="headerlink" title="监测链路"></a>监测链路</h2><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">问题集（固定 20-50 条）</span><br><span class="line">        ↓</span><br><span class="line">任务调度（多平台 × 多问题）</span><br><span class="line">        ↓</span><br><span class="line">答案与来源解析</span><br><span class="line">        ↓</span><br><span class="line">引用判定 ──→ 命中：记录文章、位置、上下文</span><br><span class="line">        └→ 提及：记录品牌名、无链接</span><br><span class="line">        ↓</span><br><span class="line">趋势看板 + 报告</span><br></pre></td></tr></tbody></table></figure><h2 id="一、问题集怎么设计"><a href="#一、问题集怎么设计" class="headerlink" title="一、问题集怎么设计"></a>一、问题集怎么设计</h2><p>问题集是整个监测系统的基准，改一次就要重新累计趋势，所以要慎重。</p><h3 id="三类问题配比"><a href="#三类问题配比" class="headerlink" title="三类问题配比"></a>三类问题配比</h3><div class="md-table-scroll"><table><thead><tr><th>类型</th><th>占比</th><th>例子</th><th>作用</th></tr></thead><tbody><tr><td>品牌类</td><td>20%</td><td>"DevNotes 是什么"</td><td>检验品牌认知</td></tr><tr><td>主题类</td><td>50%</td><td>"GEO 和 SEO 有什么区别"</td><td>检验内容引用</td></tr><tr><td>长尾类</td><td>30%</td><td>"小站怎么让 AI 引用自己的文章"</td><td>检验细分覆盖</td></tr></tbody></table></div><h3 id="写作要求"><a href="#写作要求" class="headerlink" title="写作要求"></a>写作要求</h3><ul><li><strong>用完整自然语言问句</strong>，模拟真实提问，而不是关键词堆叠。</li><li><strong>一个问题只问一件事</strong>，避免"GEO 是什么、怎么做、多久见效"这种复合问题。</li><li><strong>至少保留 5 个长期不变的问题</strong>，作为跨年的基线。</li></ul><h2 id="二、任务调度"><a href="#二、任务调度" class="headerlink" title="二、任务调度"></a>二、任务调度</h2><p>调度层要解决三件事：别把平台的额度打爆、别被限流、失败要能重试。</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 伪代码：多平台采样调度</span></span><br><span class="line"><span class="keyword">for</span> question <span class="keyword">in</span> question_set:</span><br><span class="line">    <span class="keyword">for</span> platform <span class="keyword">in</span> platforms:</span><br><span class="line">        task = enqueue(</span><br><span class="line">            platform=platform,</span><br><span class="line">            question=question,</span><br><span class="line">            priority=question.weight,      <span class="comment"># 品牌类优先</span></span><br><span class="line">            timeout=<span class="number">90</span>,</span><br><span class="line">            retries=<span class="number">2</span>,</span><br><span class="line">        )</span><br></pre></td></tr></tbody></table></figure><p>几个实际参数：</p><div class="md-table-scroll"><table><thead><tr><th>参数</th><th>取值</th><th>说明</th></tr></thead><tbody><tr><td>单平台并发</td><td>1-2</td><td>避免触发限流</td></tr><tr><td>单次超时</td><td>90 秒</td><td>联网检索通常比纯生成慢</td></tr><tr><td>失败重试</td><td>2 次，间隔 30s</td><td>超过则记录为"未采样"，不等于"未引用"</td></tr><tr><td>调度周期</td><td>双周</td><td>频率与人工检查节奏匹配</td></tr></tbody></table></div><p><strong>"未采样"和"未引用"必须分开记录。</strong> 早期版本我把超时直接算作未引用，导致趋势图上出现大量虚假下跌。</p><h2 id="三、引用判定"><a href="#三、引用判定" class="headerlink" title="三、引用判定"></a>三、引用判定</h2><p>这是整套系统里最容易做错的部分。判定分成三级：</p><div class="md-table-scroll"><table><thead><tr><th>级别</th><th>判定方式</th><th>置信度</th></tr></thead><tbody><tr><td>强引用</td><td>答案的来源列表里出现目标域名</td><td>高</td></tr><tr><td>弱引用</td><td>答案正文提到品牌名或文章标题，但无链接</td><td>中</td></tr><tr><td>无</td><td>两者都没有</td><td>—</td></tr></tbody></table></div><p>判定规则要处理几种边界情况：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">① 域名匹配要区分主域与子域      → 用 eTLD+1 比较，避免误判</span><br><span class="line">② 短域名容易误伤                → 长度小于 5 的域名要求同时匹配标题</span><br><span class="line">③ 品牌名可能有别名              → 维护别名表，如 "DevNotes" / "Dev Notes"</span><br><span class="line">④ 同一答案引用多篇              → 每篇分别计数，不做去重</span><br></pre></td></tr></tbody></table></figure><h3 id="抽检机制"><a href="#抽检机制" class="headerlink" title="抽检机制"></a>抽检机制</h3><p>再好的自动规则也会有误差。我的做法是<strong>每次采样后人工抽检 10%</strong>：如果抽检发现误判率超过 5%，就调整规则并重新计算历史数据。</p><h2 id="四、趋势看板"><a href="#四、趋势看板" class="headerlink" title="四、趋势看板"></a>四、趋势看板</h2><p>看板只放几个真正会用来做决策的指标，避免变成一个没人看的仪表盘：</p><div class="md-table-scroll"><table><thead><tr><th>指标</th><th>定义</th><th>用途</th></tr></thead><tbody><tr><td>引用率</td><td>强引用次数 / 有效采样次数</td><td>判断整体可见性</td></tr><tr><td>提及率</td><td>（强引用 + 弱引用）/ 有效采样次数</td><td>判断品牌认知</td></tr><tr><td>平台覆盖数</td><td>至少被引用过一次的平台数量</td><td>判断投放广度</td></tr><tr><td>新增被引用页面</td><td>本次新出现的被引用 URL</td><td>指导后续内容方向</td></tr><tr><td>失守页面</td><td>上次被引用、本次不再出现</td><td>提示内容需要更新</td></tr></tbody></table></div><p><strong>"失守页面"这个指标特别有用。</strong> 它通常意味着对应内容已经不够新，或者被更完整的竞品内容替代了，是最直接的更新信号。</p><h2 id="实测成本与准确率"><a href="#实测成本与准确率" class="headerlink" title="实测成本与准确率"></a>实测成本与准确率</h2><p>跑了一个季度的实际数据：</p><div class="md-table-scroll"><table><thead><tr><th>项目</th><th>数值</th></tr></thead><tbody><tr><td>问题数 × 平台数</td><td>50 × 5</td></tr><tr><td>单次采样查询数</td><td>250</td></tr><tr><td>单次采样耗时</td><td>约 18 分钟</td></tr><tr><td>单次 API 成本</td><td>十几元</td></tr><tr><td>全年成本</td><td>三百元以内</td></tr><tr><td>强引用判定准确率</td><td>约 96%（人工抽检 200 条）</td></tr><tr><td>弱引用判定准确率</td><td>约 88%</td></tr></tbody></table></div><p><strong>准确率的关键在于承认不确定性。</strong> 报告里我始终同时给出采样量和置信提示，而不是把抽样结果包装成精确数字。</p><h2 id="这份数据接下来怎么用"><a href="#这份数据接下来怎么用" class="headerlink" title="这份数据接下来怎么用"></a>这份数据接下来怎么用</h2><p>监测本身不产生价值，<strong>由监测驱动的动作才产生价值</strong>：</p><ol><li>某个问题从没被引用 → 说明缺少对应内容，补一篇。</li><li>某篇文章被引用但内容过时 → 更新，并修改 <code>dateModified</code>。</li><li>某个平台完全没引用 → 检查该平台更偏好什么类型的内容。</li><li>竞品被引用而你没有 → 对比它在同一问题下的内容结构。</li></ol><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="为什么不能用接口直接拿到引用数据？"><a href="#为什么不能用接口直接拿到引用数据？" class="headerlink" title="为什么不能用接口直接拿到引用数据？"></a>为什么不能用接口直接拿到引用数据？</h3><p>因为主流 AI 搜索产品都没有面向第三方的引用统计接口。要判断某篇文章是否被引用，只能主动提交问题、解析返回的答案与来源列表。这套方法本质上是抽样统计，所以在报告里必须同时给出采样量和置信区间。</p><h3 id="采样成本大概是多少？"><a href="#采样成本大概是多少？" class="headerlink" title="采样成本大概是多少？"></a>采样成本大概是多少？</h3><p>以 50 个问题、5 个平台、每两周一次为例，单次采样约 250 次查询。如果用带联网检索的 API，单次成本在几元到几十元量级，一年下来通常在几百元以内，远低于人工检查的时间成本。</p><h3 id="引用判定怎么做得更准？"><a href="#引用判定怎么做得更准？" class="headerlink" title="引用判定怎么做得更准？"></a>引用判定怎么做得更准？</h3><p>分三步：先用域名匹配判断是否指向目标站点，再用标题和关键句相似度确认引用的是哪一篇，最后人工抽检 10% 的结果修正规则。纯域名匹配会漏掉品牌提及，纯文本匹配会误判。</p><h2 id="专栏小结"><a href="#专栏小结" class="headerlink" title="专栏小结"></a>专栏小结</h2><p>三篇文章覆盖了自建 GEO 平台的完整路径：</p><ul><li><a href="/posts/geo-platform-architecture/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>架构与技术选型</a>：先确定边界，再选组件。</li><li><a href="/posts/geo-platform-collect-pipeline/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>内容采集与结构化</a>：把网页变成可检索的片段。</li><li>本文：把"有没有被引用"变成可追踪的指标。</li></ul><p>如果你自己也在做收录监测，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>聊聊你的判定规则——"什么算被引用"这件事目前没有标准答案，多几个样本会更有意思。</p>]]></content>
    
    
    <summary type="html">AI 搜索没有公开的引用统计接口，只能靠采样。本文讲清问题集设计、多平台任务调度、引用判定规则与趋势看板的实现，并给出成本与准确率的实际数据。</summary>
    
    
    
    <category term="GEO 平台实战" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%B9%B3%E5%8F%B0%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="GEO 平台" scheme="https://devnotes.cuiyuehui.cn/tags/GEO-%E5%B9%B3%E5%8F%B0/"/>
    
    <category term="监测" scheme="https://devnotes.cuiyuehui.cn/tags/%E7%9B%91%E6%B5%8B/"/>
    
    <category term="数据度量" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%95%B0%E6%8D%AE%E5%BA%A6%E9%87%8F/"/>
    
  </entry>
  
  <entry>
    <title>自建 GEO 平台（二）：内容采集与结构化流水线</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/geo-platform-collect-pipeline/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/geo-platform-collect-pipeline/</id>
    <published>2026-09-07T01:00:00.000Z</published>
    <updated>2026-09-07T01:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：采集流水线的核心不是"抓下来"，而是<strong>把网页变成一条条语义完整、可独立检索的片段</strong>。可落地的流程是五步：抓取 → 正文提取 → 按标题切分 → 质量打分 → 结构化与向量入库，并配套一套失败降级策略。</p><span id="more"></span><h2 id="流水线全貌"><a href="#流水线全貌" class="headerlink" title="流水线全貌"></a>流水线全貌</h2><p><img src="/images/geo-pipeline.svg" alt="内容采集与结构化流水线：抓取、正文提取、标题切分、质量打分、入库"></p><p>五个环节里，<strong>"标题切分"是对最终效果影响最大的一步</strong>，也是最容易被草率处理的一步。下面逐个说明。</p><h2 id="一、抓取：先解决-能不能进得来"><a href="#一、抓取：先解决-能不能进得来" class="headerlink" title="一、抓取：先解决&quot;能不能进得来&quot;"></a>一、抓取：先解决"能不能进得来"</h2><p>抓取环节的关键约束不是速度，而是<strong>不被封、不浪费时间</strong>。</p><p>我用的是这套参数：</p><div class="md-table-scroll"><table><thead><tr><th>参数</th><th>取值</th><th>理由</th></tr></thead><tbody><tr><td>单域名并发</td><td>2</td><td>兼顾效率和礼貌性，降低被封概率</td></tr><tr><td>请求超时</td><td>15 秒</td><td>超过这个时间基本可以判定不可用</td></tr><tr><td>重试次数</td><td>3 次，退避 2s / 8s / 30s</td><td>覆盖偶发抖动，又不至于死等</td></tr><tr><td>User-Agent</td><td>明确的机器人标识 + 联系方式</td><td>出问题时对方能找到你</td></tr><tr><td>增量判断</td><td><code>last-modified</code> + 正文哈希</td><td>内容没变就不重复入库</td></tr></tbody></table></div><p>关于 <code>robots.txt</code>：<strong>平台默认遵守，不提供绕过选项。</strong> 这是底线——一个能"绕过规则"的工具，最后往往会把麻烦留给你自己。</p><h2 id="二、正文提取：通用算法-定向规则"><a href="#二、正文提取：通用算法-定向规则" class="headerlink" title="二、正文提取：通用算法 + 定向规则"></a>二、正文提取：通用算法 + 定向规则</h2><p>中文站点的正文提取有两个坑：</p><ol><li>部分页面正文在 <code>div</code> 里而不是 <code>article</code> 标签里，通用算法会漏。</li><li>有些站点把推荐阅读、作者简介混在正文区域，通用算法会多。</li></ol><p>我的处理策略是分层的：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">第一层：通用算法（可读性打分）        → 覆盖约 80% 的站点</span><br><span class="line">第二层：站点专用选择器（按域名配置）  → 覆盖高频目标站点</span><br><span class="line">第三层：人工复核队列                  → 处理前两层都失败的页面</span><br></pre></td></tr></tbody></table></figure><p>专用选择器配置化，不用改代码：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">example.com:</span></span><br><span class="line">  <span class="attr">content:</span> <span class="string">"article.post-content"</span></span><br><span class="line">  <span class="attr">remove:</span> [<span class="string">".ad"</span>, <span class="string">".related-posts"</span>, <span class="string">".author-box"</span>]</span><br></pre></td></tr></tbody></table></figure><p>实测下来，加上第二层之后，正文提取的准确率从 78% 提升到 96%，而需要人工复核的比例从 22% 降到 4%。</p><h2 id="三、标题切分：决定检索质量的一步"><a href="#三、标题切分：决定检索质量的一步" class="headerlink" title="三、标题切分：决定检索质量的一步"></a>三、标题切分：决定检索质量的一步</h2><h3 id="为什么按标题切"><a href="#为什么按标题切" class="headerlink" title="为什么按标题切"></a>为什么按标题切</h3><p>固定长度切分的最大问题是<strong>会把一个完整论证切成两半</strong>，或把两个不相关的主题拼在一起。按 <code>h2</code> / <code>h3</code> 切分则天然尊重作者组织内容的边界。</p><h3 id="实测的粒度对比"><a href="#实测的粒度对比" class="headerlink" title="实测的粒度对比"></a>实测的粒度对比</h3><p>我在同一批 1200 篇文章上做了对比，用"能否在检索时找回原文对应段落"作为评价标准：</p><div class="md-table-scroll"><table><thead><tr><th>切分粒度</th><th>平均长度</th><th>检索命中率</th><th>备注</th></tr></thead><tbody><tr><td>固定 200 字</td><td>200</td><td>71%</td><td>上下文丢失严重</td></tr><tr><td>固定 500 字</td><td>500</td><td>83%</td><td>跨界拼接问题明显</td></tr><tr><td>固定 1000 字</td><td>1000</td><td>79%</td><td>一个片段内主题混杂</td></tr><tr><td>按标题切分</td><td>平均 480</td><td><strong>92%</strong></td><td>语义边界清晰</td></tr><tr><td>按标题切分 + 超长二次切分</td><td>平均 460</td><td><strong>93%</strong></td><td>长小节不再被截断</td></tr></tbody></table></div><p>结论很明确：<strong>按标题切分并给超长小节做二次切分，是性价比最高的方案。</strong></p><h3 id="具体规则"><a href="#具体规则" class="headerlink" title="具体规则"></a>具体规则</h3><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">1. 以 h2 / h3 为边界切分，标题作为该片段的 caption</span><br><span class="line">2. 片段超过 700 字时，按句子边界二次切分，重叠 80 字</span><br><span class="line">3. 片段小于 120 字时，与前一个片段合并</span><br><span class="line">4. 每个片段保留：所属文章标题、URL、发布时间、h1-h3 路径</span><br></pre></td></tr></tbody></table></figure><p>第 4 条特别重要。片段单独被检索出来时，<strong>只有带上"它来自哪篇文章的哪一节"，才有可解释性。</strong></p><h2 id="四、质量打分：筛掉脏数据"><a href="#四、质量打分：筛掉脏数据" class="headerlink" title="四、质量打分：筛掉脏数据"></a>四、质量打分：筛掉脏数据</h2><p>抓来的内容不都需要入库。我用了一个简单的加权打分：</p><div class="md-table-scroll"><table><thead><tr><th>维度</th><th>权重</th><th>判断方式</th></tr></thead><tbody><tr><td>有效长度</td><td>30%</td><td>中文正文字符数</td></tr><tr><td>事实密度</td><td>25%</td><td>数字、年份、专有名词占比</td></tr><tr><td>结构完整度</td><td>20%</td><td>是否有明确的标题层级</td></tr><tr><td>内容重复度</td><td>15%</td><td>与库内已有片段的相似度</td></tr><tr><td>元信息完整</td><td>10%</td><td>是否有作者、日期、来源</td></tr></tbody></table></div><p>总分低于 0.4 的片段进人工复核队列，高于 0.75 的直接入库并提高检索权重。</p><p><strong>这一步的价值在排查问题时特别明显。</strong> 没有质量分层，检索结果不准确时你无法判断是算法问题还是数据问题，只能盲调参数。</p><h2 id="五、入库：结构化与向量并存"><a href="#五、入库：结构化与向量并存" class="headerlink" title="五、入库：结构化与向量并存"></a>五、入库：结构化与向量并存</h2><p>每个片段在数据库里存两份信息：</p><figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 结构化字段：用于过滤和排序</span></span><br><span class="line">article_url, article_title, heading_path, published_at, updated_at, source_type</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 向量字段：用于语义检索</span></span><br><span class="line">embedding vector(<span class="number">1024</span>)</span><br></pre></td></tr></tbody></table></figure><p>检索时先按结构化条件过滤（例如"只查近一年、只查技术类"），再做向量相似度排序。<strong>先过滤再检索，比全量检索快一个数量级，也更准。</strong></p><h2 id="失败与降级"><a href="#失败与降级" class="headerlink" title="失败与降级"></a>失败与降级</h2><p>流水线必须假设每一步都会失败：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">抓取失败  → 重试 3 次 → 仍然失败则记录并跳过，不阻塞队列</span><br><span class="line">提取失败  → 尝试站点专用规则 → 仍失败进入人工队列</span><br><span class="line">切分异常  → 退化为按段落切分，并标记低置信度</span><br><span class="line">向量化失败 → 保留结构化数据，标记待补向量，可事后重跑</span><br></pre></td></tr></tbody></table></figure><p><strong>原则是：任何一环失败都不应该让整批任务停住。</strong> 我早期的版本就是因为一条坏数据让整个队列卡了 6 小时。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="片段切多大比较合适？"><a href="#片段切多大比较合适？" class="headerlink" title="片段切多大比较合适？"></a>片段切多大比较合适？</h3><p>实测 300 到 700 个中文字符是较优区间。太小会丢失上下文，太大则一段里混杂多个主题，向量表示被平均掉，检索准确率反而下降。按标题层级切分、再对超长小节做二次切分，是稳定可用的做法。</p><h3 id="正文提取用现成库还是自己写规则？"><a href="#正文提取用现成库还是自己写规则？" class="headerlink" title="正文提取用现成库还是自己写规则？"></a>正文提取用现成库还是自己写规则？</h3><p>先上现成库处理 80% 的常规页面，再针对高频目标站点补专用规则。完全自己写规则的成本远高于预期，而完全依赖通用库在部分中文站点上会丢掉正文。</p><h3 id="质量打分有什么用？"><a href="#质量打分有什么用？" class="headerlink" title="质量打分有什么用？"></a>质量打分有什么用？</h3><p>它决定了哪些内容进入检索库、哪些需要人工复核。没有打分，低质量页面会稀释检索结果，让你在排查问题时误以为是检索算法不准，实际上是数据脏。</p><h2 id="下一篇"><a href="#下一篇" class="headerlink" title="下一篇"></a>下一篇</h2><p>数据进来之后，最有价值的一层是<strong>它到底有没有被 AI 引用</strong>：<a href="/posts/geo-platform-visibility-monitor/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《自建 GEO 平台（三）：AI 收录监测与效果度量》</a>。</p><hr><p>你的流水线里如果遇到类似的坑，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>说说，也许有更省事的做法。</p>]]></content>
    
    
    <summary type="html">抓下来的网页怎么变成可检索的片段？本文拆解正文提取、标题切分、质量打分、入库四个环节的具体实现与阈值，并给出切分粒度的实测对比。</summary>
    
    
    
    <category term="GEO 平台实战" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%B9%B3%E5%8F%B0%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="爬虫" scheme="https://devnotes.cuiyuehui.cn/tags/%E7%88%AC%E8%99%AB/"/>
    
    <category term="GEO 平台" scheme="https://devnotes.cuiyuehui.cn/tags/GEO-%E5%B9%B3%E5%8F%B0/"/>
    
    <category term="数据流水线" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%95%B0%E6%8D%AE%E6%B5%81%E6%B0%B4%E7%BA%BF/"/>
    
    <category term="RAG" scheme="https://devnotes.cuiyuehui.cn/tags/RAG/"/>
    
  </entry>
  
  <entry>
    <title>自建 GEO 平台（一）：整体架构与技术选型</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/geo-platform-architecture/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/geo-platform-architecture/</id>
    <published>2026-09-02T01:00:00.000Z</published>
    <updated>2026-09-02T01:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：自建 GEO 平台的架构可以概括为四层——<strong>内容层（要优化什么）、采集与分析层（怎么获取和判断）、服务层（对外提供什么能力）、存储与运维层（怎么跑得住）</strong>。技术选型的核心原则是：<strong>在满足需求的前提下，尽量减少需要长期维护的组件数量。</strong></p><span id="more"></span><h2 id="先明确要解决的问题"><a href="#先明确要解决的问题" class="headerlink" title="先明确要解决的问题"></a>先明确要解决的问题</h2><p>我在动手之前列了一张需求清单，按优先级排：</p><ol><li>给定一批主题词和问题集，能自动检查目标站点是否被 AI 引用。</li><li>能抓取并解析目标站点的内容，判断它是否具备被引用的条件。</li><li>能把我自己的内容资产结构化，方便复用和改写。</li><li>能定期出报告，告诉我"哪些页面被引用了、哪些没有、原因是什么"。</li><li>全流程跑在一台服务器上，不引入需要专职运维的组件。</li></ol><p>第 5 条是硬约束。<strong>它直接决定了后面所有的技术选型。</strong></p><h2 id="整体架构"><a href="#整体架构" class="headerlink" title="整体架构"></a>整体架构</h2><p><img src="/images/geo-platform-architecture.svg" alt="GEO 平台整体架构图：内容层、采集与分析层、服务层、存储与运维层"></p><p>四层各自的职责：</p><div class="md-table-scroll"><table><thead><tr><th>层</th><th>负责什么</th><th>关键点</th></tr></thead><tbody><tr><td>内容层</td><td>主题词库、问题集、内容资产、模板规范</td><td>数据质量决定整个平台的上限</td></tr><tr><td>采集与分析层</td><td>抓取、切分、向量化、引用采样</td><td>最耗时、最容易出稳定性问题</td></tr><tr><td>服务层</td><td>诊断 API、任务调度、报告生成</td><td>保持无状态，方便重启和扩容</td></tr><tr><td>存储与运维层</td><td>数据库、对象存储、容器编排</td><td>组件越少越好</td></tr></tbody></table></div><h2 id="关键选型一：为什么是-pgvector-而不是专用向量库"><a href="#关键选型一：为什么是-pgvector-而不是专用向量库" class="headerlink" title="关键选型一：为什么是 pgvector 而不是专用向量库"></a>关键选型一：为什么是 pgvector 而不是专用向量库</h2><p>这是被问得最多的一个问题。先看数据：</p><div class="md-table-scroll"><table><thead><tr><th>方案</th><th>部署成本</th><th>100 万片段检索耗时</th><th>运维复杂度</th></tr></thead><tbody><tr><td>pgvector（HNSW）</td><td>随 Postgres 一起部署</td><td>约 20-60 ms</td><td>低，复用现有数据库</td></tr><tr><td>专用向量库</td><td>独立集群</td><td>约 10-30 ms</td><td>高，需单独备份、监控、扩容</td></tr></tbody></table></div><p>在 100 万条以内，两者的延迟差距对交互式体验没有实质影响。而省掉一套独立集群，意味着少一套备份策略、少一套监控告警、少一个半夜可能挂掉的组件。</p><p><strong>真正需要专用向量库的临界点，通常是千万级向量加上高并发检索。</strong> 中小型 GEO 平台很难触达这个量级。</p><p>性能够用的判断也可以量化：单次检索延迟在 100 ms 以内、写入吞吐能跟上增量更新、备份和恢复流程能在半小时内跑完——三条都满足，就没有换的必要。</p><h2 id="关键选型二：服务层怎么切"><a href="#关键选型二：服务层怎么切" class="headerlink" title="关键选型二：服务层怎么切"></a>关键选型二：服务层怎么切</h2><p>服务层我切成三个独立进程，而不是做成一个大单体：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">geo-diagnose   无状态 HTTP 服务   ← 接收 URL / 站点，返回诊断结果</span><br><span class="line">geo-scheduler  定时任务           ← 抓取、采样、生成报告</span><br><span class="line">geo-reporter   事件驱动           ← 监听采样结果，产出报告与通知</span><br></pre></td></tr></tbody></table></figure><p>切分的依据是<strong>变更频率</strong>：诊断逻辑每周都在调，调度周期很稳定，报告格式经常改。放在一起会导致每次改报告都要重启整个服务。</p><p>三者通过数据库和消息表通信，不引入独立的消息队列——对当前规模来说，一个带状态的表加轮询完全够用，而且更容易排查问题。</p><h2 id="关键选型三：抓取环节的取舍"><a href="#关键选型三：抓取环节的取舍" class="headerlink" title="关键选型三：抓取环节的取舍"></a>关键选型三：抓取环节的取舍</h2><p>抓取是整个平台最不可控的部分。我的处理方式：</p><div class="md-table-scroll"><table><thead><tr><th>问题</th><th>处理方式</th></tr></thead><tbody><tr><td>目标站点屏蔽爬虫</td><td>尊重 <code>robots.txt</code>，不绕过；改用手动提交 URL</td></tr><tr><td>动态渲染页面</td><td>优先解析 HTML；确实需要渲染时用无头浏览器，但限制并发</td></tr><tr><td>频繁重抓浪费资源</td><td>按 <code>last-modified</code> 与内容哈希做增量判断</td></tr><tr><td>大量超时拖慢队列</td><td>单域名并发限制为 2，超时 15 秒，失败三次降级跳过</td></tr></tbody></table></div><p>一个实测数据：在 4 核 8G 的 ECS 上，单进程抓取 200 个站点的首页与核心页面，总耗时约 12 分钟，峰值内存 900 MB。<strong>瓶颈在网络带宽而不是 CPU。</strong></p><h2 id="存储与运维"><a href="#存储与运维" class="headerlink" title="存储与运维"></a>存储与运维</h2><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">PostgreSQL 16 + pgvector   结构化数据 + 向量索引</span><br><span class="line">对象存储                    抓取快照、报告附件</span><br><span class="line">Redis                       缓存与限流计数</span><br><span class="line">Docker Compose              全部服务的编排</span><br><span class="line">Nginx                       反向代理与 HTTPS</span><br></pre></td></tr></tbody></table></figure><p>整套东西用一份 <code>docker-compose.yml</code> 管起来，<code>docker compose up -d</code> 就能跑。备份用一个 nightly 的 <code>pg_dump</code> 加对象存储同步，恢复演练每季度做一次。</p><h2 id="这套架构的边界"><a href="#这套架构的边界" class="headerlink" title="这套架构的边界"></a>这套架构的边界</h2><p>坦白说，这套设计有几处明确的取舍，如果规模变化需要重新考虑：</p><ul><li><strong>数据量超过 500 万片段</strong>，需要把向量检索拆出去，或者对数据分片。</li><li><strong>同时监测的站点超过 20 个</strong>，需要把调度从单进程改为分布式队列，否则任务会排队。</li><li><strong>需要实时反馈</strong>（用户点一下等 3 秒出结果），需要给诊断接口单独做缓存层，当前是分钟级。</li></ul><p>写清楚边界比写清楚优势更有用——<strong>知道什么情况下它会失效，才能判断它适不适合你的场景。</strong></p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="为什么不用专用的向量数据库？"><a href="#为什么不用专用的向量数据库？" class="headerlink" title="为什么不用专用的向量数据库？"></a>为什么不用专用的向量数据库？</h3><p>在数据量小于 100 万条片段时，pgvector 的性能和专用向量库差距不明显，但省掉了一整套运维成本。真正需要专用向量库的临界点通常是千万级向量加上高并发检索，中小型 GEO 平台很难触达。</p><h3 id="一台-4-核-8G-的服务器能撑住吗？"><a href="#一台-4-核-8G-的服务器能撑住吗？" class="headerlink" title="一台 4 核 8G 的服务器能撑住吗？"></a>一台 4 核 8G 的服务器能撑住吗？</h3><p>能。本站的平台在 4 核 8G 的阿里云 ECS 上运行，覆盖约 200 个站点的抓取与 50 万条片段的检索，日常 CPU 占用在 20% 以下。瓶颈通常出现在抓取阶段的网络带宽，而不是计算。</p><h3 id="平台需要接入多少个大模型？"><a href="#平台需要接入多少个大模型？" class="headerlink" title="平台需要接入多少个大模型？"></a>平台需要接入多少个大模型？</h3><p>建议至少两个。一个用于便宜、量大的内容分析任务，另一个用于质量要求高的判断任务。同时接入多个平台用于引用采样，也能避免单一模型的偏差。</p><h2 id="下一篇"><a href="#下一篇" class="headerlink" title="下一篇"></a>下一篇</h2><p>架构确定之后，最难的部分是<strong>内容采集与结构化流水线</strong>：<a href="/posts/geo-platform-collect-pipeline/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《自建 GEO 平台（二）：内容采集与结构化流水线》</a>。</p><hr><p>如果你也在搭类似的东西，或者在选型上纠结，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>聊聊——我很想知道别人是怎么权衡的。</p>]]></content>
    
    
    <summary type="html">从需求清单出发，讲清自建 GEO 平台为什么选 Postgres + pgvector 而不是专用向量库，服务层怎么切分，以及一台 4 核 8G 的服务器能撑到什么规模。</summary>
    
    
    
    <category term="GEO 平台实战" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%B9%B3%E5%8F%B0%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="GEO 平台" scheme="https://devnotes.cuiyuehui.cn/tags/GEO-%E5%B9%B3%E5%8F%B0/"/>
    
    <category term="架构设计" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="pgvector" scheme="https://devnotes.cuiyuehui.cn/tags/pgvector/"/>
    
    <category term="Docker" scheme="https://devnotes.cuiyuehui.cn/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>怎么衡量 GEO 有没有效果？一套可执行的度量方案</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/measure-geo-results/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/measure-geo-results/</id>
    <published>2026-08-27T01:00:00.000Z</published>
    <updated>2026-08-27T01:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：衡量 GEO 要同时看三层指标——<strong>抓取健康度</strong>（机器能不能进来）、<strong>引用与提及率</strong>（内容有没有被用）、<strong>实际效果</strong>（有没有人因此找到你）。只盯其中任何一层都会得出错误结论。</p><span id="more"></span><h2 id="第一层：抓取健康度"><a href="#第一层：抓取健康度" class="headerlink" title="第一层：抓取健康度"></a>第一层：抓取健康度</h2><p>这是前提层。如果抓取不正常，后面所有指标都没有意义。</p><div class="md-table-scroll"><table><thead><tr><th>指标</th><th>怎么看</th><th>健康标准</th></tr></thead><tbody><tr><td>AI 爬虫访问量</td><td>服务器访问日志按 User-Agent 统计</td><td>每周都有 GPTBot / ClaudeBot 等访问</td></tr><tr><td>页面返回码</td><td>日志中的 HTTP 状态码分布</td><td>目标页面 200，无大量 403 / 429</td></tr><tr><td>抓取覆盖</td><td>对比 sitemap 与日志中出现的 URL</td><td>核心文章 100% 被抓取过</td></tr><tr><td>渲染完整性</td><td>用无 JS 环境抓取页面，看正文是否存在</td><td>正文完整存在</td></tr></tbody></table></div><p>统计 AI 爬虫的访问量，用一条命令就能看到大致情况：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 统计最近日志里各 AI 爬虫的访问次数</span></span><br><span class="line">grep -iE <span class="string">"GPTBot|ClaudeBot|PerplexityBot|Bytespider|CCBot|Google-Extended"</span> /var/log/nginx/access.log \</span><br><span class="line">  | awk <span class="string">'{print $NF}'</span> | <span class="built_in">sort</span> | <span class="built_in">uniq</span> -c | <span class="built_in">sort</span> -rn</span><br></pre></td></tr></tbody></table></figure><p>如果一台跑了一个月的博客<strong>没有任何 AI 爬虫访问记录</strong>，先别急着优化内容，去检查 <code>robots.txt</code>、CDN 拦截规则和防火墙。</p><h2 id="第二层：引用与提及率"><a href="#第二层：引用与提及率" class="headerlink" title="第二层：引用与提及率"></a>第二层：引用与提及率</h2><p>这一层是 GEO 的核心。麻烦之处在于，<strong>主流 AI 搜索没有提供公开的引用统计接口</strong>，只能用采样方式估算。</p><h3 id="采样方法"><a href="#采样方法" class="headerlink" title="采样方法"></a>采样方法</h3><ol><li><strong>固定问题集。</strong> 挑 20 到 50 个目标用户会问的问题，写成完整自然语言句子。<ul><li>例如："GEO 和 SEO 有什么区别"</li><li>而不是："GEO SEO 区别"</li></ul></li><li><strong>固定工具。</strong> 至少在 2 到 3 个 AI 搜索产品里跑同一组问题，比如 Perplexity、ChatGPT 联网搜索、豆包、元宝。</li><li><strong>记录三个字段。</strong> 每次采样记下：是否被引用（有链接）、是否被提及（有名字但无链接）、答案与你原文的观点是否一致。</li><li><strong>固定周期。</strong> 每两周一次，把结果记进表格。</li></ol><h3 id="记录表结构"><a href="#记录表结构" class="headerlink" title="记录表结构"></a>记录表结构</h3><div class="md-table-scroll"><table><thead><tr><th>日期</th><th>问题</th><th>平台</th><th>是否引用</th><th>是否提及</th><th>引用的是哪篇文章</th></tr></thead><tbody><tr><td>2026-09-01</td><td>GEO 和 SEO 有什么区别</td><td>Perplexity</td><td>是</td><td>是</td><td>/posts/geo-vs-seo/</td></tr><tr><td>2026-09-01</td><td>GEO 和 SEO 有什么区别</td><td>ChatGPT</td><td>否</td><td>否</td><td>—</td></tr></tbody></table></div><p>跑上两三个月，趋势就出来了。<strong>重点不是单次结果，而是引用比例的变化。</strong></p><h3 id="两个容易忽略的指标"><a href="#两个容易忽略的指标" class="headerlink" title="两个容易忽略的指标"></a>两个容易忽略的指标</h3><ul><li><strong>零点击曝光。</strong> 用户看完答案就离开，但已经记住了你的名字。这类曝光不会出现在流量统计里，却会带来后续的直接访问和品牌搜索。</li><li><strong>引用一致性。</strong> 如果你的观点被引用后发生了明显变形，说明原文的表述还不够明确，需要把结论写得更"抗误读"。</li></ul><h2 id="第三层：业务结果"><a href="#第三层：业务结果" class="headerlink" title="第三层：业务结果"></a>第三层：业务结果</h2><p>对本站来说，这才是最终指标——<strong>有没有人因为看到内容而联系我。</strong></p><p>可以追踪的信号：</p><div class="md-table-scroll"><table><thead><tr><th>信号</th><th>怎么获取</th></tr></thead><tbody><tr><td>留言板留言</td><td>评论系统的通知</td></tr><tr><td>直接搜索品牌名</td><td>搜索控制台里的品牌词查询量</td></tr><tr><td>有人提到"看到你的文章"</td><td>在留言回复里加一个"你是从哪里找到这里的"提问</td></tr><tr><td>引荐来源</td><td>分析工具中的 referrer，注意 AI 产品的来源常被标记为 direct</td></tr></tbody></table></div><p>最后一条需要特别说明：<strong>很多 AI 产品跳转过来的流量会被识别为直接访问。</strong> 所以不要因为"referrer 里没有 AI 来源"就认为 GEO 没用。</p><h2 id="一套组合起来看的看板"><a href="#一套组合起来看的看板" class="headerlink" title="一套组合起来看的看板"></a>一套组合起来看的看板</h2><div class="md-table-scroll"><table><thead><tr><th>层级</th><th>指标</th><th>采样周期</th><th>判断依据</th></tr></thead><tbody><tr><td>抓取</td><td>AI 爬虫访问量</td><td>每周</td><td>持续有访问，无大量错误</td></tr><tr><td>抓取</td><td>核心页面抓取覆盖率</td><td>每月</td><td>接近 100%</td></tr><tr><td>引用</td><td>固定问题集的引用率</td><td>双周</td><td>整体呈上升趋势</td></tr><tr><td>引用</td><td>内容一致性</td><td>双周</td><td>引用内容与原文观点一致</td></tr><tr><td>效果</td><td>留言 / 主动联系数</td><td>每月</td><td>有明确来源指向内容</td></tr></tbody></table></div><h2 id="别做的事"><a href="#别做的事" class="headerlink" title="别做的事"></a>别做的事</h2><p>最后列几条我踩过的坑：</p><ol><li><strong>别用单次 AI 回答下结论。</strong> 模型输出有随机性，一次没被引用说明不了任何问题。</li><li><strong>别为了引用率去迎合模型。</strong> 内容如果对人不友好，长期一定失败。</li><li><strong>别忽略抓取层。</strong> 我见过太多"内容很好但从未被抓取"的站点，所有后续优化都是空转。</li><li><strong>别只看自己。</strong> 采样时同时记录竞争对手被引用的次数，才知道自己处于什么位置。</li></ol><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="为什么不能只看流量来判断-GEO-效果？"><a href="#为什么不能只看流量来判断-GEO-效果？" class="headerlink" title="为什么不能只看流量来判断 GEO 效果？"></a>为什么不能只看流量来判断 GEO 效果？</h3><p>因为 AI 搜索的价值很大一部分不在点击上。用户看完模型生成的答案就离开了，但他已经看到了你的品牌或作者名。这种"零点击曝光"不会出现在分析工具里，却会显著影响后续的搜索和主动访问。</p><h3 id="多久采样一次比较合适？"><a href="#多久采样一次比较合适？" class="headerlink" title="多久采样一次比较合适？"></a>多久采样一次比较合适？</h3><p>建议每两周一次，每次固定一组 20 到 50 个问题。频率太低看不出趋势，太高会被模型输出的随机性干扰。</p><h3 id="新站多久能看到引用？"><a href="#新站多久能看到引用？" class="headerlink" title="新站多久能看到引用？"></a>新站多久能看到引用？</h3><p>如果是新域名，先等收录和抓取正常（通常 2 到 6 周），再谈引用。在没被正常抓取之前，做任何引用监测都没有意义。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>抓取健康度是前提，引用率是核心，业务结果是终点。</li><li>引用率靠固定问题集定期采样，看趋势不看单点。</li><li>零点击曝光和直接访问里藏着 GEO 的收益。</li><li>下一步可以看<a href="/posts/geo-platform-visibility-monitor/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《自建 GEO 平台的收录监测模块》</a>，那里把这套采样做成了可自动化的系统。</li></ul><hr><p>如果你也在搭监测，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>聊聊你的指标设计和采样方式——这块没有标准答案，多几个样本会更有意思。</p>]]></content>
    
    
    <summary type="html">GEO 的效果不能只看流量。本文给出引用率、提及率、抓取健康度三类指标的定义与采样方法，并说明为什么&quot;有没有人因此找到你&quot;才是最终指标。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="监测" scheme="https://devnotes.cuiyuehui.cn/tags/%E7%9B%91%E6%B5%8B/"/>
    
    <category term="数据度量" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%95%B0%E6%8D%AE%E5%BA%A6%E9%87%8F/"/>
    
  </entry>
  
  <entry>
    <title>GEO 内容写作模板：让 AI 一眼看懂并愿意引用你的文章</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/geo-content-template/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/geo-content-template/</id>
    <published>2026-08-19T01:00:00.000Z</published>
    <updated>2026-08-19T01:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：GEO 友好的文章不需要特殊文体，只需要把信息<strong>按模型和人都容易提取的顺序</strong>排好。可复用的骨架是：结论区 → 问题定位 → 方法主体 → 边界说明 → FAQ → 参考资料。本文给出完整模板和改写示例。</p><span id="more"></span><h2 id="模板骨架"><a href="#模板骨架" class="headerlink" title="模板骨架"></a>模板骨架</h2><figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 标题：包含核心概念 + 明确价值</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**直接回答**</span>：用 2-3 句话给出完整结论，不铺垫。</span><br><span class="line"></span><br><span class="line">&lt;!-- more --&gt;</span><br><span class="line"></span><br><span class="line"><span class="section">## 这个问题的背景</span></span><br><span class="line">一段话说清为什么值得解决，控制在 3-5 行。</span><br><span class="line"></span><br><span class="line"><span class="section">## 核心方法（可拆多个小节）</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 小节一：先给结论，再给理由</span></span><br><span class="line"><span class="section">### 小节二：同上</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 边界与例外</span></span><br><span class="line">这个方法在什么情况下不适用。</span><br><span class="line"></span><br><span class="line"><span class="section">## 常见问题（FAQ）</span></span><br><span class="line"><span class="section">### 问题一？</span></span><br><span class="line">答案。</span><br><span class="line"></span><br><span class="line"><span class="section">## 小结</span></span><br><span class="line"><span class="bullet">-</span> 3 到 5 条要点</span><br><span class="line"></span><br><span class="line"><span class="section">## 参考资料</span></span><br><span class="line"><span class="bullet">-</span> 可核查的外部来源</span><br></pre></td></tr></tbody></table></figure><p>下面逐段解释为什么这样排。</p><h2 id="一、标题：用一个概念说清一件事"><a href="#一、标题：用一个概念说清一件事" class="headerlink" title="一、标题：用一个概念说清一件事"></a>一、标题：用一个概念说清一件事</h2><p>标题要做三件事：<strong>包含核心术语、包含读者会搜的表达、承诺一个具体结果。</strong></p><div class="md-table-scroll"><table><thead><tr><th>差的标题</th><th>好的标题</th><th>原因</th></tr></thead><tbody><tr><td>关于 GEO 的一些思考</td><td>GEO 内容写作模板：让 AI 愿意引用你的文章</td><td>有术语、有对象、有承诺</td></tr><tr><td>记一次平台搭建</td><td>自建 GEO 平台（一）：整体架构与技术选型</td><td>有编号、有范围、可预期</td></tr><tr><td>AI 时代的内容优化</td><td>GEO 和 SEO 有什么区别？从目标到做法逐条对照</td><td>是真实问题句</td></tr></tbody></table></div><p>一个实用技巧：<strong>把标题写成用户会问 AI 的那句话。</strong> 用户问什么，AI 就来检索什么。</p><h2 id="二、结论区：前-100-字决定成败"><a href="#二、结论区：前-100-字决定成败" class="headerlink" title="二、结论区：前 100 字决定成败"></a>二、结论区：前 100 字决定成败</h2><p>开头的 2 到 3 句话必须自成一体，即使被单独摘出来也能回答标题提出的问题。原因很直接：模型在做片段匹配时，<strong>开头段落是最容易被选中的片段之一</strong>。</p><figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="strong">**直接回答**</span>：GEO 优化的最小单位是段落，不是页面。</span><br><span class="line">一段包含明确事实和结论的话，比八段含糊的铺垫更容易被引用。</span><br></pre></td></tr></tbody></table></figure><p>不要把结论留到最后。学术写作习惯"先论证后总结"，这在 GEO 下是反向的。</p><h2 id="三、问题定位：给内容设定边界"><a href="#三、问题定位：给内容设定边界" class="headerlink" title="三、问题定位：给内容设定边界"></a>三、问题定位：给内容设定边界</h2><p>一段话说明"这篇文章解决谁的什么问题、在什么前提下"。它的作用是过滤掉不相关的检索，让真正匹配的问题更容易命中。</p><figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 这个问题的背景</span></span><br><span class="line"></span><br><span class="line">如果你已经有稳定的内容产出，但发现 AI 回答相关问题时从不引用你的站点，</span><br><span class="line">那么问题通常不在内容质量，而在内容的可解析性。本文讨论后者。</span><br></pre></td></tr></tbody></table></figure><h2 id="四、方法主体：每个小节自带结论"><a href="#四、方法主体：每个小节自带结论" class="headerlink" title="四、方法主体：每个小节自带结论"></a>四、方法主体：每个小节自带结论</h2><p>这是最关键的一段。写法上遵循三条规则：</p><ol><li><strong>每个 <code>h2</code> / <code>h3</code> 都是一个可以独立成立的判断</strong>，而不是"第一部分""接下来"这类空标签。</li><li><strong>小节的第一句话就是结论</strong>，后面再展开理由和细节。</li><li><strong>一节讲一件事</strong>，控制在 200 到 500 字。</li></ol><p>对比一下：</p><blockquote><p>❌ <code>## 三、具体操作</code> / "首先我们需要做一些准备工作，然后……"</p></blockquote><blockquote><p>✅ <code>## 先修 robots.txt，再动内容</code> / "顺序反了会让后面所有优化都白做，因为爬虫根本进不来。具体做法是……"</p></blockquote><p>后者的每个小节，都在为模型提供一段可以直接复用的答案素材。</p><h2 id="五、边界说明：把可信度补上"><a href="#五、边界说明：把可信度补上" class="headerlink" title="五、边界说明：把可信度补上"></a>五、边界说明：把可信度补上</h2><p>明确写出"不适用"的情形，有三个好处：避免误导读者、提高被引用的准确性、在重排阶段体现出内容的严谨性。</p><div class="md-table-scroll"><table><thead><tr><th>写法</th><th>效果</th></tr></thead><tbody><tr><td>"这个方案非常高效"</td><td>无法判断适用范围</td></tr><tr><td>"在 5 万页以内的站点上构建时间可控制在 3 分钟内；超过 20 万页需要改增量构建"</td><td>可核查、可引用</td></tr></tbody></table></div><h2 id="六、FAQ：把问答对显式化"><a href="#六、FAQ：把问答对显式化" class="headerlink" title="六、FAQ：把问答对显式化"></a>六、FAQ：把问答对显式化</h2><p>FAQ 不只是给读者看的，也是给机器看的。<strong>写成问答对之后，它可以被直接提取为一组独立的问题与答案。</strong></p><p>建议放在文章末尾，和正文的小节内容呼应但不重复。每篇 3 到 5 个问题，答案 40 到 120 字。</p><p>如果站点支持结构化数据，把这些问题同步到 <code>FAQPage</code> 的 JSON-LD 里，效果更好——本站就是这么做的。</p><h2 id="七、参考资料：给结论装上路标"><a href="#七、参考资料：给结论装上路标" class="headerlink" title="七、参考资料：给结论装上路标"></a>七、参考资料：给结论装上路标</h2><p>引用论文、官方文档、规范原文，能同时提升可信度和可核查性。</p><figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 参考资料</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> [<span class="string">GEO: Generative Engine Optimization（KDD 2024）</span>](<span class="link">https://arxiv.org/abs/2311.09735</span>)</span><br><span class="line"><span class="bullet">-</span> [<span class="string">llms.txt 规范</span>](<span class="link">https://llmstxt.org/</span>)</span><br></pre></td></tr></tbody></table></figure><p>不要引用无法访问的链接，也不要用二手转述代替原文——被引用来源的可核查性会传递到你的页面上。</p><h2 id="改写前后对比"><a href="#改写前后对比" class="headerlink" title="改写前后对比"></a>改写前后对比</h2><p><strong>改写前（典型的"自嗨型"技术文）：</strong></p><blockquote><p>关于 GEO，最近有很多讨论。随着大模型的发展，越来越多的公司开始关注这一领域。我们在实践中也做了一些探索，这里分享一下经验。</p></blockquote><p><strong>改写后：</strong></p><blockquote><p><strong>直接回答</strong>：GEO 优化的最小单位是段落，不是页面。原因是模型在检索时会把网页切分成片段做匹配，只有片段本身语义完整、包含明确结论，才可能进入最终答案。本文给出可复用的段落写法。</p></blockquote><p>同样的信息量，改写后的版本在被检索、被引用上都更有优势，因为它第一句就回答了问题。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="套用模板会不会让文章看起来千篇一律？"><a href="#套用模板会不会让文章看起来千篇一律？" class="headerlink" title="套用模板会不会让文章看起来千篇一律？"></a>套用模板会不会让文章看起来千篇一律？</h3><p>结构统一不等于内容雷同。模板固定的是信息的排列顺序，不是观点本身。读者和模型都更偏好稳定的结构，因为找信息更快。真正需要个性化的是判断、数据和案例。</p><h3 id="文章写多长比较合适？"><a href="#文章写多长比较合适？" class="headerlink" title="文章写多长比较合适？"></a>文章写多长比较合适？</h3><p>以"能不能完整回答一个问题"为标准，而不是字数。多数技术问题在 1200 到 3000 字之间可以讲透。如果超过 4000 字还在展开，通常说明应该拆成多篇互相链接的文章。</p><h3 id="为什么要在文章里写适用边界？"><a href="#为什么要在文章里写适用边界？" class="headerlink" title="为什么要在文章里写适用边界？"></a>为什么要在文章里写适用边界？</h3><p>边界是可信度的一部分。写明"这个方法适合什么规模、什么前提"，会让结论更可核查，也避免被误用。模型在重排时也会偏好带有明确前提条件的内容。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>标题写成用户会问 AI 的那句话。</li><li>开头 100 字给出完整结论，不要铺垫。</li><li>每个小节自带结论，一节只讲一件事。</li><li>用边界说明补充可信度。</li><li>FAQ 显式写成问答对，并同步到结构化数据。</li></ul><p>下一篇：<a href="/posts/measure-geo-results/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《怎么衡量 GEO 到底有没有效果》</a>。</p><hr><p>把这套写法用到你自己的文章上时，改完如果效果和预期不一样，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>说说你观察到的差异。</p><p>写完之后想确认内容有没有信息增量，可以用<a href="/posts/ai-written-content-cited/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《用 AI 写的内容能不能被 AI 引用》</a>里的四个问题自查。</p>]]></content>
    
    
    <summary type="html">一套可以直接套用的 GEO 内容结构：结论区、问题定位、方法主体、边界说明、FAQ、参考资料。附完整骨架和一份改写前后的对比。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="内容写作" scheme="https://devnotes.cuiyuehui.cn/tags/%E5%86%85%E5%AE%B9%E5%86%99%E4%BD%9C/"/>
    
    <category term="模板" scheme="https://devnotes.cuiyuehui.cn/tags/%E6%A8%A1%E6%9D%BF/"/>
    
  </entry>
  
  <entry>
    <title>结构化数据怎么做才对 GEO 有用？四种最值得加的 JSON-LD</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/structured-data-for-geo/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/structured-data-for-geo/</id>
    <published>2026-08-11T01:00:00.000Z</published>
    <updated>2026-08-11T01:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：对 GEO 来说，结构化数据的价值不在"加得越多越好"，而在<strong>让机器低成本地确认"这是什么内容、谁写的、什么时候更新的、回答了什么具体问题"</strong>。按投入产出比排序，最值得加的四种是 <code>BlogPosting</code>、<code>BreadcrumbList</code>、<code>FAQPage</code> 和 <code>Person</code>。</p><span id="more"></span><h2 id="为什么结构化数据对-GEO-特别重要"><a href="#为什么结构化数据对-GEO-特别重要" class="headerlink" title="为什么结构化数据对 GEO 特别重要"></a>为什么结构化数据对 GEO 特别重要</h2><p>回到检索链路：模型会把页面切成片段再做相似度匹配。<strong>片段一旦脱离上下文，"这段文字在讲什么"就变得模糊。</strong></p><p>结构化数据在这里提供的是<strong>页面级的确定性</strong>：</p><ul><li>这篇内容是什么类型（文章？问答？产品页？）</li><li>标题、摘要、发布时间、更新时间分别是多少</li><li>作者是谁，有什么身份背景</li><li>文中的问答对可以被拆成独立的问题与答案</li></ul><p>对模型来说，这些字段是<strong>已经解析好的结构化输入</strong>，不需要从 HTML 里猜。同等内容质量下，解析成本更低的一方通常更容易被选中。</p><h2 id="优先级排序"><a href="#优先级排序" class="headerlink" title="优先级排序"></a>优先级排序</h2><div class="md-table-scroll"><table><thead><tr><th>优先级</th><th>类型</th><th>解决什么问题</th><th>建议</th></tr></thead><tbody><tr><td>P0</td><td><code>BlogPosting</code></td><td>确认这是一篇文章及其元信息</td><td>所有内容页必做</td></tr><tr><td>P0</td><td><code>BreadcrumbList</code></td><td>表达页面在站点中的位置与归属</td><td>所有内容页必做</td></tr><tr><td>P1</td><td><code>FAQPage</code></td><td>把问答对独立暴露出来</td><td>有 FAQ 小节的页面</td></tr><tr><td>P1</td><td><code>Person</code></td><td>建立作者实体与专业领域</td><td>全站一次即可</td></tr><tr><td>P2</td><td><code>WebSite</code></td><td>站点整体信息</td><td>全站一次即可</td></tr><tr><td>P3</td><td><code>HowTo</code>、<code>SoftwareApplication</code></td><td>特定场景</td><td>按需</td></tr></tbody></table></div><h2 id="一、BlogPosting：最基础也最容易被做错"><a href="#一、BlogPosting：最基础也最容易被做错" class="headerlink" title="一、BlogPosting：最基础也最容易被做错"></a>一、BlogPosting：最基础也最容易被做错</h2><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"@context"</span><span class="punctuation">:</span> <span class="string">"https://schema.org"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"BlogPosting"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"headline"</span><span class="punctuation">:</span> <span class="string">"结构化数据怎么做才对 GEO 有用"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"description"</span><span class="punctuation">:</span> <span class="string">"按投入产出比排出四种最值得加的结构化数据。"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"datePublished"</span><span class="punctuation">:</span> <span class="string">"2026-08-11"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"dateModified"</span><span class="punctuation">:</span> <span class="string">"2026-08-11"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"author"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"Person"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"张三"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://example.com/about/"</span></span><br><span class="line">  <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"publisher"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"Organization"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"示例站点"</span></span><br><span class="line">  <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"mainEntityOfPage"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"WebPage"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"@id"</span><span class="punctuation">:</span> <span class="string">"https://example.com/posts/structured-data-for-geo/"</span></span><br><span class="line">  <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"keywords"</span><span class="punctuation">:</span> <span class="string">"结构化数据, JSON-LD, Schema.org"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"inLanguage"</span><span class="punctuation">:</span> <span class="string">"zh-CN"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p>最常见的三个错误：</p><ol><li><strong><code>dateModified</code> 和 <code>datePublished</code> 永远相同。</strong> 文章更新过就应该改 <code>dateModified</code>，它是最直接的新鲜度信号。</li><li><strong><code>author</code> 只写一个字符串。</strong> <code>"author": "张三"</code> 是合法但信息量极低的写法，用对象并带上 <code>url</code> 和 <code>sameAs</code> 才能建立实体。</li><li><strong><code>mainEntityOfPage</code> 与 canonical 不一致。</strong> 两个地址指向同一内容时，模型无法确定哪个才是原文。</li></ol><h2 id="二、BreadcrumbList：让模型知道你的内容归属"><a href="#二、BreadcrumbList：让模型知道你的内容归属" class="headerlink" title="二、BreadcrumbList：让模型知道你的内容归属"></a>二、BreadcrumbList：让模型知道你的内容归属</h2><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"@context"</span><span class="punctuation">:</span> <span class="string">"https://schema.org"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"BreadcrumbList"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"itemListElement"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">{</span> <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"ListItem"</span><span class="punctuation">,</span> <span class="attr">"position"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"首页"</span><span class="punctuation">,</span> <span class="attr">"item"</span><span class="punctuation">:</span> <span class="string">"https://example.com/"</span> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">{</span> <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"ListItem"</span><span class="punctuation">,</span> <span class="attr">"position"</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"GEO 工具箱"</span><span class="punctuation">,</span> <span class="attr">"item"</span><span class="punctuation">:</span> <span class="string">"https://example.com/categories/geo-tools/"</span> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">{</span> <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"ListItem"</span><span class="punctuation">,</span> <span class="attr">"position"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"结构化数据怎么做才对 GEO 有用"</span><span class="punctuation">,</span> <span class="attr">"item"</span><span class="punctuation">:</span> <span class="string">"https://example.com/posts/structured-data-for-geo/"</span> <span class="punctuation">}</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p>它的隐性价值是<strong>主题聚类</strong>。当模型看到十几篇文章都挂在同一个分类下，会更容易把它们识别成一个完整主题体系，这对建立领域权威很有帮助——而领域权威正是被优先引用的重要条件。</p><h2 id="三、FAQPage：把问答对直接喂给模型"><a href="#三、FAQPage：把问答对直接喂给模型" class="headerlink" title="三、FAQPage：把问答对直接喂给模型"></a>三、FAQPage：把问答对直接喂给模型</h2><p>这是对 GEO 最"对症"的一种类型，因为 AI 搜索要回答的正是问题。</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"@context"</span><span class="punctuation">:</span> <span class="string">"https://schema.org"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"FAQPage"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"mainEntity"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"Question"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"结构化数据会直接提升 AI 引用率吗？"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"acceptedAnswer"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">        <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"Answer"</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">"text"</span><span class="punctuation">:</span> <span class="string">"不会立竿见影。它解决的是机器能不能准确理解这段内容是什么。"</span></span><br><span class="line">      <span class="punctuation">}</span></span><br><span class="line">    <span class="punctuation">}</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p>两个实践建议：</p><ul><li><strong>问答必须真的出现在正文里。</strong> 只在 JSON-LD 里写、页面上看不到，属于垃圾标记，有被判定作弊的风险。</li><li><strong>答案控制在 40 到 120 字。</strong> 太短没有信息量，太长会被截断，反而失去作为独立答案的价值。</li></ul><h2 id="四、Person：让-你是谁-变成可检索的实体"><a href="#四、Person：让-你是谁-变成可检索的实体" class="headerlink" title="四、Person：让&quot;你是谁&quot;变成可检索的实体"></a>四、Person：让"你是谁"变成可检索的实体</h2><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"@context"</span><span class="punctuation">:</span> <span class="string">"https://schema.org"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"@type"</span><span class="punctuation">:</span> <span class="string">"Person"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"张三"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://example.com/about/"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"jobTitle"</span><span class="punctuation">:</span> <span class="string">"技术博主"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"knowsAbout"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"生成式引擎优化"</span><span class="punctuation">,</span> <span class="string">"AI 搜索"</span><span class="punctuation">,</span> <span class="string">"结构化数据"</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"sameAs"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">"https://github.com/your-account"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="string">"https://x.com/your-account"</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p><code>sameAs</code> 的作用是<strong>跨平台身份对齐</strong>。当模型发现同一个名字在多个可信平台上指向同一个人，作者的可信度会显著上升。这直接服务于 GEO 的第三层——可信任。</p><h2 id="怎么落地到静态博客"><a href="#怎么落地到静态博客" class="headerlink" title="怎么落地到静态博客"></a>怎么落地到静态博客</h2><p>本站用 Hexo + Stellar，落地方式分两部分：</p><ol><li><strong>文章级数据由主题生成</strong>：<code>BlogPosting</code> 由主题自动输出，包含标题、描述、时间、作者、标签。</li><li><strong>额外数据由构建脚本注入</strong>：<code>scripts/geo.js</code> 在页面渲染完成后，把 <code>BreadcrumbList</code> 和 <code>FAQPage</code> 插入 <code>&lt;/head&gt;</code> 之前。FAQ 数据直接写在文章的 front matter 里：</li></ol><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">faq:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">q:</span> <span class="string">结构化数据会直接提升</span> <span class="string">AI</span> <span class="string">引用率吗？</span></span><br><span class="line">    <span class="attr">a:</span> <span class="string">不会立竿见影。它解决的是机器能不能准确理解这段内容是什么。</span></span><br></pre></td></tr></tbody></table></figure><p>这样写作者只需要在文章的 front matter 里维护问答，JSON-LD 会自动生成，不会出现"页面改了但结构化数据忘了改"的情况。</p><h2 id="自检清单"><a href="#自检清单" class="headerlink" title="自检清单"></a>自检清单</h2><ul><li><input disabled="" type="checkbox"> 每篇文章都有 <code>BlogPosting</code>，且 <code>dateModified</code> 是真实更新时间</li><li><input disabled="" type="checkbox"> <code>mainEntityOfPage</code> 的地址与 canonical 完全一致</li><li><input disabled="" type="checkbox"> <code>author</code> 是对象而不是字符串，且指向可访问的作者页</li><li><input disabled="" type="checkbox"> 有分类结构的站点输出 <code>BreadcrumbList</code></li><li><input disabled="" type="checkbox"> 有 FAQ 的文章输出 <code>FAQPage</code>，且问答在正文可见</li><li><input disabled="" type="checkbox"> <code>Person</code> 的 <code>sameAs</code> 填的是真实存在的外部主页</li><li><input disabled="" type="checkbox"> 用 <a href="https://validator.schema.org/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>Schema Markup Validator</a> 校验过，没有报错</li></ul><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="结构化数据会直接提升-AI-引用率吗？"><a href="#结构化数据会直接提升-AI-引用率吗？" class="headerlink" title="结构化数据会直接提升 AI 引用率吗？"></a>结构化数据会直接提升 AI 引用率吗？</h3><p>不会立竿见影。它解决的是机器能不能准确理解这段内容是什么，属于必要条件而不是充分条件。没有结构化数据，模型仍可能读懂；有了它，解析成本更低、出错更少，在同等内容质量下更容易被选中。</p><h3 id="JSON-LD、Microdata、RDFa-该选哪个？"><a href="#JSON-LD、Microdata、RDFa-该选哪个？" class="headerlink" title="JSON-LD、Microdata、RDFa 该选哪个？"></a>JSON-LD、Microdata、RDFa 该选哪个？</h3><p>首选 JSON-LD。它写在 <code>script</code> 标签里，与页面视觉结构解耦，改动排版不会破坏数据，也是搜索引擎官方推荐的形式。</p><h3 id="一篇技术文章需要加多少种结构化数据？"><a href="#一篇技术文章需要加多少种结构化数据？" class="headerlink" title="一篇技术文章需要加多少种结构化数据？"></a>一篇技术文章需要加多少种结构化数据？</h3><p>三种就够：<code>BlogPosting</code> 说明这是篇文章，<code>BreadcrumbList</code> 说明它在站点里的位置，<code>FAQPage</code> 在文中有问答时补充。作者信息作为 <code>Person</code> 挂在 <code>BlogPosting</code> 里即可。</p><p>下一篇：<a href="/posts/geo-content-template/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《GEO 内容写作模板：让 AI 一眼看懂你的文章》</a>。</p><hr><p>加完之后建议用 Google 的富结果测试工具自查一遍，最容易出错的是图片地址、作者信息和日期格式。结果对不上，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>贴出来一起看。</p><p>内容被转载或改写之后怎么让溯源更容易，见<a href="/posts/content-rewritten-by-ai/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《内容被 AI 改写后传播，该如何处理》</a>。</p>]]></content>
    
    
    <summary type="html">不是所有 Schema.org 类型都对 GEO 有价值。本文按投入产出比排出 BlogPosting、BreadcrumbList、FAQPage、Person 四种优先级的结构化数据，并给出可直接复制的 JSON-LD 代码。</summary>
    
    
    
    <category term="GEO 工具箱" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%B7%A5%E5%85%B7%E7%AE%B1/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="结构化数据" scheme="https://devnotes.cuiyuehui.cn/tags/%E7%BB%93%E6%9E%84%E5%8C%96%E6%95%B0%E6%8D%AE/"/>
    
    <category term="Schema.org" scheme="https://devnotes.cuiyuehui.cn/tags/Schema-org/"/>
    
    <category term="JSON-LD" scheme="https://devnotes.cuiyuehui.cn/tags/JSON-LD/"/>
    
  </entry>
  
  <entry>
    <title>llms.txt 完全指南：给大模型准备一份站点说明书</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/llms-txt-guide/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/llms-txt-guide/</id>
    <published>2026-08-03T01:00:00.000Z</published>
    <updated>2026-09-14T03:05:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：<code>llms.txt</code> 是放在网站根目录的一份 Markdown 文件，用来告诉大模型"这个站点是做什么的、有哪些值得读的内容、按什么顺序读"。它不是官方标准，也不保证被读取，但成本极低、风险为零，属于做 GEO 时最划算的基础设施之一。</p><span id="more"></span><h2 id="llms-txt-想解决什么问题"><a href="#llms-txt-想解决什么问题" class="headerlink" title="llms.txt 想解决什么问题"></a>llms.txt 想解决什么问题</h2><p>传统抓取面对一个网站时，看到的是几百个 HTML 文件。爬虫只能靠链接结构和页面元信息猜测"哪些内容重要"。</p><p><code>llms.txt</code> 提供了一个<strong>人也能读、模型也能读</strong>的入口：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">https://example.com/</span><br><span class="line">├── robots.txt      给爬虫的规则</span><br><span class="line">├── sitemap.xml     给搜索引擎的 URL 清单</span><br><span class="line">└── llms.txt        给大模型的内容导览  ← 本文的主角</span><br></pre></td></tr></tbody></table></figure><p>它的设计意图很明确：在模型做检索之前，先给它一份结构化的目录和摘要。</p><h2 id="文件结构：四个部分"><a href="#文件结构：四个部分" class="headerlink" title="文件结构：四个部分"></a>文件结构：四个部分</h2><p>按照 <a href="https://llmstxt.org/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>llmstxt.org</a> 的约定，文件由四部分组成：</p><div class="md-table-scroll"><table><thead><tr><th>部分</th><th>作用</th><th>是否必需</th></tr></thead><tbody><tr><td><code># 站点名</code></td><td>一级标题，标识站点</td><td>必需</td></tr><tr><td><code>&gt; 一句话简介</code></td><td>引用块，说明站点定位</td><td>必需</td></tr><tr><td>正文说明</td><td>补充读者对象、覆盖范围、许可协议</td><td>可选</td></tr><tr><td><code>## 分组的链接列表</code></td><td>按主题分组的文章清单</td><td>建议提供</td></tr></tbody></table></div><p>关键约束是：<strong>链接必须是 Markdown 列表格式</strong>，这样解析器可以稳定提取。</p><h2 id="一份可直接套用的模板"><a href="#一份可直接套用的模板" class="headerlink" title="一份可直接套用的模板"></a>一份可直接套用的模板</h2><figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 你的站点名</span></span><br><span class="line"></span><br><span class="line"><span class="quote">&gt; 这是给大模型看的站点说明书：记录 XXX 领域的技术原理与落地实践。</span></span><br><span class="line"></span><br><span class="line">本站作者是 XXX，有 N 年 XXX 经验。内容面向……</span><br><span class="line">引用请注明出处：https://example.com/</span><br><span class="line"></span><br><span class="line"><span class="section">## 站点资源</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> 首页：https://example.com/</span><br><span class="line"><span class="bullet">-</span> 归档：https://example.com/archives/</span><br><span class="line"><span class="bullet">-</span> 关于作者：https://example.com/about/</span><br><span class="line"><span class="bullet">-</span> RSS：https://example.com/atom.xml</span><br><span class="line"><span class="bullet">-</span> 许可证：CC BY-NC-SA 4.0</span><br><span class="line"></span><br><span class="line"><span class="section">## 入门系列</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> [<span class="string">文章标题</span>](<span class="link">https://example.com/posts/xxx/</span>)：一句话说明这篇文章解决了什么问题</span><br><span class="line"><span class="bullet">-</span> [<span class="string">文章标题</span>](<span class="link">https://example.com/posts/yyy/</span>)：一句话说明这篇文章解决了什么问题</span><br><span class="line"></span><br><span class="line"><span class="section">## 实战系列</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> [<span class="string">文章标题</span>](<span class="link">https://example.com/posts/zzz/</span>)：一句话说明这篇文章解决了什么问题</span><br></pre></td></tr></tbody></table></figure><p>几个写作要点：</p><ol><li><strong>一句话简介要包含领域关键词。</strong> 写"记录 GEO 的技术原理与落地方法"，不要写"记录生活点滴"。</li><li><strong>每篇文章后面跟一句摘要。</strong> 这句话会直接影响模型判断这篇文章是否值得读。</li><li><strong>按主题分组，而不是按时间排序。</strong> 目录的价值在于结构，不在于时间线。</li><li><strong>写清许可协议。</strong> 明确"可以引用但需注明出处"，比含糊其辞更有利于传播。</li></ol><h2 id="llms-full-txt-要不要一起做"><a href="#llms-full-txt-要不要一起做" class="headerlink" title="llms-full.txt 要不要一起做"></a>llms-full.txt 要不要一起做</h2><p><code>llms.txt</code> 只给目录，模型仍需要逐个抓取页面。<code>llms-full.txt</code> 则把<strong>全部正文</strong>放进一个文件里，一次读完。</p><p>两者的取舍很直接：</p><div class="md-table-scroll"><table><thead><tr><th></th><th>llms.txt</th><th>llms-full.txt</th></tr></thead><tbody><tr><td>体积</td><td>几 KB</td><td>几百 KB 到几 MB</td></tr><tr><td>内容</td><td>目录 + 摘要</td><td>全文</td></tr><tr><td>适合</td><td>大站、内容持续更新</td><td>中小站点、知识密度高</td></tr><tr><td>风险</td><td>低</td><td>内容可能被直接复用</td></tr></tbody></table></div><p>我的建议是：<strong>中文技术博客同时提供两份。</strong> 如果内容涉及付费产品或核心竞争力，只提供 <code>llms.txt</code> 即可。</p><h2 id="怎么实现：让它自动生成"><a href="#怎么实现：让它自动生成" class="headerlink" title="怎么实现：让它自动生成"></a>怎么实现：让它自动生成</h2><p>手工维护 <code>llms.txt</code> 最大的问题是<strong>会忘记更新</strong>。正确做法是让它在构建时自动生成。以 Hexo 为例，在 <code>scripts/</code> 目录下注册一个生成器即可：</p><figure class="highlight js"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// scripts/llms.js</span></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">generator</span>.<span class="title function_">register</span>(<span class="string">"llms_txt"</span>, <span class="keyword">function</span> (<span class="params">locals</span>) {</span><br><span class="line">  <span class="keyword">const</span> posts = locals.<span class="property">posts</span>.<span class="title function_">sort</span>(<span class="string">"-date"</span>).<span class="title function_">toArray</span>();</span><br><span class="line">  <span class="keyword">const</span> lines = [</span><br><span class="line">    <span class="string">`# <span class="subst">${hexo.config.title}</span>`</span>,</span><br><span class="line">    <span class="string">""</span>,</span><br><span class="line">    <span class="string">`&gt; <span class="subst">${hexo.config.description}</span>`</span>,</span><br><span class="line">    <span class="string">""</span>,</span><br><span class="line">    <span class="string">"## 文章"</span>,</span><br><span class="line">    <span class="string">""</span></span><br><span class="line">  ];</span><br><span class="line">  posts.<span class="title function_">forEach</span>(<span class="function"><span class="params">post</span> =&gt;</span> {</span><br><span class="line">    lines.<span class="title function_">push</span>(<span class="string">`- [<span class="subst">${post.title}</span>](<span class="subst">${post.permalink}</span>)：<span class="subst">${post.description || <span class="string">""</span>}</span>`</span>);</span><br><span class="line">  });</span><br><span class="line">  <span class="keyword">return</span> { <span class="attr">path</span>: <span class="string">"llms.txt"</span>, <span class="attr">data</span>: lines.<span class="title function_">join</span>(<span class="string">"\n"</span>) };</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><p>这样每次构建，<code>llms.txt</code> 都会跟着文章列表自动更新。本站就是这么做的，可以直接查看<a href="/llms.txt" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>实际的 llms.txt</a> 和 <a href="/llms-full.txt" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>llms-full.txt</a>。</p><h3 id="同时更新-robots-txt"><a href="#同时更新-robots-txt" class="headerlink" title="同时更新 robots.txt"></a>同时更新 robots.txt</h3><p>在 <code>robots.txt</code> 里显式说明它的存在，让爬虫更容易发现：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"># AI 摘要入口： https://example.com/llms.txt</span><br><span class="line">Sitemap: https://example.com/sitemap.xml</span><br></pre></td></tr></tbody></table></figure><h2 id="现在是投入的好时机吗"><a href="#现在是投入的好时机吗" class="headerlink" title="现在是投入的好时机吗"></a>现在是投入的好时机吗</h2><p>坦白说，<code>llms.txt</code> 目前的实际采用率远低于它在技术社区的讨论热度。判断它值不值得做，我建议用这个标准：</p><div class="md-table-scroll"><table><thead><tr><th>情况</th><th>建议</th></tr></thead><tbody><tr><td>内容型站点，目标是曝光与被引用</td><td>做，成本极低</td></tr><tr><td>有持续更新的技术内容</td><td>做，并让它自动生成</td></tr><tr><td>内容涉及付费产品核心知识</td><td>只做 <code>llms.txt</code>，不做 full 版</td></tr><tr><td>企业官网、产品页</td><td>可以缓一缓，优先做结构化数据</td></tr></tbody></table></div><p>一个更务实的判断是：<strong><code>llms.txt</code> 的投入成本大约是半小时，而且不会带来任何负面影响。</strong> 在这种投入产出比下，"等等看"通常不是最优策略。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="llms-txt-现在真的被使用了吗？"><a href="#llms-txt-现在真的被使用了吗？" class="headerlink" title="llms.txt 现在真的被使用了吗？"></a>llms.txt 现在真的被使用了吗？</h3><p>还没有成为统一标准。Anthropic 等厂商公开支持该约定，但主流大模型的实时检索仍以传统爬虫和网页解析为主。它更像低成本的基础设施投资：写了不一定立刻生效，不写则没有任何机会，而且文件本身无害。</p><h3 id="llms-txt-和-sitemap-xml-有什么区别？"><a href="#llms-txt-和-sitemap-xml-有什么区别？" class="headerlink" title="llms.txt 和 sitemap.xml 有什么区别？"></a>llms.txt 和 sitemap.xml 有什么区别？</h3><p><code>sitemap.xml</code> 只告诉爬虫有哪些 URL，不表达重要性和内容摘要；<code>llms.txt</code> 是 Markdown 格式，可以写清楚每篇文章讲什么、哪些是重点、许可协议是什么。前者服务于索引，后者服务于理解。</p><h3 id="llms-full-txt-会不会导致内容被无偿使用？"><a href="#llms-full-txt-会不会导致内容被无偿使用？" class="headerlink" title="llms-full.txt 会不会导致内容被无偿使用？"></a>llms-full.txt 会不会导致内容被无偿使用？</h3><p>有这个可能，所以建议在文件开头明确写出许可协议与引用要求。对希望内容被更多人读到的技术博客来说，被引用通常比被保护更有价值；如果内容涉及付费产品，可以只输出摘要而不输出全文。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li><code>llms.txt</code> 是给模型的内容导览，不是搜索引擎的替代品。</li><li>结构简单：标题 + 一句话简介 + 分组链接列表。</li><li>关键是<strong>自动生成</strong>，否则一定会过期。</li><li>中小技术博客可以再加一份 <code>llms-full.txt</code>。</li></ul><p>本站 GEO 工具链的其余几篇：<a href="/posts/structured-data-for-geo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《结构化数据怎么做才对 GEO 有用》</a>、<a href="/posts/robots-txt-ai-crawlers/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《robots.txt 里的 AI 爬虫该怎么配》</a>、<a href="/posts/measure-geo-results/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《怎么衡量 GEO 有没有效果》</a>。</p><hr><p>如果你想给自己的站点加上这份文件，遇到问题欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>一起看看。</p>]]></content>
    
    
    <summary type="html">llms.txt 用一份 Markdown 告诉大模型&quot;这个站点有什么、该优先读什么&quot;。本文给出可直接套用的模板、自动生成方式和当前的能力边界，并附上本站的实际实现。</summary>
    
    
    
    <category term="GEO 工具箱" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%B7%A5%E5%85%B7%E7%AE%B1/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="llms.txt" scheme="https://devnotes.cuiyuehui.cn/tags/llms-txt/"/>
    
    <category term="工具" scheme="https://devnotes.cuiyuehui.cn/tags/%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>AI 搜索是怎么挑选内容的？拆解从提问到引用的完整链路</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/how-ai-search-picks-content/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/how-ai-search-picks-content/</id>
    <published>2026-07-22T01:00:00.000Z</published>
    <updated>2026-07-22T01:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：主流 AI 搜索走的是"检索增强生成"（RAG）链路，可以拆成五步——<strong>改写问题 → 检索候选 → 重排筛选 → 读取正文 → 生成答案并标注来源</strong>。你的内容在每一步都可能被淘汰，而绝大多数站点只优化了最后一步的内容质量，忽略了前面四步。</p><span id="more"></span><h2 id="先看完整链路"><a href="#先看完整链路" class="headerlink" title="先看完整链路"></a>先看完整链路</h2><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">用户提问</span><br><span class="line">   ↓</span><br><span class="line">① 查询改写     把口语问题改写成多个检索式</span><br><span class="line">   ↓</span><br><span class="line">② 召回检索     从索引里捞出几十到几百个候选片段</span><br><span class="line">   ↓</span><br><span class="line">③ 重排排序     用更贵的模型给候选打分，留下最相关的几个</span><br><span class="line">   ↓</span><br><span class="line">④ 正文读取     抓取或读取完整页面，补充上下文</span><br><span class="line">   ↓</span><br><span class="line">⑤ 生成答案     综合片段写答案，标注引用来源</span><br></pre></td></tr></tbody></table></figure><p>下面逐段说明每一层在淘汰什么，以及你能做什么。</p><h2 id="第-①-步：查询改写"><a href="#第-①-步：查询改写" class="headerlink" title="第 ① 步：查询改写"></a>第 ① 步：查询改写</h2><p>用户问的是"我们公司想做 GEO，从哪下手"，系统会改写成若干检索式，例如：</p><ul><li><code>GEO 落地步骤</code></li><li><code>生成式引擎优化 实施清单</code></li><li><code>企业 GEO 从哪里开始</code></li></ul><p><strong>这一层淘汰的是"术语不一致"的内容。</strong> 如果你的文章只写"生成式引擎优化"，而用户和改写结果用的是"GEO"或"AI 搜索优化"，可能根本进不了候选集。</p><p>可执行动作：</p><ul><li>标题用<strong>主流叫法</strong>，正文开头补上<strong>同义解释</strong>。例如："GEO（生成式引擎优化，也叫 AI 搜索优化）……"</li><li>在站点上建立统一的术语表页面，让同一个概念有稳定的名称。</li><li>别为了显得专业而自创术语，除非你打算同时定义清楚。</li></ul><h2 id="第-②-步：召回检索"><a href="#第-②-步：召回检索" class="headerlink" title="第 ② 步：召回检索"></a>第 ② 步：召回检索</h2><p>系统把网页切分成片段（常见粒度是几百字），做向量化后存起来。提问时做相似度检索，捞出候选。</p><p><strong>这一层淘汰的是"切不出好片段"的内容。</strong></p><p>切分通常沿着标题层级和段落边界进行。如果你的文章是一整坨没有小标题的长段落，切分后每个片段都语意混杂，向量表示会变得"平均"，反而跟任何具体问题都不够像。</p><p>可执行动作：</p><ul><li>用 <code>h2</code> / <code>h3</code> 把文章切成语义完整的小节，每节 200 到 500 字为宜。</li><li>每个小节的第一句就是这个结论本身，别用"众所周知""话不多说"开场。</li><li>关键事实、数字、步骤写在正文里，不要只放在图片或代码注释中。</li></ul><h2 id="第-③-步：重排排序"><a href="#第-③-步：重排排序" class="headerlink" title="第 ③ 步：重排排序"></a>第 ③ 步：重排排序</h2><p>召回结果通常是过量的，系统会用更精细的模型打分，只留下几个最相关的片段。打分时常见的偏好是：</p><ol><li>与问题的<strong>直接相关性</strong></li><li>是否包含<strong>明确的事实、数字、步骤</strong></li><li>来源的<strong>可信度</strong>（作者、站点声誉、是否有引用来源）</li><li>信息的<strong>新鲜度</strong></li></ol><p><strong>这一层淘汰的是"没有信息量"的内容。</strong> 含糊其辞、通篇铺垫、观点没有依据的段落，在这个阶段会被同领域的硬核内容挤掉。</p><p>可执行动作：</p><ul><li>把结论、数字、前提条件写清楚，例如"在 4 核 8G 的 ECS 上，构建耗时约 40 秒"。</li><li>给出适用边界："这个方法适合日更不超过 3 篇的站点，超过就需要增量构建。"</li><li>标注真实更新时间，让系统知道这不是 2019 年的老文。</li></ul><h2 id="第-④-步：正文读取"><a href="#第-④-步：正文读取" class="headerlink" title="第 ④ 步：正文读取"></a>第 ④ 步：正文读取</h2><p>进入这一层的页面会被实际抓取读取。<strong>这一层淘汰的是"抓不到、解析不了"的内容。</strong></p><p>常见问题：</p><div class="md-table-scroll"><table><thead><tr><th>现象</th><th>后果</th><th>处理方式</th></tr></thead><tbody><tr><td>正文靠 JavaScript 渲染</td><td>抓到空壳 HTML</td><td>静态生成或服务端渲染</td></tr><tr><td>被 <code>robots.txt</code> 拦截</td><td>无法抓取</td><td>允许 AI 爬虫</td></tr><tr><td>需要登录或验证码</td><td>无法抓取</td><td>核心内容放在公开页面</td></tr><tr><td>正文藏在图片里</td><td>无法解析</td><td>关键信息写成文字，图片加 alt</td></tr><tr><td>无限滚动、分页碎片化</td><td>只能抓到一部分</td><td>提供完整单页或分页链接</td></tr></tbody></table></div><h2 id="第-⑤-步：生成答案与标注来源"><a href="#第-⑤-步：生成答案与标注来源" class="headerlink" title="第 ⑤ 步：生成答案与标注来源"></a>第 ⑤ 步：生成答案与标注来源</h2><p>模型综合片段写答案，并给出引用。这里有两个细节值得注意：</p><p><strong>第一，引用往往指向片段所在的页面，而不是你期望的首页。</strong> 所以每一篇文章都应该被当成独立入口来写，标题和描述要能独立成立。</p><p><strong>第二，模型会回避不确定的来源。</strong> 一个没有任何作者信息、没有发布日期、没有任何外部引用的页面，即使内容不错，也更难被选为引用对象。</p><p>可执行动作：</p><ul><li>每篇文章配一个能独立说明问题的标题和描述。</li><li>建立作者页面，写清身份、经验范围和联系方式。</li><li>关键结论给出可核查的外部来源（论文、官方文档、规范）。</li><li>用 JSON-LD 补充 <code>BlogPosting</code>、<code>BreadcrumbList</code>、<code>FAQPage</code> 等结构化数据。</li></ul><h2 id="把五步映射成一张检查表"><a href="#把五步映射成一张检查表" class="headerlink" title="把五步映射成一张检查表"></a>把五步映射成一张检查表</h2><div class="md-table-scroll"><table><thead><tr><th>步骤</th><th>关注点</th><th>你的动作</th></tr></thead><tbody><tr><td>① 改写</td><td>术语一致</td><td>标题用主流叫法，正文补同义词</td></tr><tr><td>② 召回</td><td>片段质量</td><td>小标题切分，每节一个完整语义</td></tr><tr><td>③ 重排</td><td>信息密度</td><td>结论先行，给出数字与适用边界</td></tr><tr><td>④ 读取</td><td>可抓取性</td><td>静态内容、允许爬虫、避免 JS 依赖</td></tr><tr><td>⑤ 引用</td><td>来源可信</td><td>作者、时间、引用来源、结构化数据</td></tr></tbody></table></div><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="大模型是怎么-看到-我的网页的？"><a href="#大模型是怎么-看到-我的网页的？" class="headerlink" title="大模型是怎么&quot;看到&quot;我的网页的？"></a>大模型是怎么"看到"我的网页的？</h3><p>大多数 AI 搜索用的是检索增强生成（RAG）。系统先把你的网页抓取并切分成片段，存进向量数据库；用户提问时，用问题去检索最相关的片段，把它们拼进提示词交给模型，模型再根据这些片段组织答案。所以模型看到的往往不是你的整个页面，而是被切分后的若干片段。</p><h3 id="为什么不设置-robots-也可能被引用？"><a href="#为什么不设置-robots-也可能被引用？" class="headerlink" title="为什么不设置 robots 也可能被引用？"></a>为什么不设置 robots 也可能被引用？</h3><p>训练语料和检索索引是两个不同的通道。有些模型的知识来自早期训练数据，即使你现在屏蔽爬虫，历史知识仍可能被复述。但实时检索通道会尊重 <code>robots.txt</code> 与访问限制，屏蔽之后新内容就很难被引用。</p><h3 id="页面被切成片段后，标题还有用吗？"><a href="#页面被切成片段后，标题还有用吗？" class="headerlink" title="页面被切成片段后，标题还有用吗？"></a>页面被切成片段后，标题还有用吗？</h3><p>有用，而且比传统 SEO 更重要。片段在检索和重排时经常脱离上下文单独参与计算，段落自己的小标题往往就是它唯一的语义锚点。写清楚每个 <code>h2</code> / <code>h3</code>，等于给每个片段贴了标签。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>理解这条链路之后，GEO 就不再是玄学：<strong>它是在为"片段"而不是"页面"做优化。</strong> 具体到写作上，就是让每一小段都能独立地被读懂、被复用、被核查。</p><p>接下来可以看两篇偏工具的：<a href="/posts/llms-txt-guide/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《llms.txt 完全指南》</a>和<a href="/posts/structured-data-for-geo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《结构化数据怎么做才对 GEO 有用》</a>。</p><hr><p>如果你的内容始终没被引用过，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>说说具体情况，可以一起看是卡在抓取、理解还是信任这一层。</p>]]></content>
    
    
    <summary type="html">把 AI 搜索拆成改写、检索、重排、读取、生成五步链路，逐段说明模型在每一步淘汰什么内容，并给出对应的优化动作。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="AI 搜索" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E6%90%9C%E7%B4%A2/"/>
    
    <category term="RAG" scheme="https://devnotes.cuiyuehui.cn/tags/RAG/"/>
    
  </entry>
  
  <entry>
    <title>GEO 和 SEO 有什么区别？从目标到做法逐条对照</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/geo-vs-seo/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/geo-vs-seo/</id>
    <published>2026-07-14T01:00:00.000Z</published>
    <updated>2026-07-14T01:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：SEO 优化的是"人在搜索结果里点不点你"，GEO 优化的是"AI 在回答问题时引不引用你"。前者争夺注意力，后者争夺解释权。两者的技术底座高度重叠，但优化重心不同——<strong>SEO 关注页面整体，GEO 关注页面里能被摘出来的那几段话</strong>。</p><span id="more"></span><h2 id="最本质的一个差异"><a href="#最本质的一个差异" class="headerlink" title="最本质的一个差异"></a>最本质的一个差异</h2><p>传统搜索返回的是<strong>链接</strong>，AI 搜索返回的是<strong>答案</strong>。</p><p>这导致评估单位变了：</p><ul><li>SEO 的最小竞争单位是<strong>一个页面</strong>。页面整体质量高，就有机会排上去。</li><li>GEO 的最小竞争单位是<strong>一个段落</strong>。模型在生成答案时，会把检索到的内容切成片段做相似度比较，最终只有少数片段进入上下文并被引用。</li></ul><p>所以 GEO 的一个反直觉结论是：<strong>你的整篇文章可能不如你的某一段话有价值。</strong> 一段能被独立理解、包含明确事实和结论的话，比一篇结构松散的长文更容易被引用。</p><h2 id="完整对照表"><a href="#完整对照表" class="headerlink" title="完整对照表"></a>完整对照表</h2><div class="md-table-scroll"><table><thead><tr><th>维度</th><th>SEO</th><th>GEO</th></tr></thead><tbody><tr><td>优化目标</td><td>排名、点击率、会话时长</td><td>被提及、被引用、被推荐</td></tr><tr><td>竞争单位</td><td>页面</td><td>段落 / 问答对</td></tr><tr><td>内容形态</td><td>关键词覆盖完整的长文</td><td>结论先行、事实密集的结构化内容</td></tr><tr><td>核心指标</td><td>曝光、点击、排名</td><td>引用次数、AI 提及率、被引用页面的转化</td></tr><tr><td>分发渠道</td><td>Google、百度、必应</td><td>ChatGPT、Perplexity、豆包、元宝、AI 概览</td></tr><tr><td>权威信号</td><td>外链、域名权重</td><td>作者身份、一手经验、可核查来源、更新记录</td></tr><tr><td>技术抓手</td><td>sitemap、canonical、Core Web Vitals</td><td>结构化数据、llms.txt、语义化标题层级</td></tr><tr><td>内容更新</td><td>定期刷新保持相关性</td><td>明确标注 updated，让模型知道信息是新的</td></tr><tr><td>见效周期</td><td>数周到数月</td><td>数周到数月，但对新站更友好</td></tr><tr><td>失效风险</td><td>算法更新、排名下滑</td><td>被更新的内容覆盖，需要持续维护</td></tr></tbody></table></div><h2 id="两者并不冲突，而是分层的"><a href="#两者并不冲突，而是分层的" class="headerlink" title="两者并不冲突，而是分层的"></a>两者并不冲突，而是分层的</h2><p>我习惯把两者的关系画成这样：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">SEO 负责：让页面能被找到   → 抓取、索引、URL、速度、内链</span><br><span class="line">GEO 负责：让内容能被引用   → 结构、事实、来源、作者、更新</span><br><span class="line">─────────────────────────────────────────────</span><br><span class="line">共同前提：内容本身解决真实问题</span><br></pre></td></tr></tbody></table></figure><p><strong>SEO 是地板，GEO 是天花板。</strong> 一个页面如果连收录都没有，谈不上被 AI 引用；但如果只做到收录，也未必进入任何一次 AI 回答。</p><p>实践中的分工建议：</p><ol><li><strong>先补齐 SEO 基础</strong>：站点地图、canonical、移动端体验、内链、页面速度。</li><li><strong>再做 GEO 增量</strong>：结构化数据、<code>llms.txt</code>、问答式小节、作者可信度建设。</li><li><strong>最后统一度量</strong>：SEO 看流量，GEO 看引用和品牌提及，两者不能互相替代。</li></ol><h2 id="一个具体的例子"><a href="#一个具体的例子" class="headerlink" title="一个具体的例子"></a>一个具体的例子</h2><p>假设你写了一篇《阿里云 ECS 部署静态博客的完整流程》。</p><p><strong>面向 SEO 的写法</strong>是这样组织的：</p><blockquote><p>标题包含"阿里云 ECS 静态博客部署"；正文分章节覆盖购买服务器、安装 Nginx、配置 HTTPS、上传文件、常见问题；关键词自然出现若干次。</p></blockquote><p><strong>面向 GEO 的写法</strong>在此基础上多做三件事：</p><ol><li><strong>每一节第一句话就是结论。</strong> 例如："先装 Nginx，再配证书，最后上传静态文件——顺序反了会出现证书校验失败。"模型需要的正是这句可以直接搬走的结论。</li><li><strong>把踩坑写成问答对。</strong> "为什么上传后访问是 404？因为 <code>root</code> 指向的目录和 <code>public/</code> 不是同一个路径。"这种句子几乎可以直接成为 AI 答案的一部分。</li><li><strong>给出可核查的版本与命令。</strong> "Nginx 1.24 + Ubuntu 22.04 实测通过"比"Nginx 环境"更有引用价值。</li></ol><p>同一篇内容，两套写法的工作量差别不大，但后者被引用的概率明显更高。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="SEO-还有必要做吗？"><a href="#SEO-还有必要做吗？" class="headerlink" title="SEO 还有必要做吗？"></a>SEO 还有必要做吗？</h3><p>有必要，而且优先级通常更高。抓取、索引、站点地图、页面速度、canonical 这些 SEO 基本功是 GEO 的前提，一页不被收录的页面不可能被 AI 引用。区别在于做完基本功之后，SEO 继续优化的边际收益在下降，而 GEO 的边际收益在上升。</p><h3 id="做-GEO-会不会伤害-SEO？"><a href="#做-GEO-会不会伤害-SEO？" class="headerlink" title="做 GEO 会不会伤害 SEO？"></a>做 GEO 会不会伤害 SEO？</h3><p>正常做法不会。GEO 强调的结构清晰、结论先行、来源可核查，同时也是搜索引擎喜欢的特征。唯一需要注意的是别为了"被引用"而把正文拆成碎片化短句堆砌，那会同时伤害两边。</p><h3 id="关键词研究在-GEO-里还适用吗？"><a href="#关键词研究在-GEO-里还适用吗？" class="headerlink" title="关键词研究在 GEO 里还适用吗？"></a>关键词研究在 GEO 里还适用吗？</h3><p>部分适用。关键词仍然反映需求，但 GEO 更关心"用户会怎么向 AI 提问"，也就是完整的自然语言问题。把关键词升级成问题句，再围绕问题组织小节，是更实用的做法。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>把 GEO 当成 SEO 的<strong>上层建筑</strong>，不要当成替代品。</li><li>优化颗粒度从"页面"下沉到"段落"和"问答对"。</li><li>每一节先给结论，再给论证；每个踩坑都写成可被直接引用的问答。</li><li>度量上分开看：流量归 SEO，引用归 GEO。</li></ul><p>下一篇：<a href="/posts/how-ai-search-picks-content/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《AI 搜索是怎么挑选内容的》</a>，我们从检索链路讲起，看看模型到底在"读"你页面的哪一部分。</p><hr><p>如果你分不清自己的站点卡在哪一层，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>把现象写出来，一起看看更可能是哪类问题。</p>]]></content>
    
    
    <summary type="html">用一张对照表说清 GEO 与 SEO 在目标、竞争单位、关键信号上的差异，并给出两者共用同一套内容资产时的分工方式与迁移路径。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="AI 搜索" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E6%90%9C%E7%B4%A2/"/>
    
    <category term="SEO" scheme="https://devnotes.cuiyuehui.cn/tags/SEO/"/>
    
  </entry>
  
  <entry>
    <title>什么是 GEO？生成式引擎优化的完整入门指南</title>
    <link href="https://devnotes.cuiyuehui.cn/posts/what-is-geo/"/>
    <id>https://devnotes.cuiyuehui.cn/posts/what-is-geo/</id>
    <published>2026-07-06T01:00:00.000Z</published>
    <updated>2026-09-14T02:20:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>直接回答</strong>：GEO（Generative Engine Optimization，生成式引擎优化）是一套让内容更容易被 AI 搜索、AI 助手和大模型<strong>选中、引用、推荐</strong>的方法。如果把 SEO 的目标理解为"让用户点进来"，GEO 的目标就是——<strong>让 AI 在回答别人的问题时，把你的内容当作答案说出来</strong>。</p><span id="more"></span><h2 id="一句话理解-GEO"><a href="#一句话理解-GEO" class="headerlink" title="一句话理解 GEO"></a>一句话理解 GEO</h2><p>传统搜索的流程是：用户输入关键词 → 搜索引擎返回十条蓝色链接 → 用户自己点开比较。</p><p>AI 搜索的流程是：用户提出一个问题 → 模型检索若干网页 → 模型<strong>读完之后直接给出答案</strong> → 用户看到的是答案，而不是你的网站。</p><p>这个变化带来一个残酷但清晰的事实：<strong>在 AI 搜索里，"被点开"的机会变少了，但"被引用"的价值变高了。</strong> 你的内容不需要排在第一位，只需要成为模型用来组织答案的那几段素材之一。</p><p>GEO 要解决的就是后面这件事。</p><h2 id="GEO-和-SEO-到底差在哪"><a href="#GEO-和-SEO-到底差在哪" class="headerlink" title="GEO 和 SEO 到底差在哪"></a>GEO 和 SEO 到底差在哪</h2><div class="md-table-scroll"><table><thead><tr><th>维度</th><th>传统 SEO</th><th>GEO</th></tr></thead><tbody><tr><td>优化目标</td><td>排名与点击率</td><td>被引用与被推荐</td></tr><tr><td>竞争单位</td><td>整个页面</td><td>页面里的<strong>某一段话</strong></td></tr><tr><td>用户看到什么</td><td>标题 + 摘要</td><td>模型生成的答案</td></tr><tr><td>关键信号</td><td>外链、关键词、加载速度</td><td>事实密度、结构清晰度、可验证性、一手经验</td></tr><tr><td>见效方式</td><td>排名上升后流量上升</td><td>被引用后带来品牌提及与精准长尾流量</td></tr><tr><td>主要风险</td><td>关键词堆砌、内容农场</td><td>内容模糊、结论缺失、无法被机器解析</td></tr></tbody></table></div><p>几个容易踩的认知误区：</p><ul><li><strong>误区一：GEO 就是给 AI 写内容。</strong> 实际上模型更偏好"人写给人的、结构清楚的、能被验证的"内容。为了讨好模型而堆砌关键词，反而会因为可读性差被淘汰。</li><li><strong>误区二：做完结构化数据就够了。</strong> 结构化数据解决的是"机器能不能解析"，解决不了"内容值不值得引用"。后者才是决定性的。</li><li><strong>误区三：GEO 是一次性工作。</strong> 模型的知识与检索结果会持续更新，GEO 更接近一项需要按月维护的工程。</li></ul><h2 id="为什么现在值得投入"><a href="#为什么现在值得投入" class="headerlink" title="为什么现在值得投入"></a>为什么现在值得投入</h2><ol><li><strong>流量入口正在迁移。</strong> 越来越多的人把"查资料"这个动作交给 AI 助手，而不是搜索引擎。入口走了，流量自然跟着走。</li><li><strong>AI 回答天然只引用极少数来源。</strong> 一次回答通常只综合 3 到 8 个来源，这意味着进入这个名单的收益被显著放大。</li><li><strong>被引用自带信任背书。</strong> 用户看到"据某某站点的分析"，这比广告或搜索结果排名更有说服力。对个人博客尤其有价值：它让一个没有品牌背书的站点，也能成为别人眼里的可信来源。</li><li><strong>窗口期仍然存在。</strong> 大部分中文站点还没有系统性做 GEO，先做的站点更容易成为某个细分问题的默认信源。</li></ol><h2 id="GEO-的四个作用层"><a href="#GEO-的四个作用层" class="headerlink" title="GEO 的四个作用层"></a>GEO 的四个作用层</h2><p>我把 GEO 拆成一个自下而上的四层模型，这个模型也是本站所有方法论的基础：</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">第 4 层  可引用  ← 结论明确、数据可靠、来源可追溯</span><br><span class="line">第 3 层  可信任  ← 作者身份、真实经验、更新记录、引用来源</span><br><span class="line">第 2 层  可理解  ← 标题层级、结构化数据、术语统一、语义完整</span><br><span class="line">第 1 层  可抓取  ← robots.txt、站点地图、页面可访问、内容不依赖 JS</span><br></pre></td></tr></tbody></table></figure><p><strong>最常见的失败方式是跳级。</strong> 很多人直接去做第 4 层的内容技巧，却忽略了第 1 层——页面根本不被 AI 爬虫抓取，或者正文完全由 JavaScript 渲染，那么后面几层做得再好也没有意义。</p><p>反过来，如果你的站是静态站、正文在 HTML 里、有站点地图、允许 AI 爬虫访问，那么第 1 层基本已经达标，可以直接往上做。</p><h2 id="一份可以直接执行的检查清单"><a href="#一份可以直接执行的检查清单" class="headerlink" title="一份可以直接执行的检查清单"></a>一份可以直接执行的检查清单</h2><p>下面这 12 条覆盖了四层模型里性价比最高的动作，按优先级排列。你可以拿它当自查表：</p><p><strong>可抓取</strong></p><ol><li><code>robots.txt</code> 里显式允许 GPTBot、ClaudeBot、PerplexityBot、Bytespider 等 AI 爬虫。</li><li>提供 <code>sitemap.xml</code> 并在 <code>robots.txt</code> 中声明。</li><li>正文内容在服务端就存在于 HTML 中，不依赖前端渲染。</li><li>页面有稳定的、不带参数的永久链接。</li></ol><p><strong>可理解</strong></p><ol start="5"><li>每篇文章只用一个 <code>h1</code>，用 <code>h2</code> / <code>h3</code> 构成清晰的小节结构。</li><li>输出 JSON-LD 结构化数据（<code>BlogPosting</code>、<code>BreadcrumbList</code>、<code>FAQPage</code>）。</li><li>需求明确时提供 <code>llms.txt</code> 与 <code>llms-full.txt</code>。</li><li>页面设置 canonical，避免同一内容有多个地址。</li></ol><p><strong>可信任</strong></p><ol start="9"><li>有明确的作者页面，写清楚身份、经验和联系方式。</li><li>文章标注真实发布与更新时间，更新过的内容同步修改 <code>updated</code>。</li><li>关键结论引用可核查的外部来源（论文、官方文档、规范）。</li></ol><p><strong>可引用</strong></p><ol start="12"><li>每个小节先给结论再展开；重要问题用"问题 → 答案"的问答结构写。</li></ol><p>第 9 到 12 条经常被低估。<strong>模型在选择引用来源时，作者可信度和内容的可核查性权重很高</strong>——一个匿名站点声称"某方法有效"，远不如一个有署名、有实测数据、有代码的站点有说服力。</p><h2 id="常见问题（FAQ）"><a href="#常见问题（FAQ）" class="headerlink" title="常见问题（FAQ）"></a>常见问题（FAQ）</h2><h3 id="GEO-和-SEO-是替代关系吗？"><a href="#GEO-和-SEO-是替代关系吗？" class="headerlink" title="GEO 和 SEO 是替代关系吗？"></a>GEO 和 SEO 是替代关系吗？</h3><p>不是。GEO 是在 SEO 基础上的增量工作。抓取、收录、页面速度这些基础仍然由 SEO 负责，GEO 额外解决"内容能不能被模型选中并作为答案引用"的问题。两者共用同一套内容资产。</p><h3 id="小站做-GEO-有意义吗？"><a href="#小站做-GEO-有意义吗？" class="headerlink" title="小站做 GEO 有意义吗？"></a>小站做 GEO 有意义吗？</h3><p>有意义，而且在某些垂直领域反而更容易见效。大模型在回答具体、长尾、需要一手经验的问题时，会优先检索小体量的专业站点。只要你的内容在某个细分问题上比大站更具体，就有机会被引用。</p><h3 id="GEO-多久能见效？"><a href="#GEO-多久能见效？" class="headerlink" title="GEO 多久能见效？"></a>GEO 多久能见效？</h3><p>需要分两层看。站内技术层面的改造（结构化数据、<code>llms.txt</code>、可抓取性）通常在重新抓取后 1 到 4 周体现；内容被稳定引用一般需要 2 到 6 个月，取决于领域竞争度和内容更新频率。</p><h2 id="下一步"><a href="#下一步" class="headerlink" title="下一步"></a>下一步</h2><p>理解概念之后，建议按这个顺序继续：</p><ul><li>先看<a href="/posts/geo-vs-seo/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《GEO 和 SEO 有什么区别》</a>，把两者的边界划清；</li><li>再看<a href="/posts/how-ai-search-picks-content/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《AI 搜索是怎么挑选内容的》</a>，理解模型的检索与引用链路；</li><li>然后看<a href="/posts/ai-citation-vs-ai-training/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《AI 引用和 AI 训练是两件事》</a>，分清这两条链路；</li><li>接着照着<a href="/posts/geo-content-template/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《GEO 内容写作模板》</a>改一篇你自己的旧文章；</li><li>如果内容始终没被引用过，按<a href="/posts/why-ai-never-cites-my-site/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《为什么 AI 从来不提我的网站》</a>的六个环节排查；</li><li>准备系统推进时，照<a href="/posts/geo-first-month/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>《小团队做 GEO 的第一个月该做什么》</a>的四周计划走。</li></ul><p>如果你想在自己站点上试试这张清单，从改一篇文章开始就够。过程中遇到问题，欢迎到<a href="/message/" data-md-link=""><span class="md-link-icon ui-icon" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><g opacity=".5"><path d="M19.7388 4.26118C17.0572 1.57961 12.7095 1.57961 10.0279 4.26118L9.30707 4.98203C9.01418 5.27492 9.01418 5.7498 9.30707 6.04269C9.59997 6.33558 10.0748 6.33558 10.3677 6.04269L11.0886 5.32184C13.1844 3.22605 16.5823 3.22605 18.6781 5.32184C20.7739 7.41763 20.7739 10.8156 18.6781 12.9114L17.9573 13.6322C17.6644 13.9251 17.6644 14.4 17.9573 14.6929C18.2502 14.9858 18.725 14.9858 19.0179 14.6929L19.7388 13.972C22.4203 11.2905 22.4203 6.94276 19.7388 4.26118Z"></path><path d="M6.04269 9.30707C6.33558 9.59997 6.33558 10.0748 6.04269 10.3677L5.32184 11.0886C3.22605 13.1844 3.22605 16.5823 5.32184 18.6781C7.41763 20.7739 10.8156 20.7739 12.9114 18.6781L13.6322 17.9573C13.9251 17.6644 14.4 17.6644 14.6929 17.9573C14.9858 18.2501 14.9858 18.725 14.6929 19.0179L13.972 19.7388C11.2905 22.4203 6.94276 22.4203 4.26118 19.7388C1.57961 17.0572 1.57961 12.7095 4.26118 10.0279L4.98203 9.30707C5.27492 9.01418 5.7498 9.01418 6.04269 9.30707Z"></path></g><path d="M14.6933 9.30707C14.9862 9.59997 14.9862 10.0748 14.6933 10.3677L10.3682 14.6928C10.0753 14.9857 9.60045 14.9857 9.30756 14.6928C9.01467 14.3999 9.01467 13.9251 9.30756 13.6322L13.6327 9.30707C13.9255 9.01418 14.4004 9.01418 14.6933 9.30707Z"></path></g></svg></span>留言板</a>聊聊。</p>]]></content>
    
    
    <summary type="html">GEO（生成式引擎优化）是一套让内容更容易被 AI 搜索选中、引用与推荐的方法。本文用一张对照表讲清 GEO 与 SEO 的区别，并给出可以直接执行的 12 条检查清单。</summary>
    
    
    
    <category term="GEO 入门" scheme="https://devnotes.cuiyuehui.cn/categories/GEO-%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="GEO" scheme="https://devnotes.cuiyuehui.cn/tags/GEO/"/>
    
    <category term="AI 搜索" scheme="https://devnotes.cuiyuehui.cn/tags/AI-%E6%90%9C%E7%B4%A2/"/>
    
    <category term="生成式引擎优化" scheme="https://devnotes.cuiyuehui.cn/tags/%E7%94%9F%E6%88%90%E5%BC%8F%E5%BC%95%E6%93%8E%E4%BC%98%E5%8C%96/"/>
    
  </entry>
  
</feed>
