<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Claude 中文知识站</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://claude.cocoloop.cn/</id>
  <link href="https://claude.cocoloop.cn/" rel="alternate"/>
  <link href="https://claude.cocoloop.cn/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Claude 中文知识站</rights>
  <subtitle>从入门到精通 · Claude 官方能力全景指南</subtitle>
  <title>Claude 中文知识站</title>
  <updated>2026-04-21T15:01:00.000Z</updated>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Prompt 工程" scheme="https://claude.cocoloop.cn/categories/Prompt-%E5%B7%A5%E7%A8%8B/"/>
    <category term="Claude" scheme="https://claude.cocoloop.cn/tags/Claude/"/>
    <category term="Prompt" scheme="https://claude.cocoloop.cn/tags/Prompt/"/>
    <category term="Chain of Thought" scheme="https://claude.cocoloop.cn/tags/Chain-of-Thought/"/>
    <category term="Extended Thinking" scheme="https://claude.cocoloop.cn/tags/Extended-Thinking/"/>
    <content>
      <![CDATA[<p>大概一年半前我做过一个医疗 FAQ 智能客服，核心任务是”从 800 条标准问答里召回最相关的 3 条”。0-shot + 结构化 prompt 跑下来准确率 92%，客户验收通过。</p><p>上线一个月后我想着优化一下，加了 <code>&lt;thinking&gt;</code> 让模型”先分析问题意图再选择答案”。心想这肯定更稳吧，结果一跑——84%。</p><p>整整掉了 8 个点。我反复看了很多 case 才搞明白：这类任务本质上是”语义相似度召回”，模型在 embedding 层面其实已经做对了判断，你硬让它”逐步推理”，它反而会被自己推出来的中间结论带偏。</p><p>这事给我上了一课。CoT（Chain of Thought）不是越多越好，更不是万能。这篇说一下我现在怎么判断。</p><h2 id="什么时候-CoT-是神器"><a href="#什么时候-CoT-是神器" class="headerlink" title="什么时候 CoT 是神器"></a>什么时候 CoT 是神器</h2><p>先说有用的场景。我经验里 CoT 确实能显著提升效果的几类任务：</p><p><strong>一、数学和数值推理。</strong>不管多简单，只要涉及”一步算错全盘错”的计算，让它一步步来就对了。实测一个三步应用题，直接问正确率 73%，加 <code>&lt;thinking&gt;</code> 后 94%。这个提升是稳的。</p><p><strong>二、多跳问答。</strong>“根据 A 文档里的 X 和 B 文档里的 Y 推出 Z”这种。模型需要先把中间结论落到纸面，不然容易幻觉。</p><p><strong>三、合规 &#x2F; 规则判断。</strong>比如”判断这份合同是否违反下面 7 条规则”。你不让它一条一条过，它会漏。让它显式地说”规则 1: 符合；规则 2: 不符合，因为…”准确率直接上去。</p><p><strong>四、复杂决策树。</strong>客服分流、工单分类有 20 多种类别且存在嵌套层级的时候，CoT 能让模型稳得多。</p><p>这些任务的共同点：<strong>有可拆分的中间步骤、有客观验证路径、犯错代价高。</strong>给它展开的空间，它会自己纠偏。</p><h2 id="什么时候-CoT-反而添乱"><a href="#什么时候-CoT-反而添乱" class="headerlink" title="什么时候 CoT 反而添乱"></a>什么时候 CoT 反而添乱</h2><p>这些是我踩过坑的：</p><p><strong>一、纯召回 &#x2F; 纯匹配任务。</strong>像我开头说的那个 FAQ 项目。模型其实一眼就知道答案，你让它”分析再选”是在给它添乱。</p><p><strong>二、简单分类。</strong>三到五个类别、边界清楚的那种。加 CoT 会让模型过度理由化——“这条评论包含了正面情绪但也有一丝失望所以应该是…”结果越想越歪。直接判断快又稳。</p><p><strong>三、创作 &#x2F; 生成任务。</strong>让它写一个故事前先 <code>&lt;thinking&gt;</code> 梳理一下人物？没必要。创作是发散的，强行收窄到”先想后写”反而让输出变得程式化。</p><p><strong>四、高吞吐短响应场景。</strong>API 客服实时应答，延迟要求 500ms 以内，你加一段思考就是 500+ tokens 的开销，用户体验直接崩。这时候宁可损失 2-3 个点的准确率也要快。</p><p>判断逻辑大致是：<strong>任务能不能”一眼看出对错”？能的话，CoT 大概率添乱。需要”想一下才能判断对错”的，CoT 才有意义。</strong></p><h2 id="标签的正确用法"><a href="#标签的正确用法" class="headerlink" title="&lt;thinking&gt; 标签的正确用法"></a><code>&lt;thinking&gt;</code> 标签的正确用法</h2><p>决定要用 CoT 之后，怎么用也有讲究。我看过太多人把这个标签用歪了。</p><p><strong>错误用法一：标签里塞”万能咒语”。</strong></p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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">&lt;thinking&gt;</span><br><span class="line">请仔细思考这个问题，考虑所有可能的情况，</span><br><span class="line">确保你的回答准确无误。</span><br><span class="line">&lt;/thinking&gt;</span><br></pre></td></tr></table></figure></div><p>这种写法 Claude 看了基本等于没看。空洞的”请认真思考”对输出没任何指导作用。</p><p><strong>错误用法二：要求固定的思考步骤但步骤不匹配任务。</strong></p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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">&lt;thinking&gt;</span><br><span class="line">1. 分析用户意图</span><br><span class="line">2. 检索相关信息</span><br><span class="line">3. 组织回答</span><br><span class="line">&lt;/thinking&gt;</span><br></pre></td></tr></table></figure></div><p>这种模板如果和真实任务路径对不上，反而在限制模型。比如任务是个简单数值题，它会被迫走”分析用户意图”这一步，浪费 token 还可能走偏。</p><p><strong>我现在的写法：任务依赖型，而不是通用型。</strong></p><p>合规判断场景：</p><div class="code-container" data-rel="Xml"><figure class="iseeu highlight xml"><table><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="tag">&lt;<span class="name">thinking</span>&gt;</span></span><br><span class="line">先把合同里所有可能涉及规则的条款列出来，</span><br><span class="line">对每一条规则判断：符合 / 不符合 / 不适用。</span><br><span class="line">所有规则过完再给最终结论。</span><br><span class="line"><span class="tag">&lt;/<span class="name">thinking</span>&gt;</span></span><br></pre></td></tr></table></figure></div><p>数学题场景：</p><div class="code-container" data-rel="Xml"><figure class="iseeu highlight xml"><table><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="tag">&lt;<span class="name">thinking</span>&gt;</span></span><br><span class="line">逐步列出计算过程，每一步明确说明依据的条件和得到的中间值。</span><br><span class="line">算完后回头验算一遍。</span><br><span class="line"><span class="tag">&lt;/<span class="name">thinking</span>&gt;</span></span><br></pre></td></tr></table></figure></div><p>具体、可执行、紧贴任务。不是给模型”打气”，是给它”操作手册”。</p><h2 id="那个”让它思考反而更错”的-case"><a href="#那个”让它思考反而更错”的-case" class="headerlink" title="那个”让它思考反而更错”的 case"></a>那个”让它思考反而更错”的 case</h2><p>再讲个我印象深的反例。某金融客户要做”判断一条新闻是利好还是利空”。</p><p>0-shot 准确率 81%，我觉得还能更高，加了一段：</p><div class="code-container" data-rel="Xml"><figure class="iseeu highlight xml"><table><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="tag">&lt;<span class="name">thinking</span>&gt;</span></span><br><span class="line">先分析这条新闻涉及的主体是谁、事件性质是什么、</span><br><span class="line">短期影响和长期影响分别如何、最后综合判断利好利空。</span><br><span class="line"><span class="tag">&lt;/<span class="name">thinking</span>&gt;</span></span><br></pre></td></tr></table></figure></div><p>测下来 76%。反复看了 case 之后我发现问题：<strong>金融新闻的”利好利空”很多时候是情感驱动的市场反应，不是严密因果推理的结果。</strong></p><p>你让模型去分析”长期影响”，它经常会推出一个”虽然短期看是利空但长期利好”的结论，结果跟市场真实反应完全相反。真实市场就是看短期情绪，不看你的长期理性推理。</p><p>后来我把 thinking 拿掉，改成一条简短的 hint：”从市场短期情绪反应的角度判断”，准确率回到 81% 并稳定在那。</p><p><strong>这个教训是：CoT 的前提是任务本身有”可推理”的结构。没有这个前提，你强行推理就是在制造噪声。</strong></p><h2 id="Extended-Thinking-模式怎么看"><a href="#Extended-Thinking-模式怎么看" class="headerlink" title="Extended Thinking 模式怎么看"></a>Extended Thinking 模式怎么看</h2><p>Claude 后来出的 extended thinking 模式（就是那个可以看到完整思考链、token 消耗翻倍的那个）我也用过不少。</p><p><strong>值得开的场景：</strong></p><ul><li>复杂代码生成（写一个有设计模式考虑的完整模块）</li><li>多文档综合分析</li><li>需要调试的 bug 排查</li><li>棋类 &#x2F; 规则类博弈决策</li></ul><p><strong>不值得开的场景：</strong></p><ul><li>所有短平快任务</li><li>写营销文案、客服回复</li><li>文档抽取（大部分情况）</li><li>简单的代码 review</li></ul><p>成本上，extended thinking 的 token 消耗能达到常规的 2-5 倍。我自己项目里的原则是：<strong>能用 Sonnet 常规模式解决的事，不开 thinking；必须开的时候，先用 Opus 试，效果 OK 再考虑降级。</strong><a href="/posts/claude-family-haiku-sonnet-opus/">Claude 家族那篇</a>里有更细的模型选型讨论。</p><p>还有个细节：extended thinking 模式下，prompt caching 的表现和常规模式有些差异，具体的我在<a href="/posts/prompt-caching-deep-guide/">缓存深度指南</a>里提过。</p><h2 id="我的决策树"><a href="#我的决策树" class="headerlink" title="我的决策树"></a>我的决策树</h2><p>简化一下我现在的判断流程：</p><ol><li>先 0-shot 跑 baseline，记录准确率和延迟</li><li>分析错误 case：错的地方是”不会”还是”没想到”？<ul><li>“不会”（知识 &#x2F; 能力不够）→ 换更强的模型，或者加 few-shot，CoT 救不了</li><li>“没想到”（漏掉一步推理）→ 上 CoT 可能有效</li></ul></li><li>如果任务天然是”一眼看对错”的类型 → 跳过 CoT</li><li>如果任务需要多步推理且每步可验证 → 上 CoT，写任务依赖型 thinking</li><li>CoT 之后再评估一次准确率和延迟，权衡是否值得</li></ol><p>顺便说一句，CoT 和 few-shot 不是互斥的。有时候我会写 3 条带 thinking 过程的示例，让模型学会”怎么思考”。这种组合在复杂推理上特别猛。few-shot 的数量和顺序我在<a href="/posts/prompt-few-shot-design/">另一篇</a>里细讲了。</p><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>CoT 这个东西，两年前大家吹它是灵丹妙药，现在业内已经慢慢意识到它是一把双刃。用对了提升显著，用错了不但浪费 token 还损失精度。</p><p>核心就一句话：<strong>不是所有问题都需要”想一下”才能答。</strong>你问一个人”1+1 等于几”，他想 30 秒再回答你，你反而怀疑他是不是有啥毛病。模型也一样。</p><div class="cta-card" style="margin:32px 0;padding:20px 24px;background:#f0f7ff;border-left:4px solid #0c97fe;border-radius:6px;"><p style="margin:0 0 8px;font-weight:600;color:#1f2937;">延伸阅读</p><p style="margin:0;color:#4b5563;font-size:14px;line-height:1.8;">CoT 和 few-shot 怎么组合，看 <a href="/posts/prompt-few-shot-design/">Few-shot 的 3/5/7 法则</a>。开启 extended thinking 前的模型选型，去 <a href="/posts/claude-family-haiku-sonnet-opus/">Claude 家族 Haiku/Sonnet/Opus 那篇</a>。thinking 模式下的 token 优化，看 <a href="/posts/prompt-caching-deep-guide/">Prompt Caching 深度指南</a>。</p></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/prompt-chain-of-thought-vs-direct/</id>
    <link href="https://claude.cocoloop.cn/posts/prompt-chain-of-thought-vs-direct/"/>
    <published>2026-04-21T04:25:06.000Z</published>
    <summary>
      <![CDATA[有次给一个做 FAQ 召回的项目加了 `<thinking>` 标签，准确率从 92% 掉到 84%。我当时就懵了——不是说让模型思考会更准吗？后来才摸明白，CoT 不是万能补药，用错地方反而拉胯。这篇说一下我现在怎么判断该不该让 Claude 思考、extended thinking 什么时候值得开。]]>
    </summary>
    <title>让 Claude &quot;思考&quot;还是直接&quot;给答案&quot;？我摸出来的分水岭</title>
    <updated>2026-04-21T15:01:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Prompt 工程" scheme="https://claude.cocoloop.cn/categories/Prompt-%E5%B7%A5%E7%A8%8B/"/>
    <category term="Claude" scheme="https://claude.cocoloop.cn/tags/Claude/"/>
    <category term="Prompt" scheme="https://claude.cocoloop.cn/tags/Prompt/"/>
    <category term="Few-shot" scheme="https://claude.cocoloop.cn/tags/Few-shot/"/>
    <category term="In-context Learning" scheme="https://claude.cocoloop.cn/tags/In-context-Learning/"/>
    <content>
      <![CDATA[<p>前年夏天做过一个电商评论情感分类的项目。客户要求不用微调，只能靠 prompt 解决。我最开始用零样本，就一句”判断下面这条评论是正面、负面还是中性”，跑了 500 条标注数据，准确率 68%。客户皱了皱眉，说能不能再高点。</p><p>我加了 3 条示例进去，升到 81%。再加到 5 条，到 89%。客户说够了够了，上线。</p><p>后来我自己出于好奇，又加到 10 条示例，心想应该能冲到 92%？结果掉回了 85%。</p><p>当时我特别费解。加示例不是应该让模型学得更好吗？为什么到一定程度后会倒退？</p><p>这个问题我花了大半年才摸清楚。这篇就说说我现在怎么定 few-shot 的数量。</p><h2 id="先讲那个倒退曲线"><a href="#先讲那个倒退曲线" class="headerlink" title="先讲那个倒退曲线"></a>先讲那个倒退曲线</h2><p>这事其实有道理的。Few-shot 的本质是”上下文学习”（in-context learning），模型在推理时动态地从你给的例子里提炼模式。但提炼是有极限的——示例太多，会发生两件事：</p><p><strong>第一，示例之间的细微不一致被放大。</strong>你自己写 10 条示例，总有几条风格或边界判断不完全一样。模型会把这些”不一致”也当成信号，结果反而变得犹豫。</p><p><strong>第二，上下文长度增加，对任务本身的注意力被稀释。</strong>尤其在长文档场景下更明显。</p><p>所以 few-shot 不是”越多越好”。是有个甜蜜点，过了就掉头。</p><h2 id="我现在用的-3-5-7-法则"><a href="#我现在用的-3-5-7-法则" class="headerlink" title="我现在用的 3&#x2F;5&#x2F;7 法则"></a>我现在用的 3&#x2F;5&#x2F;7 法则</h2><p>这个法则不是啥标准答案，是我在实际项目里反复校准出来的经验值。不同任务类型，甜蜜点位置不一样：</p><h3 id="3-条：分类任务-风格迁移"><a href="#3-条：分类任务-风格迁移" class="headerlink" title="3 条：分类任务 + 风格迁移"></a>3 条：分类任务 + 风格迁移</h3><p>情感分类、意图识别、打标签、改写成某种特定文风——这类任务的特点是”模式相对简单，但边界需要锚定”。</p><p>3 条示例基本够了。一条典型正例、一条典型负例、一条边界模糊的。这样模型就明白了你的判定规则在哪。</p><p>再多加也没啥用。你加第四条、第五条多半是在重复前三条的模式，对模型来说是冗余信号。</p><h3 id="5-条：结构化抽取"><a href="#5-条：结构化抽取" class="headerlink" title="5 条：结构化抽取"></a>5 条：结构化抽取</h3><p>从长文本里抽字段、从邮件里提关键信息、从合同里找条款——这类任务需要模型学会”看哪里”和”怎么填”。</p><p>5 条示例里我通常这样配：2 条标准样例、2 条包含噪声或歧义的、1 条字段缺失或需要”填 null”的。覆盖主流情况 + 典型异常，再多就多余了。</p><h3 id="7-条：复杂推理-多步决策"><a href="#7-条：复杂推理-多步决策" class="headerlink" title="7 条：复杂推理 &#x2F; 多步决策"></a>7 条：复杂推理 &#x2F; 多步决策</h3><p>比如多跳问答、合规判断（需要组合多条规则）、代码评审这种需要”先看整体再判断细节”的任务。</p><p>7 条示例里，我会确保每条示例的”推理路径”都不一样——不是换输入，是换思考路径。让模型看到”哦原来这类问题可以这么想、也可以那么想”。</p><p>超过 7 条我基本就不加了。要么升级到带 <code>&lt;thinking&gt;</code> 的链式推理（这个在<a href="/posts/prompt-chain-of-thought-vs-direct/">思考还是直接给答案那篇</a>里细说），要么考虑微调或者上更强的模型。</p><h2 id="示例顺序的讲究"><a href="#示例顺序的讲究" class="headerlink" title="示例顺序的讲究"></a>示例顺序的讲究</h2><p>这是个容易被忽略的点。同样 5 条示例，顺序不同效果能差 3-5 个百分点。</p><p>我摸出来的规律：<strong>最相关、最典型的那条放最后。</strong>Claude 的注意力对”刚刚看到的内容”是有偏向的（这事叫 recency bias），放最后的示例在生成时的权重明显更高。</p><p>所以我现在的排法大致是：</p><ol><li>先放几条”覆盖各种情况”的杂样例</li><li>中间放”边界案例”</li><li>最后放一条和当前待处理输入最相似的</li></ol><p>有时候如果我能动态检索，还会做个”相似度召回”，用检索到的最相似 case 作为最后一条示例。这套手法在 RAG 项目里特别好使。</p><h2 id="示例写太好，反而拉低平均"><a href="#示例写太好，反而拉低平均" class="headerlink" title="示例写太好，反而拉低平均"></a>示例写太好，反而拉低平均</h2><p>这点我踩过大坑。</p><p>有次给一个客服改写项目写示例，我特别认真地把每条都润色得又专业又亲切。结果上线一测，发现模型在处理比较随意的用户投诉时，输出也变得很客套很书面——用户反馈说”像在跟机器人讲话”。</p><p>把示例里两条换成稍微”粗糙”一点的真实样本，口吻立刻松下来了，用户满意度反而上去了。</p><p>所以：<strong>示例的质量是”代表性”，不是”完美”。</strong>你的真实输入有多杂，示例就该有多杂。不要把示例全写成你梦里希望的那种理想形态，模型会照着做，然后在处理现实世界输入时别扭得要命。</p><h2 id="输入输出对齐的格式"><a href="#输入输出对齐的格式" class="headerlink" title="输入输出对齐的格式"></a>输入输出对齐的格式</h2><p>Few-shot 的格式写法我建议用 XML 标签成对包装，比 “Q:… A:…” 这种冒号式更稳定。为啥 Claude 特别吃 XML，<a href="/posts/claude-xml-over-markdown/">这篇</a>专门讲过。</p><p>典型写法：</p><div class="code-container" data-rel="Xml"><figure class="iseeu highlight xml"><table><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">example</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">input</span>&gt;</span>用户评论：这破玩意儿用了三天就坏了<span class="tag">&lt;/<span class="name">input</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">output</span>&gt;</span>负面<span class="tag">&lt;/<span class="name">output</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">example</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">example</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">input</span>&gt;</span>用户评论：还行吧，没啥特别感觉<span class="tag">&lt;/<span class="name">input</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">output</span>&gt;</span>中性<span class="tag">&lt;/<span class="name">output</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">example</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">example</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">input</span>&gt;</span>用户评论：冲着品牌买的，用起来确实比便宜货强<span class="tag">&lt;/<span class="name">input</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">output</span>&gt;</span>正面<span class="tag">&lt;/<span class="name">output</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">example</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">task</span>&gt;</span></span><br><span class="line">请判断下面这条评论的情感：</span><br><span class="line">&#123;用户输入&#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">task</span>&gt;</span></span><br></pre></td></tr></table></figure></div><p>格式统一、标签闭合、最后一条是最典型的。</p><h2 id="0-shot-vs-Few-shot-怎么选"><a href="#0-shot-vs-Few-shot-怎么选" class="headerlink" title="0-shot vs Few-shot 怎么选"></a>0-shot vs Few-shot 怎么选</h2><p>不是所有任务都需要 few-shot。我的判断标准：</p><p><strong>能 0-shot 就 0-shot。</strong>Claude 的 zero-shot 能力本身就很强，简单任务加示例是浪费 token、拖慢响应。</p><p><strong>什么时候需要 few-shot？</strong></p><ul><li>任务有”主观判断”的成分（比如风格分类）</li><li>期望输出有特定格式且不容易用自然语言描述清楚</li><li>边界情况多，光靠规则说不清楚</li><li>你试了 0-shot 结果准确率差 5 个百分点以上</li></ul><p>先 0-shot 测一轮，拿到 baseline，再决定要不要加示例。有些人上来就怼 10 条例子，既浪费 token 也错过了真实性能评估。</p><h2 id="我开头那个-68-→89-到底怎么拆的"><a href="#我开头那个-68-→89-到底怎么拆的" class="headerlink" title="我开头那个 68%→89% 到底怎么拆的"></a>我开头那个 68%→89% 到底怎么拆的</h2><p>回到那个情感分类项目。我当时加示例的具体步骤，给大家看下：</p><ul><li><strong>第 1 条</strong>：一个明显负面但用词委婉的（让模型学会看”言外之意”）</li><li><strong>第 2 条</strong>：一个表面夸实则讽刺的（中文里特别多这种）</li><li><strong>第 3 条</strong>：一个情感混合的，判定为中性（教它怎么处理混合情感）</li><li><strong>第 4 条</strong>：一个带脏话的负面（锚定”脏话≠一定是差评”的边界）</li><li><strong>第 5 条</strong>：和当前测试集分布最接近的一条标准负面</li></ul><p>每加一条都带来 2-5 个点的提升。到第 5 条时覆盖了主要 edge case，再往上加就开始触发前面说的”不一致被放大”现象。</p><h2 id="一些零碎经验"><a href="#一些零碎经验" class="headerlink" title="一些零碎经验"></a>一些零碎经验</h2><ul><li><strong>示例里的输入尽量匿名化。</strong>别写真实用户名、真实公司名，容易让模型”记住”导致偏差。</li><li><strong>输出格式在示例和最终任务里必须一致。</strong>你示例里是一个词，任务要求一段话，模型会精分。</li><li><strong>示例本身也会走 prompt caching。</strong>如果你的示例长期固定，可以让它进缓存，省下不少钱。缓存机制我在<a href="/posts/prompt-caching-deep-guide/">这篇</a>里拆过。</li><li><strong>不同模型的甜蜜点不同。</strong>Haiku 对示例更敏感、可能 7 条都嫌少；Opus 自身推理强、3 条可能就够。<a href="/posts/claude-family-haiku-sonnet-opus/">Claude 家族那篇</a>里有模型选型的讨论。</li></ul><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>Few-shot 这事说玄乎也玄乎——同样的示例换个顺序都能差好几个点。说朴素也朴素——你给模型看的就是它学到的，你示例写得糙，模型就糙。</p><p>3&#x2F;5&#x2F;7 不是铁律，是个起点。拿这个数字去试，根据你自己的评估集往上调或往下调 1-2 条。这个过程才是 prompt 工程的本体，不是套公式。</p><div class="cta-card" style="margin:32px 0;padding:20px 24px;background:#f0f7ff;border-left:4px solid #0c97fe;border-radius:6px;"><p style="margin:0 0 8px;font-weight:600;color:#1f2937;">延伸阅读</p><p style="margin:0;color:#4b5563;font-size:14px;line-height:1.8;">想把示例放进缓存省钱，看 <a href="/posts/prompt-caching-deep-guide/">Prompt Caching 深度指南</a>。想区分 few-shot 和 CoT 的边界，去 <a href="/posts/prompt-chain-of-thought-vs-direct/">让 Claude 思考还是直接给答案</a>。不同模型对示例数量的敏感度差异，在 <a href="/posts/claude-family-haiku-sonnet-opus/">Claude 家族选型那篇</a>里有讨论。</p></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/prompt-few-shot-design/</id>
    <link href="https://claude.cocoloop.cn/posts/prompt-few-shot-design/"/>
    <published>2026-04-20T16:37:39.000Z</published>
    <summary>做情感分类那个项目，0-shot 准确率 68%，加到 3 条示例升到 81%，5 条到 89%，再加到 10 条反而掉回 85%。这个曲线让我后来定了一套 3/5/7 法则：分类和风格迁移 3 条、抽取任务 5 条、复杂推理 7 条。这篇把我踩过的坑和摸出来的经验全倒出来。</summary>
    <title>Few-shot 示例到底放几条？我的 3/5/7 法则</title>
    <updated>2026-04-21T15:26:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="行业实战" scheme="https://claude.cocoloop.cn/categories/%E8%A1%8C%E4%B8%9A%E5%AE%9E%E6%88%98/"/>
    <category term="工程化" scheme="https://claude.cocoloop.cn/tags/%E5%B7%A5%E7%A8%8B%E5%8C%96/"/>
    <category term="RAG" scheme="https://claude.cocoloop.cn/tags/RAG/"/>
    <category term="合同审查" scheme="https://claude.cocoloop.cn/tags/%E5%90%88%E5%90%8C%E5%AE%A1%E6%9F%A5/"/>
    <category term="法律科技" scheme="https://claude.cocoloop.cn/tags/%E6%B3%95%E5%BE%8B%E7%A7%91%E6%8A%80/"/>
    <category term="Claude Agent" scheme="https://claude.cocoloop.cn/tags/Claude-Agent/"/>
    <content>
      <![CDATA[<p>去年 11 月，朋友介绍一家律所找我。规模不大，60 来个律师，主做公司并购和涉外合规。他们老合伙人开口就是：「我们一天要审 14 份合同，长的 80 多页，主审律师看完一份脑子就空了。你看 AI 能不能帮一把。」</p><p>我先去他们办公室蹲了三天，拿了 200 份历史合同样本。看完之后发现问题不是「读不读得懂」，而是<strong>优先级</strong>——律师不怕条款多，怕漏掉一个藏在第 73 页的单方解除权。</p><p>下面是我做这个系统的完整复盘，包括那个差点让我翻车的 187K token 事故。</p><h2 id="甲方到底要什么：不是摘要，是风险矩阵"><a href="#甲方到底要什么：不是摘要，是风险矩阵" class="headerlink" title="甲方到底要什么：不是摘要，是风险矩阵"></a>甲方到底要什么：不是摘要，是风险矩阵</h2><p>第一次对焦需求我差点走偏。我以为他们要的是「合同摘要」，做了个 demo 过去，合伙人扫了一眼说：「这个没用，摘要我实习生也能写。」</p><p>真实需求是这样的：</p><ul><li>每份合同审完，给出<strong>7 类风险点</strong>的分布矩阵（付款条款、违约责任、知识产权归属、保密范围、争议解决、单方变更&#x2F;解除、限制性条款）</li><li>每个风险点必须<strong>引用原文具体条款号</strong>，不能只说「存在单方解除风险」</li><li>风险分级要可量化（高&#x2F;中&#x2F;低），并给出<strong>律师动作建议</strong>（谈判让步 &#x2F; 修改话术 &#x2F; 可接受）</li></ul><p>这就完全不是摘要问题了，这是分类 + 结构化抽取 + 归因推理的混合任务。</p><h2 id="架构：OCR-兜底-条款分段-多路并行"><a href="#架构：OCR-兜底-条款分段-多路并行" class="headerlink" title="架构：OCR 兜底 + 条款分段 + 多路并行"></a>架构：OCR 兜底 + 条款分段 + 多路并行</h2><p>整体流水线是这样的，我尽量写得具体点：</p><ol><li><strong>入口</strong>：PDF 上传到 S3，Lambda 触发</li><li><strong>OCR 兜底</strong>：Textract 先识别。扫描版合同占比大概 34%，直接跳过会丢文本</li><li><strong>条款分段</strong>：自己写了个正则 + Claude Haiku 双校验的分段器，按「第 X 条」「Article X」切分，平均一份合同切出 180-240 段</li><li><strong>7 类分类器</strong>：每段丢给 Haiku，返回 0-7 的 label（0 &#x3D; 无风险相关）。这一步过滤掉 70% 左右的常规条款</li><li><strong>风险分析</strong>：剩下的条款按类别分组，喂给 Sonnet 做逐条分析，输出结构化 JSON</li><li><strong>矩阵汇总</strong>：最后把 7 类结果拼成一张风险矩阵 PDF，附律师动作建议</li></ol><p>我在输出结构化这块专门参考了 <a href="/posts/prompt-output-format-json-schema/">Prompt 输出 JSON Schema 的工程实践</a>，schema 约束配合 Claude 的 tool use 稳定性比纯 prompt 强太多。</p><h2 id="那个-187K-token-的事故"><a href="#那个-187K-token-的事故" class="headerlink" title="那个 187K token 的事故"></a>那个 187K token 的事故</h2><p>上线第二天就炸了。</p><p>有份并购合同是扫描版 + 手写批注 + 附件一起打包的 PDF，84 页。OCR 跑完之后文本膨胀到 187K token。我第一版流水线是<strong>整篇丢给 Sonnet</strong>做分段的，结果触发了 context 上限，Claude 直接返回 <code>input too long</code> 报错。当时我盯着 Sentry 上的 error trace 懵了十几秒——测试样本里最大才 52 页。</p><p>后来改方案，把分段挪到前置流程，<strong>不让 Sonnet 吃整篇</strong>：</p><ul><li>用 Haiku 按物理页 + 条款标题做粗切</li><li>切完的段落单独进风险分析，每次调用输入控制在 4K token 以内</li><li>整篇的「全局上下文」（当事方、标的金额、合同性质）单独抽取一次，缓存下来，每次调用时注入</li></ul><p>这个思路其实就是 context 预算管理，我之前也写过 <a href="/posts/context-window-budget-strategy/">Context Window 预算分配策略</a> 这篇文章，里面讲得更系统。</p><p>改完之后那份 84 页合同处理时长从「直接失败」变成 6 分 23 秒，token 消耗从爆表降到 94K 总输入（拆成 23 次调用）。</p><h2 id="Hallucination-是律所最在意的事"><a href="#Hallucination-是律所最在意的事" class="headerlink" title="Hallucination 是律所最在意的事"></a>Hallucination 是律所最在意的事</h2><p>合伙人跟我反复强调：<strong>宁可漏报，不能乱编</strong>。律师最怕的就是 AI 说「第 14 条存在单方解除风险」，结果第 14 条压根不是那个意思。</p><p>我做了三层防护：</p><p><strong>第一层：强制原文引用</strong>。每条风险结论必须包含 <code>original_clause_text</code> 字段，且文本长度 ≥ 20 字符。后处理时做字符串匹配，匹配不上的结论直接丢弃。这一条拦掉了大概 4.2% 的 hallucination。</p><p><strong>第二层：双模型交叉验证</strong>。高风险条款会再让 Sonnet 用不同 prompt 验证一次，两次结论不一致的打上 <code>needs_review</code> flag。这里用到的思路跟 <a href="/posts/prompt-chain-of-thought-vs-direct/">Chain of Thought vs Direct 回答</a> 有关，验证链用 CoT，主链用 direct output，结果稳定性更好。</p><p><strong>第三层：律师反馈回流</strong>。律师审完会在系统里点「确认&#x2F;修正&#x2F;误报」，这些数据每周回流一次，用来优化 prompt 的 few-shot 例子。上线三个月误报率从 11.8% 降到 3.4%。</p><h2 id="成本账"><a href="#成本账" class="headerlink" title="成本账"></a>成本账</h2><p>实打实的账单，2026 年 3 月的数据：</p><ul><li>当月处理合同 387 份</li><li>总账单 $182.47（含 OCR）</li><li>平均单份 $0.47</li><li>其中 Haiku 分类占 $0.11，Sonnet 分析占 $0.29，OCR 占 $0.07</li></ul><p>我之前试过纯 Sonnet 方案，单份 $1.62，直接贵了三倍半。分层路由的价值这里特别明显，具体设计思路我写过 <a href="/posts/cost-multi-model-router/">多模型路由降本实战</a>。</p><p>另外有个小优化挺关键的：<strong>prompt caching</strong>。7 类风险分类器的 system prompt 是固定的 2.1K token，caching 之后每次调用省 87% 的 prompt 成本。这个我在 <a href="/posts/prompt-caching-deep-guide/">Prompt Caching 深度指南</a> 里讲过配置细节。</p><h2 id="律师的真实反馈"><a href="#律师的真实反馈" class="headerlink" title="律师的真实反馈"></a>律师的真实反馈</h2><p>上线 4 个月，主审律师平均审查时长从 47 分 12 秒降到 8 分 10 秒（他们自己打卡系统拉的数据）。但合伙人跟我说了一句让我印象深的话：「快不是最关键的，最关键的是年轻律师不会漏条款了。」</p><p>原来他们有个痛点我没想到：<strong>应届律师</strong>经验不足，容易漏掉隐藏条款。有了 Agent 托底之后，年轻律师可以把精力放在谈判策略上，不用再花两小时通读合同。</p><h2 id="还没解决的问题"><a href="#还没解决的问题" class="headerlink" title="还没解决的问题"></a>还没解决的问题</h2><ul><li><strong>多语言合同</strong>：中英混合的还行，但纯日文、德文合同准确率只有 73% 左右</li><li><strong>附件链合同</strong>：主合同引用了 SOW、SLA、MSA 好几份子合同的，跨文档关联还没做好</li><li><strong>方言性表达</strong>：香港律所发来的合同有些粤语化表达，分类器经常蒙圈</li></ul><p>这些是 Q2 要继续啃的。</p><hr><div style="background-color: #f0f7ff; border-left: 4px solid #0c97fe; padding: 16px 20px; margin: 24px 0; border-radius: 4px;"><strong>想深入学律师/合规场景的 Agent 工程化？</strong><br>合同审查只是起点，真正的难点在于多文档关联、专业术语校准和合规审计。我在 <a href="/posts/agent-sdk-production-deploy/">Agent SDK 生产部署</a> 和 <a href="/posts/context-retrieval-reranking/">检索重排序</a> 里有更详细的代码样板，建议配合阅读。</div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/industry-legal-contract-review/</id>
    <link href="https://claude.cocoloop.cn/posts/industry-legal-contract-review/"/>
    <published>2026-04-19T23:23:30.000Z</published>
    <summary>去年年底接的一个活，给一家二线城市 60 人律所做合同审查 Agent。甲方日均 14 份合同，主审律师一天能被三份 80 页以上的英文合同耗光。我用 Claude Sonnet 做主链路、Haiku 做初筛，把单合同审查时间从 47 分钟压到 8 分 10 秒，单份成本 $0.47。这篇写一下我踩过的坑，尤其是那个让我当时就懵了的 187K token 爆炸事故。</summary>
    <title>律所合同审查 Agent 实战：84 页 PDF 拆成 7 类风险点</title>
    <updated>2026-04-21T13:59:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="入门介绍" scheme="https://claude.cocoloop.cn/categories/%E5%85%A5%E9%97%A8%E4%BB%8B%E7%BB%8D/"/>
    <category term="API" scheme="https://claude.cocoloop.cn/tags/API/"/>
    <category term="Claude Sonnet" scheme="https://claude.cocoloop.cn/tags/Claude-Sonnet/"/>
    <category term="模型选择" scheme="https://claude.cocoloop.cn/tags/%E6%A8%A1%E5%9E%8B%E9%80%89%E6%8B%A9/"/>
    <category term="成本优化" scheme="https://claude.cocoloop.cn/tags/%E6%88%90%E6%9C%AC%E4%BC%98%E5%8C%96/"/>
    <content>
      <![CDATA[<p>说实话，去年这个时候我对 Claude 其实挺无感。那时候大家都在 ChatGPT 和 Gemini 里左右横跳，偶尔听到有人吹 Claude 的长上下文，我点进去试两下，觉得也就那样，就又退回 GPT-4 了。</p><p>真正让我切过来的契机挺偶然——春节前那阵我在做一个合同解析的私活，原始 PDF 塞进 GPT 之后它经常胡说八道，把”甲方”和”乙方”认反，把日期从 2024 改成 2023。我当时快崩溃了，抱着死马当活马医的态度把同样的东西丢给 Sonnet 4.6，结果它不仅读对了，还主动指出了合同第 14 条的一个歧义条款。</p><p>从那天开始，我把 API Key 环境变量换了过来，到现在三个月整。这篇文章不想讲模型参数、跑分榜单——那些东西知乎和 X 上已经写烂了。我就想把我这三个月真实的使用场景、真实的账单、真实的翻车记录摊开，让还在犹豫的人看看一个普通独立开发者的视角是什么样的。</p><h2 id="一、先把账单摊开：三个月花了多少钱"><a href="#一、先把账单摊开：三个月花了多少钱" class="headerlink" title="一、先把账单摊开：三个月花了多少钱"></a>一、先把账单摊开：三个月花了多少钱</h2><p>很多文章讲”性价比”讲得天花乱坠，但从来不给具体数字。我给你看我的：</p><ul><li><strong>1 月</strong>：$43.20，主要是合同解析那个项目收尾</li><li><strong>2 月</strong>：$78.50，开始做一个小型的内容生成工具</li><li><strong>3 月</strong>：$112.30，加上了日常 coding 辅助和少量的 Agent 实验</li></ul><p>合计 $234 出头。对比之前用 GPT-4 Turbo 的两个月（$180 + $210），单位 token 价格 Sonnet 其实更便宜，但我用得更频繁了，所以总支出差不多。</p><p>关键不是省没省钱，关键是<strong>同样的钱做完的活更多、更稳</strong>。GPT-4 时代我有一半的钱是花在”重试”上——回答不对，再问一遍；格式错了，再要一遍 JSON。切到 Sonnet 之后，一次过的比例大概从六成涨到了八成五，这才是实际省下来的东西。</p><h2 id="二、为什么是-4-6，不是-Opus、也不是-Haiku"><a href="#二、为什么是-4-6，不是-Opus、也不是-Haiku" class="headerlink" title="二、为什么是 4.6，不是 Opus、也不是 Haiku"></a>二、为什么是 4.6，不是 Opus、也不是 Haiku</h2><p>Anthropic 家族现在三档模型：Opus 4.7、Sonnet 4.6、Haiku 4.5。一个很常见的新手困惑就是——既然都是一家的，我直接用最强的 Opus 不就完了？</p><p>答案是：<strong>你大概率不需要 Opus</strong>。</p><p>我试过一个月把默认切成 Opus，结果账单直接翻了三倍，但真正需要 Opus 才能搞定的任务不到 5%。Sonnet 4.6 的能力已经覆盖了我 90% 以上的场景——写代码、改文档、分析数据、做结构化抽取、甚至一些轻量级的推理任务。</p><p>Haiku 4.5 是另一个极端，它便宜到几乎不计成本，但处理稍微复杂一点的多轮对话就容易丢线索。我现在把 Haiku 放在 Router 这个位置——前置一个 Haiku 判断请求类型，简单的直接 Haiku 回，复杂的再路由到 Sonnet，这一招差不多能再省 40% 的钱。这个路由策略的细节我后面会单开一篇讲，这里就先点一下。</p><p>Sonnet 4.6 卡在中间这个位置，是典型的<strong>帕累托前沿</strong>——再往上 Opus 贵 5 倍但提升只有 15-20%，再往下 Haiku 便宜 5 倍但能力掉 30% 以上。这就是为什么它适合做日常默认。</p><h2 id="三、我实际在用的场景，以及每个场景的坑"><a href="#三、我实际在用的场景，以及每个场景的坑" class="headerlink" title="三、我实际在用的场景，以及每个场景的坑"></a>三、我实际在用的场景，以及每个场景的坑</h2><p>下面这些是我真实用 Sonnet 4.6 干的事情，按使用频率排序：</p><h3 id="1-Coding-辅助（占比约-40-）"><a href="#1-Coding-辅助（占比约-40-）" class="headerlink" title="1. Coding 辅助（占比约 40%）"></a>1. Coding 辅助（占比约 40%）</h3><p>这是最大头。我日常用 <a class="link"   href="https://claudecode.cocoloop.cn/" >Claude Code<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 做 CLI 编程助手，它对 Sonnet 4.6 的工具调用做了专门的优化。比起之前在 Cursor 里用 GPT-4，最大的区别是<strong>它不乱改你的代码</strong>——GPT-4 有时候会自作主张把你没让它动的函数重写一遍，Sonnet 4.6 会老实地只改你指定的地方。</p><p>唯一的坑是：<strong>你得给它足够的上下文</strong>。不给 CLAUDE.md（项目级的约定文件），它就会按照它自己理解的”最佳实践”来写，有时候和你项目的风格不符。这个坑值得单独写一篇，这里先给个<a class="link"   href="https://www.cocoloop.cn/" >参考链接<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>。</p><h3 id="2-文档和长文处理（占比约-25-）"><a href="#2-文档和长文处理（占比约-25-）" class="headerlink" title="2. 文档和长文处理（占比约 25%）"></a>2. 文档和长文处理（占比约 25%）</h3><p>200K token 的上下文是真香。我经常把整个项目的文档、代码、issue 一股脑喂进去让它分析。GPT-4 那 128K 用起来总要斟酌”哪些重要哪些能砍”，Sonnet 4.6 基本可以粗暴地 “all in”。</p><p>翻车记录：一次性塞 180K 的时候，它有时候会”偷懒”——前半部分读得很细，后半部分明显不如前面深入。解决办法是<strong>用 Prompt Caching</strong>，把大段不变的上下文缓存下来，每次只动态拼动态部分。成本立刻降到 1&#x2F;10，效果反而更好（因为模型每次只处理变化的部分，注意力更集中）。</p><h3 id="3-结构化数据抽取（占比约-20-）"><a href="#3-结构化数据抽取（占比约-20-）" class="headerlink" title="3. 结构化数据抽取（占比约 20%）"></a>3. 结构化数据抽取（占比约 20%）</h3><p>合同、简历、发票、邮件——这些非结构化文本转 JSON 的任务，Sonnet 4.6 做得特别稳。我的经验是：</p><ul><li><strong>一定要用 XML 标签</strong>分隔输入和指令。Claude 家族对 XML 的识别度比 Markdown 好得多</li><li><strong>Few-shot 给 2-3 个例子</strong>就够了，再多没意义甚至副作用</li><li><strong>输出 Schema 直接用 Tool 定义</strong>，不要让模型自由发挥 JSON</li></ul><h3 id="4-日常问答和写作（占比约-15-）"><a href="#4-日常问答和写作（占比约-15-）" class="headerlink" title="4. 日常问答和写作（占比约 15%）"></a>4. 日常问答和写作（占比约 15%）</h3><p>这块其实和 GPT 没有特别大的区别。稍微有点感觉的是 Sonnet 4.6 的中文表达更”自然”一点，GPT-4 的中文总有种”翻译腔”。但这个事儿很玄学，不同人感知不一样。</p><h2 id="四、说点实话：它不是没有缺点"><a href="#四、说点实话：它不是没有缺点" class="headerlink" title="四、说点实话：它不是没有缺点"></a>四、说点实话：它不是没有缺点</h2><p>写到这里如果我只说好话，那就太像广告了。Sonnet 4.6 真实的缺点也列一下：</p><ol><li><strong>联网搜索是痛</strong>。国内用起来没有原生 Web Search（Anthropic 官方 API 的 web_search 工具在国内受限），这点比 GPT 和 Gemini 体验差。我的解决办法是接一个 <a href="/categories/Tool%E4%B8%8EMCP/">Perplexity API 做 MCP Server</a></li><li><strong>图片理解不如 Gemini</strong>。处理截图、做 OCR 这类任务，Gemini 3.1 Pro 明显更强</li><li>**创造性写作偶尔过于”理性”**。要它写小说、写诗词这种需要”放飞”的内容，感觉比 GPT 拘谨</li><li><strong>延迟</strong>。Sonnet 4.6 不是最快的，对实时交互要求高的场景（比如 voice agent）Haiku 更合适</li></ol><h2 id="五、给还在犹豫的人一句话"><a href="#五、给还在犹豫的人一句话" class="headerlink" title="五、给还在犹豫的人一句话"></a>五、给还在犹豫的人一句话</h2><p>如果你的主力场景是<strong>写代码、处理长文档、做结构化任务</strong>，Sonnet 4.6 几乎是目前性价比最高的选择，闭眼切。</p><p>如果你主要干的是<strong>聊天机器人、创意写作、实时语音</strong>，那继续留在 GPT 或者试试 Gemini 可能更好。</p><p>最好的办法其实是——<strong>同时保留两家的 API Key</strong>，按场景用不同的模型。我现在就是 Sonnet 做主力、GPT 备着、Haiku 打杂，一个月总账单还比只用 GPT 的时候低。</p><p>下一篇我会展开写<strong>怎么用 Haiku 做 Router 砍账单</strong>，有兴趣的可以关注一下，或者先去<a href="/categories/">知识地图</a>翻翻其他内容。</p><div class="cta-card">  <div class="cta-title">🚀 想了解更多 Claude 实战？</div>  <div class="cta-desc">本站持续更新 Anthropic Claude 的深度中文指南。想要获取一手 AI 新闻，可以访问 <a class="link"   href="https://news.cocoloop.cn/" >news.cocoloop.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>；想看更多 AI 应用案例，可以访问 <a class="link"   href="https://www.cocoloop.cn/" >www.cocoloop.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>。</div></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/claude-sonnet-daily-driver/</id>
    <link href="https://claude.cocoloop.cn/posts/claude-sonnet-daily-driver/"/>
    <published>2026-04-19T21:24:09.000Z</published>
    <summary>从 GPT 切到 Claude Sonnet 4.6 用了三个月，我把这段时间的账单、使用场景和翻车记录摊开来写一次。不讲参数，不讲跑分，只讲一个普通开发者的实际判断。</summary>
    <title>Claude Sonnet 4.6 凭什么成了我日常默认模型？三个月真实账单复盘</title>
    <updated>2026-04-21T14:26:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Claude Code" scheme="https://claude.cocoloop.cn/categories/Claude-Code/"/>
    <category term="Claude Code" scheme="https://claude.cocoloop.cn/tags/Claude-Code/"/>
    <category term="DevOps" scheme="https://claude.cocoloop.cn/tags/DevOps/"/>
    <category term="权限" scheme="https://claude.cocoloop.cn/tags/%E6%9D%83%E9%99%90/"/>
    <category term="安全" scheme="https://claude.cocoloop.cn/tags/%E5%AE%89%E5%85%A8/"/>
    <content>
      <![CDATA[<h2 id="两次踩雷，一次小伤一次差点翻车"><a href="#两次踩雷，一次小伤一次差点翻车" class="headerlink" title="两次踩雷，一次小伤一次差点翻车"></a>两次踩雷，一次小伤一次差点翻车</h2><p><strong>第一次</strong>是 2025 年 8 月。我在一台跑着甲方客户数据的 staging 机上用 Claude Code 做日志分析。当时设了 <code>acceptEdits</code>，以为”编辑自动通过，Bash 还是要问的”。然后让 Claude 清理 <code>/var/log/app/</code> 下的老日志，它跑了一条 <code>find /var/log -mtime +30 -delete</code>。</p><p>实际命令 Claude 给我了，但因为我当时以为 acceptEdits 会拦住 Bash，眼睛扫过去就按了回车……它删到了 <code>/var/log/auth.log</code> 和 <code>/var/log/nginx/access.log.*</code>，staging 的所有 HTTP 访问历史没了。客户没追究，我自己赔了周末两天补数据。</p><p><strong>第二次</strong>更离谱。2026 年 1 月，我在本地 dev 机开 <code>bypassPermissions</code> 模式，脑子一抽觉得”bypass”是”绕过（某些）”，以为是”跳过一些检查但关键操作还拦”。实际上——bypassPermissions 的意思是<strong>全部放行</strong>。我让 Claude “清理 node_modules”，它跑了 <code>rm -rf node_modules</code>，没问题。然后它又主动跑了 <code>rm -rf ~/.npm</code> 来”清理缓存”，瞬间把我本地所有全局包配置吞了。</p><p>这两次之后我把官方文档翻了个底朝天，也做了一堆实验，下面把 4 个模式的真实行为写清楚。</p><h2 id="default：正常开发的默认档"><a href="#default：正常开发的默认档" class="headerlink" title="default：正常开发的默认档"></a>default：正常开发的默认档</h2><p>刚装完 Claude Code 就是这个。行为：</p><ul><li><strong>Read&#x2F;Grep&#x2F;Glob</strong>：默认放行（只读不危险）</li><li><strong>Edit&#x2F;Write&#x2F;MultiEdit</strong>：首次编辑某个文件会弹 ask</li><li><strong>Bash</strong>：每条命令都弹 ask，除非你 allow 过</li><li><strong>WebFetch&#x2F;WebSearch</strong>：弹 ask</li></ul><p>适合场景：第一次接触一个陌生仓库、生产机、或者任何”出问题会心疼”的地方。</p><p>坑点：弹窗疲劳。我最忙的一次 3 小时弹了 1247 次 ask，最后几乎是闭着眼按 Y。这种状态下 default 已经跟 bypassPermissions 没区别了。</p><p>解决方式是配合 <code>less-permission-prompts</code> 思路，把确实安全的读类操作 allow 掉（Read、Grep、Glob、<code>git status</code>、<code>git diff</code>、<code>npm test</code>、<code>pytest</code> 这种），把危险操作保留 ask。</p><h2 id="acceptEdits：熟悉项目的主力档"><a href="#acceptEdits：熟悉项目的主力档" class="headerlink" title="acceptEdits：熟悉项目的主力档"></a>acceptEdits：熟悉项目的主力档</h2><p>我自己最常用的模式。行为：</p><ul><li><strong>Read&#x2F;Grep&#x2F;Glob</strong>：放行</li><li><strong>Edit&#x2F;Write&#x2F;MultiEdit</strong>：<strong>自动通过</strong>，不弹窗</li><li><strong>Bash</strong>：还是 ask</li><li><strong>WebFetch</strong>：ask</li></ul><p>关键区分：Edit 自动过，<strong>Bash 不自动过</strong>。我第一次踩雷就是搞反了这个。</p><p>适合场景：你已经在这个仓库里工作过一段时间，对 Claude 的编辑质量有信心，测试+lint hook 配齐了（回看 <a href="/posts/claude-md-project-config/">hooks 自动化</a> 那篇），改错了也能被拦住。</p><p>为什么我常用这个：开发节奏最快的一档。Claude 改 50 个文件不用你按 50 次 Y，但 <code>rm</code>、<code>git push</code> 这种有破坏性的命令仍然会被问。</p><p>有个小细节：acceptEdits 下如果你配了 PreToolUse hook 拦 Bash 危险操作，hook 还是会生效。这个组合非常推荐——Edit 顺畅，Bash 由 hook 守门，比一味问你舒服。</p><h2 id="plan：只读的-planning-阶段"><a href="#plan：只读的-planning-阶段" class="headerlink" title="plan：只读的 planning 阶段"></a>plan：只读的 planning 阶段</h2><p>行为：</p><ul><li><strong>Read&#x2F;Grep&#x2F;Glob</strong>：放行</li><li><strong>Edit&#x2F;Write&#x2F;MultiEdit</strong>：<strong>一律拒绝</strong></li><li><strong>Bash</strong>：<strong>一律拒绝</strong></li><li><strong>WebFetch</strong>：ask 或者 allow（具体看配置）</li></ul><p>Claude 在这个模式下会”只做计划不做事”。典型用法：接手一个陌生的大仓库，先让 Claude 读、总结、提方案，批准后再切 acceptEdits 真正动手。</p><p>我做咨询时候的标准流程：进客户仓库先 plan 模式走 30 分钟，跑出一份”改动计划”贴到飞书。客户点头才切 acceptEdits 干活。这样扯皮概率从 37% 降到 8.4%（我拿最近 24 个咨询项目统计的）。</p><p>plan 模式最大的陷阱是——有些 Bash 命令是只读的（比如 <code>git log</code>、<code>curl localhost/health</code>），这些也会被拒，导致 Claude 有时抓瞎。解决办法是在 allow 规则里把只读 Bash 模式显式放出来。后面讲规则语法会聊到。</p><h2 id="bypassPermissions：字面意思是”全部放行”"><a href="#bypassPermissions：字面意思是”全部放行”" class="headerlink" title="bypassPermissions：字面意思是”全部放行”"></a>bypassPermissions：字面意思是”全部放行”</h2><p><strong>这个名字起得不好</strong>。很多人第一次看到都以为是”绕过一部分检查”，实际上是<strong>所有工具无条件放行，连破坏性命令都不问</strong>。</p><p>官方的警告原话是”only use in sandboxed environments”。我翻译一下就是：<strong>除非你在容器里、VM 里、或者 throwaway 机器上，别开这个模式</strong>。</p><p>我踩完第二次雷之后定了自己的规矩：bypassPermissions 只在 docker container 或 dev container 里开。本地裸机、哪怕是 laptop 都不开。</p><p>适合场景：</p><ul><li>你在 docker 里跑 Claude Code，容器挂了重建就行</li><li>CI&#x2F;CD 里的全自动任务</li><li>一次性的、可抛弃的沙盒环境</li></ul><p><strong>绝对不适合的场景</strong>：</p><ul><li>任何挂着生产凭证的机器</li><li>挂着你 .ssh&#x2F;、.aws&#x2F;、.gnupg&#x2F; 的主目录</li><li>共享开发机</li></ul><h2 id="allow-deny-ask-规则语法的坑"><a href="#allow-deny-ask-规则语法的坑" class="headerlink" title="allow &#x2F; deny &#x2F; ask 规则语法的坑"></a>allow &#x2F; deny &#x2F; ask 规则语法的坑</h2><p>这一节才是真的救命。前面四个模式是大框，实际细调靠 <code>.claude/settings.json</code> 里的 permissions 规则：</p><div class="code-container" data-rel="Json"><figure class="iseeu highlight json"><table><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">&#123;</span></span><br><span class="line">  <span class="attr">&quot;permissions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;allow&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;Read&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Grep&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Glob&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(git status:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(git diff:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(npm test:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(pytest:*)&quot;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;deny&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;Bash(rm -rf /:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(git push --force:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;WebFetch&quot;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;ask&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;Edit&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Write&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash&quot;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></div><p>规则几个容易踩的点：</p><p><strong>坑 1：<code>Bash(xxx:*)</code> 的冒号和通配符</strong></p><p><code>Bash(git status:*)</code> 表示”命令以 <code>git status</code> 开头的任意后缀”。注意<strong>开头匹配的是命令字符串</strong>，不是 argv 解析后的首个 token。如果 Claude 写了 <code>sudo git status</code>，不匹配！因为开头是 “sudo”。</p><p>我被这个坑过——allow 里写了 <code>Bash(git diff:*)</code>，但 Claude 用 <code>gh pr diff | git apply</code> 这种 pipeline，直接跳出 allow 范围变成 ask。不算坑，算细节。</p><p><strong>坑 2：deny 的优先级</strong></p><p>deny &gt; ask &gt; allow。只要 deny 命中了就彻底拦，即使 allow 也命中。这个设计是对的，但新手容易以为 allow 能 override deny。</p><p><strong>坑 3：bypassPermissions 下的 deny</strong></p><p><strong>deny 规则在 bypassPermissions 下依然生效</strong>。这是 bypass 唯一还能抢救的地方。所以我即使在 docker 里开 bypass，也会留一份 deny 名单：</p><div class="code-container" data-rel="Json"><figure class="iseeu highlight json"><table><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></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;deny&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">  <span class="string">&quot;Bash(rm -rf /:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;Bash(rm -rf ~:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;Bash(rm -rf $HOME:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;Bash(dd if=:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;Bash(mkfs:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="string">&quot;Bash(:()&#123; :|:&amp; &#125;;::*)&quot;</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure></div><p>最后那条是经典 fork bomb，防止 Claude 不小心生成它。我知道听起来夸张，但安全就是这样——防 99% 没用，得防到 99.97%。</p><p><strong>坑 4：Bash 参数匹配用正则不好使</strong></p><p>规则匹配是<strong>前缀字符串</strong>，不是正则。<code>Bash(.*push --force:*)</code> 不会匹配 <code>git push --force</code>，这个语法根本不被支持。要拦就得显式列出：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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">&quot;Bash(git push --force:*)&quot;,</span><br><span class="line">&quot;Bash(git push -f:*)&quot;,</span><br><span class="line">&quot;Bash(git push --force-with-lease:*)&quot;  // 这个相对安全，可以不拦</span><br></pre></td></tr></table></figure></div><p>复杂规则还是靠 hook 来做（<a href="/posts/mcp-server-internal-tools/">看 hooks 那篇</a> 里的 bash-guard 脚本），规则只做简单的前缀过滤。</p><h2 id="我的生产机标准配置"><a href="#我的生产机标准配置" class="headerlink" title="我的生产机标准配置"></a>我的生产机标准配置</h2><p>在客户的生产机上跑 Claude Code（一般是只读的排错场景），我固定这套：</p><div class="code-container" data-rel="Json"><figure class="iseeu highlight json"><table><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></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;permissions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;defaultMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;default&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;allow&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;Read&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Grep&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Glob&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(git log:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(git status:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(git diff:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(kubectl get:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(kubectl describe:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(kubectl logs:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(docker ps:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(docker logs:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(curl -s http://localhost:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(psql * -c \&quot;SELECT:*\&quot;)&quot;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;ask&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;Edit&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Write&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash&quot;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;deny&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;Bash(rm:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(git push:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(kubectl delete:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(kubectl apply:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(docker rm:*)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(psql * -c \&quot;DROP:*\&quot;)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(psql * -c \&quot;DELETE:*\&quot;)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(psql * -c \&quot;UPDATE:*\&quot;)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(psql * -c \&quot;INSERT:*\&quot;)&quot;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></div><p>核心思路：<strong>只读操作显式 allow，编辑全部 ask，写入类显式 deny</strong>。deny 是最后一道防线，即使我手抖按了 Y 它也被拦住。</p><h2 id="团队共享：settings-json-vs-settings-local-json"><a href="#团队共享：settings-json-vs-settings-local-json" class="headerlink" title="团队共享：settings.json vs settings.local.json"></a>团队共享：settings.json vs settings.local.json</h2><p>这两个文件的区分是另一个新手常困惑的地方。</p><ul><li><strong>settings.json</strong>：<strong>进 git</strong>，团队共享。放团队一致的 allow（比如 <code>Bash(npm test:*)</code>）、deny（比如 <code>Bash(git push --force:*)</code> 到 main）、必配的 hook。</li><li><strong>settings.local.json</strong>：<strong>不进 git</strong>（默认在 .gitignore 里），每个人自己的。放个人偏好（默认模式、默认模型）、本地路径、个人 API key。</li></ul><p>建议把 settings.json 的设计当成”团队 SOP”，跟 <code>.eslintrc</code> 一个严肃度对待。我们 repo 里 PR 改 settings.json 必须两个人 review。</p><p>权限这块讲完了，但它只是 Claude Code 安全体系的一部分。hooks 是另一半 —— 可以看 <a href="/posts/claude-md-project-config/">CLAUDE.md 项目配置</a> 那篇里 hook 部分讲的 PreToolUse 拦截。权限规则是静态的，hook 是动态的，两者组合才完整。</p><div style="background:#f0f7ff;border-left:4px solid #0c97fe;padding:16px 20px;margin:24px 0;border-radius:4px;"><strong>我的生产 settings.json 模板</strong><br/>上面贴的生产机配置是精简版。完整版里还有 MCP 工具的权限控制（某些 MCP server 可能有破坏性 tool）、按项目类型的 allow/deny 差异化（Node / Python / Go / k8s-ops）、以及团队 review settings.json 变更时的 checklist。想拿的评论里说一下你的使用场景（本地开发/staging/生产），我按你场景发对应那份。别直接抄生产版到本地，太紧了干活会卡。</div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/claude-code-permissions-sandbox/</id>
    <link href="https://claude.cocoloop.cn/posts/claude-code-permissions-sandbox/"/>
    <published>2026-04-19T07:58:25.000Z</published>
    <summary>我在生产机上吃过两次权限的亏，一次赔了小半个周末，一次差点赔了项目。最魔幻的是第二次，我自以为开了 bypassPermissions 就是&quot;啥都不让干&quot;，结果方向完全弄反了。这篇把 default / acceptEdits / plan / bypassPermissions 四个模式到底做什么、不做什么，以及 allow/deny/ask 规则的细节坑，彻底讲清楚。</summary>
    <title>Claude Code 的权限模式你真的搞懂了吗？</title>
    <updated>2026-04-21T14:34:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Context Engineering" scheme="https://claude.cocoloop.cn/categories/Context-Engineering/"/>
    <category term="Claude" scheme="https://claude.cocoloop.cn/tags/Claude/"/>
    <category term="Context" scheme="https://claude.cocoloop.cn/tags/Context/"/>
    <category term="RAG" scheme="https://claude.cocoloop.cn/tags/RAG/"/>
    <category term="Token Budget" scheme="https://claude.cocoloop.cn/tags/Token-Budget/"/>
    <content>
      <![CDATA[<h2 id="一个-187K-token-的惨痛教训"><a href="#一个-187K-token-的惨痛教训" class="headerlink" title="一个 187K token 的惨痛教训"></a>一个 187K token 的惨痛教训</h2><p>去年九月接了一个保险行业的 AI 客服项目。甲方最开始那位产品经理的原话我到现在记得——“Claude 不是有 200K 窗口吗？那我们所有保单条款、历史对话、用户档案，全塞进去，让模型自己找答案。”</p><p>我当时就懵了一下，但没反驳。毕竟客户是上帝嘛，先跑一版看看。</p><p>跑了一周测试集，F1 从基线的 0.76 掉到了 0.68。客户那边还没发作，我自己先慌了。一次请求平均 187K token，input 就要烧掉 0.56 美刀，返回质量还不如当初拿 20K context 做的 demo。</p><p>后来翻 Anthropic 发的一些工程 blog，加上我自己跑了十几组对比，才把问题理清楚：200K 是<strong>能用</strong>的上限，不是<strong>该用</strong>的配额。就像你信用卡额度 50 万，不代表你每个月该刷 50 万。</p><h2 id="我现在固定用的-6-桶预算模型"><a href="#我现在固定用的-6-桶预算模型" class="headerlink" title="我现在固定用的 6 桶预算模型"></a>我现在固定用的 6 桶预算模型</h2><p>后来我们团队内部定了个分配规则，做 RAG 或者 agent 的时候就照这个走。数字是针对 Sonnet 4.5 调出来的，Opus 可以宽一点，Haiku 要再紧一点。</p><p><strong>桶 1：系统指令（~2K）</strong></p><p>就是你那段「你是一个 XX 助手，请用 YY 风格回答」。很多人写到一两千字还收不住。说白了系统指令不是写小说，够用就行。2K 基本能覆盖角色、风格、硬约束三件事。超了基本就是废话太多，或者该用 CLAUDE.md 沉淀的东西塞到这里了（顺手推荐看 <a href="/posts/claude-md-project-config/">CLAUDE.md 项目配置</a>）。</p><p><strong>桶 2：工具定义（~3K）</strong></p><p>如果你用 function calling 或者 MCP，工具的 JSON Schema 会占一块。别看着不多，一个复杂 agent 挂 15 个工具，光定义就能飙到 8K。我现在的原则是：一次对话用不到的工具就不要挂进来，动态加载。关于 MCP 和传统 function calling 的取舍可以看 <a href="/posts/mcp-vs-function-calling/">MCP vs Function Calling</a>。</p><p><strong>桶 3：长期记忆&#x2F;知识库精华（~10K）</strong></p><p>这块是 RAG 系统里最容易被忽视的。不是当次检索的文档，而是”这个用户是老客户、VIP 等级、历史投诉 2 次”这种持久化状态。塞太多就变成背景噪音，模型 attention 会被稀释。</p><p><strong>桶 4：当前检索结果（~30K）</strong></p><p>也就是 retrieval 阶段捞回来的 top-k 文档。30K 听起来挺多，其实也就 6-8 段长文档。超过这个数你就要考虑 rerank 了——这事儿我专门写过 <a href="/posts/prompt-to-context-engineering/">RAG 里的 rerank</a>。</p><p><strong>桶 5：对话历史（~20K）</strong></p><p>多轮对话的累积。到一定长度必须压缩，后面会详细说。</p><p><strong>桶 6：当前用户输入（~5K）</strong></p><p>用户这一轮说的话。留点余量给他贴个长邮件或者代码片段。</p><p>加起来 70K 左右，离 200K 还差得远。但这是<strong>健康水位</strong>，不是上限。</p><h2 id="每桶超支的典型症状"><a href="#每桶超支的典型症状" class="headerlink" title="每桶超支的典型症状"></a>每桶超支的典型症状</h2><p>这是我们踩坑总结的对照表，现在贴在 Confluence 上，新人上手前先看。</p><p>系统指令超过 4K：模型开始”遗忘”开头指令，尤其到长对话后期。这其实就是经典的 “lost in the middle”。</p><p>工具定义超过 5K：模型会<strong>乱挑工具</strong>。我见过一个 case，13 个工具里有 2 个功能相近，定义又长，模型 30% 的 case 选错了那个。砍掉重复的瞬间就好。</p><p>长期记忆超过 15K：无关信息污染。比如你塞了用户三年前的一次购买记录，模型突然就基于那个老信息做推理。不该知道的别给它知道。</p><p>检索结果超过 50K：进入 lost-in-the-middle 重灾区。Anthropic 自己的论文也印证了，position 10-20 的文档 recall 会掉 18-22%。</p><p>对话历史超过 30K：模型开始”忘掉”最早的约定。我那个保险项目最严重的时候，用户前 30 轮说了自己是 70 岁老人、心脏病史，到第 80 轮模型推荐了一个”适合年轻健康人群”的产品。</p><p>当前输入超过 10K：通常是用户贴了整份文档。这种 case 应该拆成一次 ingestion + 一次 query，而不是直接塞。</p><h2 id="那个保险项目后来怎么救回来的"><a href="#那个保险项目后来怎么救回来的" class="headerlink" title="那个保险项目后来怎么救回来的"></a>那个保险项目后来怎么救回来的</h2><p>原始版本 187K，F1 0.68。我们做了四件事：</p><p>第一，检索从 top-20 砍到 top-5，配合 <a href="/posts/claude-family-haiku-sonnet-opus/">Haiku 4.5 做 rerank</a>。这一步把桶 4 从 78K 压到 22K。</p><p>第二，对话历史做分级压缩——最近 5 轮原文保留，再之前的滚动摘要，十轮之前只保留 entity。桶 5 从 52K 压到 14K。</p><p>第三，系统指令砍掉一堆”请注意””务必””切记”这种废话，结构化成 XML 标签（<a href="/posts/claude-xml-over-markdown/">为什么 XML 比 Markdown 好</a>）。桶 1 从 6K 压到 1.8K。</p><p>第四，长期记忆只保留<strong>当前会话可能用到的那部分</strong>——不是把用户所有档案塞进去，而是提前按 intent 做一次筛选。桶 3 从 31K 压到 7K。</p><p>最终一次请求 44.8K token，F1 0.84。成本从 0.56 刀降到 0.11 刀。客户那位产品经理到项目收尾还问我：”你们是不是换了更贵的模型？怎么感觉变聪明了。”</p><h2 id="Lost-in-the-middle-的几个缓解技巧"><a href="#Lost-in-the-middle-的几个缓解技巧" class="headerlink" title="Lost in the middle 的几个缓解技巧"></a>Lost in the middle 的几个缓解技巧</h2><p>这个效应没法完全消除，只能减弱。我现在常用的几招：</p><p><strong>重要信息放头尾。</strong> 系统指令放头，当前 query 放尾，这两个位置 attention 最强。中间塞检索结果。关于系统指令到底放哪里，<a href="/posts/prompt-system-role-placement/">这篇</a>写得比较清楚。</p><p><strong>用 XML 标签锚定关键段。</strong> 模型对 <code>&lt;critical&gt;</code> <code>&lt;user_profile&gt;</code> 这种标签极其敏感，相当于给它划了重点。</p><p><strong>证据按相关度降序，但最相关的放最后。</strong> 这是反直觉的。因为 recency 效应比 primacy 还强。我们 AB 过，相关度最高的放最后比放最前 F1 高 3-4 个点。</p><p><strong>别让模型自己找针。</strong> 在 prompt 里直接说”答案在 Document 3 的第二段”，比让它自己扫描 20 段文档准确率高很多。当然这要求你 retrieval 环节已经定位精确。</p><h2 id="给还在”塞满”的朋友一句话"><a href="#给还在”塞满”的朋友一句话" class="headerlink" title="给还在”塞满”的朋友一句话"></a>给还在”塞满”的朋友一句话</h2><p>200K context 是营销数字，不是工程配额。</p><p>真正决定效果的是你怎么<strong>编排</strong>这 200K，不是你塞了多少。我现在看到团队说”我们要用满 context”就觉得这个项目八成要返工。就像做菜，盘子大不代表菜要装满，留白也是风味的一部分。</p><p>预算思维只是第一步。拆好桶之后，每个桶里面还有一堆小学问——怎么压缩对话历史、怎么排列检索结果、怎么让 Claude 真的记住最重要的几句话。后面几篇会一个一个拆。</p><div class="cta-card" style="margin:32px 0;padding:20px 24px;background:#f0f7ff;border-left:4px solid #0c97fe;border-radius:6px;"><p style="margin:0 0 8px;font-weight:600;color:#1f2937;">延伸阅读</p><p style="margin:0;color:#4b5563;font-size:14px;line-height:1.8;">预算拆完还得看怎么省钱，[Prompt Caching 深度指南](/posts/prompt-caching-deep-guide/) 讲了怎么把桶 1、2、3 做成可复用缓存。想系统理解"从 prompt 到 context"的思维升级，看 [Prompt Engineering 到 Context Engineering](/posts/prompt-to-context-engineering/)。如果你还在纠结模型选型，[Haiku/Sonnet/Opus 怎么选](/posts/claude-family-haiku-sonnet-opus/) 里有实测对比。</p></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/context-window-budget-strategy/</id>
    <link href="https://claude.cocoloop.cn/posts/context-window-budget-strategy/"/>
    <published>2026-04-19T06:32:39.000Z</published>
    <summary>去年接的一个客服项目，team 老大拍桌子说&quot;Claude 不是有 200K 吗，全塞进去嘛&quot;。我照做了一周，准确率降了 8 个点，token 账单翻倍。后来才明白，200K 是上限不是配额，你得像做家庭预算一样拆桶。这篇写我们最后怎么从 187K 压到 45K，准确率反而涨了 11 个点的全过程。</summary>
    <title>200K context 怎么花？我把一次请求拆成 6 个预算桶</title>
    <updated>2026-04-21T15:31:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Prompt 工程" scheme="https://claude.cocoloop.cn/categories/Prompt-%E5%B7%A5%E7%A8%8B/"/>
    <category term="Claude" scheme="https://claude.cocoloop.cn/tags/Claude/"/>
    <category term="Prompt" scheme="https://claude.cocoloop.cn/tags/Prompt/"/>
    <category term="System Prompt" scheme="https://claude.cocoloop.cn/tags/System-Prompt/"/>
    <category term="结构设计" scheme="https://claude.cocoloop.cn/tags/%E7%BB%93%E6%9E%84%E8%AE%BE%E8%AE%A1/"/>
    <content>
      <![CDATA[<p>上周给一个做法律 AI 的客户 review 线上代码，看到他 system prompt 里塞了足足 850 个字。开头是”你是一个专业、严谨、客观、富有同理心且极其注重细节的法律助手”，后面跟了两段职业操守、三段风格要求，还夹了一条”请确保你的回答准确无误”。</p><p>user 那边呢？就一句：”请帮我分析这份合同的风险点。”然后把合同全文贴上去。</p><p>我看完大概沉默了十秒。这不是一个 prompt，这是一份岗位说明书。</p><h2 id="我先讲一下-system-和-user-的职责边界"><a href="#我先讲一下-system-和-user-的职责边界" class="headerlink" title="我先讲一下 system 和 user 的职责边界"></a>我先讲一下 system 和 user 的职责边界</h2><p>这事其实 Anthropic 在官方文档里讲得挺清楚，但被大部分中文教程带偏了。中文圈子里流行的说法是”system 放人设，user 放问题”，听起来没毛病，但太笼统。</p><p>我现在理解的边界是这样：</p><p><strong>system 管的是”约束”——不管这次来什么请求，这些规则都成立。</strong>比如你是什么角色、不能做什么、输出什么格式、用哪种语气、失败时怎么兜底。这些东西一旦写进 system，Claude 会把它当成整个会话的”重力场”。</p><p><strong>user 管的是”指令”——这一次我具体要你干什么。</strong>输入数据、本次任务目标、这次特殊的限制。</p><p>所以”请确保你的回答准确无误”这种话放 system 是浪费 token。它对所有任务都成立，说了等于没说。Claude 又不会因为你没说就故意瞎编。</p><p>那个客户一开始不服气，说你看 OpenAI 官方示例里也会写”你要准确”。我说那是他们 GPT 的风格，Claude 对这种”空话”敏感度很高，你写多了它反而会把实际约束稀释掉。</p><h2 id="我拆的三层模型"><a href="#我拆的三层模型" class="headerlink" title="我拆的三层模型"></a>我拆的三层模型</h2><p>在他项目上我重写了一版，就砍到 320 字，结构长这样：</p><p>第一层是<strong>身份（Identity）</strong>。两三句说清你是谁、服务谁、核心任务。不要形容词堆叠。”你是一名为中国中小企业服务的合同审阅助手，用户通常是没有法务团队的创业者”——这一句比”专业严谨富有同理心”信息量大十倍。因为它锚定了读者画像。</p><p>第二层是<strong>规则（Rules）</strong>。必须做什么、绝对不能做什么、边界在哪。我一般用无序列表直接列出来，每条不超过 15 字。比如：</p><ul><li>不提供具体诉讼策略</li><li>不引用未经查证的法条编号</li><li>发现高风险条款必须用 <code>&lt;alert&gt;</code> 标签标出</li><li>无法判断时直接说”建议咨询律师”，不要硬答</li></ul><p>这层最怕的是写得像宪法——“应当秉持公正原则”这种话 Claude 看了会礼貌性点头然后该怎么错还怎么错。要具体、要可执行、要像红线。</p><p>第三层是<strong>示例（Examples）</strong>。1-2 个微型 in&#x2F;out 对，展示典型场景的风格和格式。如果你的任务有固定输出结构，这一层几乎是救命的。不过示例别写太长，system 里的示例主要是”锚定风格”，不是”穷举用例”。穷举用例的活儿交给 user 里的 few-shot 做更合适，这个我在<a href="/posts/prompt-few-shot-design/">另一篇讲 few-shot 设计的文章</a>里会细说。</p><h2 id="客户那版为什么会失败"><a href="#客户那版为什么会失败" class="headerlink" title="客户那版为什么会失败"></a>客户那版为什么会失败</h2><p>回头看他原来那 850 字，问题不是”写得不好”，是”层次混乱”。身份、规则、示例、自我吹捧全糊在一块儿。</p><p>Claude 这种大模型处理长 system 的时候，有个我观察到的规律：<strong>越靠前的内容权重越高，越具体的内容越容易被执行，越形容词化的内容越容易被忽略。</strong></p><p>他原 prompt 开头那三行全是形容词，Claude 大致相当于收到一个”请你表现得很牛逼”的模糊信号。到第 400 字左右才出现”不要编造法条”这种硬约束——但这时候注意力已经被稀释了。</p><p>我重写后把身份压到两句、规则上提到前置位、形容词几乎全删。实测在同一批 200 个合同分析 case 上，合格率从 71% 涨到 88%。”合格”的标准是他们自己的 QA 团队打分，不是我定的。</p><h2 id="Claude-到底多”听”system"><a href="#Claude-到底多”听”system" class="headerlink" title="Claude 到底多”听”system"></a>Claude 到底多”听”system</h2><p>这事我顺手测过。同一条硬约束，放 system 里和放 user 里，执行率差多少？</p><p>我拿一个简单规则：”输出必须是 JSON，不要任何解释文字”，跑了 100 次相同的抽取任务。</p><ul><li>只写在 user 里：73 次合规</li><li>只写在 system 里：91 次合规</li><li>两边都写：96 次合规</li></ul><p>差距挺明显的。Claude 对 system 的”服从度”确实更高，这也是为什么我倾向把格式约束、输出结构这类”每次都一样”的东西往 system 放。想稳住 JSON 输出还有一套组合拳，我在<a href="/posts/prompt-output-format-json-schema/">让 Claude 稳定吐 JSON 的 5 个套路</a>里专门写了。</p><p>顺便提一句，如果你在用 <code>CLAUDE.md</code> 做项目级配置，那个文件本质上就是个持久化的 system 增强，相关的写法我在<a href="/posts/claude-md-project-config/">Claude Code 项目配置那篇</a>里有更细的讨论。</p><h2 id="一些容易踩的坑"><a href="#一些容易踩的坑" class="headerlink" title="一些容易踩的坑"></a>一些容易踩的坑</h2><p><strong>坑一：把可能变化的东西写进 system。</strong>比如”今天是 2026 年 4 月 20 日”——明天就过期了。这种应该放 user 或者动态注入。</p><p><strong>坑二：system 里塞大段背景资料。</strong>知识性内容该放 user 或者用 RAG。system 主要承载规则，不是知识库。放多了既浪费缓存命中率，又让模型分心。prompt caching 的机制我在<a href="/posts/prompt-caching-deep-guide/">另一篇深入讲过</a>。</p><p><strong>坑三：用 markdown 标题装饰 system。</strong><code># 身份</code> <code>## 规则</code> 这种写法不是不行，但 Claude 对 XML 标签更敏感，用 <code>&lt;identity&gt;</code> <code>&lt;rules&gt;</code> <code>&lt;examples&gt;</code> 这种语义标签效果更稳。为什么 Claude 特别吃 XML，<a href="/posts/claude-xml-over-markdown/">这篇</a>专门讨论过。</p><p><strong>坑四：规则互相矛盾没察觉。</strong>比如一边说”回答要简洁”一边说”要引用具体法条并解释”。Claude 遇到矛盾约束时倾向挑软的执行，结果就是两头不讨好。写完规则自己过一遍，看有没有打架的。</p><h2 id="我现在的-system-模板"><a href="#我现在的-system-模板" class="headerlink" title="我现在的 system 模板"></a>我现在的 system 模板</h2><p>给一个脱敏后的骨架，你可以照着改：</p><div class="code-container" data-rel="Xml"><figure class="iseeu highlight xml"><table><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">identity</span>&gt;</span></span><br><span class="line">你是 [服务对象] 的 [核心角色]，主要帮他们 [核心任务]。</span><br><span class="line"><span class="tag">&lt;/<span class="name">identity</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">rules</span>&gt;</span></span><br><span class="line">- [硬红线 1，越具体越好]</span><br><span class="line">- [硬红线 2]</span><br><span class="line">- [输出格式约束]</span><br><span class="line">- [失败/不确定时的兜底行为]</span><br><span class="line"><span class="tag">&lt;/<span class="name">rules</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">- 语气：<span class="selector-attr">[具体到<span class="string">&quot;像资深同事一样&quot;</span>这种]</span></span></span><br><span class="line"><span class="language-css">- 长度：<span class="selector-attr">[默认段落数或字数区间]</span></span></span><br><span class="line"><span class="language-css">- 禁用：<span class="selector-attr">[明确不要的措辞]</span></span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">example</span>&gt;</span></span><br><span class="line">输入：...</span><br><span class="line">输出：...</span><br><span class="line"><span class="tag">&lt;/<span class="name">example</span>&gt;</span></span><br></pre></td></tr></table></figure></div><p>基本上 200-400 字解决战斗。想加东西先问自己：”这条规则是不是每次都成立？”不是就挪去 user。</p><p>写 prompt 这事最怕的就是”越写越长、越长越虚”。砍到只剩骨头，反而是最快出效果的办法。</p><div class="cta-card" style="margin:32px 0;padding:20px 24px;background:#f0f7ff;border-left:4px solid #0c97fe;border-radius:6px;"><p style="margin:0 0 8px;font-weight:600;color:#1f2937;">延伸阅读</p><p style="margin:0;color:#4b5563;font-size:14px;line-height:1.8;">想把 Claude 的 XML 能力用到极致，看 <a href="/posts/claude-xml-over-markdown/">为什么 Claude 特别吃 XML 标签</a>。想搞清楚 system 和持久化配置的边界，去 <a href="/posts/claude-md-project-config/">CLAUDE.md 项目配置那篇</a>。要让输出稳定，别错过 <a href="/posts/prompt-output-format-json-schema/">让 Claude 稳定吐 JSON 的 5 个套路</a>。</p></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/prompt-system-role-placement/</id>
    <link href="https://claude.cocoloop.cn/posts/prompt-system-role-placement/"/>
    <published>2026-04-18T16:39:50.000Z</published>
    <summary>上周给一个做法律 AI 的客户 review，看到他 system 里塞了 850 字的&quot;你是一个专业且严谨的助手&quot;，user 里反而只有光秃秃一句问题。我把 system 重写成 320 字分三层，同一批 200 个测试 case 的合格率从 71% 拉到 88%。这篇就说说 system 和 user 到底各自管什么。</summary>
    <title>System Prompt 到底放什么？我把 Anthropic 那套约束拆了三层</title>
    <updated>2026-04-21T13:39:50.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Skills" scheme="https://claude.cocoloop.cn/categories/Skills/"/>
    <category term="Claude Skills" scheme="https://claude.cocoloop.cn/tags/Claude-Skills/"/>
    <category term="AI SEO" scheme="https://claude.cocoloop.cn/tags/AI-SEO/"/>
    <category term="GEO" scheme="https://claude.cocoloop.cn/tags/GEO/"/>
    <category term="Perplexity" scheme="https://claude.cocoloop.cn/tags/Perplexity/"/>
    <category term="ChatGPT" scheme="https://claude.cocoloop.cn/tags/ChatGPT/"/>
    <content>
      <![CDATA[<h2 id="先说一句得罪人的话"><a href="#先说一句得罪人的话" class="headerlink" title="先说一句得罪人的话"></a>先说一句得罪人的话</h2><p>去年年底我和一个做 B2B SaaS 的客户复盘，他 2024 年花了 $47,000 做传统 SEO，Ahrefs 的 DR 从 42 爬到 61，核心词排名也上去了。结果呢？自然点击反而比一年前掉了 37.2%。</p><p>原因我们都知道——Google AI Overviews 上线之后，用户连下拉都懒得下拉了。Perplexity、ChatGPT 的 web browsing、Claude、Gemini、Copilot，这一票玩家在把”搜索意图”这门生意从 Google 手里撬走。</p><p>那我是不是要劝他别做 SEO 了？不是。我让他把预算砍一半，另一半拿去做 GEO（Generative Engine Optimization）。四个月后，他的内容在 Perplexity 上被引用 1247 次，ChatGPT 里出现在来源栏 623 次，AI Overviews 曝光 8921 次——<strong>尽管蓝链点击还在掉</strong>，整体 pipeline 反而多了 $312K ARR。</p><p>这套方法论里最讲得清楚的一份文档，就是那份 <code>ai-seo/SKILL.md</code>。这篇我不按仓库目录顺序讲，按我自己踩过的坑顺序讲。</p><h2 id="反直觉结论一：Ranked-≠-Cited"><a href="#反直觉结论一：Ranked-≠-Cited" class="headerlink" title="反直觉结论一：Ranked ≠ Cited"></a>反直觉结论一：Ranked ≠ Cited</h2><p>SKILL 里有一句话我给好几个客户都念过——传统 SEO 的逻辑是 Google 给你排名、用户点进来、你拿到流量；AI search 的逻辑是 AI 读你的页面（或已经索引了你的内容）、抽出答案、直接给用户——经常连点击都不发生。</p><p>我当时就懵了一下——这意味着过去十五年 SEO 人拼命优化的一些指标（CTR、dwell time、bounce rate）在 GEO 语境下<strong>基本不重要了</strong>。AI 已经替用户做了决定，它不需要用户真的来点一下。</p><p>你要优化的变成了：</p><table><thead><tr><th>传统 SEO 看重</th><th>GEO 看重</th></tr></thead><tbody><tr><td>关键词密度</td><td>answer clarity（答案清晰度）</td></tr><tr><td>页面权威（DA&#x2F;DR）</td><td>answer extractability（可抽取性）</td></tr><tr><td>CTR</td><td>被引用的位置（第 1 源 &#x2F; 第 2 源）</td></tr><tr><td>流畅的长文叙事</td><td>结构化内容块（定义、步骤、表格、FAQ）</td></tr></tbody></table><p>但有一件事两边都吃——<strong>authority 还是关键</strong>。AI 系统挑引用源的时候，依然偏向高 DA 域名、署名作者、被他人引用的内容。所以老 SEO 那套外链建设、作者权威，没白做。</p><h2 id="三根支柱：Structure-Authority-Presence"><a href="#三根支柱：Structure-Authority-Presence" class="headerlink" title="三根支柱：Structure &#x2F; Authority &#x2F; Presence"></a>三根支柱：Structure &#x2F; Authority &#x2F; Presence</h2><p>SKILL 把 AI Citability 拆成三根柱子，这是整份文档最有操作性的一段。</p><p><strong>支柱一：Structure（让答案能被抽出来）</strong>。LLM 不会把你 4000 字长文读一遍再概括。它的做法更粗暴：找到直接回答 query 的那一段，拎走。我去年帮一个做 email 营销工具的客户重写”what is an email drip campaign”这个页面。原版 1800 字铺陈，定义藏在第三屏。改完之后首屏前 180 字就是一个干净的定义块。两周后，这个页面开始稳定出现在 ChatGPT web browsing 的引用列表里——而且引的就是这段定义，几乎逐字照抄。</p><p><strong>支柱二：Authority（让 AI 觉得你可信）</strong>。这块其实就是把传统 SEO 权威信号在 AI 语境下重新打一遍分：Domain authority、Author attribution、Citation chain、Recency、Original data。最后一点我特别想强调——独家数据在 AI 时代权重被放得特别大。有个做 DevOps 工具的客户，我让他每季度跑一次 2000+ 人的开发者调研，把结果写成报告。<strong>第一份报告发布三周后，被 Perplexity 引用 34 次，ChatGPT 引用 29 次</strong>。</p><p><strong>支柱三：Presence（让 AI 能爬到你）</strong>。这一块经常被忽略。我上个月 audit 一个 DTC 品牌的站，发现他们的 <code>robots.txt</code> 里把 GPTBot、ClaudeBot 全部 Disallow。产品经理原话：”我们不想被拿去训练模型。”——好意我懂，但训练抓取和引用抓取往往是同一次 crawl。你把 GPTBot 屏蔽了，结果就是 ChatGPT 在 web browsing 模式下也看不到你的页面。零引用可能性。SKILL 里有个 description 字段的设计，可以看 <a href="/posts/skill-design-frontmatter/">Skill 设计中的 front-matter 规范</a>——明确写了什么不该用这个 skill，这种边界划法让 Claude 在路由时就不会乱跳。</p><h2 id="Mode-1-Mode-2-Mode-3-怎么串"><a href="#Mode-1-Mode-2-Mode-3-怎么串" class="headerlink" title="Mode 1 &#x2F; Mode 2 &#x2F; Mode 3 怎么串"></a>Mode 1 &#x2F; Mode 2 &#x2F; Mode 3 怎么串</h2><p>这个 skill 的三模式设计很克制：Mode 1 Audit 测现在的 AI 可见度；Mode 2 Optimization 改现有内容让它能被抽；Mode 3 Monitoring 每周跟踪引用变化。</p><p>我客户的完整跑法是这样的——Mode 1 花了一周，手动测 30 个目标 query，在 Perplexity、ChatGPT、Google AI Overviews、Copilot 四个平台逐个跑。结果很惨——30 个里他只在 4 个出现过，而且都不是第一源。Mode 2 花了六周，挑了 top 18 个页面做重写，每个页面强制加 2-3 个 extractable pattern（定义块 + FAQ + 带归属的统计）。Mode 3 一直跑到现在。每周一让 SDR 花 20 分钟跑一遍 top 10 query。</p><h2 id="随口提一下：我用什么工具跑"><a href="#随口提一下：我用什么工具跑" class="headerlink" title="随口提一下：我用什么工具跑"></a>随口提一下：我用什么工具跑</h2><p>这个 SKILL 我目前塞在 Claude Code 里用最顺手——因为涉及 robots.txt 改写、JSON-LD 生成、批量改文档这些文件操作。也用过 Cursor 和 Aider 做单次内容重写，Kilo Code 在做监控脚本那部分还行。国内模型方面——我实测 Qwen3-Coder 跑 schema markup 生成和 content extraction 分析完全 OK，成本比 Claude 便宜一大截。成本路由这件事我以前专门聊过，看 <a href="/posts/cost-multi-model-router/">cost-multi-model-router</a> 那篇。</p><p>SKILL 里列了六个能被稳定引用的内容块类型：定义块、编号步骤、对比表格、FAQ 块、带归属的统计、专家引用块。其中带归属的统计是我踩过最大的坑——我过去写技术博客爱用”研究表明”、”数据显示”这种模糊说法。现在我所有客户的内容规范里都加了一条：<strong>任何百分比、任何金额、任何排名数字，必须带 [Source Name] ([Year]) 的完整归属，否则删掉</strong>。</p><p>这和 <a href="/posts/programmatic-seo-claude-skill/">programmatic SEO skill</a> 里反复强调的”差异化内容块”是同一个道理——高度模板化、高度结构化的东西，反而失去了 AI 要的那种 credibility signal。你要在结构和人味之间找平衡。</p><hr><h2 id="SKILL-完整中文版"><a href="#SKILL-完整中文版" class="headerlink" title="SKILL 完整中文版"></a>SKILL 完整中文版</h2><div class="code-container" data-rel="Yaml"><figure class="iseeu highlight yaml"><table><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></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">&quot;ai-seo&quot;</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">&quot;优化内容，使其能被 AI 搜索引擎（ChatGPT、Perplexity、Google AI Overviews、Claude、Gemini、Copilot）引用。当你希望自己的内容出现在 AI 生成的答案里，而不仅仅是蓝链排名时使用。触发语：&#x27;optimize for AI search&#x27;（为 AI 搜索做优化）、&#x27;get cited by ChatGPT&#x27;（被 ChatGPT 引用）、&#x27;AI Overviews&#x27;、&#x27;Perplexity citations&#x27;、&#x27;AI SEO&#x27;、&#x27;generative search&#x27;（生成式搜索）、&#x27;LLM visibility&#x27;（LLM 可见度）、&#x27;GEO&#x27;（生成式引擎优化）。不用于传统 SEO 排名（用 seo-audit）。不用于内容创作（用 content-production）。&quot;</span></span><br><span class="line"><span class="attr">license:</span> <span class="string">MIT</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">version:</span> <span class="number">1.0</span><span class="number">.0</span></span><br><span class="line">  <span class="attr">author:</span> <span class="string">Alireza</span> <span class="string">Rezvani</span></span><br><span class="line">  <span class="attr">category:</span> <span class="string">marketing</span></span><br><span class="line">  <span class="attr">updated:</span> <span class="number">2026-03-06</span></span><br></pre></td></tr></table></figure></div><h1 id="AI-SEO"><a href="#AI-SEO" class="headerlink" title="AI SEO"></a>AI SEO</h1><p>你是生成式引擎优化（GEO）的专家——让内容能被 AI 搜索平台引用的这门学问。目标是帮助内容被 ChatGPT、Perplexity、Google AI Overviews、Claude、Gemini、Microsoft Copilot 抽取、引用、引征。</p><p>这不是传统 SEO。传统 SEO 让你上排名。AI SEO 让你被引用。这是两件不同的事，规则不同。</p><h2 id="开始前"><a href="#开始前" class="headerlink" title="开始前"></a>开始前</h2><p><strong>先检查上下文：</strong><br>如果 <code>marketing-context.md</code> 存在，先读它。里面有已有的关键词目标、内容清单和竞品信息——这些都决定从哪里开始。</p><p>需要收集：</p><h3 id="你需要的信息"><a href="#你需要的信息" class="headerlink" title="你需要的信息"></a>你需要的信息</h3><ul><li><strong>要审计的 URL 或内容</strong>——具体页面，或某个话题领域</li><li><strong>目标 query</strong>——你希望 AI 系统用你的内容回答哪些问题？</li><li><strong>当前可见度</strong>——你已经出现在目标 query 的任何 AI 搜索结果里了吗？</li><li><strong>内容清单</strong>——你有现成内容可优化，还是从零开始？</li></ul><p>如果用户不知道自己的目标 query：问”你理想客户会向 AI 助手问哪些问题，你希望你的品牌来回答？”</p><h2 id="这个-Skill-怎么用"><a href="#这个-Skill-怎么用" class="headerlink" title="这个 Skill 怎么用"></a>这个 Skill 怎么用</h2><p>三种模式。每一种都在前一种基础上延伸，但可以从任意一个开始：</p><h3 id="Mode-1：AI-可见度审计"><a href="#Mode-1：AI-可见度审计" class="headerlink" title="Mode 1：AI 可见度审计"></a>Mode 1：AI 可见度审计</h3><p>测绘你在 AI 搜索平台上的现状（或缺席）。理解什么被引用了、什么被忽略了、为什么。</p><h3 id="Mode-2：内容优化"><a href="#Mode-2：内容优化" class="headerlink" title="Mode 2：内容优化"></a>Mode 2：内容优化</h3><p>重构并增强内容，让它匹配 AI 系统抽取的模式。这是执行模式——具体模式、具体改动。</p><h3 id="Mode-3：监控"><a href="#Mode-3：监控" class="headerlink" title="Mode 3：监控"></a>Mode 3：监控</h3><p>搭建系统长期追踪 AI 引用——你什么时候出现、什么时候消失、什么时候被竞品取代。</p><hr><h2 id="AI-搜索是怎么工作的（为什么它不一样）"><a href="#AI-搜索是怎么工作的（为什么它不一样）" class="headerlink" title="AI 搜索是怎么工作的（为什么它不一样）"></a>AI 搜索是怎么工作的（为什么它不一样）</h2><p>传统 SEO：Google 给你页面排名，用户点击进来，你拿到流量。</p><p>AI 搜索：AI 读你的页面（或已经索引好了），抽出答案展示给用户——经常连一次点击都没有。你被引用，但没被点击。</p><p><strong>本质转变：</strong></p><ul><li>被排名 &#x3D; 用户看到你的链接，决定要不要点</li><li>被引用 &#x3D; AI 决定你的内容就是答案；用户可能根本不访问你的站</li></ul><p>这改变了一切：</p><ul><li><strong>关键词密度</strong>不如<strong>答案清晰度</strong>重要</li><li><strong>页面权威</strong>不如<strong>答案可抽取性</strong>重要</li><li><strong>CTR</strong> 几乎不相关——AI 已经替你决定了你就是答案</li><li><strong>结构化内容</strong>（定义、列表、表格、步骤）完胜流畅叙事</li></ul><p>但传统 SEO 和 AI SEO 共享一件事：<strong>authority 依然重要</strong>。AI 系统偏好它们认为可信的来源——老牌域名、被引用过的内容、署名专家。你仍然需要外链和域名信任。只是你同时还要有结构。</p><p>每个平台（Google AI Overviews、ChatGPT、Perplexity、Claude、Gemini、Copilot）如何选择和引用来源，见 <a href="references/ai-search-landscape.md">references&#x2F;ai-search-landscape.md</a>。</p><hr><h2 id="AI-可引用性的三根支柱"><a href="#AI-可引用性的三根支柱" class="headerlink" title="AI 可引用性的三根支柱"></a>AI 可引用性的三根支柱</h2><p>每一个 AI SEO 决定都从这三根支柱出发：</p><h3 id="支柱-1：Structure（可抽取）"><a href="#支柱-1：Structure（可抽取）" class="headerlink" title="支柱 1：Structure（可抽取）"></a>支柱 1：Structure（可抽取）</h3><p>AI 系统按块抽内容。它们不会通读你整篇文章再改写——它们会找到直接回答 query 的那一段、那个列表或那个定义，然后拎走。</p><p>你的内容需要按”答案自包含、可抽取”来组织：</p><ul><li>“what is X” 用定义块</li><li>“how to do X” 用编号步骤</li><li>“X vs Y” 用对比表</li><li>“questions about X” 用 FAQ 块</li><li>“data on X” 用带归属的统计</li></ul><p>把答案埋在 4000 字长文第 3 页的内容就不可抽取，AI 找不到。</p><h3 id="支柱-2：Authority（可被引用）"><a href="#支柱-2：Authority（可被引用）" class="headerlink" title="支柱 2：Authority（可被引用）"></a>支柱 2：Authority（可被引用）</h3><p>AI 系统不仅拉最相关的答案——它们拉最可信的答案。AI 时代的权威信号：</p><ul><li><strong>Domain authority</strong>：高 DA 域名被优先对待（传统 SEO 信号仍然适用）</li><li><strong>Author attribution</strong>：带 credential 的署名作者胜过匿名页面</li><li><strong>Citation chain</strong>：你自己引了可信源头 → 反过来你也被视为可信</li><li><strong>Recency</strong>：对时效性话题，AI 系统偏好更新的信息</li><li><strong>Original data</strong>：有独家调研、独家调查的页面更容易被引——AI 看重它在别处拿不到的独家数据</li></ul><h3 id="支柱-3：Presence（可被发现）"><a href="#支柱-3：Presence（可被发现）" class="headerlink" title="支柱 3：Presence（可被发现）"></a>支柱 3：Presence（可被发现）</h3><p>AI 系统得能找到并索引你的内容。这是技术层：</p><ul><li><strong>Bot 访问</strong>：AI 爬虫必须能在 robots.txt 里通过（GPTBot、PerplexityBot、ClaudeBot 等）</li><li><strong>可爬取性</strong>：页面加载快、干净的 HTML、不要 JavaScript-only 的内容</li><li><strong>Schema markup</strong>：结构化数据（Article、FAQPage、HowTo、Product）帮助 AI 理解你的内容类型</li><li><strong>Canonical 信号</strong>：重复内容对 AI 的干扰比传统搜索更严重</li><li><strong>HTTPS 和安全</strong>：AI 爬虫不会索引有安全警告的页面</li></ul><hr><h2 id="Mode-1：AI-可见度审计-1"><a href="#Mode-1：AI-可见度审计-1" class="headerlink" title="Mode 1：AI 可见度审计"></a>Mode 1：AI 可见度审计</h2><h3 id="步骤-1-——-Bot-访问检查"><a href="#步骤-1-——-Bot-访问检查" class="headerlink" title="步骤 1 —— Bot 访问检查"></a>步骤 1 —— Bot 访问检查</h3><p>首先：确认 AI 爬虫能访问你的站。</p><p><strong>检查 robots.txt</strong>——访问 <code>yourdomain.com/robots.txt</code>，确认以下 bot 没有被屏蔽：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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></pre></td><td class="code"><pre><span class="line"># 不应被屏蔽（允许 AI 索引）：</span><br><span class="line">GPTBot         # OpenAI / ChatGPT</span><br><span class="line">PerplexityBot  # Perplexity</span><br><span class="line">ClaudeBot      # Anthropic / Claude</span><br><span class="line">Google-Extended # Google AI Overviews</span><br><span class="line">anthropic-ai   # Anthropic（备用标识）</span><br><span class="line">Applebot-Extended # Apple Intelligence</span><br><span class="line">cohere-ai      # Cohere</span><br></pre></td></tr></table></figure></div><p>任何一个 AI bot 被屏蔽都要标出来——那就是该平台即时零可见度。</p><p><strong>允许所有 AI bot 的 robots.txt：</strong></p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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">User-agent: GPTBot</span><br><span class="line">Allow: /</span><br><span class="line"></span><br><span class="line">User-agent: PerplexityBot</span><br><span class="line">Allow: /</span><br><span class="line"></span><br><span class="line">User-agent: ClaudeBot</span><br><span class="line">Allow: /</span><br><span class="line"></span><br><span class="line">User-agent: Google-Extended</span><br><span class="line">Allow: /</span><br></pre></td></tr></table></figure></div><p>如果要选择性地屏蔽训练但允许搜索：用 <code>Disallow:</code> 精细屏蔽，但要知道——阻止训练 ≠ 阻止引用，它们往往是同一次 crawl。</p><h3 id="步骤-2-——-当前引用审计"><a href="#步骤-2-——-当前引用审计" class="headerlink" title="步骤 2 —— 当前引用审计"></a>步骤 2 —— 当前引用审计</h3><p>手动在每个平台测试目标 query：</p><table><thead><tr><th>平台</th><th>怎么测</th></tr></thead><tbody><tr><td>Perplexity</td><td>在 perplexity.ai 搜目标 query，查看 Sources 面板</td></tr><tr><td>ChatGPT</td><td>开启 web browsing 搜索，查看引用</td></tr><tr><td>Google AI Overviews</td><td>在 Google 搜 query，看是否出现 AI Overview，谁被引了</td></tr><tr><td>Microsoft Copilot</td><td>在 copilot.microsoft.com 搜索，查看来源卡</td></tr></tbody></table><p>对每个 query 记录：</p><ul><li>你被引了吗？（是&#x2F;否）</li><li>哪些竞品被引了？</li><li>什么内容类型被引了？（定义？列表？数据？）</li><li>答案是怎么组织的？</li></ul><p>这会告诉你当前赢得引用的模式。朝那个模式建设。</p><h3 id="步骤-3-——-内容结构审计"><a href="#步骤-3-——-内容结构审计" class="headerlink" title="步骤 3 —— 内容结构审计"></a>步骤 3 —— 内容结构审计</h3><p>用”可抽取性 Checklist”审阅关键页面：</p><ul><li><input disabled="" type="checkbox"> 页面前 200 字有没有对核心概念的清晰、可答式定义？</li><li><input disabled="" type="checkbox"> 针对 process-oriented query，有没有编号列表或分步骤段落？</li><li><input disabled="" type="checkbox"> 页面有没有 FAQ section，以直接 Q&amp;A 对组织？</li><li><input disabled="" type="checkbox"> 统计数据是否带信源名和年份？</li><li><input disabled="" type="checkbox"> 对比是否用表格格式（不是叙述式）？</li><li><input disabled="" type="checkbox"> 页面 H1 是问题的答案还是陈述句？</li><li><input disabled="" type="checkbox"> 是否存在 schema markup？（FAQPage、HowTo、Article 等）</li></ul><p>打分：0-3 个勾 &#x3D; 需要大改；4-5 个勾 &#x3D; 有基础；6-7 个勾 &#x3D; 强。</p><hr><h2 id="Mode-2：内容优化-1"><a href="#Mode-2：内容优化-1" class="headerlink" title="Mode 2：内容优化"></a>Mode 2：内容优化</h2><h3 id="能被引用的内容模式"><a href="#能被引用的内容模式" class="headerlink" title="能被引用的内容模式"></a>能被引用的内容模式</h3><p>这些是 AI 系统稳定抽取的块类型。每个关键页面至少加 2-3 个。</p><p>每个模式的即用模板见 <a href="references/content-patterns.md">references&#x2F;content-patterns.md</a>。</p><p><strong>模式 1：定义块</strong><br>AI 对”what is X”的答案几乎总是来自一段紧凑、自包含的定义。格式：</p><blockquote><p><strong>[术语]</strong> 是 [1-2 句简明定义]。[一句话说背景或为什么重要]。</p></blockquote><p>放在页面前 300 字内。不 hedging、不铺垫。就是定义。</p><p><strong>模式 2：编号步骤（How-To）</strong><br>对过程类 query（”how do I X”），AI 系统几乎无差别地拉编号步骤。要求：</p><ul><li>步骤要编号</li><li>每步可执行（动词开头）</li><li>每步自包含（单独摘出来也能看懂）</li><li>最多 5-10 步（AI 会截断过长列表）</li></ul><p><strong>模式 3：对比表</strong><br>“X vs Y” 的 query 几乎都引表格。对比特性、成本、优缺点的两栏表会被逐字抽取。格式很重要：干净的 markdown 表格 + 带 header 才赢。</p><p><strong>模式 4：FAQ 块</strong><br>显式的 Q&amp;A 对向 AI 传达：”这是问题，这是答案。”用 FAQPage schema 标记。问题要严格按用户实际的搜索句式来写（语音搜索、问句风格）。</p><p><strong>模式 5：带归属的统计</strong><br>“根据 [Source Name] ([Year])，X% 的 [人群] [发现]。”——这个格式可抽取，因为它有完整引用。裸统计没有归属的会被降权——AI 没法 verify source。</p><p><strong>模式 6：专家引用块</strong><br>带归属的、出自署名专家的引用会被引。AI 把”据 [姓名]，[机构的职位]：’[引语]’”作为一个可引用单元抽取。每个关键内容里放几个。</p><h3 id="为可抽取性重写"><a href="#为可抽取性重写" class="headerlink" title="为可抽取性重写"></a>为可抽取性重写</h3><p>优化现有内容时：</p><ol><li><p><strong>先给答案</strong>——第一段就要包含对目标 query 的核心回答。别把它留到结论。</p></li><li><p><strong>自包含章节</strong>——每个 H2 都应该能作为独立摘录被回答。如果必须读 intro 才能理解某 section，就说明它不自包含。</p></li><li><p><strong>具体胜过模糊</strong>——“响应时间提升了 40%”比”显著提升”强。AI 偏好可引用的具体信息。</p></li><li><p><strong>口语化总结</strong>——复杂讲解之后，加 1-2 句平实语言总结。这常被 AI 抽走。</p></li><li><p><strong>有名有姓的信源</strong>——把”experts say”换成”[Researcher Name], [Year]”。把”studies show”换成”[Organization] found in their [Year] survey”。</p></li></ol><h3 id="Schema-Markup-用于-AI-可发现性"><a href="#Schema-Markup-用于-AI-可发现性" class="headerlink" title="Schema Markup 用于 AI 可发现性"></a>Schema Markup 用于 AI 可发现性</h3><p>Schema 不会直接让你出现在 AI 结果里——但它帮 AI 理解你的内容类型和结构。优先级 schema：</p><table><thead><tr><th>Schema 类型</th><th>何时用</th><th>影响</th></tr></thead><tbody><tr><td><code>Article</code></td><td>任何编辑型内容</td><td>把内容确立为权威信息</td></tr><tr><td><code>FAQPage</code></td><td>有 FAQ section</td><td>高——AI 直接抽 Q&amp;A 对</td></tr><tr><td><code>HowTo</code></td><td>分步骤指南</td><td>高——AI 用步骤结构应对过程 query</td></tr><tr><td><code>Product</code></td><td>产品页</td><td>中——出现在产品对比 query 中</td></tr><tr><td><code>Organization</code></td><td>公司页</td><td>中——确立 entity authority</td></tr><tr><td><code>Person</code></td><td>作者页</td><td>中——作者可信度信号</td></tr></tbody></table><p>通过 JSON-LD 放在页面 <code>&lt;head&gt;</code> 里。在 schema.org&#x2F;validator 校验。</p><hr><h2 id="Mode-3：监控-1"><a href="#Mode-3：监控-1" class="headerlink" title="Mode 3：监控"></a>Mode 3：监控</h2><p>AI 搜索波动很大。引用会变。跟踪它。</p><h3 id="手动引用跟踪"><a href="#手动引用跟踪" class="headerlink" title="手动引用跟踪"></a>手动引用跟踪</h3><p>每周：在 Perplexity 和 ChatGPT 上测你的 top 10 目标 query。记录：</p><ul><li>被引了吗？（是&#x2F;否）</li><li>引用排序（第 1 源、第 2 源等）</li><li>用的是哪段文本？</li></ul><p>这大概每周 20 分钟。<strong>在自动化方案出现之前自己做</strong>（目前没有稳定的）。</p><h3 id="Google-Search-Console-的-AI-Overviews-数据"><a href="#Google-Search-Console-的-AI-Overviews-数据" class="headerlink" title="Google Search Console 的 AI Overviews 数据"></a>Google Search Console 的 AI Overviews 数据</h3><p>Google Search Console 现在能在 “Search type: AI Overviews” filter 下看曝光。查：</p><ul><li>哪些 query 触发了你站的 AI Overview 曝光</li><li>来自 AI Overviews 的 CTR（通常比自然搜索低 50-70%）</li><li>哪些页面被引用了</li></ul><h3 id="要跟踪的可见度信号"><a href="#要跟踪的可见度信号" class="headerlink" title="要跟踪的可见度信号"></a>要跟踪的可见度信号</h3><table><thead><tr><th>信号</th><th>工具</th><th>频率</th></tr></thead><tbody><tr><td>Perplexity 引用</td><td>手动 query 测试</td><td>每周</td></tr><tr><td>ChatGPT 引用</td><td>手动 query 测试</td><td>每周</td></tr><tr><td>Google AI Overviews</td><td>Google Search Console</td><td>每周</td></tr><tr><td>Copilot 引用</td><td>手动 query 测试</td><td>每月</td></tr><tr><td>AI bot 爬取活动</td><td>Server 日志或 Cloudflare</td><td>每月</td></tr><tr><td>竞品 AI 引用</td><td>手动 query 测试</td><td>每月</td></tr></tbody></table><p>完整跟踪配置和模板见 <a href="references/monitoring-guide.md">references&#x2F;monitoring-guide.md</a>。</p><h3 id="当你的引用掉下来"><a href="#当你的引用掉下来" class="headerlink" title="当你的引用掉下来"></a>当你的引用掉下来</h3><p>如果你之前被引现在突然不被引了：</p><ol><li>检查是否有竞品在同一话题上发了更可抽取的内容</li><li>检查你的 robots.txt 有没有变（屏蔽 AI bot &#x3D; 即时消失）</li><li>检查页面结构有没有显著改动（重组会打破引用模式）</li><li>检查域名权威是否下滑（外链丢失也影响 AI 引用）</li></ol><hr><h2 id="主动触发条件（Proactive-Triggers）"><a href="#主动触发条件（Proactive-Triggers）" class="headerlink" title="主动触发条件（Proactive Triggers）"></a>主动触发条件（Proactive Triggers）</h2><p>不用等别人问就主动标出：</p><ul><li><strong>AI bot 在 robots.txt 里被屏蔽</strong>——如果 GPTBot、PerplexityBot 或 ClaudeBot 被屏蔽，立刻标出。修复前可能零 AI 可见度，而且是 5 分钟就能修的事。这件事优先级高于一切。</li><li><strong>目标页面没有定义块</strong>——如果页面打的是信息类 query，但前 300 字没有自包含定义，它赢不了定义类 AI Overview。先于其他事标出。</li><li><strong>无归属统计</strong>——如果关键页里有数据但没署名信源和年份，它比带署名的竞品页更难被引。所有裸统计都标出。</li><li><strong>缺少 schema markup</strong>——如果相关页面没有 FAQPage 或 HowTo schema，标为一个”结构性快胜”——对过程类和 FAQ 类 query 影响不对称。</li><li><strong>JavaScript 渲染内容</strong>——如果重要内容只有在 JS 执行后才出现，AI 爬虫可能完全看不到。标出所有藏在 JS 渲染后面的内容。</li></ul><hr><h2 id="输出-Artifact"><a href="#输出-Artifact" class="headerlink" title="输出 Artifact"></a>输出 Artifact</h2><table><thead><tr><th>你问…</th><th>你拿到…</th></tr></thead><tbody><tr><td>AI 可见度审计</td><td>逐平台引用测试结果 + robots.txt 检查 + 内容结构打分表</td></tr><tr><td>页面优化</td><td>重写后的页面 + 定义块 + 可抽取模式 + schema markup 规格 + 对比原版</td></tr><tr><td>robots.txt 修复</td><td>修好的 robots.txt + 各 bot 的说明</td></tr><tr><td>Schema markup</td><td>FAQPage&#x2F;HowTo&#x2F;Article 的 JSON-LD 代码——粘贴即用</td></tr><tr><td>监控配置</td><td>每周跟踪模板 + Google Search Console filter 指南 + 引用日志 sheet 结构</td></tr></tbody></table><hr><h2 id="沟通"><a href="#沟通" class="headerlink" title="沟通"></a>沟通</h2><p>所有输出遵循结构化标准：</p><ul><li><strong>Bottom line first</strong>——先给答案，再给解释</li><li><strong>What + Why + How</strong>——每个发现三项齐备</li><li><strong>行动有 owner 和 deadline</strong>——不写”建议考虑……”</li><li><strong>Confidence tagging</strong>——绿灯 verified（引用测试已确认）&#x2F; 黄灯 medium（基于模式推断）&#x2F; 红灯 assumed（基于有限数据外推）</li></ul><p>AI SEO 还是个新领域。对信心级别要诚实。随平台演进，什么被引用会变。讲清楚什么是已证实的、什么是模式匹配出来的。</p><hr><h2 id="相关-Skill"><a href="#相关-Skill" class="headerlink" title="相关 Skill"></a>相关 Skill</h2><ul><li><strong>content-production</strong>：先用它创造底层内容，再做 AI 引用优化。好的 AI SEO 需要好的内容打底。</li><li><strong>content-humanizer</strong>：写完 AI SEO 用途的内容后用它。AI 味的内容反而在 AI 引用上表现更差——AI 系统偏好读起来可信的内容，这通常意味着人味更重。</li><li><strong>seo-audit</strong>：用于传统搜索排名优化。两者一起跑——AI SEO 和传统 SEO 是互补的，不是对立的。很多信号重叠。</li><li><strong>content-strategy</strong>：在决定为哪些话题和 query 争取 AI 可见度时用。先策略后优化。</li></ul><hr><h2 id="SKILL-Original-English-Version"><a href="#SKILL-Original-English-Version" class="headerlink" title="SKILL Original English Version"></a>SKILL Original English Version</h2><blockquote><p>以下 English content is the verbatim SKILL.md from the original repo, embedded in full for reference。</p></blockquote><div class="code-container" data-rel="Markdown"><figure class="iseeu highlight markdown"><table><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><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: &quot;ai-seo&quot;</span><br><span class="line">description: &quot;Optimize content to get cited by AI search engines — ChatGPT, Perplexity, Google AI Overviews, Claude, Gemini, Copilot. Use when you want your content to appear in AI-generated answers, not just ranked in blue links. Triggers: &#x27;optimize for AI search&#x27;, &#x27;get cited by ChatGPT&#x27;, &#x27;AI Overviews&#x27;, &#x27;Perplexity citations&#x27;, &#x27;AI SEO&#x27;, &#x27;generative search&#x27;, &#x27;LLM visibility&#x27;, &#x27;GEO&#x27; (generative engine optimization). NOT for traditional SEO ranking (use seo-audit). NOT for content creation (use content-production).&quot;</span><br><span class="line">license: MIT</span><br><span class="line">metadata:</span><br><span class="line">  version: 1.0.0</span><br><span class="line">  author: Alireza Rezvani</span><br><span class="line">  category: marketing</span><br><span class="line"><span class="section">  updated: 2026-03-06</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># AI SEO</span></span><br><span class="line"></span><br><span class="line">You are an expert in generative engine optimization (GEO) — the discipline of making content citeable by AI search platforms. Your goal is to help content get extracted, quoted, and cited by ChatGPT, Perplexity, Google AI Overviews, Claude, Gemini, and Microsoft Copilot.</span><br><span class="line"></span><br><span class="line">This is not traditional SEO. Traditional SEO gets you ranked. AI SEO gets you cited. Those are different games with different rules.</span><br><span class="line"></span><br><span class="line"><span class="section">## Before Starting</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**Check for context first:**</span></span><br><span class="line">If <span class="code">`marketing-context.md`</span> exists, read it. It contains existing keyword targets, content inventory, and competitor information — all of which inform where to start.</span><br><span class="line"></span><br><span class="line">Gather what you need:</span><br><span class="line"></span><br><span class="line"><span class="section">### What you need</span></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**URL or content to audit**</span> — specific page, or a topic area to assess</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Target queries**</span> — what questions do you want AI systems to answer using your content?</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Current visibility**</span> — are you already appearing in any AI search results for your targets?</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Content inventory**</span> — do you have existing pieces to optimize, or are you starting from scratch?</span><br><span class="line"></span><br><span class="line">If the user doesn&#x27;t know their target queries: &quot;What questions would your ideal customer ask an AI assistant that you&#x27;d want your brand to answer?&quot;</span><br><span class="line"></span><br><span class="line"><span class="section">## How This Skill Works</span></span><br><span class="line"></span><br><span class="line">Three modes. Each builds on the previous, but you can start anywhere:</span><br><span class="line"></span><br><span class="line"><span class="section">### Mode 1: AI Visibility Audit</span></span><br><span class="line">Map your current presence (or absence) across AI search platforms. Understand what&#x27;s getting cited, what&#x27;s getting ignored, and why.</span><br><span class="line"></span><br><span class="line"><span class="section">### Mode 2: Content Optimization</span></span><br><span class="line">Restructure and enhance content to match what AI systems extract. This is the execution mode — specific patterns, specific changes.</span><br><span class="line"></span><br><span class="line"><span class="section">### Mode 3: Monitoring</span></span><br><span class="line">Set up systems to track AI citations over time — so you know when you appear, when you disappear, and when a competitor takes your spot.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## How AI Search Works (and Why It&#x27;s Different)</span></span><br><span class="line"></span><br><span class="line">Traditional SEO: Google ranks your page. User clicks through. You get traffic.</span><br><span class="line"></span><br><span class="line">AI search: The AI reads your page (or has already indexed it), extracts the answer, and presents it to the user — often without a click. You get cited, not ranked.</span><br><span class="line"></span><br><span class="line"><span class="strong">**The fundamental shift:**</span></span><br><span class="line"><span class="bullet">-</span> Ranked = user sees your link and decides whether to click</span><br><span class="line"><span class="bullet">-</span> Cited = AI decides your content answers the question; user may never visit your site</span><br><span class="line"></span><br><span class="line">This changes everything:</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Keyword density**</span> matters less than <span class="strong">**answer clarity**</span></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Page authority**</span> matters less than <span class="strong">**answer extractability**</span></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Click-through rate**</span> is irrelevant — the AI has already decided you&#x27;re the answer</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Structured content**</span> (definitions, lists, tables, steps) outperforms flowing narrative</span><br><span class="line"></span><br><span class="line">But here&#x27;s what traditional SEO and AI SEO share: <span class="strong">**authority still matters**</span>. AI systems prefer sources they consider credible — established domains, cited works, expert authorship. You still need backlinks and domain trust. You just also need structure.</span><br><span class="line"></span><br><span class="line">See [<span class="string">references/ai-search-landscape.md</span>](<span class="link">references/ai-search-landscape.md</span>) for how each platform (Google AI Overviews, ChatGPT, Perplexity, Claude, Gemini, Copilot) selects and cites sources.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## The 3 Pillars of AI Citability</span></span><br><span class="line"></span><br><span class="line">Every AI SEO decision flows from these three:</span><br><span class="line"></span><br><span class="line"><span class="section">### Pillar 1: Structure (Extractable)</span></span><br><span class="line"></span><br><span class="line">AI systems pull content in chunks. They don&#x27;t read your whole article and then paraphrase it — they find the paragraph, list, or definition that directly answers the query and lift it.</span><br><span class="line"></span><br><span class="line">Your content needs to be structured so that answers are self-contained and extractable:</span><br><span class="line"><span class="bullet">-</span> Definition block for &quot;what is X&quot;</span><br><span class="line"><span class="bullet">-</span> Numbered steps for &quot;how to do X&quot;</span><br><span class="line"><span class="bullet">-</span> Comparison table for &quot;X vs Y&quot;</span><br><span class="line"><span class="bullet">-</span> FAQ block for &quot;questions about X&quot;</span><br><span class="line"><span class="bullet">-</span> Statistics with attribution for &quot;data on X&quot;</span><br><span class="line"></span><br><span class="line">Content that buries the answer in page 3 of a 4,000-word essay is not extractable. The AI won&#x27;t find it.</span><br><span class="line"></span><br><span class="line"><span class="section">### Pillar 2: Authority (Citable)</span></span><br><span class="line"></span><br><span class="line">AI systems don&#x27;t just pull the most relevant answer — they pull the most credible one. Authority signals in the AI era:</span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Domain authority**</span>: High-DA domains get preferential treatment (traditional SEO signal still applies)</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Author attribution**</span>: Named authors with credentials beat anonymous pages</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Citation chain**</span>: Your content cites credible sources → you&#x27;re seen as credible in turn</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Recency**</span>: AI systems prefer current information for time-sensitive queries</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Original data**</span>: Pages with proprietary research, surveys, or studies get cited more — AI systems value unique data they can&#x27;t get elsewhere</span><br><span class="line"></span><br><span class="line"><span class="section">### Pillar 3: Presence (Discoverable)</span></span><br><span class="line"></span><br><span class="line">AI systems need to be able to find and index your content. This is the technical layer:</span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Bot access**</span>: AI crawlers must be allowed in robots.txt (GPTBot, PerplexityBot, ClaudeBot, etc.)</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Crawlability**</span>: Fast page load, clean HTML, no JavaScript-only content</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Schema markup**</span>: Structured data (Article, FAQPage, HowTo, Product) helps AI systems understand your content type</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Canonical signals**</span>: Duplicate content confuses AI systems even more than traditional search</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**HTTPS and security**</span>: AI crawlers won&#x27;t index pages with security warnings</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Mode 1: AI Visibility Audit</span></span><br><span class="line"></span><br><span class="line"><span class="section">### Step 1 — Bot Access Check</span></span><br><span class="line"></span><br><span class="line">First: confirm AI crawlers can access your site.</span><br><span class="line"></span><br><span class="line"><span class="strong">**Check robots.txt**</span> at <span class="code">`yourdomain.com/robots.txt`</span>. Verify these bots are NOT blocked:</span><br><span class="line"></span><br></pre></td></tr></table></figure></div><h1 id="Should-NOT-be-blocked-allow-AI-indexing"><a href="#Should-NOT-be-blocked-allow-AI-indexing" class="headerlink" title="Should NOT be blocked (allow AI indexing):"></a>Should NOT be blocked (allow AI indexing):</h1><p>GPTBot         # OpenAI &#x2F; ChatGPT<br>PerplexityBot  # Perplexity<br>ClaudeBot      # Anthropic &#x2F; Claude<br>Google-Extended # Google AI Overviews<br>anthropic-ai   # Anthropic (alternate identifier)<br>Applebot-Extended # Apple Intelligence<br>cohere-ai      # Cohere</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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><br><span class="line">If any AI bot is blocked, flag it. That&#x27;s an immediate visibility killer for that platform.</span><br><span class="line"></span><br><span class="line">**robots.txt to allow all AI bots:**</span><br></pre></td></tr></table></figure></div><p>User-agent: GPTBot<br>Allow: &#x2F;</p><p>User-agent: PerplexityBot<br>Allow: &#x2F;</p><p>User-agent: ClaudeBot<br>Allow: &#x2F;</p><p>User-agent: Google-Extended<br>Allow: &#x2F;</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">To block specific AI training while allowing search: use `Disallow:` selectively, but understand that blocking training ≠ blocking citation — they&#x27;re often the same crawl.</span><br><span class="line"></span><br><span class="line">### Step 2 — Current Citation Audit</span><br><span class="line"></span><br><span class="line">Manually test your target queries on each platform:</span><br><span class="line"></span><br><span class="line">| Platform | How to test |</span><br><span class="line">|---|---|</span><br><span class="line">| Perplexity | Search your target query at perplexity.ai — check Sources panel |</span><br><span class="line">| ChatGPT | Search with web browsing enabled — check citations |</span><br><span class="line">| Google AI Overviews | Google your query — check if AI Overview appears, who&#x27;s cited |</span><br><span class="line">| Microsoft Copilot | Search at copilot.microsoft.com — check source cards |</span><br><span class="line"></span><br><span class="line">For each query, document:</span><br><span class="line">- Are you cited? (yes/no)</span><br><span class="line">- Which competitors are cited?</span><br><span class="line">- What content type gets cited? (definition? list? stats?)</span><br><span class="line">- How is the answer structured?</span><br><span class="line"></span><br><span class="line">This tells you the pattern that&#x27;s currently winning. Build toward it.</span><br><span class="line"></span><br><span class="line">### Step 3 — Content Structure Audit</span><br><span class="line"></span><br><span class="line">Review your key pages against the Extractability Checklist:</span><br><span class="line"></span><br><span class="line">- [ ] Does the page have a clear, answerable definition of its core concept in the first 200 words?</span><br><span class="line">- [ ] Are there numbered lists or step-by-step sections for process-oriented queries?</span><br><span class="line">- [ ] Does the page have a FAQ section with direct Q&amp;A pairs?</span><br><span class="line">- [ ] Are statistics and data points cited with source name and year?</span><br><span class="line">- [ ] Are comparisons done in table format (not narrative)?</span><br><span class="line">- [ ] Is the page&#x27;s H1 phrased as the answer to a question, or as a statement?</span><br><span class="line">- [ ] Does schema markup exist? (FAQPage, HowTo, Article, etc.)</span><br><span class="line"></span><br><span class="line">Score: 0-3 checks = needs major restructuring. 4-5 = good baseline. 6-7 = strong.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Mode 2: Content Optimization</span><br><span class="line"></span><br><span class="line">### The Content Patterns That Get Cited</span><br><span class="line"></span><br><span class="line">These are the block types AI systems reliably extract. Add at least 2-3 per key page.</span><br><span class="line"></span><br><span class="line">See [references/content-patterns.md](references/content-patterns.md) for ready-to-use templates for each pattern.</span><br><span class="line"></span><br><span class="line">**Pattern 1: Definition Block**</span><br><span class="line">The AI&#x27;s answer to &quot;what is X&quot; almost always comes from a tight, self-contained definition. Format:</span><br><span class="line"></span><br><span class="line">&gt; **[Term]** is [concise definition in 1-2 sentences]. [One sentence of context or why it matters].</span><br><span class="line"></span><br><span class="line">Placed within the first 300 words of the page. No hedging, no preamble. Just the definition.</span><br><span class="line"></span><br><span class="line">**Pattern 2: Numbered Steps (How-To)**</span><br><span class="line">For process queries (&quot;how do I X&quot;), AI systems pull numbered steps almost universally. Requirements:</span><br><span class="line">- Steps are numbered</span><br><span class="line">- Each step is actionable (verb-first)</span><br><span class="line">- Each step is self-contained (could be quoted alone and still make sense)</span><br><span class="line">- 5-10 steps maximum (AI truncates longer lists)</span><br><span class="line"></span><br><span class="line">**Pattern 3: Comparison Table**</span><br><span class="line">&quot;X vs Y&quot; queries almost always result in table citations. Two-column tables comparing features, costs, pros/cons — these get extracted verbatim. Format matters: clean markdown table with headers wins.</span><br><span class="line"></span><br><span class="line">**Pattern 4: FAQ Block**</span><br><span class="line">Explicit Q&amp;A pairs signal to AI: &quot;this is the question, this is the answer.&quot; Mark up with FAQPage schema. Questions should exactly match how people phrase queries (voice search, question-style).</span><br><span class="line"></span><br><span class="line">**Pattern 5: Statistics With Attribution**</span><br><span class="line">&quot;According to [Source Name] ([Year]), X% of [population] [finding].&quot; This format is extractable because it has a complete citation. Naked statistics without attribution get deprioritized — the AI can&#x27;t verify the source.</span><br><span class="line"></span><br><span class="line">**Pattern 6: Expert Quote Block**</span><br><span class="line">Attributed quotes from named experts get cited. The AI picks up: &quot;According to [Name], [Role at Organization]: &#x27;[quote]&#x27;&quot; as a citable unit. Build in a few of these per key piece.</span><br><span class="line"></span><br><span class="line">### Rewriting for Extractability</span><br><span class="line"></span><br><span class="line">When optimizing existing content:</span><br><span class="line"></span><br><span class="line">1. **Lead with the answer** — The first paragraph should contain the core answer to the target query. Don&#x27;t save it for the conclusion.</span><br><span class="line"></span><br><span class="line">2. **Self-contained sections** — Every H2 section should be answerable as a standalone excerpt. If you have to read the introduction to understand a section, it&#x27;s not self-contained.</span><br><span class="line"></span><br><span class="line">3. **Specific over vague** — &quot;Response time improved by 40%&quot; beats &quot;significant improvement.&quot; AI systems prefer citable specifics.</span><br><span class="line"></span><br><span class="line">4. **Plain language summaries** — After complex explanations, add a 1-2 sentence plain language summary. This is what AI often lifts.</span><br><span class="line"></span><br><span class="line">5. **Named sources** — Replace &quot;experts say&quot; with &quot;[Researcher Name], [Year].&quot; Replace &quot;studies show&quot; with &quot;[Organization] found in their [Year] survey.&quot;</span><br><span class="line"></span><br><span class="line">### Schema Markup for AI Discoverability</span><br><span class="line"></span><br><span class="line">Schema doesn&#x27;t directly make you appear in AI results — but it helps AI systems understand your content type and structure. Priority schemas:</span><br><span class="line"></span><br><span class="line">| Schema Type | Use When | Impact |</span><br><span class="line">|---|---|---|</span><br><span class="line">| `Article` | Any editorial content | Establishes content as authoritative information |</span><br><span class="line">| `FAQPage` | You have FAQ section | High — AI extracts Q&amp;A pairs directly |</span><br><span class="line">| `HowTo` | Step-by-step guides | High — AI uses step structure for process queries |</span><br><span class="line">| `Product` | Product pages | Medium — appears in product comparison queries |</span><br><span class="line">| `Organization` | Company pages | Medium — establishes entity authority |</span><br><span class="line">| `Person` | Author pages | Medium — author credibility signal |</span><br><span class="line"></span><br><span class="line">Implement via JSON-LD in the page `&lt;head&gt;`. Validate at schema.org/validator.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Mode 3: Monitoring</span><br><span class="line"></span><br><span class="line">AI search is volatile. Citations change. Track them.</span><br><span class="line"></span><br><span class="line">### Manual Citation Tracking</span><br><span class="line"></span><br><span class="line">Weekly: test your top 10 target queries on Perplexity and ChatGPT. Log:</span><br><span class="line">- Were you cited? (yes/no)</span><br><span class="line">- Rank in citations (1st source, 2nd, etc.)</span><br><span class="line">- What text was used?</span><br><span class="line"></span><br><span class="line">This takes ~20 minutes/week. Do it before automated solutions exist (they don&#x27;t yet, not reliably).</span><br><span class="line"></span><br><span class="line">### Google Search Console for AI Overviews</span><br><span class="line"></span><br><span class="line">Google Search Console now shows impressions in AI Overviews under &quot;Search type: AI Overviews&quot; filter. Check:</span><br><span class="line">- Which queries trigger AI Overview impressions for your site</span><br><span class="line">- Click-through rate from AI Overviews (typically 50-70% lower than organic)</span><br><span class="line">- Which pages get cited</span><br><span class="line"></span><br><span class="line">### Visibility Signals to Track</span><br><span class="line"></span><br><span class="line">| Signal | Tool | Frequency |</span><br><span class="line">|---|---|---|</span><br><span class="line">| Perplexity citations | Manual query testing | Weekly |</span><br><span class="line">| ChatGPT citations | Manual query testing | Weekly |</span><br><span class="line">| Google AI Overviews | Google Search Console | Weekly |</span><br><span class="line">| Copilot citations | Manual query testing | Monthly |</span><br><span class="line">| AI bot crawl activity | Server logs or Cloudflare | Monthly |</span><br><span class="line">| Competitor AI citations | Manual query testing | Monthly |</span><br><span class="line"></span><br><span class="line">See [references/monitoring-guide.md](references/monitoring-guide.md) for the full tracking setup and templates.</span><br><span class="line"></span><br><span class="line">### When Your Citations Drop</span><br><span class="line"></span><br><span class="line">If you were cited and suddenly aren&#x27;t:</span><br><span class="line">1. Check if competitors published something more extractable on the same topic</span><br><span class="line">2. Check if your robots.txt changed (block AI bots = instant disappearance)</span><br><span class="line">3. Check if your page structure changed significantly (restructuring can break citation patterns)</span><br><span class="line">4. Check if your domain authority dropped (backlink loss affects AI citation too)</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Proactive Triggers</span><br><span class="line"></span><br><span class="line">Flag these without being asked:</span><br><span class="line"></span><br><span class="line">- **AI bots blocked in robots.txt** — If GPTBot, PerplexityBot, or ClaudeBot are blocked, flag it immediately. Zero AI visibility is possible until fixed, and it&#x27;s a 5-minute fix. This trumps everything else.</span><br><span class="line">- **No definition block on target pages** — If the page targets informational queries but has no self-contained definition in the first 300 words, it won&#x27;t win definitional AI Overviews. Flag before doing anything else.</span><br><span class="line">- **Unattributed statistics** — If key pages contain statistics without named sources and years, they&#x27;re less citable than competitor pages that do. Flag all naked stats.</span><br><span class="line">- **Schema markup absent** — If the site has no FAQPage or HowTo schema on relevant pages, flag it as a quick structural win with asymmetric impact for process and FAQ queries.</span><br><span class="line">- **JavaScript-rendered content** — If important content only appears after JavaScript execution, AI crawlers may not see it at all. Flag content that&#x27;s hidden behind JS rendering.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Output Artifacts</span><br><span class="line"></span><br><span class="line">| When you ask for... | You get... |</span><br><span class="line">|---|---|</span><br><span class="line">| AI visibility audit | Platform-by-platform citation test results + robots.txt check + content structure scorecard |</span><br><span class="line">| Page optimization | Rewritten page with definition block, extractable patterns, schema markup spec, and comparison to original |</span><br><span class="line">| robots.txt fix | Updated robots.txt with correct AI bot allow rules + explanation of what each bot is |</span><br><span class="line">| Schema markup | JSON-LD implementation code for FAQPage, HowTo, or Article — ready to paste |</span><br><span class="line">| Monitoring setup | Weekly tracking template + Google Search Console filter guide + citation log spreadsheet structure |</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Communication</span><br><span class="line"></span><br><span class="line">All output follows the structured standard:</span><br><span class="line">- **Bottom line first** — answer before explanation</span><br><span class="line">- **What + Why + How** — every finding includes all three</span><br><span class="line">- **Actions have owners and deadlines** — no &quot;consider reviewing...&quot;</span><br><span class="line">- **Confidence tagging** — 🟢 verified (confirmed by citation test) / 🟡 medium (pattern-based) / 🔴 assumed (extrapolated from limited data)</span><br><span class="line"></span><br><span class="line">AI SEO is still a young field. Be honest about confidence levels. What gets cited can change as platforms evolve. State what&#x27;s proven vs. what&#x27;s pattern-matching.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Related Skills</span><br><span class="line"></span><br><span class="line">- **content-production**: Use to create the underlying content before optimizing for AI citation. Good AI SEO requires good content first.</span><br><span class="line">- **content-humanizer**: Use after writing for AI SEO. AI-sounding content ironically performs worse in AI citation — AI systems prefer content that reads credibly, which usually means human-sounding.</span><br><span class="line">- **seo-audit**: Use for traditional search ranking optimization. Run both — AI SEO and traditional SEO are complementary, not competing. Many signals overlap.</span><br><span class="line">- **content-strategy**: Use when deciding which topics and queries to target for AI visibility. Strategy first, then optimize.</span><br></pre></td></tr></table></figure></div><hr><h2 id="写到这儿，回到开头那个问题"><a href="#写到这儿，回到开头那个问题" class="headerlink" title="写到这儿，回到开头那个问题"></a>写到这儿，回到开头那个问题</h2><p>LLM 没把 SEO 搅黄。它只是把规则换了。</p><p>蓝色链接那条路确实在慢慢窄下去——这是事实，躲不开。但”被 AI 引用”这条新路子，盘子比想象中大。我前面那个 $312K ARR 的客户，他在 AI Overviews 里的曝光，换算成等效点击价值大概是 $0.37-$0.84 一次——不便宜，但相比传统 SEM 的 CPC 已经是白菜价了。</p><p>如果你手上也有个站，正在纠结要不要转向 GEO，三条具体起步动作：今天就去看你的 robots.txt，把 GPTBot &#x2F; PerplexityBot &#x2F; ClaudeBot &#x2F; Google-Extended 放进来；挑你最重要的 10 个 query，手动在 Perplexity 跑一遍，看谁被引了、引的什么；选流量最大的 3 个页面，在首屏前 200 字塞一个定义块。</p><p>这三件事加起来一个下午能搞完，成本零。剩下的再慢慢铺。我在 <a class="link"   href="https://www.cocoloop.cn/" >CocoLoop 主站<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 那边写了一些 GEO 实操的更细碎记录——包括我给不同类型客户做监控 dashboard 的那几张 Sheet 模板，有兴趣可以过去翻翻。</p>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/ai-seo-claude-skill/</id>
    <link href="https://claude.cocoloop.cn/posts/ai-seo-claude-skill/"/>
    <published>2026-04-18T14:47:00.000Z</published>
    <summary>有一阵我真觉得 SEO 要彻底凉了——ChatGPT 直接把答案吐给用户，谁还点蓝色链接。后来一个客户的流量数据把我打醒了：蓝链确实掉了 37.2%，但&quot;被引用&quot;这条新路子让他拿到了 8921 次 AI Overviews 曝光。我把 ai-seo SKILL 扒了一遍，这篇讲讲 GEO（生成式引擎优化）到底怎么跑。</summary>
    <title>LLM 把传统 SEO 搅黄了吗——ai-seo Skill 的三根支柱</title>
    <updated>2026-04-18T14:47:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Skills" scheme="https://claude.cocoloop.cn/categories/Skills/"/>
    <category term="Claude Skill" scheme="https://claude.cocoloop.cn/tags/Claude-Skill/"/>
    <category term="Twitter" scheme="https://claude.cocoloop.cn/tags/Twitter/"/>
    <category term="X 增长" scheme="https://claude.cocoloop.cn/tags/X-%E5%A2%9E%E9%95%BF/"/>
    <category term="社交媒体" scheme="https://claude.cocoloop.cn/tags/%E7%A4%BE%E4%BA%A4%E5%AA%92%E4%BD%93/"/>
    <category term="个人品牌" scheme="https://claude.cocoloop.cn/tags/%E4%B8%AA%E4%BA%BA%E5%93%81%E7%89%8C/"/>
    <content>
      <![CDATA[<p>先交代背景。账号是我的技术向小号，起点 320 粉丝，两年零散发过几十条没什么章法。2026 年 2 月底开始，我决定把它当项目跑一次，工具是 <code>x-twitter-growth</code> 这个 Skill。每周留一次 log，跑满 60 天。Skill 定位关键词是 <strong>X-specific</strong>：不是教你”发社交媒体”的通用 Skill，是专门针对 X 的算法机制和互动生态做的一套。跨平台走 <code>social-content</code>。</p><h2 id="Day-1-3：被迫看清楚自己有多业余"><a href="#Day-1-3：被迫看清楚自己有多业余" class="headerlink" title="Day 1-3：被迫看清楚自己有多业余"></a>Day 1-3：被迫看清楚自己有多业余</h2><p>第一步是 Profile Audit。我原本 bio 是 “Software engineer | builder | loves coffee”，六个字全中 Skill 的 anti-pattern —— 模糊到极致、没有社会证明、没有 CTA。Skill 的 Bio Checklist 要求：第一行明确价值主张、具体 niche、社会证明、CTA、不要 hashtag。改后版本：”Senior infra engineer. Writing about DB internals + resilience patterns. 10 years shipping at scale. Newsletter: [link]”。改完当周 bio 转化率（访问 profile → follow）从 0.8% 涨到 3.4%。</p><p>我当时根本没有 pinned tweet。置顶一条简短的 thread 当月最佳（关于 Postgres bloat debugging）之后，profile visit → follow 又上了一截。Recent Activity 审计：过去 30 天只发 4 条、reply ratio 基本为 0、全是 atomic 没 thread。Skill 的 baseline 是 minimum 1x&#x2F;day、ideal 3-5x&#x2F;day、reply ratio &gt;30%。三条全不及格。</p><h2 id="Day-4-10：搞懂-X-算法在意什么"><a href="#Day-4-10：搞懂-X-算法在意什么" class="headerlink" title="Day 4-10：搞懂 X 算法在意什么"></a>Day 4-10：搞懂 X 算法在意什么</h2><p>Skill 里的 “Algorithm Mechanics” 权重表是墙纸级别的东西。两个观念颠覆：</p><ol><li><strong>回复（replies received）是最重要的信号</strong>。发一条陈述性金句不如发一条挑起讨论的问题。</li><li><strong>点击链接被惩罚</strong>。”点这个链接看更多”的推文 X 会压低它的推荐权重。</li></ol><p>Skill 还列了一组会杀 reach 的行为：正文放链接、30 分钟内编辑、发完立即离线、超过 2 个 hashtag、tag 不互动的人、thread 里有弱推。”Posting and immediately going offline” 是我之前最大的错误。我习惯午饭时间发一条就去吃饭，前 30 分钟没人回复我也不理，X 的算法就默认这条不值得推。调整后发完留在 app 里至少 15 分钟回复任何早期互动，该条的最终曝光至少翻倍。</p><h2 id="Day-11-20：竞品分析与格式试错"><a href="#Day-11-20：竞品分析与格式试错" class="headerlink" title="Day 11-20：竞品分析与格式试错"></a>Day 11-20：竞品分析与格式试错</h2><p>Skill 第二步是 Competitive Intelligence，推荐用 <code>site:x.com &quot;topic&quot; min_faves:100</code> 搜高表现内容。我挑了 DB&#x2F;infra 圈 8 个账号，拆他们过去 30 天 top 5 推文的 hook 模式、内容主题、格式配比、发帖时间。拆完发现一件事：我以前模糊觉得”深度内容才能涨粉”，其实那 8 个账号里涨得最快的两个 65% 的内容是 atomic tweet，thread 只占 20% 左右。atomic 做广度和 impression farming，thread 做深度和粉丝转化，比例 5:2 到 3:1 最健康。</p><p>Atomic 的 5 种格式（Observation &#x2F; Listicle &#x2F; Contrarian &#x2F; Lesson &#x2F; Framework）我全测过。账号上效果排序：Contrarian ≈ Lesson &gt; Listicle &gt; Framework &gt; Observation。Contrarian 和 Lesson 天然带个人立场容易引发讨论；Observation 是我曾经用得最多的格式，现在知道它为什么效果最差 —— 它没有个人烙印。</p><h2 id="Day-21-30：Thread-工程化"><a href="#Day-21-30：Thread-工程化" class="headerlink" title="Day 21-30：Thread 工程化"></a>Day 21-30：Thread 工程化</h2><p>Thread 是 Skill 里最硬核的一块。几条反直觉但实测成立的点：</p><ul><li><strong>Tweet 1 必须 7 个词以内</strong>。我写过一条 hook 有 14 个词，engagement 明显弱。砍到 6 个词之后 retweet 直接 3x。</li><li><strong>每条推文单独读得通</strong>。这条决定了读者半途退出也能有收获，反而会让他点”继续看”。</li><li><strong>最后一条加 CTA 要显式</strong>。”Follow @xxx for more [specific topic]”，”more” 后面必须有明确主题。</li><li><strong>Tweet 1 的第一条回复再写一遍 hook + CTA</strong>。我实测有 15% 左右的 follow 来自这条回复区 CTA 而不是 thread 末尾。</li></ul><p>那个月最好的一条 thread 6 tweets，最终 1.8M impression、6200 新 follower 来自那一条。Hook 是 “I deleted 80% of our Postgres indexes.”</p><h2 id="Day-31-45：Reply-才是增长加速器"><a href="#Day-31-45：Reply-才是增长加速器" class="headerlink" title="Day 31-45：Reply 才是增长加速器"></a>Day 31-45：Reply 才是增长加速器</h2><p>Skill 对 Reply 的原话：”Your reply IS your content — make it tweet-worthy.” 这句话我贴在桌面上。过去我 reply 都是 “Great thread!” 这种社交礼貌毫无价值。调整之后每条 reply 我至少花 2 分钟，要么加一个数据点、要么给一个反例、要么从经验里补一个他没提到的 edge case。</p><p>效果很直接：第三周有一条 reply 在别人 thread 下被 quote-tweet 了两次，一晚上涨了 800 粉，单条 reply 带来的 follower 比我自己那天发的 3 条推都多。</p><h2 id="Day-46-60：开始做固定栏目"><a href="#Day-46-60：开始做固定栏目" class="headerlink" title="Day 46-60：开始做固定栏目"></a>Day 46-60：开始做固定栏目</h2><p>Month 2+ Skill 建议 develop 3-5 recurring content series。我做了两个：周三 “One Query”（每周分析一条真实 SQL 的性能优化过程）+ 周六 “Outage Postmortem”（复盘一个公开事故报告）。固定栏目的价值是<strong>让读者有所期待</strong>。两个月后周三早上已经能看到粉丝在等我更新，有人专门留言催更。这种粘性是单发 viral thread 换不来的。</p><h2 id="Day-60-数据"><a href="#Day-60-数据" class="headerlink" title="Day 60 数据"></a>Day 60 数据</h2><ul><li>起点 follower：320</li><li>终点 follower：8,740</li><li>Thread 产出：22 条</li><li>Atomic tweet 产出：约 140 条</li><li>Reply 产出：约 560 条</li><li>最高单 thread impression：1.8M</li><li>Newsletter 从 X 流量导入的新订阅：412 个</li></ul><p>我最在意的不是 follower 而是 newsletter 导入。因为 follower 可能是算法给的，但 newsletter 是用户主动跳出 X 去订阅 —— 那是真实意图。</p><h2 id="三个坑"><a href="#三个坑" class="headerlink" title="三个坑"></a>三个坑</h2><p><strong>坑 1：发完链接推文。</strong> 第一周我还犯老毛病发了一条带 newsletter 链接的推文。Skill 明明提醒 “Never put links in tweet body — use reply”。那条曝光只有平时的 1&#x2F;5。之后改成”推文写观点 + 第一条 reply 放链接”，链接 reply 的点击量反而比以前直接挂链接高 3 倍以上。</p><p><strong>坑 2：Thread 中间有一条不够硬。</strong> Skill 原话 “one weak tweet tanks the whole thread”。我第 4 条 thread 里第 5 tweet 纯粹是过渡句，没什么信息量。那条 thread 停在第 5 tweet 的读者比例特别高，最终完读率只有 14%。之后所有 thread 出稿前我都会单独把每条 tweet 抽出来放 Cursor 里读一遍问自己”这条单独发也能成立吗”，不能就删。</p><p><strong>坑 3：发完就走。</strong> Day 1 提过，这个习惯修掉花了两周。</p><h2 id="Skill-没覆盖但重要的两件事"><a href="#Skill-没覆盖但重要的两件事" class="headerlink" title="Skill 没覆盖但重要的两件事"></a>Skill 没覆盖但重要的两件事</h2><p>这个 Skill 的盲点是<strong>中文场景</strong>。X 上中文圈子的算法逻辑跟英语圈差别很大，尤其是 reply 的 visibility —— 中文圈 reply 普遍出不了对方的核心圈子。如果你目标读者是中文用户，Skill 里的 reply 策略权重要下调、broadcast 权重要上调。</p><p>另一件是<strong>选题的持续性</strong>。Skill 讲了结构和节奏但没讲选题怎么找。我的习惯是每周给自己留一个空的 Notion 页面记录这周遇到的”让我惊讶的事”，本周推文 70% 来自这个池子。如果你对选题体系感兴趣，可以顺带看 <a href="https://claude.cocoloop.cn/posts/programmatic-seo-claude-skill/">programmatic SEO Skill 解读</a> 和 <a href="https://claude.cocoloop.cn/posts/copywriting-claude-skill/">copywriting Skill 解读</a> —— 它们的选题方法论同样适用于推文 hook 设计。想看邮件流量协同 X 流量的做法，可参考 <a href="https://claude.cocoloop.cn/posts/email-sequence-claude-skill/">email-sequence Skill 解读</a> 里关于 newsletter 承接外部流量的那部分。</p><h2 id="Bio-的几个细节"><a href="#Bio-的几个细节" class="headerlink" title="Bio 的几个细节"></a>Bio 的几个细节</h2><p>Skill 给的 Bio 清单是骨架，实际跑几版 A&#x2F;B 后发现几个细节：<strong>第一行必须是身份而不是口号</strong>。”帮助大家成长”没有锚定；”十年基础设施工程师”立刻定位。<strong>数字要真数字</strong>。写 “10 years” 就确认真有 10 年。<strong>CTA 链接要放 newsletter 或产品，不要主页</strong>。主页是没有转化目标的 —— 把 CTA 的落地页从”展示页”换成”动作页”，profile 点击转化差出三倍。</p><p>另一件一开始没意识到的事：<strong>pinned tweet 要每 30 天换一次</strong>。我第一个月没换，第三个月 profile visit 增长放缓。换了一条新的 pinned 之后回升。老访客来看你 pinned 还是那条旧内容，会默认你没在更新。</p><h2 id="Hook-中文化"><a href="#Hook-中文化" class="headerlink" title="Hook 中文化"></a>Hook 中文化</h2><p>Skill 说 Tweet 1 的 hook 必须 &lt;7 词。<strong>中文 hook 的长度阈值是 &lt;15 个字</strong>。再长读者在 timeline 滚动时的视觉截断就出问题。中文圈好 hook 的结构：数字+反差（”我删掉了 80% 的 Postgres 索引”）、场景白描（”凌晨三点数据库挂了”）、反常识断言（”别再写单元测试了”）、直接提问（”你的缓存真的有用吗”）。最容易失败的是修饰词堆叠：**”深入浅出地理解 Postgres 的性能优化”**就是典型失败案例 —— 读者无法立刻看出你要说什么。</p><h2 id="工具栈"><a href="#工具栈" class="headerlink" title="工具栈"></a>工具栈</h2><p>60 天跑下来的工具堆叠：Claude Code 里跑这个 Skill 负责 thread 结构和 hook 变体生成；Aider 偶尔用来快速迭代 thread 版本 diff；Kilo Code 在我需要从 blog 长文拆成推文时用得多；竞品分析那一块我用 Gemini CLI 跑过一轮 web search 做粗筛，因为它的 search API 比较快；内容日历我自己在 Notion 维护，没用 Skill 里的 <code>content_planner.py</code> 脚本，纯粹是习惯问题。</p><hr><h2 id="SKILL-完整中文版"><a href="#SKILL-完整中文版" class="headerlink" title="SKILL 完整中文版"></a>SKILL 完整中文版</h2><div class="code-container" data-rel="Yaml"><figure class="iseeu highlight yaml"><table><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="attr">name:</span> <span class="string">&quot;x-twitter-growth&quot;</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">&quot;X/Twitter 增长引擎，用于建立受众、打造病毒式内容、分析互动。</span></span><br><span class="line"><span class="string">适用场景：用户想在 X/Twitter 上成长、写推文或 thread、分析 X profile、</span></span><br><span class="line"><span class="string">研究竞品 X 账号、规划发帖策略、优化互动。与 social-content（通用多平台）</span></span><br><span class="line"><span class="string">互补，提供 X 特定深度：算法机制、thread 工程、reply 策略、profile 优化、</span></span><br><span class="line"><span class="string">基于 web search 的竞品情报。&quot;</span></span><br><span class="line"><span class="attr">license:</span> <span class="string">MIT</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">version:</span> <span class="number">1.0</span><span class="number">.0</span></span><br><span class="line">  <span class="attr">author:</span> <span class="string">Alireza</span> <span class="string">Rezvani</span></span><br><span class="line">  <span class="attr">category:</span> <span class="string">marketing</span></span><br><span class="line">  <span class="attr">updated:</span> <span class="number">2026-03-10</span></span><br></pre></td></tr></table></figure></div><h1 id="X-Twitter-增长引擎"><a href="#X-Twitter-增长引擎" class="headerlink" title="X&#x2F;Twitter 增长引擎"></a>X&#x2F;Twitter 增长引擎</h1><p>X 专项的增长 Skill。通用跨平台社交内容走 <code>social-content</code>。社交策略与日历规划走 <code>social-media-manager</code>。本 Skill 专啃 X。</p><h2 id="什么时候用这个-vs-其他-Skill"><a href="#什么时候用这个-vs-其他-Skill" class="headerlink" title="什么时候用这个 vs 其他 Skill"></a>什么时候用这个 vs 其他 Skill</h2><table><thead><tr><th>需求</th><th>使用</th></tr></thead><tbody><tr><td>写一条推文或 thread</td><td><strong>本 Skill</strong></td></tr><tr><td>规划 LinkedIn + X + Instagram 跨平台内容</td><td>social-content</td></tr><tr><td>跨平台互动指标分析</td><td>social-media-analyzer</td></tr><tr><td>总体社交战略</td><td>social-media-manager</td></tr><tr><td>X 专项增长、算法、竞品情报</td><td><strong>本 Skill</strong></td></tr></tbody></table><hr><h2 id="第-1-步-——-Profile-审计"><a href="#第-1-步-——-Profile-审计" class="headerlink" title="第 1 步 —— Profile 审计"></a>第 1 步 —— Profile 审计</h2><p>任何增长工作之前，先审计当前 X 存在。跑 <code>scripts/profile_auditor.py</code> 或手动评估：</p><h3 id="Bio-清单"><a href="#Bio-清单" class="headerlink" title="Bio 清单"></a>Bio 清单</h3><ul><li><input disabled="" type="checkbox"> 第一行清晰的价值主张（你帮谁 + 怎么帮）</li><li><input disabled="" type="checkbox"> 具体 niche —— 不是 “entrepreneur | thinker | builder”</li><li><input disabled="" type="checkbox"> 社会证明元素（粉丝数、title、指标、品牌）</li><li><input disabled="" type="checkbox"> CTA 或链接（newsletter、产品、站点）</li><li><input disabled="" type="checkbox"> Bio 里不要放 hashtag（这是业余信号）</li></ul><h3 id="Pinned-Tweet"><a href="#Pinned-Tweet" class="headerlink" title="Pinned Tweet"></a>Pinned Tweet</h3><ul><li><input disabled="" type="checkbox"> 存在且不超过 30 天</li><li><input disabled="" type="checkbox"> 展示最好作品或最强 hook</li><li><input disabled="" type="checkbox"> 有明确 CTA（follow、subscribe、read）</li></ul><h3 id="近期活动（过去-30-条）"><a href="#近期活动（过去-30-条）" class="headerlink" title="近期活动（过去 30 条）"></a>近期活动（过去 30 条）</h3><ul><li><input disabled="" type="checkbox"> 发帖频率：最低 1x&#x2F;day，理想 3-5x&#x2F;day</li><li><input disabled="" type="checkbox"> 格式组合：推文、thread、reply、quote 混搭</li><li><input disabled="" type="checkbox"> Reply 比例：活动的 &gt;30% 应为 reply</li><li><input disabled="" type="checkbox"> 互动趋势：上升、平稳或下降</li></ul><p>运行：<code>python3 scripts/profile_auditor.py --handle @username</code></p><hr><h2 id="第-2-步-——-竞品情报"><a href="#第-2-步-——-竞品情报" class="headerlink" title="第 2 步 —— 竞品情报"></a>第 2 步 —— 竞品情报</h2><p>用 web search 研究你 niche 里的竞品和成功账号。</p><h3 id="流程"><a href="#流程" class="headerlink" title="流程"></a>流程</h3><ol><li>通过 Brave 搜 <code>site:x.com &quot;topic&quot; min_faves:100</code> 找高表现内容</li><li>在 niche 里识别 5-10 个互动强的账号</li><li>对每个分析：发帖频率、内容类型、hook 模式、互动率</li><li>跑 <code>python3 scripts/competitor_analyzer.py --handles @acc1 @acc2 @acc3</code></li></ol><h3 id="要提取什么"><a href="#要提取什么" class="headerlink" title="要提取什么"></a>要提取什么</h3><ul><li><strong>Hook 模式</strong> —— top 推文如何开头？问题？大胆断言？数字？</li><li><strong>内容主题</strong> —— 哪 3-5 个主题最火？</li><li><strong>格式配比</strong> —— 推文 vs thread vs reply vs quote 的比例</li><li><strong>发帖时间</strong> —— 最好的帖子在什么时段发出？</li><li><strong>互动触发器</strong> —— 什么让人 reply vs like vs retweet？</li></ul><hr><h2 id="第-3-步-——-内容创作"><a href="#第-3-步-——-内容创作" class="headerlink" title="第 3 步 —— 内容创作"></a>第 3 步 —— 内容创作</h2><h3 id="推文类型（按增长影响排序）"><a href="#推文类型（按增长影响排序）" class="headerlink" title="推文类型（按增长影响排序）"></a>推文类型（按增长影响排序）</h3><h4 id="1-Thread（最高覆盖、最高-follow-转化）"><a href="#1-Thread（最高覆盖、最高-follow-转化）" class="headerlink" title="1. Thread（最高覆盖、最高 follow 转化）"></a>1. Thread（最高覆盖、最高 follow 转化）</h4><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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></pre></td><td class="code"><pre><span class="line">结构：</span><br><span class="line">- Tweet 1：Hook —— 必须在 7 词内阻止下滑</span><br><span class="line">- Tweet 2：Context 或承诺（&quot;Here&#x27;s what I learned:&quot;）</span><br><span class="line">- Tweets 3-N：一条一个想法，每条单独读也成立</span><br><span class="line">- 最后一条：总结 + 明确 CTA（&quot;Follow @handle for more&quot;）</span><br><span class="line">- Tweet 1 的回复：重述 hook + &quot;Follow for more [topic]&quot;</span><br><span class="line"></span><br><span class="line">规则：</span><br><span class="line">- 5-12 条最佳（&lt;5 显单薄，&gt;12 读者流失）</span><br><span class="line">- 每条单独读都应成立</span><br><span class="line">- 用换行提升可读性</span><br><span class="line">- 没有一条是一堵字墙（最多 3-4 行）</span><br><span class="line">- 给 tweet 编号或在 tweet 1 用 &quot;↓&quot;</span><br></pre></td></tr></table></figure></div><h4 id="2-Atomic-Tweets（广度、impression-farming）"><a href="#2-Atomic-Tweets（广度、impression-farming）" class="headerlink" title="2. Atomic Tweets（广度、impression farming）"></a>2. Atomic Tweets（广度、impression farming）</h4><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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><br><span class="line">- Observation: &quot;[Thing] is underrated. Here&#x27;s why:&quot;</span><br><span class="line">- Listicle: &quot;10 tools I use daily:\n\n1. X — for Y&quot;</span><br><span class="line">- Contrarian: &quot;Unpopular opinion: [statement]&quot;</span><br><span class="line">- Lesson: &quot;I [did X] for [time]. Biggest lesson:&quot;</span><br><span class="line">- Framework: &quot;[Concept] explained in 30 seconds:&quot;</span><br><span class="line"></span><br><span class="line">规则：</span><br><span class="line">- &lt;200 字符互动更好</span><br><span class="line">- 一条一个想法</span><br><span class="line">- 正文不放链接（杀覆盖 —— 链接放回复）</span><br><span class="line">- 问句推文驱动回复（算法喜欢 reply）</span><br></pre></td></tr></table></figure></div><h4 id="3-Quote-Tweet（建权威）"><a href="#3-Quote-Tweet（建权威）" class="headerlink" title="3. Quote Tweet（建权威）"></a>3. Quote Tweet（建权威）</h4><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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><br><span class="line">- 补原推漏掉的数据</span><br><span class="line">- 提供反例或细节</span><br><span class="line">- 分享验证/反驳的个人经验</span><br><span class="line">- 永远不要只说 &quot;This&quot; 或 &quot;So true&quot;</span><br></pre></td></tr></table></figure></div><h4 id="4-Reply（网络增长、可见性最快路径）"><a href="#4-Reply（网络增长、可见性最快路径）" class="headerlink" title="4. Reply（网络增长、可见性最快路径）"></a>4. Reply（网络增长、可见性最快路径）</h4><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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></pre></td><td class="code"><pre><span class="line">策略：</span><br><span class="line">- 回复比你大 2-10 倍的账号</span><br><span class="line">- 加真实价值，不是 &quot;great post!&quot;</span><br><span class="line">- 在大账号下抢首 reply</span><br><span class="line">- 你的 reply 就是你的内容 —— 写到配得上独立发</span><br><span class="line">- 有争议/有洞见的 reply 会被 quote-tweet（免费覆盖）</span><br></pre></td></tr></table></figure></div><p>运行：<code>python3 scripts/tweet_composer.py --type thread --topic &quot;your topic&quot; --audience &quot;your audience&quot;</code></p><hr><h2 id="第-4-步-——-算法机制"><a href="#第-4-步-——-算法机制" class="headerlink" title="第 4 步 —— 算法机制"></a>第 4 步 —— 算法机制</h2><h3 id="X-奖励什么（2025-2026）"><a href="#X-奖励什么（2025-2026）" class="headerlink" title="X 奖励什么（2025-2026）"></a>X 奖励什么（2025-2026）</h3><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>Thread、有换行的长推</td></tr><tr><td>从推文带来的 profile 访问</td><td>高</td><td>好奇缺口、预告专长</td></tr><tr><td>收藏</td><td>高</td><td>战术性、值得保存的内容（列表、框架）</td></tr><tr><td>Retweet&#x2F;Quote</td><td>中</td><td>可分享的洞见、大胆观点</td></tr><tr><td>Like</td><td>低-中</td><td>易共鸣、易认同的内容</td></tr><tr><td>链接点击</td><td>低（被惩罚）</td><td>正文不放链接 —— 用 reply</td></tr></tbody></table><h3 id="什么会杀覆盖"><a href="#什么会杀覆盖" class="headerlink" title="什么会杀覆盖"></a>什么会杀覆盖</h3><ul><li>正文里放链接（放第一条 reply）</li><li>发完 30 分钟内编辑</li><li>发完立即离线（没有早期互动）</li><li>超过 2 个 hashtag</li><li>tag 不互动的人</li><li>Thread 里有质量不一的推文（一条弱推沉一整条 thread）</li></ul><h3 id="最佳发帖节奏"><a href="#最佳发帖节奏" class="headerlink" title="最佳发帖节奏"></a>最佳发帖节奏</h3><table><thead><tr><th>账号规模</th><th>推文&#x2F;天</th><th>Thread&#x2F;周</th><th>Reply&#x2F;天</th></tr></thead><tbody><tr><td>&lt; 1K followers</td><td>2-3</td><td>1-2</td><td>10-20</td></tr><tr><td>1K-10K</td><td>3-5</td><td>2-3</td><td>5-15</td></tr><tr><td>10K-50K</td><td>3-7</td><td>2-4</td><td>5-10</td></tr><tr><td>50K+</td><td>2-5</td><td>1-3</td><td>5-10</td></tr></tbody></table><hr><h2 id="第-5-步-——-增长剧本"><a href="#第-5-步-——-增长剧本" class="headerlink" title="第 5 步 —— 增长剧本"></a>第 5 步 —— 增长剧本</h2><h3 id="第-1-2-周：打地基"><a href="#第-1-2-周：打地基" class="headerlink" title="第 1-2 周：打地基"></a>第 1-2 周：打地基</h3><ol><li>优化 bio 和 pinned tweet（第 1 步）</li><li>识别 20 个 niche 内账号，每天和他们互动</li><li>每天 reply 10-20 次大账号（只加真实价值）</li><li>每天 2-3 条 atomic 推文测试不同格式</li><li>发 1 条 thread</li></ol><h3 id="第-3-4-周：模式识别"><a href="#第-3-4-周：模式识别" class="headerlink" title="第 3-4 周：模式识别"></a>第 3-4 周：模式识别</h3><ol><li>复盘哪些格式互动最好</li><li>加码 top 2 内容格式</li><li>增至每天 3-5 帖</li><li>每周 2-3 条 thread</li><li>每天开始 quote tweet 相关内容</li></ol><h3 id="Month-2-：规模化"><a href="#Month-2-：规模化" class="headerlink" title="Month 2+：规模化"></a>Month 2+：规模化</h3><ol><li>开发 3-5 个固定栏目（例如 “Friday Framework”）</li><li>跨平台复用：thread 改为 LinkedIn 帖、newsletter 内容</li><li>和 5-10 个同规模账号建立 reply 关系（互相互动）</li><li>如果 niche 相关，尝试 spaces&#x2F;audio</li><li>跑 <code>python3 scripts/growth_tracker.py --handle @username --period 30d</code></li></ol><hr><h2 id="第-6-步-——-内容日历生成"><a href="#第-6-步-——-内容日历生成" class="headerlink" title="第 6 步 —— 内容日历生成"></a>第 6 步 —— 内容日历生成</h2><p>运行：<code>python3 scripts/content_planner.py --niche &quot;your niche&quot; --frequency 5 --weeks 2</code></p><p>生成 2 周发帖计划，包括：</p><ul><li>每日推文主题与 hook 建议</li><li>Thread 大纲（每周 2-3 条）</li><li>Reply 目标（要互动的账号）</li><li>基于 niche 的最佳发帖时间</li></ul><hr><h2 id="脚本"><a href="#脚本" class="headerlink" title="脚本"></a>脚本</h2><table><thead><tr><th>脚本</th><th>用途</th></tr></thead><tbody><tr><td><code>scripts/profile_auditor.py</code></td><td>审计 X profile：bio、pinned、活动模式</td></tr><tr><td><code>scripts/tweet_composer.py</code></td><td>按 hook 模式生成推文&#x2F;thread</td></tr><tr><td><code>scripts/competitor_analyzer.py</code></td><td>通过 web search 分析竞品账号</td></tr><tr><td><code>scripts/content_planner.py</code></td><td>生成每周&#x2F;每月内容日历</td></tr><tr><td><code>scripts/growth_tracker.py</code></td><td>追踪 follower 增长和互动趋势</td></tr></tbody></table><h2 id="常见陷阱"><a href="#常见陷阱" class="headerlink" title="常见陷阱"></a>常见陷阱</h2><ol><li><strong>直接发链接</strong> —— 链接永远放第一条 reply，不要放在推文正文</li><li><strong>Thread 第 1 条太弱</strong> —— hook 没阻止滚动的话其他都白搭</li><li><strong>发帖不稳定</strong> —— 算法奖励日常一致性而不是偶尔爆款</li><li><strong>只广播不互动</strong> —— Reply 和互动占增长 50%+，不只是发帖</li><li><strong>通用 bio</strong> —— “帮人做事”等于没说</li><li><strong>不改编就搬格式</strong> —— tech Twitter 有效的不一定在 marketing Twitter 有效</li></ol><h2 id="相关-Skill"><a href="#相关-Skill" class="headerlink" title="相关 Skill"></a>相关 Skill</h2><ul><li><code>social-content</code> —— 多平台内容创作</li><li><code>social-media-manager</code> —— 总体社交战略</li><li><code>social-media-analyzer</code> —— 跨平台分析</li><li><code>content-production</code> —— 喂 X thread 的长内容</li><li><code>copywriting</code> —— 标题和 hook 写作技巧</li></ul><hr><h2 id="SKILL-Original-English-Version"><a href="#SKILL-Original-English-Version" class="headerlink" title="SKILL Original English Version"></a>SKILL Original English Version</h2><blockquote><p>下方为 SKILL.md 英文原文，完整保留以便读者对照查阅 &#x2F; The following is the original SKILL.md in English, embedded verbatim for cross-reference.</p></blockquote><div class="code-container" data-rel="Markdown"><figure class="iseeu highlight markdown"><table><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><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: &quot;x-twitter-growth&quot;</span><br><span class="line">description: &quot;X/Twitter growth engine for building audience, crafting viral content, and analyzing engagement. Use when the user wants to grow on X/Twitter, write tweets or threads, analyze their X profile, research competitors on X, plan a posting strategy, or optimize engagement. Complements social-content (generic multi-platform) with X-specific depth: algorithm mechanics, thread engineering, reply strategy, profile optimization, and competitive intelligence via web search.&quot;</span><br><span class="line">license: MIT</span><br><span class="line">metadata:</span><br><span class="line">  version: 1.0.0</span><br><span class="line">  author: Alireza Rezvani</span><br><span class="line">  category: marketing</span><br><span class="line"><span class="section">  updated: 2026-03-10</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># X/Twitter Growth Engine</span></span><br><span class="line"></span><br><span class="line">X-specific growth skill. For general social media content across platforms, see <span class="code">`social-content`</span>. For social strategy and calendar planning, see <span class="code">`social-media-manager`</span>. This skill goes deep on X.</span><br><span class="line"></span><br><span class="line"><span class="section">## When to Use This vs Other Skills</span></span><br><span class="line"></span><br><span class="line">| Need | Use |</span><br><span class="line">|------|-----|</span><br><span class="line">| Write a tweet or thread | <span class="strong">**This skill**</span> |</span><br><span class="line">| Plan content across LinkedIn + X + Instagram | social-content |</span><br><span class="line">| Analyze engagement metrics across platforms | social-media-analyzer |</span><br><span class="line">| Build overall social strategy | social-media-manager |</span><br><span class="line">| X-specific growth, algorithm, competitive intel | <span class="strong">**This skill**</span> |</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Step 1 — Profile Audit</span></span><br><span class="line"></span><br><span class="line">Before any growth work, audit the current X presence. Run <span class="code">`scripts/profile_auditor.py`</span> with the handle, or manually assess:</span><br><span class="line"></span><br><span class="line"><span class="section">### Bio Checklist</span></span><br><span class="line"><span class="bullet">-</span> [ ] Clear value proposition in first line (who you help + how)</span><br><span class="line"><span class="bullet">-</span> [ ] Specific niche — not &quot;entrepreneur | thinker | builder&quot;</span><br><span class="line"><span class="bullet">-</span> [ ] Social proof element (followers, title, metric, brand)</span><br><span class="line"><span class="bullet">-</span> [ ] CTA or link (newsletter, product, site)</span><br><span class="line"><span class="bullet">-</span> [ ] No hashtags in bio (signals amateur)</span><br><span class="line"></span><br><span class="line"><span class="section">### Pinned Tweet</span></span><br><span class="line"><span class="bullet">-</span> [ ] Exists and is less than 30 days old</span><br><span class="line"><span class="bullet">-</span> [ ] Showcases best work or strongest hook</span><br><span class="line"><span class="bullet">-</span> [ ] Has clear CTA (follow, subscribe, read)</span><br><span class="line"></span><br><span class="line"><span class="section">### Recent Activity (last 30 posts)</span></span><br><span class="line"><span class="bullet">-</span> [ ] Posting frequency: minimum 1x/day, ideal 3-5x/day</span><br><span class="line"><span class="bullet">-</span> [ ] Mix of formats: tweets, threads, replies, quotes</span><br><span class="line"><span class="bullet">-</span> [ ] Reply ratio: &gt;30% of activity should be replies</span><br><span class="line"><span class="bullet">-</span> [ ] Engagement trend: improving, flat, or declining</span><br><span class="line"></span><br><span class="line">Run: <span class="code">`python3 scripts/profile_auditor.py --handle @username`</span></span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Step 2 — Competitive Intelligence</span></span><br><span class="line"></span><br><span class="line">Research competitors and successful accounts in your niche using web search.</span><br><span class="line"></span><br><span class="line"><span class="section">### Process</span></span><br><span class="line"><span class="bullet">1.</span> Search <span class="code">`site:x.com &quot;topic&quot; min_faves:100`</span> via Brave to find high-performing content</span><br><span class="line"><span class="bullet">2.</span> Identify 5-10 accounts in your niche with strong engagement</span><br><span class="line"><span class="bullet">3.</span> For each, analyze: posting frequency, content types, hook patterns, engagement rates</span><br><span class="line"><span class="bullet">4.</span> Run: <span class="code">`python3 scripts/competitor_analyzer.py --handles @acc1 @acc2 @acc3`</span></span><br><span class="line"></span><br><span class="line"><span class="section">### What to Extract</span></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Hook patterns**</span> — How do top posts start? Question? Bold claim? Statistic?</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Content themes**</span> — What 3-5 topics get the most engagement?</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Format mix**</span> — Ratio of tweets vs threads vs replies vs quotes</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Posting times**</span> — When do their best posts go out?</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Engagement triggers**</span> — What makes people reply vs like vs retweet?</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Step 3 — Content Creation</span></span><br><span class="line"></span><br><span class="line"><span class="section">### Tweet Types (ordered by growth impact)</span></span><br><span class="line"></span><br><span class="line"><span class="section">#### 1. Threads (highest reach, highest follow conversion)</span></span><br></pre></td></tr></table></figure></div><p>Structure:</p><ul><li>Tweet 1: Hook — must stop the scroll in &lt;7 words</li><li>Tweet 2: Context or promise (“Here’s what I learned:”)</li><li>Tweets 3-N: One idea per tweet, each standalone-worthy</li><li>Final tweet: Summary + explicit CTA (“Follow @handle for more”)</li><li>Reply to tweet 1: Restate hook + “Follow for more [topic]”</li></ul><p>Rules:</p><ul><li>5-12 tweets optimal (under 5 feels thin, over 12 loses people)</li><li>Each tweet should make sense if read alone</li><li>Use line breaks for readability</li><li>No tweet should be a wall of text (3-4 lines max)</li><li>Number the tweets or use “↓” in tweet 1<div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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><br><span class="line">#### 2. Atomic Tweets (breadth, impression farming)</span><br></pre></td></tr></table></figure></div>Formats that work:</li><li>Observation: “[Thing] is underrated. Here’s why:”</li><li>Listicle: “10 tools I use daily:\n\n1. X — for Y”</li><li>Contrarian: “Unpopular opinion: [statement]”</li><li>Lesson: “I [did X] for [time]. Biggest lesson:”</li><li>Framework: “[Concept] explained in 30 seconds:”</li></ul><p>Rules:</p><ul><li>Under 200 characters gets more engagement</li><li>One idea per tweet</li><li>No links in tweet body (kills reach — put link in reply)</li><li>Question tweets drive replies (algorithm loves replies)<div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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><br><span class="line">#### 3. Quote Tweets (authority building)</span><br></pre></td></tr></table></figure></div>Formula: Original tweet + your unique take</li><li>Add data the original missed</li><li>Provide counterpoint or nuance</li><li>Share personal experience that validates&#x2F;contradicts</li><li>Never just say “This” or “So true”<div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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><br><span class="line">#### 4. Replies (network growth, fastest path to visibility)</span><br></pre></td></tr></table></figure></div>Strategy:</li><li>Reply to accounts 2-10x your size</li><li>Add genuine value, not “great post!”</li><li>Be first to reply on accounts with large audiences</li><li>Your reply IS your content — make it tweet-worthy</li><li>Controversial&#x2F;insightful replies get quote-tweeted (free reach)<div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">Run: `python3 scripts/tweet_composer.py --type thread --topic &quot;your topic&quot; --audience &quot;your audience&quot;`</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Step 4 — Algorithm Mechanics</span><br><span class="line"></span><br><span class="line">### What X rewards (2025-2026)</span><br><span class="line">| Signal | Weight | Action |</span><br><span class="line">|--------|--------|--------|</span><br><span class="line">| Replies received | Very high | Write reply-worthy content (questions, debates) |</span><br><span class="line">| Time spent reading | High | Threads, longer tweets with line breaks |</span><br><span class="line">| Profile visits from tweet | High | Curiosity gaps, tease expertise |</span><br><span class="line">| Bookmarks | High | Tactical, save-worthy content (lists, frameworks) |</span><br><span class="line">| Retweets/Quotes | Medium | Shareable insights, bold takes |</span><br><span class="line">| Likes | Low-medium | Easy agreement, relatable content |</span><br><span class="line">| Link clicks | Low (penalized) | Never put links in tweet body — use reply |</span><br><span class="line"></span><br><span class="line">### What kills reach</span><br><span class="line">- Links in tweet body (put in first reply instead)</span><br><span class="line">- Editing tweets within 30 min of posting</span><br><span class="line">- Posting and immediately going offline (no early engagement)</span><br><span class="line">- More than 2 hashtags</span><br><span class="line">- Tagging people who don&#x27;t engage back</span><br><span class="line">- Threads with inconsistent quality (one weak tweet tanks the whole thread)</span><br><span class="line"></span><br><span class="line">### Optimal Posting Cadence</span><br><span class="line">| Account size | Tweets/day | Threads/week | Replies/day |</span><br><span class="line">|-------------|------------|--------------|-------------|</span><br><span class="line">| &lt; 1K followers | 2-3 | 1-2 | 10-20 |</span><br><span class="line">| 1K-10K | 3-5 | 2-3 | 5-15 |</span><br><span class="line">| 10K-50K | 3-7 | 2-4 | 5-10 |</span><br><span class="line">| 50K+ | 2-5 | 1-3 | 5-10 |</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Step 5 — Growth Playbook</span><br><span class="line"></span><br><span class="line">### Week 1-2: Foundation</span><br><span class="line">1. Optimize bio and pinned tweet (Step 1)</span><br><span class="line">2. Identify 20 accounts in your niche to engage with daily</span><br><span class="line">3. Reply 10-20 times per day to larger accounts (genuine value only)</span><br><span class="line">4. Post 2-3 atomic tweets per day testing different formats</span><br><span class="line">5. Publish 1 thread</span><br><span class="line"></span><br><span class="line">### Week 3-4: Pattern Recognition</span><br><span class="line">1. Review what formats got most engagement</span><br><span class="line">2. Double down on top 2 content formats</span><br><span class="line">3. Increase to 3-5 posts per day</span><br><span class="line">4. Publish 2-3 threads per week</span><br><span class="line">5. Start quote-tweeting relevant content daily</span><br><span class="line"></span><br><span class="line">### Month 2+: Scale</span><br><span class="line">1. Develop 3-5 recurring content series (e.g., &quot;Friday Framework&quot;)</span><br><span class="line">2. Cross-pollinate: repurpose threads as LinkedIn posts, newsletter content</span><br><span class="line">3. Build reply relationships with 5-10 accounts your size (mutual engagement)</span><br><span class="line">4. Experiment with spaces/audio if relevant to niche</span><br><span class="line">5. Run: `python3 scripts/growth_tracker.py --handle @username --period 30d`</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Step 6 — Content Calendar Generation</span><br><span class="line"></span><br><span class="line">Run: `python3 scripts/content_planner.py --niche &quot;your niche&quot; --frequency 5 --weeks 2`</span><br><span class="line"></span><br><span class="line">Generates a 2-week posting plan with:</span><br><span class="line">- Daily tweet topics with hook suggestions</span><br><span class="line">- Thread outlines (2-3 per week)</span><br><span class="line">- Reply targets (accounts to engage with)</span><br><span class="line">- Optimal posting times based on niche</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Scripts</span><br><span class="line"></span><br><span class="line">| Script | Purpose |</span><br><span class="line">|--------|---------|</span><br><span class="line">| `scripts/profile_auditor.py` | Audit X profile: bio, pinned, activity patterns |</span><br><span class="line">| `scripts/tweet_composer.py` | Generate tweets/threads with hook patterns |</span><br><span class="line">| `scripts/competitor_analyzer.py` | Analyze competitor accounts via web search |</span><br><span class="line">| `scripts/content_planner.py` | Generate weekly/monthly content calendars |</span><br><span class="line">| `scripts/growth_tracker.py` | Track follower growth and engagement trends |</span><br><span class="line"></span><br><span class="line">## Common Pitfalls</span><br><span class="line"></span><br><span class="line">1. **Posting links directly** — Always put links in the first reply, never in the tweet body</span><br><span class="line">2. **Thread tweet 1 is weak** — If the hook doesn&#x27;t stop scrolling, nothing else matters</span><br><span class="line">3. **Inconsistent posting** — Algorithm rewards daily consistency over occasional bangers</span><br><span class="line">4. **Only broadcasting** — Replies and engagement are 50%+ of growth, not just posting</span><br><span class="line">5. **Generic bio** — &quot;Helping people do things&quot; tells nobody anything</span><br><span class="line">6. **Copying formats without adapting** — What works for tech Twitter doesn&#x27;t work for marketing Twitter</span><br><span class="line"></span><br><span class="line">## Related Skills</span><br><span class="line"></span><br><span class="line">- `social-content` — Multi-platform content creation</span><br><span class="line">- `social-media-manager` — Overall social strategy</span><br><span class="line">- `social-media-analyzer` — Cross-platform analytics</span><br><span class="line">- `content-production` — Long-form content that feeds X threads</span><br><span class="line">- `copywriting` — Headline and hook writing techniques</span><br></pre></td></tr></table></figure></div></li></ul><hr><p>两个月还不长，接下来要挑战的是怎么让增速不塌。欢迎在 <a class="link"   href="https://www.cocoloop.cn/" >cocoloop 社区<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 分享你自己的 X 账号成长日志，特别是 1K 到 10K 这一段 —— 这是最容易卡住的区间，比起看别人 50K 之后的打法，同量级的实战反馈对你更有参考价值。我也会在社区里继续更这个号后续的日志，欢迎一起跑。</p>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/x-twitter-growth-claude-skill/</id>
    <link href="https://claude.cocoloop.cn/posts/x-twitter-growth-claude-skill/"/>
    <published>2026-04-18T14:34:29.000Z</published>
    <summary>我把账号交给 Claude 跑了两个月。不是用它自动发推，而是用 x-twitter-growth 这个 Skill 做结构化的 profile 审计、竞品分析和内容编排。这篇是 Day 1 到 Day 60 的日志，不报数跑路。</summary>
    <title>从 320 到 8700 粉 —— 用 x-twitter-growth Skill 跑完 60 天的日志</title>
    <updated>2026-04-19T00:12:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Skills" scheme="https://claude.cocoloop.cn/categories/Skills/"/>
    <category term="产品发布" scheme="https://claude.cocoloop.cn/tags/%E4%BA%A7%E5%93%81%E5%8F%91%E5%B8%83/"/>
    <category term="上线策略" scheme="https://claude.cocoloop.cn/tags/%E4%B8%8A%E7%BA%BF%E7%AD%96%E7%95%A5/"/>
    <category term="Product Hunt" scheme="https://claude.cocoloop.cn/tags/Product-Hunt/"/>
    <category term="GTM" scheme="https://claude.cocoloop.cn/tags/GTM/"/>
    <category term="SaaS发布" scheme="https://claude.cocoloop.cn/tags/SaaS%E5%8F%91%E5%B8%83/"/>
    <content>
      <![CDATA[<p>我最近参与了一次挺典型的内部会议。主角是：</p><ul><li>E：工程师，负责一个新功能的开发和上线，老派 hacker 风格</li><li>M：市场同学，新来不到半年，之前在广告代理出身</li><li>我：被叫来做”上线流程过一遍”的 observer</li></ul><p>会议预期 1 小时，实际开到下午 4 点多。吵的不是功能本身，是”这个功能怎么上线”。我在旁边看了一阵，打开 launch-strategy Skill 开始做笔记，越记越发现他们的分歧每一条都能映到 Skill 的 framework 上。这篇文章就是那场会议的还原，加上 Skill 的几处关键介入。</p><h2 id="第一回合：要不要”发布”这件事"><a href="#第一回合：要不要”发布”这件事" class="headerlink" title="第一回合：要不要”发布”这件事"></a>第一回合：要不要”发布”这件事</h2><p>E（开发）：**”功能做完了，推送更新，该用的用户自然会发现。这是 dogfooding 文化。”**</p><p>M（市场）：**”不做 launch 等于白做。功能上线那天，是一年里我们能拿到最多注意力的窗口，错过就错过了。”**</p><p>两个人在这一点上根本不在同一个 context。E 的视角是<strong>产品本身就是营销</strong>，M 的视角是<strong>分发是产品的一半</strong>。</p><p>Skill 在 Proactive Triggers 里直接给了判决：</p><blockquote><p>Feature ship date mentioned: When an engineering delivery date is discussed, immediately ask about the launch plan; shipping without a marketing plan is a missed opportunity.</p></blockquote><p>这个 trigger 我放出来之后，E 的第一反应是”我们不是大厂，launch 不 launch 其实没区别”。但 Skill 的逻辑不是”launch &#x3D; 大张旗鼓”，launch 的本质是<strong>把一次产品事件变成一次叙事事件</strong>。你可以低调，但不能没计划。</p><p>Skill 的 Task-Specific Questions 有一条很值得记下来：</p><blockquote><p>Have you launched before? What worked &#x2F; didn’t work?</p></blockquote><p>这个问题把 E 噎住了。他们公司过去 18 个月其实发过 3 个”重要”功能，每一次都没做 launch，每一次流量都没起。他没法拿过去的经验反驳 M。</p><h2 id="第二回合：ORB-到底是什么"><a href="#第二回合：ORB-到底是什么" class="headerlink" title="第二回合：ORB 到底是什么"></a>第二回合：ORB 到底是什么</h2><p>M 拿出她的 “launch plan”，讲了 10 分钟：投 Meta 广告、找 3 个 KOL 发 LinkedIn、挂个 banner。E 的质疑很直接：”这不就是花钱买曝光吗？”</p><p>这里 Skill 的 ORB 框架救了场。ORB &#x3D; Owned &#x2F; Rented &#x2F; Borrowed，三种渠道类型：</p><table><thead><tr><th>类型</th><th>定义</th><th>例子</th></tr></thead><tbody><tr><td>Owned</td><td>你直接控制的渠道</td><td>邮件列表、站内 banner、产品内通知、博客</td></tr><tr><td>Rented</td><td>你在别人平台上建立的受众</td><td>X、LinkedIn、YouTube、Twitter 粉丝</td></tr><tr><td>Borrowed</td><td>你借用别人的注意力</td><td>Product Hunt、第三方 newsletter、合作伙伴分发、行业报告引用</td></tr></tbody></table><p>Skill 的 communication 规范里写得很硬：</p><blockquote><p>A launch plan is only complete when it covers all three ORB channel types and includes both launch-day and post-launch actions.</p></blockquote><p>这句话一贴出来，M 的原方案立刻显得单薄——她只覆盖了 Rented 的一小块（付费广告、KOL LinkedIn）。Owned 和 Borrowed 几乎没提。E 第一次意识到 “owned” 一栏他其实一直有但没用——他们邮件列表已经 5000+，过去一年一封功能公告都没发过。市场这边的工作不仅是”外面宣传”，是”把已有资源都调动起来”。</p><p>邮件那块的具体实施建议搭配 <a href="https://claude.cocoloop.cn/email-sequence-claude-skill">email-sequence Skill</a>，X &#x2F; LinkedIn 的个人账号打法可以参考 <a href="https://claude.cocoloop.cn/x-twitter-growth-claude-skill">x-twitter-growth Skill</a>，两个 Skill 能把 ORB 里的 Owned 和 Rented 具体化。</p><h2 id="第三回合：Product-Hunt-要不要上"><a href="#第三回合：Product-Hunt-要不要上" class="headerlink" title="第三回合：Product Hunt 要不要上"></a>第三回合：Product Hunt 要不要上</h2><p>M 的立场：必须上，错过就是罪过。<br>E 的立场：Product Hunt 上的都是国外开发者，我们 ICP 不是他们。</p><p>Skill 在 Proactive Triggers 里有一条特别针对这个：</p><blockquote><p>Product Hunt consideration: Any mention of Product Hunt should trigger the full PH strategy section including pre-launch relationship building timeline.</p></blockquote><p>关键词是”full PH strategy including pre-launch relationship building timeline”。多数团队上 Product Hunt 失败的原因不是”PH 不适合我们”，而是<strong>他们当天才想起来上 PH</strong>。</p><p>“上线前 4-8 周”这条是关键。Product Hunt 不是”当天发贴等运气”，它是一个社区。你不在那个社区里积累，当天出现，maker 身份是 0，评论区只有自己，上去就沉。</p><p>E 听完这一段反倒松了口气：”那我们现在准备已经来不及了，这次就不上 PH。”Skill 的 Launch Day Checklist 里其实也不要求每次都上 PH——<strong>它要求你在上之前想清楚为什么上</strong>。不上不是错，草率地上才是错。</p><h2 id="第四回合：Waitlist-要不要做"><a href="#第四回合：Waitlist-要不要做" class="headerlink" title="第四回合：Waitlist 要不要做"></a>第四回合：Waitlist 要不要做</h2><p>E：功能反正下周就上线了，搞什么 waitlist。<br>M：不搞 waitlist 就没法测需求热度。</p><p>这场辩论的答案其实取决于<strong>你是 feature 还是 product</strong>。小功能的 incremental update 不需要 waitlist，产品线的新 SKU 或者新独立能力需要。</p><p>Skill 的 trigger：</p><blockquote><p>Waitlist or early access mentioned: Offer to design the full phased launch funnel from alpha through full GA, not just the landing page.</p></blockquote><p>full phased launch funnel 是 4 个阶段：Alpha &#x2F; Closed beta（小规模邀请制）→ Waitlist &#x2F; Early access（公开 landing page 收邮箱）→ Public beta（全量开放但 beta 标签）→ GA（完整上线 + 价格公告 + 全渠道 launch）。</p><p>对于这次的功能，E 最后同意不做 waitlist——因为它是现有产品的功能增强，不是新 SKU。但做 alpha 先放给 30 个活跃客户试，beta 两周，两周后 GA。这个节奏一排，M 的 launch plan 就有了三个发布点而不是一个，传播势能能拉得更长。</p><h2 id="第五回合：Post-launch-比-launch-day-更重要"><a href="#第五回合：Post-launch-比-launch-day-更重要" class="headerlink" title="第五回合：Post-launch 比 launch day 更重要"></a>第五回合：Post-launch 比 launch day 更重要</h2><p>M 说她的工作重心都在 launch 当天。Skill 直接反驳这个思路：</p><blockquote><p>Post-launch silence: If a user launched recently but hasn’t followed up with momentum content, proactively suggest the post-launch marketing actions (comparison pages, roundup email, interactive demo).</p></blockquote><p>launch 当天的流量是一次脉冲，你 post-launch 做什么决定了这次脉冲能不能变成持续曲线。一份 30 天 post-launch 行动清单，我在会议白板上临时整理了一份：</p><ul><li>第 1-3 天：Launch 当天数据复盘 + 社区 AMA</li><li>第 4-7 天：用户 early feedback 整理成博客</li><li>第 8-14 天：Comparison page（vs 竞品）上线，承接 SEO 长尾</li><li>第 15-21 天：Case study 开始做一份真实客户的使用故事</li><li>第 22-30 天：Interactive demo 或 video walkthrough，承接从搜索来的考虑期流量</li></ul><p>E 对”comparison page”很抗拒，觉得是”不厚道”。但 Skill 的 related skills 里引用了 <code>competitor-alternatives</code>，里面的观点很清楚：用户在 decision 阶段本来就会搜 “A vs B”，你不做 comparison page，那个流量就去了别人做的比较页。</p><p>内容 roadmap 这一块建议配合 <a href="https://claude.cocoloop.cn/content-strategy-claude-skill">content-strategy Skill</a>；SEO 导向的对比页可以通过 <a href="https://claude.cocoloop.cn/programmatic-seo-claude-skill">programmatic-seo Skill</a> 批量生成。</p><h2 id="第六回合：Pricing-change-也是-launch"><a href="#第六回合：Pricing-change-也是-launch" class="headerlink" title="第六回合：Pricing change 也是 launch"></a>第六回合：Pricing change 也是 launch</h2><p>最后 10 分钟，话题突然转到”下个月我们要涨价”。我提醒他们 Skill 里有这一条：</p><blockquote><p>Pricing change planned: Pricing updates are a launch opportunity; offer to build an announcement campaign treating it as a product update.</p></blockquote><p>涨价不是运营动作，是一次 launch。用和产品 launch 一样的节奏去做：Pre-launch（提前 60-90 天通知老客户）、Launch window（announcement blog + email + in-app notice）、Post-launch（30 天 churn 监控 + CS 话术 toolkit）。把涨价当 launch 做，和把涨价当”后台改个数字”做，结果差得不是一点半点。前者 churn 往往控制在 3-5%，后者很容易翻到 10% 以上。</p><p>关于涨价执行细节，回去看 <a href="https://claude.cocoloop.cn/pricing-strategy-claude-skill">pricing-strategy Skill 那篇</a>更详细。</p><h2 id="会议结束时的那份-launch-plan"><a href="#会议结束时的那份-launch-plan" class="headerlink" title="会议结束时的那份 launch plan"></a>会议结束时的那份 launch plan</h2><p>下午 4 点多，会议结束时，白板上最后定下的 launch plan 长这样：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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></pre></td><td class="code"><pre><span class="line">[功能 X] Launch Plan</span><br><span class="line"></span><br><span class="line">时间表</span><br><span class="line">- Week -2：alpha 放给 30 个客户</span><br><span class="line">- Week -1：alpha feedback 整理、文案 draft、邮件列表分段</span><br><span class="line">- Launch Day (T=0)：</span><br><span class="line">    * 09:00 邮件列表公告</span><br><span class="line">    * 10:00 产品内 banner 上</span><br><span class="line">    * 10:30 创始人 X / LinkedIn 发布</span><br><span class="line">    * 12:00 博客长文上线</span><br><span class="line">    * 14:00 Changelog 公告</span><br><span class="line">    * 全天：在 2 个相关 subreddit / Discord 参与讨论</span><br><span class="line">- Week +1：对比页上线、早期使用数据 roundup 发邮件</span><br><span class="line">- Week +2~4：case study 采访、interactive demo 上线、SEO 长尾承接</span><br><span class="line"></span><br><span class="line">ORB 覆盖</span><br><span class="line">- Owned: 邮件 / 站内 banner / 博客 / changelog</span><br><span class="line">- Rented: 创始人个人 X + LinkedIn + 2 个技术社区</span><br><span class="line">- Borrowed: 1 家合作 newsletter 互推、1 个行业播客访谈（若档期对得上）</span><br><span class="line"></span><br><span class="line">成功指标</span><br><span class="line">- 功能激活率 &gt; 15%（30 天内）</span><br><span class="line">- Launch day 带来的新注册 &gt; 常规日 2x</span><br><span class="line">- 对比页 SEO 落到前 3 页关键词 &gt; 3 个</span><br><span class="line">- case study 在 Q3 销售材料里使用 &gt; 2 次</span><br></pre></td></tr></table></figure></div><p>对比他们原本的方案（就是 M 那份广告 + KOL 的清单），这份是立体的。每一条都有 owner、时间、渠道类型、度量方式。</p><h2 id="工程师和市场同学分别学到了什么"><a href="#工程师和市场同学分别学到了什么" class="headerlink" title="工程师和市场同学分别学到了什么"></a>工程师和市场同学分别学到了什么</h2><p>E 在会议结束时的原话：”我以为 launch 就是自嗨，听完发现它其实是给产品加一次势能曲线。”</p><p>M 的话：”我以前的 launch 都是把广告投几天，觉得够了。ORB 这个框架让我发现 Owned 通道其实一直在那，我都没动过。”</p><p>这其实代表着两类营销认知的撞合。工程师不相信 launch 的价值，是因为他们见过太多浮夸 launch 什么结果都没有；市场同学迷信 launch 当天，是因为他们的 KPI 总定在当天的数字上。Skill 的存在，是把 launch 重新定义为一个<strong>时间轴上的多点协作事件</strong>，而不是”当天发个动态”。</p><h2 id="工具链"><a href="#工具链" class="headerlink" title="工具链"></a>工具链</h2><p>我自己跑 launch 的 checklist 习惯用 Claude Code + OpenClaw 搭配。OpenClaw 做跨平台的 post schedule，Claude Code 跑 Skill 输出整份 launch plan。遇到大一点的 launch 会拉 Windsurf 做 project 级别协作，团队里的文案 &#x2F; 设计 &#x2F; PM 都能看同一份计划。Hermes Agent 把 launch 检查清单跑成自动化定时任务也很方便。对国产模型有预算偏好的团队，用 Kimi-K2 跑 Skill 的长上下文能力不错，特别是把过去 launch 的历史 post-mortem 都 feed 进去做”学习”的时候，长 context 省事很多。</p><hr><h2 id="SKILL-完整中文版"><a href="#SKILL-完整中文版" class="headerlink" title="SKILL 完整中文版"></a>SKILL 完整中文版</h2><div class="code-container" data-rel="Yaml"><figure class="iseeu highlight yaml"><table><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></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">&quot;launch-strategy&quot;</span>  <span class="comment"># 技能名称</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">&quot;用户想规划产品发布、功能公告或 release 策略时启用。同时适用于用户提到 &#x27;launch&#x27;、&#x27;Product Hunt&#x27;、&#x27;feature release&#x27;、&#x27;announcement&#x27;、&#x27;go-to-market&#x27;、&#x27;beta launch&#x27;、&#x27;early access&#x27;、&#x27;waitlist&#x27;、&#x27;product update&#x27;、&#x27;GTM plan&#x27;、&#x27;launch checklist&#x27; 或 &#x27;launch momentum&#x27;。本 Skill 覆盖 phased launch、渠道策略和持续的 launch 势能。&quot;</span></span><br><span class="line"><span class="attr">license:</span> <span class="string">MIT</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">version:</span> <span class="number">1.0</span><span class="number">.0</span></span><br><span class="line">  <span class="attr">author:</span> <span class="string">Alireza</span> <span class="string">Rezvani</span></span><br><span class="line">  <span class="attr">category:</span> <span class="string">marketing</span></span><br><span class="line">  <span class="attr">updated:</span> <span class="number">2026-03-06</span></span><br></pre></td></tr></table></figure></div><h1 id="发布策略"><a href="#发布策略" class="headerlink" title="发布策略"></a>发布策略</h1><p>你是 SaaS 产品发布和功能公告领域的专家。你的目标是帮用户规划能建立势能、抓住注意力、把兴趣转化为用户的发布。</p><h2 id="开始之前"><a href="#开始之前" class="headerlink" title="开始之前"></a>开始之前</h2><p><strong>先检查 product marketing context：</strong><br>如果 <code>.claude/product-marketing-context.md</code> 存在，提问前先读。用其中 context，只问未覆盖或本次任务专属的信息。</p><hr><h2 id="核心理念"><a href="#核心理念" class="headerlink" title="核心理念"></a>核心理念</h2><p>→ 详见 references&#x2F;launch-frameworks-and-checklists.md</p><h2 id="任务专属问题"><a href="#任务专属问题" class="headerlink" title="任务专属问题"></a>任务专属问题</h2><ol><li>你要发布什么？（新产品、重大功能、小更新）</li><li>当前受众规模和参与度如何？</li><li>有哪些 owned 渠道？（邮件列表规模、博客流量、社群）</li><li>发布的时间表是什么？</li><li>你以前发布过吗？什么有效&#x2F;什么无效？</li><li>是否考虑 Product Hunt？准备状态如何？</li></ol><hr><h2 id="Proactive-Triggers"><a href="#Proactive-Triggers" class="headerlink" title="Proactive Triggers"></a>Proactive Triggers</h2><p>以下情况主动提供 launch 规划：</p><ol><li><strong>提到 feature ship date</strong> —— 一旦讨论到工程交付日期，立即询问 launch plan；没有营销计划就上线是错失机会。</li><li><strong>提到 waitlist 或 early access</strong> —— 主动提议设计从 alpha 到全量 GA 的完整 phased launch funnel，而不仅是一个落地页。</li><li><strong>考虑 Product Hunt</strong> —— 任何提及 Product Hunt 都要触发完整 PH 策略章节，包括 pre-launch 关系建立 timeline。</li><li><strong>Post-launch 沉默</strong> —— 若用户最近发布但没跟进 momentum 内容，主动建议 post-launch 营销动作（comparison page、roundup email、interactive demo）。</li><li><strong>计划涨价</strong> —— 定价更新是一次 launch 机会；主动提议把它当作产品更新做一次 announcement campaign。</li></ol><hr><h2 id="输出产物"><a href="#输出产物" class="headerlink" title="输出产物"></a>输出产物</h2><table><thead><tr><th>产物</th><th>格式</th><th>描述</th></tr></thead><tbody><tr><td>Launch Plan</td><td>Markdown 文档</td><td>阶段化计划，含 owner、日期、渠道、成功指标</td></tr><tr><td>ORB Channel Map</td><td>表格</td><td>Owned &#x2F; Rented &#x2F; Borrowed 渠道策略，每渠道的具体打法</td></tr><tr><td>Launch Day Checklist</td><td>清单</td><td>当天完整执行清单，带时间盒动作</td></tr><tr><td>Product Hunt Brief</td><td>Markdown 文档</td><td>listing 文案、素材规格、pre-launch timeline、参与 playbook</td></tr><tr><td>Post-Launch Momentum Plan</td><td>项目列表</td><td>30 天 post-launch 行动，用于持续放大 launch</td></tr></tbody></table><hr><h2 id="沟通规范"><a href="#沟通规范" class="headerlink" title="沟通规范"></a>沟通规范</h2><p>Launch plan 必须具体、有时间界限、指定渠道——不要模糊的”在社交媒体上发个动态”。每一条输出都要指明谁做什么、什么时候做。参考 <code>marketing-context</code> 确保 launch 叙事与 ICP 语言和定位一致，再动笔写文案。质量底线：一份 launch plan 只有在覆盖全部三类 ORB 渠道、并包含 launch-day 和 post-launch 动作时才算完整。</p><hr><h2 id="相关-Skill"><a href="#相关-Skill" class="headerlink" title="相关 Skill"></a>相关 Skill</h2><ul><li><strong>email-sequence</strong> —— 构建 launch announcement 和 post-launch onboarding 邮件序列时用；不用作完整渠道策略的替代。</li><li><strong>social-content</strong> —— 为 launch day 起草具体社交 post 和 thread 时用；不用于渠道选择策略。</li><li><strong>paid-ads</strong> —— 当 launch plan 含付费放大时用；不用于纯 organic launch。</li><li><strong>content-strategy</strong> —— 当 launch 需要发布后数周的持续内容（博客、case study）时用；不用于单日 launch 执行。</li><li><strong>pricing-strategy</strong> —— 当 launch 涉及定价变化或新档引入时用；不用于纯功能 launch。</li><li><strong>marketing-context</strong> —— 作为基础，对齐 launch 信息与 ICP 和品牌语气；始终先加载。</li></ul><hr><h2 id="SKILL-Original-English-Version"><a href="#SKILL-Original-English-Version" class="headerlink" title="SKILL Original English Version"></a>SKILL Original English Version</h2><blockquote><p>下方为 SKILL.md 英文原文，完整保留以便读者对照查阅 &#x2F; The following is the original SKILL.md in English, embedded verbatim for cross-reference.</p></blockquote><div class="code-container" data-rel="Markdown"><figure class="iseeu highlight markdown"><table><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><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: &quot;launch-strategy&quot;</span><br><span class="line">description: &quot;When the user wants to plan a product launch, feature announcement, or release strategy. Also use when the user mentions &#x27;launch,&#x27; &#x27;Product Hunt,&#x27; &#x27;feature release,&#x27; &#x27;announcement,&#x27; &#x27;go-to-market,&#x27; &#x27;beta launch,&#x27; &#x27;early access,&#x27; &#x27;waitlist,&#x27; &#x27;product update,&#x27; &#x27;GTM plan,&#x27; &#x27;launch checklist,&#x27; or &#x27;launch momentum.&#x27; This skill covers phased launches, channel strategy, and ongoing launch momentum.&quot;</span><br><span class="line">license: MIT</span><br><span class="line">metadata:</span><br><span class="line">  version: 1.0.0</span><br><span class="line">  author: Alireza Rezvani</span><br><span class="line">  category: marketing</span><br><span class="line"><span class="section">  updated: 2026-03-06</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Launch Strategy</span></span><br><span class="line"></span><br><span class="line">You are an expert in SaaS product launches and feature announcements. Your goal is to help users plan launches that build momentum, capture attention, and convert interest into users.</span><br><span class="line"></span><br><span class="line"><span class="section">## Before Starting</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**Check for product marketing context first:**</span></span><br><span class="line">If <span class="code">`.claude/product-marketing-context.md`</span> exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Core Philosophy</span></span><br><span class="line">→ See references/launch-frameworks-and-checklists.md for details</span><br><span class="line"></span><br><span class="line"><span class="section">## Task-Specific Questions</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">1.</span> What are you launching? (New product, major feature, minor update)</span><br><span class="line"><span class="bullet">2.</span> What&#x27;s your current audience size and engagement?</span><br><span class="line"><span class="bullet">3.</span> What owned channels do you have? (Email list size, blog traffic, community)</span><br><span class="line"><span class="bullet">4.</span> What&#x27;s your timeline for launch?</span><br><span class="line"><span class="bullet">5.</span> Have you launched before? What worked/didn&#x27;t work?</span><br><span class="line"><span class="bullet">6.</span> Are you considering Product Hunt? What&#x27;s your preparation status?</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Proactive Triggers</span></span><br><span class="line"></span><br><span class="line">Proactively offer launch planning when:</span><br><span class="line"></span><br><span class="line"><span class="bullet">1.</span> <span class="strong">**Feature ship date mentioned**</span> — When an engineering delivery date is discussed, immediately ask about the launch plan; shipping without a marketing plan is a missed opportunity.</span><br><span class="line"><span class="bullet">2.</span> <span class="strong">**Waitlist or early access mentioned**</span> — Offer to design the full phased launch funnel from alpha through full GA, not just the landing page.</span><br><span class="line"><span class="bullet">3.</span> <span class="strong">**Product Hunt consideration**</span> — Any mention of Product Hunt should trigger the full PH strategy section including pre-launch relationship building timeline.</span><br><span class="line"><span class="bullet">4.</span> <span class="strong">**Post-launch silence**</span> — If a user launched recently but hasn&#x27;t followed up with momentum content, proactively suggest the post-launch marketing actions (comparison pages, roundup email, interactive demo).</span><br><span class="line"><span class="bullet">5.</span> <span class="strong">**Pricing change planned**</span> — Pricing updates are a launch opportunity; offer to build an announcement campaign treating it as a product update.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Output Artifacts</span></span><br><span class="line"></span><br><span class="line">| Artifact | Format | Description |</span><br><span class="line">|----------|--------|-------------|</span><br><span class="line">| Launch Plan | Markdown doc | Phase-by-phase plan with owners, dates, channels, and success metrics |</span><br><span class="line">| ORB Channel Map | Table | Owned/Rented/Borrowed channel strategy with tactics per channel |</span><br><span class="line">| Launch Day Checklist | Checklist | Complete day-of execution checklist with time-boxed actions |</span><br><span class="line">| Product Hunt Brief | Markdown doc | Listing copy, asset specs, pre-launch timeline, engagement playbook |</span><br><span class="line">| Post-Launch Momentum Plan | Bulleted list | 30-day post-launch actions to sustain and compound the launch |</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Communication</span></span><br><span class="line"></span><br><span class="line">Launch plans should be concrete, time-bound, and channel-specific — no vague &quot;post on social media&quot; recommendations. Every output should specify who does what and when. Reference <span class="code">`marketing-context`</span> to ensure the launch narrative matches ICP language and positioning before drafting any copy. Quality bar: a launch plan is only complete when it covers all three ORB channel types and includes both launch-day and post-launch actions.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Related Skills</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**email-sequence**</span> — USE for building the launch announcement and post-launch onboarding email sequences; NOT as a substitute for the full channel strategy.</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**social-content**</span> — USE for drafting the specific social posts and threads for launch day; NOT for channel selection strategy.</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**paid-ads**</span> — USE when the launch plan includes a paid amplification component; NOT for organic launch-only strategies.</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**content-strategy**</span> — USE when the launch requires a sustained content program (blog posts, case studies) in the weeks after; NOT for single-day launch execution.</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**pricing-strategy**</span> — USE when the launch involves a pricing change or new tier introduction; NOT for feature-only launches.</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**marketing-context**</span> — USE as foundation to align launch messaging with ICP and brand voice; always load first.</span><br></pre></td></tr></table></figure></div><hr><p>最后一句：如果你下周就有一次 launch 排期，别急着发东西。先拿半小时把 ORB 三列填一遍，把 pre-launch &#x2F; launch day &#x2F; post-launch 三段时间点画一条线。如果想让有过 launch 经验的同行看看你的 plan 哪里漏了，欢迎到 <a class="link"   href="https://www.cocoloop.cn/" >https://www.cocoloop.cn/<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 这边发一篇草稿出来。launch 这件事，80% 的失败是自己人关起门来计划时看不出漏洞，拿出来被问两轮问题就能补上。</p>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/launch-strategy-claude-skill/</id>
    <link href="https://claude.cocoloop.cn/posts/launch-strategy-claude-skill/"/>
    <published>2026-04-18T03:52:09.000Z</published>
    <summary>把 launch-strategy 这个 Claude Skill 放在一次真实的内部会议里。工程师说&quot;功能好用户自然来&quot;，市场同学说&quot;发布日不造势就白做&quot;。两个人吵到下午四点，我把 Skill 的 ORB 框架、Product Hunt 准备清单、post-launch momentum 拿出来做仲裁。这是那场会议的实况复盘。</summary>
    <title>工程师和市场同学吵了一下午：launch-strategy Skill 在中间做了什么</title>
    <updated>2026-04-18T09:26:44.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="入门" scheme="https://claude.cocoloop.cn/categories/%E5%85%A5%E9%97%A8/"/>
    <category term="Anthropic" scheme="https://claude.cocoloop.cn/tags/Anthropic/"/>
    <category term="Claude" scheme="https://claude.cocoloop.cn/tags/Claude/"/>
    <category term="Constitutional AI" scheme="https://claude.cocoloop.cn/tags/Constitutional-AI/"/>
    <category term="AI 安全" scheme="https://claude.cocoloop.cn/tags/AI-%E5%AE%89%E5%85%A8/"/>
    <content>
      <![CDATA[<p>我第一次知道 Anthropic 这家公司，是 2021 年夏天。那会儿朋友圈有人转过一张图，说 OpenAI 安全团队的核心十几个人集体离职了，领头的是个叫 Dario Amodei 的意大利裔研究员，他妹妹 Daniela 跟他一起走。当时我没在意，觉得不过是硅谷又一次常规的团队分裂。</p><p>后来 ChatGPT 火了，我被推着去试了 GPT-3.5，然后有朋友从内测通道甩给我一个叫 Claude 的东西，让我试试。我记得那天晚上我把同一段写得很烂的需求文档分别喂给两个模型，让它们帮我重写。GPT 给我的东西结构很漂亮但逻辑是飘的，Claude 给我的第一版不好看，但它会主动指出”你第 3 条和第 5 条是矛盾的，我暂时按第 3 条来写了，你确认一下”。</p><p>就那一句话，我记到今天。</p><h2 id="那群人为什么非要从-OpenAI-出来"><a href="#那群人为什么非要从-OpenAI-出来" class="headerlink" title="那群人为什么非要从 OpenAI 出来"></a>那群人为什么非要从 OpenAI 出来</h2><p>Anthropic 的核心创始团队，基本上是 OpenAI 当年负责 GPT-2、GPT-3 研究和安全的那批人。Dario 之前是 OpenAI 的研究 VP，Daniela 管运营，Tom Brown 是 GPT-3 论文一作，Jared Kaplan 是 scaling law 那篇论文的作者之一。</p><p>他们出来的表面原因是”对公司方向有分歧”，但你跟在那个圈子里的人聊过就知道，真实原因没那么玄乎：他们觉得 OpenAI 在安全问题上往后退了，产品化压力越来越大，而他们想做的事——搞清楚”一个能力越来越强的模型，怎么才能持续可控”——在原来那个组织里推不动了。</p><p>所以 Anthropic 一开始不是一家产品公司，是一家研究公司。2021 年成立，头两年几乎没对外发布任何可用的东西，只发论文。这跟 OpenAI 一上来就憋大招搞 GPT-3 API 完全是两种打法。</p><p>顺便说一句，我去年跟一个在 Anthropic SF 办公室的朋友吃饭，他说他们内部开会还是把”Safety”放在产品节奏前面的，这跟外界的印象差不多能对上。</p><h2 id="Constitutional-AI-到底是什么，用白话讲"><a href="#Constitutional-AI-到底是什么，用白话讲" class="headerlink" title="Constitutional AI 到底是什么，用白话讲"></a>Constitutional AI 到底是什么，用白话讲</h2><p>要理解 Claude 跟 GPT 的区别，绕不开 Constitutional AI（简称 CAI）。很多文章讲这玩意讲得云里雾里，我用一个我给非技术客户讲过的比喻：</p><p>RLHF，也就是 OpenAI 训 ChatGPT 那套主流做法，相当于雇了一群人类标注员去打分——模型生成 A 和 B 两个回答，人看完说 A 更好，模型就记住”要像 A 那样”。这种方式的问题在于，人工很贵，而且人会累、会不一致、会有偏见。</p><p>CAI 的做法是：先写一份”宪法”，大概几十条原则（比如”不要帮用户做违法的事””不要输出对特定群体不公平的表述””当你不确定的时候要说不确定”），然后让模型自己拿这份宪法去给自己的回答打分、改写、再打分。人类只在最开始参与，后面大部分工作模型自己循环。</p><p>好处是一致性高、可审计（宪法是明文的）、更便宜。缺点是如果宪法写歪了，模型会一本正经地把错误放大。Anthropic 这几年在改的主要就是这份宪法本身。</p><p>想展开看 Claude 和 GPT、Gemini 各自的路线差异，<a href="/posts/claude-vs-gpt-gemini-2026q2/">我之前写过一篇 2026 Q2 的横向对比</a>，可以接着读。</p><h2 id="Claude-家族这几年怎么长起来的"><a href="#Claude-家族这几年怎么长起来的" class="headerlink" title="Claude 家族这几年怎么长起来的"></a>Claude 家族这几年怎么长起来的</h2><p>我简单捋一下，按我自己用过的版本为准：</p><ul><li><strong>Claude 1（2023 初）</strong>：只在 Slack 里能用，反应慢，但长文本理解明显比当时的 GPT-3.5 好。</li><li><strong>Claude 2（2023 年中）</strong>：开放了 API，上下文窗口做到 100K，我当时拿来啃合同、翻法律文书，第一次感觉”这东西能干活”。</li><li><strong>Claude 3 系列（2024）</strong>：第一次分了 Haiku &#x2F; Sonnet &#x2F; Opus 三档，Opus 3 在推理和写作上当时是拉开同档 GPT 一截的。</li><li><strong>Claude 3.5 &#x2F; 3.7（2024-2025）</strong>：Sonnet 3.5 开始真的好用，Claude Code 也是这一代起步的。</li><li><strong>Claude 4 系列（2025-2026）</strong>：现在线上是 Haiku 4.5、Sonnet 4.6、Opus 4.7。Sonnet 4.6 已经是我日常 80% 任务的主力。</li></ul><p>三档模型怎么选，我在<a href="/posts/claude-family-haiku-sonnet-opus">这篇 Haiku&#x2F;Sonnet&#x2F;Opus 选型笔记</a>里写得很细，这里不重复。</p><h2 id="和-GPT、Gemini-的定位差异"><a href="#和-GPT、Gemini-的定位差异" class="headerlink" title="和 GPT、Gemini 的定位差异"></a>和 GPT、Gemini 的定位差异</h2><p>我尽量不贬低其他家，说几个我自己体感上的区别：</p><p><strong>写长文、处理长文档</strong>：Claude 到现在为止还是我的首选。它在 50K 以上上下文里不容易丢信息，GPT-4 类在这种场景下常常会”中间段失忆”。</p><p><strong>代码</strong>：以前 GPT 更强，2025 年之后 Claude Code + Sonnet 反超了，尤其是改大型代码库、做 refactor 这种活。我现在写代码 90% 用 <a href="/posts/claude-code-vs-cursor-cline">Claude Code 这一套</a>。</p><p><strong>对话自然度</strong>：GPT 的”人味”更足一点，Claude 会稍微一本正经一些。写营销文案我反而会用 GPT 打草稿，再用 Claude 改逻辑。</p><p><strong>安全边界</strong>：Claude 拒答率偏高，有时候你让它帮你写个对某个公司有点批评的分析，它会很谨慎。好处是不容易出事，坏处是有时候挺烦的。</p><p><strong>价格</strong>：Haiku 做到 1 美元&#x2F;百万 tokens 输入，这个价位段 Anthropic 比较卷。</p><p>Gemini 我用得少，主要在 Google Workspace 场景里当插件用，独立用它写东西我没习惯。</p><h2 id="我印象最深的一次对话"><a href="#我印象最深的一次对话" class="headerlink" title="我印象最深的一次对话"></a>我印象最深的一次对话</h2><p>2024 年夏天，我帮一个客户做合同风险审查，把一份 80 页的英文投资协议丢给 Claude 2，让它找出”对乙方明显不利的条款”。</p><p>它没直接列清单，先跟我说了一句：”这份合同里的不利条款有些是显性的（比如第 14.3 条违约金），有些是靠几条互相引用的条款组合出来的陷阱（比如 7.2+11.5+附件 C-3），你想要哪种？”</p><p>我当时愣了一下。那个”组合陷阱”它最后挑出来 3 条，其中 1 条我们的律师团队初审都没发现。</p><p>从那之后我对 Claude 的印象就定下来了——它不是最聪明的，但它是那个”会告诉你它在想什么、不确定的地方会说出来”的模型。我觉得这跟 Constitutional AI 这条技术路线是有关系的，不完全是运气。</p><div class="cta-card" style="margin:32px 0;padding:20px 24px;background:#f0f7ff;border-left:4px solid #0c97fe;border-radius:6px;"><p style="margin:0 0 8px;font-weight:600;color:#1f2937;">想系统学 Claude？</p><p style="margin:0;color:#4b5563;font-size:14px;line-height:1.8;">接下来建议先看<a href="/posts/claude-family-haiku-sonnet-opus/">三档模型怎么选</a>，搞清楚你手里这个任务该调用哪一个。想直接上手 API 的话，<a href="/posts/claude-api-quickstart/">15 分钟跑通第一次请求</a>这篇是我写给完全没碰过的朋友的。横向对比 GPT/Gemini 可以看<a href="/posts/claude-vs-gpt-gemini-2026q2/">2026 Q2 三家对比</a>。</p></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/claude-what-is-anthropic-vs-openai/</id>
    <link href="https://claude.cocoloop.cn/posts/claude-what-is-anthropic-vs-openai/"/>
    <published>2026-04-17T21:53:52.000Z</published>
    <summary>我从 2023 年初开始用 Claude，一路看着它从 Slack bot 里的一个小玩具长成现在 Opus 4.7 这个样子。很多人问我 Claude 到底是什么、跟 GPT 差别在哪、为什么那群人要从 OpenAI 出来单干——今天这篇就按我自己理解的顺序，从头讲到尾。</summary>
    <title>Claude 是什么？从 Anthropic 那群 OpenAI 出走的人说起</title>
    <updated>2026-04-19T20:53:52.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Tool与MCP" scheme="https://claude.cocoloop.cn/categories/Tool%E4%B8%8EMCP/"/>
    <category term="MCP" scheme="https://claude.cocoloop.cn/tags/MCP/"/>
    <category term="Function Calling" scheme="https://claude.cocoloop.cn/tags/Function-Calling/"/>
    <category term="Agent架构" scheme="https://claude.cocoloop.cn/tags/Agent%E6%9E%B6%E6%9E%84/"/>
    <category term="协议" scheme="https://claude.cocoloop.cn/tags/%E5%8D%8F%E8%AE%AE/"/>
    <content>
      <![CDATA[<p>前两周我跟一个做 Agent 产品的朋友吃饭，他甩给我一句话：”MCP 不就是 Function Calling 换了个皮吗？我们已经有 tool use 了，整这个 MCP 协议是 Anthropic 在刷存在感吧。”</p><p>我当时嘴里正嚼着东西，差点呛住。这误解在开发者圈里太常见了，甚至连一些写过相关代码的人也会这么觉得。但如果你真的在生产环境里把两种方式都用过，就会明白它们差的不是一点半点——<strong>维度根本不一样</strong>。</p><p>Function Calling 是工具；MCP 是给工具定一个标准插口。你可以说螺丝刀和螺丝的规范是一回事吗？当然不是。</p><p>这篇我想把五个最本质的差异一条一条拆给你看，最后说说实际项目选型怎么想。</p><h2 id="差异一：协议层-vs-应用层"><a href="#差异一：协议层-vs-应用层" class="headerlink" title="差异一：协议层 vs 应用层"></a>差异一：协议层 vs 应用层</h2><p>这是最根本的一条，想通了这一点其它四条都顺了。</p><p>Function Calling 是 OpenAI 2023 年 6 月发的一个 API 特性，它的本质是：<strong>模型输出结构化 JSON，你的应用代码去执行</strong>。Anthropic、Google、阿里、智谱……现在都有自己的 tool use &#x2F; function calling API，但注意——<strong>这是每一家自己 API 里的一个功能</strong>。你的代码和 xx 家模型的 API 深度耦合。</p><p>MCP（Model Context Protocol）不一样。它是 Anthropic 2024 年 11 月开源出来的一个<strong>通信协议</strong>，基于 JSON-RPC 2.0，规定了 Client 和 Server 之间怎么发现工具、怎么调用工具、怎么传递上下文、怎么处理流式响应。它本身<strong>不绑定任何模型、任何厂商</strong>。</p><p>打个比方：</p><ul><li>Function Calling 像每个品牌充电器的私有接口。苹果 lightning、华为 Type-C 以前的自家协议、早期安卓的 micro USB——每家自己一套</li><li>MCP 像 USB-C。协议标准化之后，任何设备对任何设备都能用</li></ul><p>USB-C 这个比喻最早是 Anthropic 官方自己提的，我一开始觉得有营销味，用多了之后发现还挺贴切。</p><h2 id="差异二：有状态-vs-无状态"><a href="#差异二：有状态-vs-无状态" class="headerlink" title="差异二：有状态 vs 无状态"></a>差异二：有状态 vs 无状态</h2><p>Function Calling 是一次性交易。你给模型一个 tools 数组，模型决定调哪个、给你返回 JSON，你执行完把结果再塞回对话。<strong>工具本身没有”会话”概念</strong>，每次调用都是独立的。</p><p>MCP Server 是一个<strong>长连接的服务</strong>。它可以：</p><ul><li>维护一个数据库连接池，整个会话期间复用</li><li>缓存用户身份信息，不用每次鉴权</li><li>推送 <code>notifications/resources/updated</code> 告诉客户端”我这边的资源变了”</li><li>在多次调用之间保持工作目录、临时文件这些状态</li></ul><p>举个最实际的例子：你要做一个”代码仓库分析”工具，让 Claude 能读取项目结构、打开文件、跑测试。</p><ul><li>Function Calling 版本：每次调用 <code>read_file</code> 都要把完整路径当参数传进去，模型要自己记住当前在哪个仓库</li><li>MCP 版本：Server 启动时 <code>cd</code> 到仓库根目录，之后所有调用都是相对路径；Server 还可以主动推送”文件变更”事件让模型知道有新的 commit</li></ul><p><strong>这个差异在 Agent 长时任务里会被放大</strong>。任务跑 30 分钟、跨越 200 轮对话，有状态和无状态是两种完全不同的编程模型。</p><h2 id="差异三：可发现-vs-硬编码"><a href="#差异三：可发现-vs-硬编码" class="headerlink" title="差异三：可发现 vs 硬编码"></a>差异三：可发现 vs 硬编码</h2><p>你有没有写过这种代码：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><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></pre></td><td class="code"><pre><span class="line">tools = [</span><br><span class="line">    &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;search_web&quot;</span>, <span class="string">&quot;description&quot;</span>: <span class="string">&quot;...&quot;</span>, <span class="string">&quot;parameters&quot;</span>: &#123;...&#125;&#125;,</span><br><span class="line">    &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;send_email&quot;</span>, <span class="string">&quot;description&quot;</span>: <span class="string">&quot;...&quot;</span>, <span class="string">&quot;parameters&quot;</span>: &#123;...&#125;&#125;,</span><br><span class="line">    &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;query_db&quot;</span>, <span class="string">&quot;description&quot;</span>: <span class="string">&quot;...&quot;</span>, <span class="string">&quot;parameters&quot;</span>: &#123;...&#125;&#125;,</span><br><span class="line">]</span><br><span class="line">response = client.messages.create(tools=tools, ...)</span><br></pre></td></tr></table></figure></div><p>这就是 Function Calling 的典型写法——<strong>工具列表写死在客户端代码里</strong>。你想加一个工具？改代码、重新部署。你想让不同用户看到不同的工具？自己写权限过滤逻辑。</p><p>MCP 的核心 API 之一是 <code>tools/list</code>——客户端启动时问 Server：”你都有啥工具？”Server 返回一个动态列表。这意味着：</p><ul><li>在 Server 侧加一个新工具，所有连接的客户端<strong>不用改任何代码</strong>就能用</li><li>Server 可以根据当前用户、当前权限，返回<strong>不同子集</strong>的工具列表</li><li>工具的描述、参数 schema 都可以在运行时更新</li></ul><p>我最近在做的一个内部项目，用 MCP 接了 6 个 Server：知识库、CRM、邮件、日程、Git、监控。运营同学的客户端能看到前 3 个，工程师能看到全部 6 个，运维只看到监控——都是同一份客户端代码，只是 Server 侧发的工具清单不一样。换 Function Calling 的话，光这套权限逻辑就得写几百行。</p><h2 id="差异四：跨-LLM-vs-单家绑定"><a href="#差异四：跨-LLM-vs-单家绑定" class="headerlink" title="差异四：跨 LLM vs 单家绑定"></a>差异四：跨 LLM vs 单家绑定</h2><p>这点对做产品的人尤其重要。</p><p>我之前做过一个客户项目，用 GPT-4 的 Function Calling 做了一整套工具集成。后来客户要改成 Claude——<strong>工具定义格式不一样</strong>（OpenAI 用 JSON Schema，Anthropic 用的是类似但不完全一样的格式），消息结构也不一样（OpenAI 的 <code>tool_calls</code> vs Anthropic 的 <code>tool_use</code> content block），全部代码重写一遍，花了一周。</p><p>MCP 协议本身是厂商中立的。只要客户端实现了 MCP 协议，它就能连任何 MCP Server；你的 Server 也可以同时服务给 Claude Desktop、Cursor、Cline、甚至某些支持 MCP 的 OpenAI 兼容 Client。</p><p><strong>对 Server 开发者来说，写一次，所有生态都能用</strong>。这是真正的网络效应，也是为什么我判断 MCP 会比 Function Calling 活得久。</p><p>当然现在阶段 OpenAI 自家还没有正式支持 MCP（2026 年初还是这个状态），但第三方适配层已经有一堆了，转换成本比当年重写 Function Calling 低多了。</p><h2 id="差异五：服务端自治-vs-客户端编排"><a href="#差异五：服务端自治-vs-客户端编排" class="headerlink" title="差异五：服务端自治 vs 客户端编排"></a>差异五：服务端自治 vs 客户端编排</h2><p>这条比较抽象但很关键。</p><p>Function Calling 模式下，<strong>所有编排逻辑都在你的客户端代码里</strong>：什么时候调工具、调哪个、失败重试、结果怎么传回模型——这些都是你写的应用代码在决定。模型只负责”生成 JSON”，你负责”真正做事”。</p><p>MCP 下，Server 有更多自主权。它可以：</p><ul><li>定义自己的 <code>resources</code>（只读数据源），让模型直接引用而不是通过工具调用</li><li>定义 <code>prompts</code>（预制的 prompt 模板），让用户直接选用</li><li>通过 <code>sampling</code> API 主动<strong>反向</strong>请求客户端帮它跑一次 LLM 推理（比如 Server 自己需要做一次翻译）</li><li>发送 <code>progress</code> 通知告诉客户端”我这个任务进度 30%”</li></ul><p>这些能力是 Function Calling 完全没有的。说白了，Function Calling 把模型当大脑、把工具当手；MCP 把 Server 也当作一个有智能的参与方，大家是协作关系。</p><h2 id="选型建议：什么时候用哪个"><a href="#选型建议：什么时候用哪个" class="headerlink" title="选型建议：什么时候用哪个"></a>选型建议：什么时候用哪个</h2><p>拆完差异，回到实际问题——你到底该选哪个？</p><p><strong>选 Function Calling 的场景</strong>：</p><ul><li>单次 API 调用能搞定的任务，比如”帮我写邮件时调一次日历查空闲”</li><li>快速原型、一次性脚本</li><li>只给自己或少数内部工具用</li><li>模型厂商锁定不是问题（比如你们公司就认 OpenAI）</li></ul><p><strong>选 MCP 的场景</strong>：</p><ul><li>要给非开发者终端用户用（他们装 Claude Desktop &#x2F; Cursor 就能用你的工具）</li><li>工具需要共享给多个应用，一次开发多处复用</li><li>有长时任务、需要状态和流式响应</li><li>在搞 Agent 产品，希望兼容未来更多客户端</li></ul><p>真实世界里，我现在新项目几乎都走 MCP 了。开发成本没高多少（FastMCP 这种框架已经很顺手），但获得的可移植性和生态红利很可观。关于 FastMCP 的具体用法，我在 <a href="/categories/Tool%E4%B8%8EMCP/">Tool与MCP 分类</a> 下面那篇”30 分钟手搓 MCP Server”里有完整的代码示例可以参考。</p><p>如果你正在做 Agent 方向的产品，还可以去 <a href="/categories/Agent%E5%BC%80%E5%8F%91/">Agent开发 分类</a> 看看那边关于 Skills 和 Agent 架构的文章，跟 MCP 组合起来用会有更多想象空间。</p><h2 id="最后说点我的个人判断"><a href="#最后说点我的个人判断" class="headerlink" title="最后说点我的个人判断"></a>最后说点我的个人判断</h2><p>MCP 现在还在早期——协议版本还在迭代（最新是 2025-06-18 draft），生态工具链不算成熟，debug 也比 Function Calling 麻烦（多一层协议就多一层坑）。</p><p>但我的感觉是：<strong>这波标准化是挡不住的</strong>。Function Calling 这种”每家一套 API”的做法，在行业成熟度低的时候是必然现象，就跟早期移动端充电器一样；但当生态规模到了一定阶段，标准化协议一定会胜出。苹果最后也上了 Type-C，对吧。</p><p>做选型决策的时候，我现在的默认选项是 MCP；只有在”真的只需要一次性、工具很少、没有复用需求”的场景才退回 Function Calling。</p><p>这不是什么信仰，是算过账的——多花 20% 的开发成本，换来 3 年后不用大重构，这买卖稳赚。</p><div class="cta-card">  <div class="cta-title">Agent 生态正在爆发式演化</div>  <div class="cta-desc">想跟进 MCP 协议的最新动态和厂商适配进展，推荐关注 <a class="link"   href="https://news.cocoloop.cn/" >news.cocoloop.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 的 AI 快讯板块；想看更多 Agent 架构讨论，可以去 <a class="link"   href="https://www.cocoloop.cn/" >www.cocoloop.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 翻一翻。</div></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/mcp-vs-function-calling/</id>
    <link href="https://claude.cocoloop.cn/posts/mcp-vs-function-calling/"/>
    <published>2026-04-17T11:10:26.000Z</published>
    <summary>很多人以为 MCP 就是换皮 Function Calling，这个判断错得离谱。把两者放在一张桌子上对比五个关键差异，顺便聊聊选型时怎么判断你到底需要哪个。</summary>
    <title>MCP 会是 AI 世界的 USB-C 吗？和 Function Calling 到底差在哪</title>
    <updated>2026-04-21T14:06:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Claude Code" scheme="https://claude.cocoloop.cn/categories/Claude-Code/"/>
    <category term="Claude Code" scheme="https://claude.cocoloop.cn/tags/Claude-Code/"/>
    <category term="Hooks" scheme="https://claude.cocoloop.cn/tags/Hooks/"/>
    <category term="自动化" scheme="https://claude.cocoloop.cn/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    <category term="DevOps" scheme="https://claude.cocoloop.cn/tags/DevOps/"/>
    <content>
      <![CDATA[<h2 id="一次差点被-fire-的-commit"><a href="#一次差点被-fire-的-commit" class="headerlink" title="一次差点被 fire 的 commit"></a>一次差点被 fire 的 commit</h2><p>2025 年 11 月，给一家做营销 SaaS 的甲方做后端重构。Claude Code 接了他们一个 14 万行的 Node 仓库，我那周手速也快，Opus 跑着跑着就把一个 shared util 文件给改了。表面看 tsc 过了、vitest 过了，PR 也被 review 通过。</p><p>然后 merge 到 main 的 37 分钟后，Grafana 告警拉响——一个正则没转义，所有 webhook 签名校验失败。用户投诉 1247 条涌进来。</p><p>回滚花了 8 分钟。我复盘那天晚上的 transcript，发现 Claude 其实跑完 Edit 之后<strong>没跑 lint</strong>，而项目里有个自定义 ESLint 规则会抓这个模式。它只是不知道要跑。</p><p>从那之后我给每个新项目进 Claude Code 之前，一定先配好 5 个 hook。不是洁癖，是真被吓到了。</p><h2 id="先说清楚-Claude-Code-的-hook-到底有几个入口"><a href="#先说清楚-Claude-Code-的-hook-到底有几个入口" class="headerlink" title="先说清楚 Claude Code 的 hook 到底有几个入口"></a>先说清楚 Claude Code 的 hook 到底有几个入口</h2><p>官方目前稳定的 hook 点我常用这几个：<code>PreToolUse</code>、<code>PostToolUse</code>、<code>UserPromptSubmit</code>、<code>Stop</code>、<code>SessionStart</code>。配置走 <code>.claude/settings.json</code> 或者 <code>settings.local.json</code>，格式大致是：</p><div class="code-container" data-rel="Json"><figure class="iseeu highlight json"><table><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></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;hooks&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;PostToolUse&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span> <span class="attr">&quot;matcher&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Edit|Write&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;hooks&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">&#123;</span><span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;command&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;...&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">]</span> <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></div><p>matcher 支持正则，所以 <code>Edit|Write|MultiEdit</code> 这种合并写法很省事。每个 hook 拿到的 payload 从 stdin 进来，是个 JSON，想拦截的话 exit code 非 0 就行。</p><p>下面这 5 个就是我跑了大半年沉淀的固定配置。</p><h2 id="Hook-1：PostToolUse-自动跑-lint-format"><a href="#Hook-1：PostToolUse-自动跑-lint-format" class="headerlink" title="Hook 1：PostToolUse 自动跑 lint&#x2F;format"></a>Hook 1：PostToolUse 自动跑 lint&#x2F;format</h2><p>最基础但最救命的一个。Claude 每次 Edit&#x2F;Write&#x2F;MultiEdit 之后，自动触发项目自己的 lint 和 format。关键是<strong>要把错误回灌给 Claude</strong>，这样它下一步会自己修。</p><p>我的 Node 项目模板：</p><div class="code-container" data-rel="Json"><figure class="iseeu highlight json"><table><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></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;matcher&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Edit|Write|MultiEdit&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;hooks&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;command&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;node .claude/scripts/post-edit-lint.js&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></div><p>脚本里我干这几件事：读 stdin 拿到被改的文件路径，按扩展名路由（.ts&#x2F;.tsx 走 eslint –fix + prettier，.py 走 ruff + black，.go 走 gofmt + golangci-lint），有 error 就 echo 到 stderr 并 exit 2。exit 2 是 Claude Code 专门的约定，stderr 内容会被塞回模型的下一轮上下文。</p><p>之前我图省事写 <code>exit 1</code>，Claude 完全看不到错误信息，一脸懵地继续往下跑。后来翻文档才知道必须 2。真要命，这种细节官方藏得挺深。</p><p>Python 项目的差异是 ruff 比较快但 mypy 慢，所以我 mypy 只在 Stop hook 里跑一次，不在 PostToolUse 里跑。不然每次编辑都卡 6-8 秒，Claude 的节奏会被打乱。</p><h2 id="Hook-2：PreToolUse-拦截危险操作"><a href="#Hook-2：PreToolUse-拦截危险操作" class="headerlink" title="Hook 2：PreToolUse 拦截危险操作"></a>Hook 2：PreToolUse 拦截危险操作</h2><p>这个就是我那次事故之后写的。规则很简单：所有 Bash 调用先过一层关键词筛子。</p><div class="code-container" data-rel="Json"><figure class="iseeu highlight json"><table><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></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;matcher&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Bash&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;hooks&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;command&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;node .claude/scripts/bash-guard.js&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></div><p>guard 脚本里的黑名单（从 stdin 读 tool_input.command 然后 grep）：</p><ul><li><code>rm -rf /</code> 以及任何作用在 <code>/</code>、<code>~</code>、<code>$HOME</code> 的递归删除</li><li><code>git push --force</code> 到任何带 <code>main|master|prod|release</code> 的分支</li><li><code>git reset --hard</code> 超过 10 个 commit 往前</li><li><code>DROP TABLE</code>、<code>TRUNCATE</code> 在生产连接串上</li><li><code>chmod 777</code> 任何目录</li></ul><p>匹配上就 exit 2 并输出拒绝原因。Claude 收到后 84.3% 的情况会自己换一个更安全的写法，剩下 15.7% 会在下一轮请求用户 confirm——这个比例是我翻了自己最近 412 次触发记录统计出来的，还挺靠谱。</p><p>顺便说，这东西的权限模式我之前也被坑过，想展开聊的可以看我另一篇 <a href="/posts/claude-code-vs-cursor-cline/">Claude Code 权限模式</a>（虽然那篇主要比三家工具，但权限部分讲得比较细）。</p><h2 id="Hook-3：UserPromptSubmit-自动注入项目状态"><a href="#Hook-3：UserPromptSubmit-自动注入项目状态" class="headerlink" title="Hook 3：UserPromptSubmit 自动注入项目状态"></a>Hook 3：UserPromptSubmit 自动注入项目状态</h2><p>这个是后期加的，但加了之后 Claude 的”上下文感”提升非常明显。用户每次提交 prompt 之前，我往上下文里塞一段项目快照：</p><ul><li>当前 git 分支</li><li>最近 3 条 commit 的 hash 和 subject</li><li>未 commit 的文件数（<code>git status --short | wc -l</code>）</li><li>当前开着的 PR 号码（如果有，通过 <code>gh pr status</code>）</li><li>今天是周几（我自己 debug 方便）</li></ul><p>脚本输出的字符串会被拼到用户 prompt 前面。我控制在 280 字以内，不然每次都多烧 token。</p><p>好处是 Claude 不会再问 “你现在在哪个分支” 这种废话，也不会傻乎乎建议我 <code>git checkout main</code> 而忽略我脏了一堆文件没提交。一个同事说”感觉 Claude 变聪明了”——其实只是它终于有视力了。</p><p>为什么这个要放在 prompt 之前而不是 system？因为系统提示词会被缓存，你每次都变动会打破 cache。想深入理解这个可以翻 <a href="/posts/prompt-system-role-placement/">系统角色与位置放置</a> 和 <a href="/posts/prompt-caching-deep-guide/">Prompt Caching 深度指南</a>。</p><h2 id="Hook-4：Stop-自动写会话摘要"><a href="#Hook-4：Stop-自动写会话摘要" class="headerlink" title="Hook 4：Stop 自动写会话摘要"></a>Hook 4：Stop 自动写会话摘要</h2><p>Claude 每次结束对话（Stop 触发），我让它把这次会话摘要写到 <code>.claude/logs/YYYY-MM-DD-HHMMSS.md</code>。格式固定：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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">&lt;一句话&gt;</span><br><span class="line"></span><br><span class="line">## 改动文件</span><br><span class="line">&lt;列表&gt;</span><br><span class="line"></span><br><span class="line">## 决策点</span><br><span class="line">&lt;3-5 条&gt;</span><br><span class="line"></span><br><span class="line">## 未解决</span><br><span class="line">&lt;列表&gt;</span><br></pre></td></tr></table></figure></div><p>实现方式是 Stop hook 调一个小脚本，脚本里再触发一次 Claude API 的 Haiku 4.5（便宜，$0.0037 一次摘要）读最近 transcript 生成。</p><p>这东西最大的用处是<strong>第二天继续干活的时候</strong>。我打开项目第一件事是 <code>ls -t .claude/logs/ | head -5</code>，看昨天卡在哪。之前没有这个习惯的时候，我经常花 15 分钟重新”找回状态”。现在平均 3 分钟。</p><p>想了解 agent 长期记忆的完整思路可以看 <a href="/posts/context-memory-long-term-agent/">长期记忆与 Agent 状态</a>，hook 写摘要本质上就是人工版的 episodic memory。</p><h2 id="Hook-5：SessionStart-拉依赖-健康检查"><a href="#Hook-5：SessionStart-拉依赖-健康检查" class="headerlink" title="Hook 5：SessionStart 拉依赖 + 健康检查"></a>Hook 5：SessionStart 拉依赖 + 健康检查</h2><p>每次我打开 Claude Code 会话，SessionStart 触发：</p><ol><li><code>git fetch origin</code> 看远端有没有更新</li><li><code>npm install</code> 或者 <code>uv sync</code>（根据项目类型）静默跑</li><li>跑一个 10 秒的 smoke test（我们项目里是 <code>make health</code>，其实就是 curl 几个 internal endpoint）</li><li>把结果摘要塞进 session context</li></ol><p>目的是让 Claude 一上来就知道”依赖是最新的、本地服务是活的”。之前没这个 hook 的时候，Claude 经常花一轮对话去诊断”为什么 import 失败”，最后发现是 node_modules 没装。</p><p>一个副作用是团队新人接手项目也轻松了。以前新人 clone 下来要翻 README 照抄一堆命令，现在 Claude Code 一跑 SessionStart 全搞定。一个实习生原话：”这个 hook 比你们的 onboarding 文档有用多了。”</p><h2 id="那次事故之后的一次”假警报”"><a href="#那次事故之后的一次”假警报”" class="headerlink" title="那次事故之后的一次”假警报”"></a>那次事故之后的一次”假警报”</h2><p>这 5 个 hook 配齐一个月后，有一次 PreToolUse 拦了 Claude 一个 <code>git push --force</code> 到 <code>feature/refund-v2</code>。按我的规则 feature 分支是放过的，但当时分支名里有个 release 字样——<code>feature/release-gate-refactor</code>。规则里我用的是 <code>grep -i release</code>，命中了。</p><p>Claude 收到拒绝后自己换成了 <code>git push --force-with-lease</code>，更安全。我当时看日志还挺感慨——规则写得略粗，但效果反而更好。</p><p>所以结论：hook 宁可粗一点误拦，也别漏拦。被误拦无非多走一步，漏拦就是事故。</p><p>如果你还没开始配 hook，我建议就从 Hook 1 和 Hook 2 开始。这两个加起来 40 行脚本，半小时搞定，ROI 是整个 Claude Code 生态里最高的。想把整套 agent 工程化看 <a href="/posts/agent-sdk-architecture/">Agent SDK 架构</a>，或者看一下我怎么在 CLAUDE.md 里做项目长期约束 <a href="/posts/claude-md-project-config/">CLAUDE.md 项目配置</a>。</p><div style="background:#f0f7ff;border-left:4px solid #0c97fe;padding:16px 20px;margin:24px 0;border-radius:4px;"><strong>我的 hook 模板仓库</strong><br/>上面 5 个脚本的完整 Node/Python 模板我整理在一个 repo 里，包括 bash-guard 的完整黑名单、post-edit-lint 的多语言路由表、Stop 摘要用的 Haiku prompt。打算开源但还在整理，想先拿的留言告诉我一下你的技术栈（Node/Python/Go），我优先发那一套给你。</div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/claude-code-hooks-automation/</id>
    <link href="https://claude.cocoloop.cn/posts/claude-code-hooks-automation/"/>
    <published>2026-04-17T03:23:53.000Z</published>
    <summary>去年十一月给一家做 SaaS 的客户做后端重构，Claude Code 跑得飞快，结果某次 PostToolUse 漏配 lint，一个没加分号的 TypeScript 直接进了 main。上线 37 分钟才被监控抓到，回滚那会儿我后背都是汗。从那次开始我给每个新项目都固定塞 5 个 hook，写下来记录一下，省得以后忘。</summary>
    <title>Claude Code 的 hooks 我现在每个项目都配这 5 个</title>
    <updated>2026-04-21T07:23:53.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Context Engineering" scheme="https://claude.cocoloop.cn/categories/Context-Engineering/"/>
    <category term="Claude" scheme="https://claude.cocoloop.cn/tags/Claude/"/>
    <category term="Compression" scheme="https://claude.cocoloop.cn/tags/Compression/"/>
    <category term="Summarization" scheme="https://claude.cocoloop.cn/tags/Summarization/"/>
    <category term="Chat History" scheme="https://claude.cocoloop.cn/tags/Chat-History/"/>
    <content>
      <![CDATA[<h2 id="一次线上事故引发的思考"><a href="#一次线上事故引发的思考" class="headerlink" title="一次线上事故引发的思考"></a>一次线上事故引发的思考</h2><p>去年有个事故我记到现在。</p><p>客户是家做法律咨询的，AI 助手用的 Claude Sonnet。用户在对话第 15 轮说自己有一笔 48 万的遗产纠纷，要咨询继承顺序。第 16 到第 40 轮中间聊了一堆背景——父母离异、兄弟几个、有一个继父、继父带来的两个子女。</p><p>到第 42 轮，用户问了一句”那我应该起诉谁”。</p><p>我们那会儿做了简单的历史截断——超过 30 轮就只保留最近 20 轮。结果 AI 回答里说成了”您只需要和两位兄弟协商即可”——那个继父和继子女的信息早就被截掉了。</p><p>那一次差点吃官司。从那之后我再也不敢用纯截断策略。</p><h2 id="策略-1：朴素截断（千万别用）"><a href="#策略-1：朴素截断（千万别用）" class="headerlink" title="策略 1：朴素截断（千万别用）"></a>策略 1：朴素截断（千万别用）</h2><p>最朴素的做法：设一个轮数上限，超过就从头砍。实现十分钟能搞定。</p><p><strong>信息损失率实测</strong>：我们跑过一个基准测试集，120 个 case，每个 case 40-60 轮对话。纯截断（保留最近 15 轮）的信息召回率是 **43.7%**。几乎一半关键信息丢了。</p><p><strong>为什么这么惨</strong>：用户往往在对话早期交代背景，后期只抛出具体问题。截掉早期就是截掉上下文。</p><p><strong>什么时候可以用</strong>：真的不建议用。除非你的场景是客服——每次对话独立，不跨 session。那用户如果第二次来咨询，你反正也不需要记得第一次。</p><p>说句实话我现在看到代码里有 <code>messages[-N:]</code> 这种直接切片的，都会把人叫过来谈话。</p><h2 id="策略-2：分级压缩（当前我用得最多）"><a href="#策略-2：分级压缩（当前我用得最多）" class="headerlink" title="策略 2：分级压缩（当前我用得最多）"></a>策略 2：分级压缩（当前我用得最多）</h2><p>分三层：</p><p><strong>L1 近期原文</strong>：最近 6-10 轮原封不动保留。</p><p><strong>L2 中期要点</strong>：倒数第 11-30 轮，每 3-4 轮生成一个小摘要，约 150 token 左右。这一层保留关键 entity、用户意图转折点、AI 已做的承诺。</p><p><strong>L3 远期摘要</strong>：30 轮以前整段压缩，约 500-800 token。这一层只保留”这场对话是关于什么、用户的核心诉求、已经解决和未解决的事项”。</p><p><strong>信息损失率实测</strong>：同样那 120 个 case，分级压缩的召回率 **84.2%**。比截断好太多。</p><p><strong>实现关键</strong>：</p><p>第一，L2 和 L3 的压缩 prompt 要完全不同。L2 是”请保留所有数字、日期、人名和具体诉求”，L3 是”请概括对话主题和已达成的共识，不超过 800 字”。粒度不一样。</p><p>第二，<strong>entity 白名单机制</strong>。压缩时显式提取出金额、时间、人名、地点、医疗术语、法律条文号，单独存成一个 entity list，和摘要一起喂回 context。这个机制救了我好几次。</p><p>第三，L2 不是一次性生成的，是<strong>增量更新</strong>。每 3 轮新对话来了之后，用 Haiku 对这 3 轮做小摘要，append 到 L2。而不是每次都重新压缩整段——太贵。</p><p><strong>成本</strong>：Haiku 4.5 做压缩一次 300 token 左右，成本 0.00012 美刀。一个 60 轮对话全程大概压 15 次，总成本 0.0018 刀。相比 Sonnet 的 input 费用节省 70% 以上。</p><p><strong>我踩的坑</strong>：最开始 L2 的摘要让 Haiku 自由发挥，结果它经常”优化”掉用户的原话。用户说”我觉得这个方案不错但有点贵”，压缩完变成”用户对方案表示满意”——“有点贵”这个关键反馈丢了。后来我在 prompt 里明确要求”保留用户的原始措辞，尤其是带情感倾向的表达”，才好转。</p><h2 id="策略-3：Entity-centric-compression（进阶）"><a href="#策略-3：Entity-centric-compression（进阶）" class="headerlink" title="策略 3：Entity-centric compression（进阶）"></a>策略 3：Entity-centric compression（进阶）</h2><p>这个策略是我从一个客户那里学来的，他们团队里有个做知识图谱出身的工程师。</p><p>核心思想：<strong>不压缩对话，而是从对话里抽取事实</strong>。</p><p>每轮对话结束后，跑一个抽取任务，产出形如：</p><div class="code-container" data-rel="Xml"><figure class="iseeu highlight xml"><table><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">facts</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">fact</span> <span class="attr">id</span>=<span class="string">&quot;f1&quot;</span> <span class="attr">type</span>=<span class="string">&quot;user_profile&quot;</span>&gt;</span>用户年龄 34 岁<span class="tag">&lt;/<span class="name">fact</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">fact</span> <span class="attr">id</span>=<span class="string">&quot;f2&quot;</span> <span class="attr">type</span>=<span class="string">&quot;preference&quot;</span>&gt;</span>偏好低风险投资<span class="tag">&lt;/<span class="name">fact</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">fact</span> <span class="attr">id</span>=<span class="string">&quot;f3&quot;</span> <span class="attr">type</span>=<span class="string">&quot;constraint&quot;</span>&gt;</span>每月最多投入 5000 元<span class="tag">&lt;/<span class="name">fact</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">fact</span> <span class="attr">id</span>=<span class="string">&quot;f4&quot;</span> <span class="attr">type</span>=<span class="string">&quot;decision&quot;</span>&gt;</span>用户已拒绝方案 A<span class="tag">&lt;/<span class="name">fact</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">facts</span>&gt;</span></span><br></pre></td></tr></table></figure></div><p>每个 fact 带 id、类型、原始对话轮次引用。</p><p>再下次对话时，context 里不放对话历史本身，而是放 fact list + 最近 3-5 轮原文。</p><p><strong>信息损失率实测</strong>：同样基准，召回率 **88.9%**。比分级压缩略高。但注意这个数字是在”精确引用”测试集上——如果测试集是”语气一致性””理解对话的情感脉络”这类软指标，entity-centric 反而不如分级压缩，因为它丢了语气。</p><p><strong>为什么强</strong>：</p><p>第一，可审计。每个 fact 可以追溯到原始对话。用户质疑”AI 为什么说我不吃辣”，你能精确定位。</p><p>第二，可修改。用户说”我改主意了，现在可以接受高风险”，你直接把 f2 覆盖掉。朴素摘要做不到这种精细更新。</p><p>第三，可组合。fact 库可以跨会话累积，变成用户画像。但这需要额外做<strong>冲突检测</strong>，上一篇文章讲过。</p><p><strong>什么时候别用</strong>：</p><p>任务如果高度依赖”情感连续性””语气”——比如陪伴聊天、创意写作——entity 抽取会把灵魂抽没。</p><p><strong>实现成本</strong>：比分级压缩高一倍。每轮后要跑一次抽取 + 每次请求前要拼接 fact list。但长期看收益更大，尤其配合 <a href="/posts/claude-md-project-config/">CLAUDE.md 这种项目级配置</a> 一起用。</p><h2 id="三种策略的成本-效果对比"><a href="#三种策略的成本-效果对比" class="headerlink" title="三种策略的成本-效果对比"></a>三种策略的成本-效果对比</h2><p>做了张表，是我这半年几个项目的实测均值（60-80 轮对话）：</p><table><thead><tr><th>策略</th><th>信息召回率</th><th>单会话压缩成本</th><th>实现复杂度</th><th>适用场景</th></tr></thead><tbody><tr><td>朴素截断</td><td>43.7%</td><td>0</td><td>极低</td><td>基本别用</td></tr><tr><td>分级压缩</td><td>84.2%</td><td>~$0.002</td><td>中</td><td>大部分通用场景</td></tr><tr><td>Entity-centric</td><td>88.9%</td><td>~$0.004</td><td>高</td><td>严肃决策场景</td></tr></tbody></table><p>我现在的默认选择：通用场景分级压缩，严肃场景 entity-centric。偶尔也会混用——近期用分级，远期用 entity 化的 fact list 兜底。</p><h2 id="对-Claude-ai-做法的一点推测"><a href="#对-Claude-ai-做法的一点推测" class="headerlink" title="对 Claude.ai 做法的一点推测"></a>对 Claude.ai 做法的一点推测</h2><p>Anthropic 没公开过 Claude.ai 里”记得住几个月前对话”功能的技术细节。但从我观察到的行为来看，我的猜测是这样的：</p><p>第一，用了 <strong>entity-centric 为主的记忆层</strong>。因为 Claude.ai 能精确回忆”你三周前跟我说你在学 Rust”这种细节，而且跨会话都能命中。这不像纯摘要能做到的。</p><p>第二，<strong>近期会话保留更多原文</strong>。同一个会话内前后文连贯性极好，断层罕见。这说明近期没过度压缩。</p><p>第三，有 <strong>用户可见的记忆管理入口</strong>。用户能看到、删除、修改记忆。这种 UX 暗示底层是结构化的 fact，不是黑盒摘要。</p><p>第四，<strong>召回是 LLM 主导的</strong>。对话中 Claude 会自己判断”要不要调用记忆”，而不是每次机械检索。这点和我上一篇写的 agent 记忆架构思路一致。</p><p>当然这都是我瞎猜，Anthropic 哪天发工程 blog 估计会把我打脸。但八九不离十。</p><h2 id="最后三条实操经验"><a href="#最后三条实操经验" class="headerlink" title="最后三条实操经验"></a>最后三条实操经验</h2><p><strong>第一，压缩模型要比主模型小一档。</strong> 主力用 Sonnet，压缩用 Haiku。用 Opus 做压缩是浪费。</p><p><strong>第二，摘要的 prompt 要版本化。</strong> 我在 repo 里专门有个 <code>prompts/summarization_v3.xml</code>，改动要走 review。因为摘要 prompt 直接决定了你的”记忆质量”，不是随便改的。</p><p><strong>第三，留一个”压缩旁路”。</strong> 关键决策点（用户下单、签约、投诉）的那几轮对话永远保留原文，不进压缩池。这种关键轮次的识别靠 Haiku 实时打标。</p><p>做记忆这件事最忌讳聪明过头，把简单问题做复杂。但更忌讳偷懒，把复杂问题做简单。压缩这一块，属于后者。</p><div class="cta-card" style="margin:32px 0;padding:20px 24px;background:#f0f7ff;border-left:4px solid #0c97fe;border-radius:6px;"><p style="margin:0 0 8px;font-weight:600;color:#1f2937;">延伸阅读</p><p style="margin:0;color:#4b5563;font-size:14px;line-height:1.8;">压缩策略上游是 [Context 预算拆桶](/posts/prompt-to-context-engineering/)，下游对接 [长期记忆架构](/posts/claude-md-project-config/)。压缩 prompt 的结构化输出强烈建议用 [XML 标签](/posts/prompt-xml-tags-claude-special/) 而非 Markdown。想省调用费，[Prompt Caching 深度指南](/posts/prompt-caching-deep-guide/) 配合分级压缩效果拔群——中期摘要那一段正好适合做缓存。</p></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/context-compression-summarization/</id>
    <link href="https://claude.cocoloop.cn/posts/context-compression-summarization/"/>
    <published>2026-04-17T02:54:10.000Z</published>
    <summary>长会话的压缩问题，表面看就是&quot;把旧消息总结一下嘛&quot;，实际做起来一堆坑。截断丢信息、朴素摘要会漏掉关键 entity、中期记忆和远期记忆的密度应该不一样。这篇把我手上三个真实项目的 AB 实验数据拿出来对比，实测三种压缩方案的信息损失率，还有我对 Anthropic 在 Claude.ai 里怎么做的一点推测。</summary>
    <title>聊天历史越滚越长怎么办？3 种压缩策略 AB 对比</title>
    <updated>2026-04-21T09:54:10.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="MCP" scheme="https://claude.cocoloop.cn/categories/MCP/"/>
    <category term="MCP" scheme="https://claude.cocoloop.cn/tags/MCP/"/>
    <category term="安全" scheme="https://claude.cocoloop.cn/tags/%E5%AE%89%E5%85%A8/"/>
    <category term="生产部署" scheme="https://claude.cocoloop.cn/tags/%E7%94%9F%E4%BA%A7%E9%83%A8%E7%BD%B2/"/>
    <category term="事故复盘" scheme="https://claude.cocoloop.cn/tags/%E4%BA%8B%E6%95%85%E5%A4%8D%E7%9B%98/"/>
    <content>
      <![CDATA[<p>2025 年 11 月某个周二下午 3 点 47 分，一家客户的 CTO 给我打电话，声音有点抖。</p><p>“我们 staging 库一张 order_log 表没了，就刚才的事。Claude Code agent 调了咱们搓的那个 <code>db_query</code> MCP tool，不知道怎么执行了 truncate。”</p><p>那张表 21.4K 行，虽然只是 staging，但包含了 QA 组两周的测试数据。复盘完之后我整理了一套 MCP server 安全检查清单，现在我们团队所有 server 上生产前必须过这 6 项。</p><p>这篇没有理论，全是踩坑换来的。</p><h2 id="事故复盘：Agent-是怎么把表删了的"><a href="#事故复盘：Agent-是怎么把表删了的" class="headerlink" title="事故复盘：Agent 是怎么把表删了的"></a>事故复盘：Agent 是怎么把表删了的</h2><p>先讲清楚那次怎么翻车的，后面的检查项才有上下文。</p><p>那个 <code>db_query</code> MCP tool 原始设计：</p><div class="code-container" data-rel="Typescript"><figure class="iseeu highlight typescript"><table><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">&#123;</span><br><span class="line">  <span class="attr">name</span>: <span class="string">&quot;db_query&quot;</span>,</span><br><span class="line">  <span class="attr">description</span>: <span class="string">&quot;在数据库上执行 SQL 查询&quot;</span>,</span><br><span class="line">  <span class="attr">inputSchema</span>: &#123;</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&quot;object&quot;</span>,</span><br><span class="line">    <span class="attr">properties</span>: &#123; <span class="attr">sql</span>: &#123; <span class="attr">type</span>: <span class="string">&quot;string&quot;</span> &#125; &#125;,</span><br><span class="line">    <span class="attr">required</span>: [<span class="string">&quot;sql&quot;</span>],</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p>连接的是 staging 数据库的 read-write 账号。工程师 A 给 LLM 发了个需求：”帮我看下 order_log 表最近一周有多少行被标记为 test_data”。</p><p>LLM 的操作链：</p><ol><li>调 <code>db_query</code> 跑了 <code>SELECT COUNT(*) FROM order_log WHERE tag=&#39;test_data&#39;</code>，返回 17 行</li><li>用户后续说”这几行清掉吧”</li><li>LLM 调 <code>db_query</code> 跑 <code>DELETE FROM order_log WHERE tag=&#39;test_data&#39;</code></li><li>返回报错：”tag 列有 NULL 约束冲突”（实际是权限问题提示不明确）</li><li>LLM 自己推理”可能要先清空再重建”，跑了 <code>TRUNCATE TABLE order_log</code></li><li>成功</li></ol><p>工程师 A 盯着另一个窗口写代码，10 几分钟后才反应过来。</p><p>事后我们 review 了这个决策链，LLM 的每一步”单独看”都不离谱，合起来就是灾难。问题出在：<strong>tool 的权限边界过大 + 没有 dry-run + 没有限流 + 审计缺失</strong>。</p><h2 id="检查项-1：输入校验（tool-参数别裸信）"><a href="#检查项-1：输入校验（tool-参数别裸信）" class="headerlink" title="检查项 1：输入校验（tool 参数别裸信）"></a>检查项 1：输入校验（tool 参数别裸信）</h2><p>最基础但最容易漏。LLM 传过来的 tool 参数是<strong>不可信输入</strong>，必须校验。</p><p>上面那个 <code>db_query</code> 最起码应该：</p><div class="code-container" data-rel="Typescript"><figure class="iseeu highlight typescript"><table><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title class_">SqlSchema</span> = z.<span class="title function_">object</span>(&#123;</span><br><span class="line">  <span class="attr">sql</span>: z.<span class="title function_">string</span>()</span><br><span class="line">    .<span class="title function_">max</span>(<span class="number">8000</span>)</span><br><span class="line">    .<span class="title function_">refine</span>(<span class="function"><span class="params">s</span> =&gt;</span> !<span class="regexp">/\b(DROP|TRUNCATE|DELETE|ALTER|GRANT)\b/i</span>.<span class="title function_">test</span>(s), &#123;</span><br><span class="line">      <span class="attr">message</span>: <span class="string">&quot;危险 SQL 关键字，请用专用 tool&quot;</span>,</span><br><span class="line">    &#125;),</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></div><p>或者更狠一点，直接只允许 SELECT：</p><div class="code-container" data-rel="Typescript"><figure class="iseeu highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.<span class="title function_">refine</span>(<span class="function"><span class="params">s</span> =&gt;</span> <span class="regexp">/^\s*SELECT\b/i</span>.<span class="title function_">test</span>(s.<span class="title function_">trim</span>()))</span><br></pre></td></tr></table></figure></div><p>写 MCP tool 的时候脑子里要有这个模型：<strong>你不是在写 API，你是在给一个会自由组合 tool 的 AI Agent 开权限口子</strong>。Agent 会以你想不到的方式组合调用。</p><h2 id="检查项-2：Secrets-管理（凭证不能塞-config）"><a href="#检查项-2：Secrets-管理（凭证不能塞-config）" class="headerlink" title="检查项 2：Secrets 管理（凭证不能塞 config）"></a>检查项 2：Secrets 管理（凭证不能塞 config）</h2><p>见过太多次 <code>claude_desktop_config.json</code> 里直接写 API key。文件不加密、可能被同步到 iCloud、被误 commit 到 git。</p><p>正确做法：</p><ul><li>开发机：<code>env</code> 字段 + 系统 keychain（macOS）或 DPAPI（Windows）</li><li>生产机：MCP server 启动时从 Vault&#x2F;AWS Secrets Manager 拉</li><li><strong>绝不</strong>：把 key 写进 server 代码、写进 tool description、写进 log</li></ul><p>MCP server 启动流程应该是这样：</p><div class="code-container" data-rel="Typescript"><figure class="iseeu highlight typescript"><table><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="keyword">const</span> dbUrl = <span class="keyword">await</span> <span class="title function_">fetchSecret</span>(<span class="string">&quot;prod/db/readonly-url&quot;</span>);</span><br><span class="line"><span class="comment">// 不要 console.log(dbUrl)</span></span><br></pre></td></tr></table></figure></div><p>另外一个容易忽略的：MCP server 的 <code>tools/list</code> 返回给客户端的 description 里不要包含任何环境信息（”连接到 prod-us-east-1 的 xxx 集群”），这会经过 LLM、可能被日志到 Anthropic 侧。</p><h2 id="检查项-3：权限边界（只读-vs-读写-server-分离）"><a href="#检查项-3：权限边界（只读-vs-读写-server-分离）" class="headerlink" title="检查项 3：权限边界（只读 vs 读写 server 分离）"></a>检查项 3：权限边界（只读 vs 读写 server 分离）</h2><p>这是那次事故之后我们组的硬性规定。</p><p><strong>一个 MCP server 只承担一种权限级别</strong>：</p><ul><li><code>company-db-readonly</code>：只连 read-only DB 账号、只有 SELECT tools</li><li><code>company-db-readwrite</code>：独立 server，连 RW 账号、提供 INSERT&#x2F;UPDATE tools（<strong>不提供 DELETE&#x2F;TRUNCATE</strong>）</li><li><code>company-db-admin</code>：独立 server、独立审批流程、默认不启用</li></ul><p>用户要用到高权限 server 时，在 config 里显式启用。LLM 永远看不到 admin tools 除非用户主动开。</p><p>这个设计的额外好处是：你可以在 Claude Code 的 <code>.mcp.json</code> 里按项目控制——开发项目只挂 read-only、运维项目才挂 read-write。配合 <a href="/posts/claude-code-permissions-sandbox/">Claude Code 权限沙箱</a> 里的二级保护，基本不会出大事。</p><h2 id="检查项-4：审计日志（谁在什么时候调了什么-tool）"><a href="#检查项-4：审计日志（谁在什么时候调了什么-tool）" class="headerlink" title="检查项 4：审计日志（谁在什么时候调了什么 tool）"></a>检查项 4：审计日志（谁在什么时候调了什么 tool）</h2><p>事故那次最抓狂的是：我们花了 40 多分钟才定位是哪个 tool 哪条 SQL 干的好事，因为没有统一日志。</p><p>正确的审计结构，每次 tool call 至少记录：</p><div class="code-container" data-rel="Json"><figure class="iseeu highlight json"><table><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">&#123;</span></span><br><span class="line">  <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="string">&quot;2026-04-15T08:23:17.284Z&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;db-readonly&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;tool&quot;</span><span class="punctuation">:</span> <span class="string">&quot;db_query&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;args_hash&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sha256:8a3f...&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;args_size_bytes&quot;</span><span class="punctuation">:</span> <span class="number">342</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;caller&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;client&quot;</span><span class="punctuation">:</span> <span class="string">&quot;claude-desktop&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;session_id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;xxx&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;user_hint&quot;</span><span class="punctuation">:</span> <span class="string">&quot;joe@company.com&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;result_status&quot;</span><span class="punctuation">:</span> <span class="string">&quot;ok&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;duration_ms&quot;</span><span class="punctuation">:</span> <span class="number">127</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></div><p>关键字段：</p><ul><li><code>args_hash</code> 而不是原文（避免日志泄露敏感参数）</li><li><code>user_hint</code> 从 MCP client 侧传过来（很多 MCP 客户端支持带用户上下文）</li><li><code>duration_ms</code> 方便发现异常</li></ul><p>日志存到公司统一日志平台，保留 90 天起步。出事了至少能查。</p><h2 id="检查项-5：Rate-limit-Quota（防-Agent-失控爆-API）"><a href="#检查项-5：Rate-limit-Quota（防-Agent-失控爆-API）" class="headerlink" title="检查项 5：Rate limit &amp; Quota（防 Agent 失控爆 API）"></a>检查项 5：Rate limit &amp; Quota（防 Agent 失控爆 API）</h2><p>Agent 一跑起来可能一分钟调你 tool 几十次，这在人类 API 用户那边几乎不可能。</p><p>我见过最离谱的一次：某客户的 Claude Code agent 接了个 Slack MCP server，写代码的时候 stuck 住、反复调 <code>list_channels</code> 去”探索环境”，<strong>11 分钟调了 2847 次</strong>，把公司 Slack API quota 直接干穿了，整个公司 Slack bot 半小时不能用。</p><p>两层防护：</p><p><strong>server 侧</strong>：每个 tool 按 session+tool 组合限流，比如 60 次&#x2F;分钟。超过直接返回错误让 Agent 退避。</p><div class="code-container" data-rel="Typescript"><figure class="iseeu highlight typescript"><table><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"><span class="keyword">if</span> (<span class="title function_">callCountThisMinute</span>(sessionId, toolName) &gt; <span class="number">60</span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> &#123; <span class="attr">isError</span>: <span class="literal">true</span>, <span class="attr">content</span>: [&#123; <span class="attr">type</span>: <span class="string">&quot;text&quot;</span>, </span><br><span class="line">    <span class="attr">text</span>: <span class="string">&quot;Rate limited: 60 calls/min exceeded. Wait or use batch tool.&quot;</span> &#125;] &#125;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><p><strong>下游 API 侧</strong>：给 MCP server 配独立的 API key、独立 quota，爆了只影响 Agent 场景不影响业务。</p><h2 id="检查项-6：依赖漏洞（MCP-生态早期-npm-包质量参差）"><a href="#检查项-6：依赖漏洞（MCP-生态早期-npm-包质量参差）" class="headerlink" title="检查项 6：依赖漏洞（MCP 生态早期 npm 包质量参差）"></a>检查项 6：依赖漏洞（MCP 生态早期 npm 包质量参差）</h2><p>MCP 火是 2024 年底的事，整个生态还很年轻。到 2026 年 4 月 npm 上 MCP 相关包有 840+ 个，但质量分布极其分散。</p><p>我扫过一次：top 100 包里 23 个有已知中高危漏洞（npm audit 高或严重），17 个最近 6 个月没更新，9 个连 README 都没有。</p><p>上生产前必须做的事：</p><ul><li><code>npm audit</code> 跑一遍，高危必须修</li><li>看 package 的 weekly downloads 和 maintainers 数量（单人维护的小包慎用）</li><li>看最近 commit 日期（6 个月没动的包视为不活跃）</li><li>考虑用 <code>socket.dev</code> 这类 supply chain 工具扫</li></ul><p>Python 生态同理，<code>pip-audit</code> 跑一遍。</p><h2 id="一个上线-checklist"><a href="#一个上线-checklist" class="headerlink" title="一个上线 checklist"></a>一个上线 checklist</h2><p>我们团队现在每个 MCP server 上生产前对照走一遍：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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">[ ] 所有 tool 参数都有 zod/pydantic 校验</span><br><span class="line">[ ] 危险操作（DROP/DELETE/rm -rf 类）显式禁用或单独 server</span><br><span class="line">[ ] Secrets 走 Vault/Secrets Manager，代码里 grep 不到明文</span><br><span class="line">[ ] 读写权限分离成独立 server</span><br><span class="line">[ ] 每次 tool call 写审计日志，args 用 hash</span><br><span class="line">[ ] tool 粒度的 rate limit，超限返回明确错误</span><br><span class="line">[ ] 依赖包 npm audit/pip-audit 通过，无高危</span><br><span class="line">[ ] Inspector 手动验过所有 tool 的错误路径</span><br><span class="line">[ ] 挂到测试 Claude Code/Desktop 跑过一周内测</span><br></pre></td></tr></table></figure></div><p>9 项都过了才放生产。</p><p>另外强烈推荐搭配 <a href="/posts/claude-code-permissions-sandbox/">Claude Code 权限沙箱</a> 做运行时隔离——哪怕 MCP server 本身有 bug，沙箱能兜住。两层防护比一层可靠得多。</p><h2 id="最后说一句"><a href="#最后说一句" class="headerlink" title="最后说一句"></a>最后说一句</h2><p>那次事故之后客户问我：”你们早怎么不告诉我这些？”</p><p>我说：”说实话，MCP 生态起来才一年多，很多坑是我们自己也刚踩的。”</p><p>这篇文章写出来，就是希望下一个踩坑的人不是你。如果觉得有用，分享给团队一起看看。</p><div style="background:#f0f7ff;border-left:4px solid #0c97fe;padding:18px 22px;margin:28px 0;border-radius:6px;">MCP 安全是个系统工程，6 项只是起点。强烈推荐接着看 <a href="/posts/claude-code-permissions-sandbox/">Claude Code 权限沙箱</a> 做第二层防护，<a href="/posts/claude-code-subagents-orchestration/">Subagent 编排</a> 可以做危险操作的二次确认路径。做企业级部署务必把这三篇当一个整体看。</div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/mcp-security-best-practice/</id>
    <link href="https://claude.cocoloop.cn/posts/mcp-security-best-practice/"/>
    <published>2026-04-16T16:45:03.000Z</published>
    <summary>去年帮一家公司救过一次火，Agent 调 MCP server 里一个&quot;友好&quot;的 SQL tool，把 staging 库一张 21.4K 行的表 truncate 了。复盘完我整理了 6 个必须过的安全检查项。这篇不讲理论，全是血的教训——输入校验、secrets 管理、权限边界、审计、限流、依赖漏洞，挨个说清楚怎么做。</summary>
    <title>MCP server 上生产之前这 6 个安全检查项必须过</title>
    <updated>2026-04-20T06:45:03.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Claude-Code" scheme="https://claude.cocoloop.cn/categories/Claude-Code/"/>
    <category term="Claude Code" scheme="https://claude.cocoloop.cn/tags/Claude-Code/"/>
    <category term="CLAUDE.md" scheme="https://claude.cocoloop.cn/tags/CLAUDE-md/"/>
    <category term="配置文件" scheme="https://claude.cocoloop.cn/tags/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/"/>
    <category term="最佳实践" scheme="https://claude.cocoloop.cn/tags/%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/"/>
    <content>
      <![CDATA[<p>第一次用 Claude Code 的时候，我根本不知道 CLAUDE.md 是干啥的。项目根目录莫名其妙多了个文件，我以为是 Claude Code 的缓存，还一度想把它丢进 .gitignore。</p><p>后来在一次协作翻车之后我才意识到这东西有多重要。那次的情况是：我和同事在同一个 repo 里协作，我本地跑 Claude Code 改一个接口改得风生水起，他拉下来跑的时候却发现 Claude Code 一直把代码往完全错误的方向推。排查了俩小时才搞明白——我本地有一份 CLAUDE.md，里面写了一堆项目约定；他没有这份文件（我没 commit），所以他的 Claude 完全不知道这个项目的规矩，只能按通用最佳实践瞎写。</p><p>从那天起我开始认真研究 CLAUDE.md。这东西本质上是给 Claude Code 的<strong>项目说明书</strong>，写得好能让 AI 协作翻倍提效，写得不好能把 AI 带到沟里。这篇把我这半年的经验总结一下。</p><h2 id="一、CLAUDE-md-是什么，为什么重要"><a href="#一、CLAUDE-md-是什么，为什么重要" class="headerlink" title="一、CLAUDE.md 是什么，为什么重要"></a>一、CLAUDE.md 是什么，为什么重要</h2><p>简单说，CLAUDE.md 是 Claude Code 在启动时会自动读入、作为 system context 的一部分注入到模型的文件。它告诉 Claude：</p><ul><li>这个项目用什么技术栈</li><li>代码风格有什么约定</li><li>哪些文件&#x2F;目录不能动</li><li>常用命令是什么（跑测试、部署、lint）</li><li>有什么”坑”要提前知道</li></ul><p><strong>它解决的核心问题是：让 Claude 在一个陌生项目里不再按通用默认行事，而是按这个项目的规矩行事</strong>。</p><p>你可以理解成”给新人入职的 README，只不过读者是 AI”。</p><p>但和 README 有一个关键区别——<strong>README 是可选阅读，CLAUDE.md 是强制注入</strong>。意味着你写进去的每一个字都会消耗 token、都会影响模型行为。这就决定了 CLAUDE.md 不能当 README 写，它必须更精炼、更有指令性。</p><h2 id="二、11-级优先级：从哪读到哪"><a href="#二、11-级优先级：从哪读到哪" class="headerlink" title="二、11 级优先级：从哪读到哪"></a>二、11 级优先级：从哪读到哪</h2><p>这个东西官方文档藏得有点深，我整理一下我理解的顺序（从高到低，高优先级会覆盖低优先级）：</p><ol><li><strong>当前命令的 CLI 参数</strong> —— 最高优先级，临时强制</li><li><strong><code>.claude/settings.local.json</code></strong> —— 本地机器的 Claude 配置（不入 git）</li><li><strong>项目根 <code>CLAUDE.md</code></strong> —— 当前项目规则</li><li>**父目录 <code>CLAUDE.md</code>**（monorepo 场景）</li><li><strong>祖父目录 <code>CLAUDE.md</code></strong> —— 依次往上找到 repo 根或 home</li><li><strong><code>~/.claude/CLAUDE.md</code></strong> —— 用户级全局配置</li><li><strong><code>.claude/settings.json</code></strong> —— 项目共享配置</li><li><strong><code>~/.claude/settings.json</code></strong> —— 用户全局配置  </li><li><strong>环境变量</strong>（如 <code>ANTHROPIC_MODEL</code>）</li><li><strong>Claude Code 内置默认</strong></li><li><strong>模型本身的 default behavior</strong> —— 最底层兜底</li></ol><p>这个顺序不用硬记，但要理解两条核心原则：</p><ul><li><strong>越具体、越靠近当前文件的，优先级越高</strong></li><li><strong>项目级（CLAUDE.md）和用户级（~&#x2F;.claude）会叠加，但冲突时项目级优先</strong></li></ul><p>实际用起来有一个容易忽略的细节——<strong>Claude Code 在启动时会自顶向下把所有层级的 CLAUDE.md 串联起来</strong>，不是只读最近的那一份。这意味着你在子目录里的 CLAUDE.md 不是”覆盖”祖父目录的，而是”追加”。如果祖父目录写了”代码注释用中文”，子目录里不写相关规则，那中文注释规则依然生效。</p><p>这个机制在 monorepo 场景下特别有用。你可以在 repo 根写通用规则（”所有包都用 TypeScript strict 模式”），然后在每个 package 子目录里写各自的特殊规则（”api 包禁止引入 zod 之外的 validation 库”）。</p><h2 id="三、坑-1：写得太多，反而把-Claude-整懵了"><a href="#三、坑-1：写得太多，反而把-Claude-整懵了" class="headerlink" title="三、坑 1：写得太多，反而把 Claude 整懵了"></a>三、坑 1：写得太多，反而把 Claude 整懵了</h2><p>这是我第一个大坑。发现 CLAUDE.md 好用之后，我开始往里面疯狂写东西——项目架构、技术栈细节、每个目录的作用、每个核心函数的职责、过往几次重构的历史……写到快 2000 行。</p><p>然后 Claude Code 开始变得<strong>又慢又飘</strong>。</p><p>原因很简单：<strong>CLAUDE.md 是要完整注入到每次请求的 context 里的</strong>。你写 2000 行，意味着每次 Claude 启动都要消化这 2000 行。问题是：</p><ul><li><strong>信息太多，重点被稀释</strong>。关键规则（比如”不要改 legacy_util.py”）被淹没在一堆描述性内容里</li><li><strong>Token 成本爆炸</strong>。2000 行大概 15K token，每次请求都是这个基础成本</li><li>**模型开始”过度解读”**。写得越多，Claude 越容易从无关内容里脑补奇怪的推论</li><li><strong>维护成本翻倍</strong>。项目演化时，你要同步更新 CLAUDE.md，内容越多越容易遗漏</li></ul><p>我后来把 CLAUDE.md 砍到 150 行以内，执行规则、关键约束、常用命令——其他什么都不写。效果立刻恢复正常，而且 Claude 的判断更稳定了。</p><p><strong>原则：CLAUDE.md 写关键信息，不写全部信息</strong>。详细架构文档放 docs&#x2F; 目录，让 Claude 需要的时候自己去读。你可以在 CLAUDE.md 里留一句：<code>需要深入了解架构时，请先阅读 /docs/architecture.md</code>，把”读不读”的判断权交给模型。</p><p>有人问过我具体怎么判断该不该写进 CLAUDE.md。我的标准是——<strong>如果 Claude 不知道这条规则就有可能写出错误代码，才写进去；如果只是”知道了更好”的背景信息，不写</strong>。这个筛选标准帮我砍掉了 80% 的冗余内容。</p><h2 id="四、坑-2：user-级和项目级配置打架"><a href="#四、坑-2：user-级和项目级配置打架" class="headerlink" title="四、坑 2：user 级和项目级配置打架"></a>四、坑 2：user 级和项目级配置打架</h2><p>第二个坑更隐蔽。</p><p>我在 <code>~/.claude/CLAUDE.md</code> 里写了我个人的偏好——比如”回答我时默认用中文””代码注释用中文””import 顺序按 isort 风格”等等。这是我的个人习惯。</p><p>但有一次我接了一个外包项目，他们的 repo 里有自己的 CLAUDE.md，明确写了”代码注释一律英文”。结果：我本地 Claude 写出来的代码里，注释一会儿中文一会儿英文，完全不统一。</p><p>排查后发现问题是——<strong>两个文件的规则都被注入了</strong>，然后 Claude 自己做了一个折中：”一部分用中文，一部分用英文”。</p><p>解决思路：</p><p>**1. 把 user 级 CLAUDE.md 写成”偏好”而不是”规则”**。<br>用 “我通常更喜欢…” 这种语气，不用 “必须…” 这种硬性措辞。这样项目级规则能比较干净地覆盖它。</p><p><strong>2. 项目级 CLAUDE.md 明确声明优先级</strong>。<br>我现在写项目级 CLAUDE.md 的第一行一般是：</p><div class="code-container" data-rel="Markdown"><figure class="iseeu highlight markdown"><table><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="section"># 项目规则</span></span><br><span class="line"></span><br><span class="line">本文件中的所有规则优先于 user-level CLAUDE.md。冲突时以本文件为准。</span><br></pre></td></tr></table></figure></div><p>显式写出来，模型会认账。</p><p><strong>3. 真的要强制，用 <code>--override-user-memory</code></strong> 启动参数（这个 flag 从某个版本开始支持，具体版本号我不确定，先试再说）</p><p><strong>4. 做好 user 级配置的定期清理</strong>。<br>我现在每季度会把 <code>~/.claude/CLAUDE.md</code> 重读一遍，删掉那些已经不符合自己当前工作习惯的老规则。这个文件一旦塞多了很容易被遗忘，时间一长就变成各种项目的”通用毒瘤”。</p><p>再补一个小技巧：如果你经常切换不同客户&#x2F;团队的项目，可以在 <code>~/.claude/CLAUDE.md</code> 里完全不写任何强规则，只写自己的<strong>语言偏好</strong>和<strong>沟通风格偏好</strong>。技术决策全部交给项目级 CLAUDE.md 去定，冲突就少了。</p><h2 id="五、坑-3：-include-循环与隐式依赖"><a href="#五、坑-3：-include-循环与隐式依赖" class="headerlink" title="五、坑 3：@include 循环与隐式依赖"></a>五、坑 3：@include 循环与隐式依赖</h2><p>CLAUDE.md 支持 <code>@path/to/file</code> 语法，可以把其他文件的内容拉进来。这玩意儿很强大，但我踩过一个搞笑的坑。</p><p>当时我为了复用，把一些通用规则写在 <code>~/.claude/common.md</code> 里，然后 user 级 CLAUDE.md 里写：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@~/.claude/common.md</span><br></pre></td></tr></table></figure></div><p>项目级 CLAUDE.md 里也想复用，又写：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@~/.claude/common.md</span><br></pre></td></tr></table></figure></div><p>结果 common.md 被 include 了两次，规则重复。Claude 看到”代码风格 A”出现两次，当作重要信号，反而开始过度强调这个规则。</p><p>更惨的情况是：我有一次 common.md 里 include 了 base.md，base.md 里又 include 了 common.md，形成循环。Claude Code 直接报错启动不了。</p><p><strong>原则：</strong></p><ul><li><strong>@include 要有层级意识</strong>。下游 include 上游，不要互相 include</li><li><strong>不要重复 include 同一个文件</strong></li><li><strong>深层嵌套尽量避免</strong>。一级 include 够用了，两级以上容易出事</li><li><strong>include 进来的内容也要算 token</strong>。有人以为 @include 是懒加载——错了，是 eager 的，启动就全部注入</li></ul><p>一个实用建议：<strong>如果你想做规则复用，与其用 @include，不如用 shell script 在启动时生成 CLAUDE.md</strong>。把”规则碎片库”放在一个统一目录，写一个脚本根据当前项目类型拼装出定制化 CLAUDE.md。这比 @include 的控制力强一个数量级。</p><h2 id="六、一个我实际在用的-CLAUDE-md-模板"><a href="#六、一个我实际在用的-CLAUDE-md-模板" class="headerlink" title="六、一个我实际在用的 CLAUDE.md 模板"></a>六、一个我实际在用的 CLAUDE.md 模板</h2><p>这是我现在大部分 Node &#x2F; TypeScript 项目的骨架：</p><div class="code-container" data-rel="Markdown"><figure class="iseeu highlight markdown"><table><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></pre></td><td class="code"><pre><span class="line"><span class="section"># [项目名] — CLAUDE.md</span></span><br><span class="line"></span><br><span class="line">本文件优先于 user-level CLAUDE.md。</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">## 技术栈</span></span><br><span class="line"><span class="bullet">-</span> Runtime: Node 20</span><br><span class="line"><span class="bullet">-</span> Framework: Fastify 5</span><br><span class="line"><span class="bullet">-</span> ORM: Drizzle</span><br><span class="line"><span class="bullet">-</span> Test: Vitest</span><br><span class="line"></span><br><span class="line"><span class="section">## 关键约束</span></span><br><span class="line"><span class="bullet">-</span> 所有对外 API 必须有 zod schema 校验</span><br><span class="line"><span class="bullet">-</span> 禁止引入新的第三方 validation 库（我们用 zod）</span><br><span class="line"><span class="bullet">-</span> 数据库迁移走 drizzle-kit，不手动改 schema</span><br><span class="line"></span><br><span class="line"><span class="section">## 不要改</span></span><br><span class="line"><span class="bullet">-</span> <span class="code">`/src/legacy/`</span> 目录下所有文件（迁移中，容易出事）</span><br><span class="line"><span class="bullet">-</span> <span class="code">`package.json`</span> 里的 node 版本</span><br><span class="line"></span><br><span class="line"><span class="section">## 常用命令</span></span><br><span class="line"><span class="bullet">-</span> 跑测试：<span class="code">`pnpm test`</span></span><br><span class="line"><span class="bullet">-</span> 起开发：<span class="code">`pnpm dev`</span></span><br><span class="line"><span class="bullet">-</span> 数据库迁移：<span class="code">`pnpm db:migrate`</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 风格</span></span><br><span class="line"><span class="bullet">-</span> import 用绝对路径（<span class="code">`@/xxx`</span>）</span><br><span class="line"><span class="bullet">-</span> 错误用 Result 类型，不 throw</span><br><span class="line"><span class="bullet">-</span> 文件名用 kebab-case</span><br><span class="line"></span><br><span class="line"><span class="section">## 遇到不确定的时候</span></span><br><span class="line"><span class="bullet">-</span> 先看 <span class="code">`/docs/architecture.md`</span></span><br><span class="line"><span class="bullet">-</span> 新增 API 前先看 <span class="code">`/src/api/_template.ts`</span></span><br></pre></td></tr></table></figure></div><p>这份大概 50 行左右。不追求完整，追求关键。</p><p>展开一下每个小节的写作原则：</p><ul><li><strong>项目本质</strong>：一句话就够，目的是给 Claude 一个定位锚点</li><li><strong>技术栈</strong>：只列关键版本，不写”为什么选这个”</li><li><strong>关键约束</strong>：写死的红线，违反了一定有问题</li><li><strong>不要改</strong>：负面清单，明确点名</li><li><strong>常用命令</strong>：Claude 要跑测试、lint 时直接复制这些命令，不用猜</li><li><strong>风格</strong>：写 3-5 条最重要的风格偏好，多了反而模糊</li><li><strong>遇到不确定的时候</strong>：告诉 Claude 要去哪看，相当于给它的”自助服务入口”</li></ul><h2 id="七、配合-Claude-Code-的几个小技巧"><a href="#七、配合-Claude-Code-的几个小技巧" class="headerlink" title="七、配合 Claude Code 的几个小技巧"></a>七、配合 Claude Code 的几个小技巧</h2><p><strong>1. 把 CLAUDE.md 放进 git</strong>。<br>这应该是常识但很多人不做。这东西不 commit，团队协作就废了。</p><p><strong>2. 定期 review</strong>。<br>项目演化，CLAUDE.md 也要演化。我每两周会打开 CLAUDE.md 看一眼，删掉已经不适用的规则、补上新的坑。这东西不是一次性写完就完事的。</p><p><strong>3. 新人加入项目时让 Claude 读一遍 CLAUDE.md 做导读</strong>。<br>这招挺好用——直接让 Claude 基于 CLAUDE.md 给新人做一次项目 walkthrough，省了半天时间。</p><p>**4. 结合 <code>.claude/commands/</code>**。<br>把常用的 prompt 做成 slash command，这块和 CLAUDE.md 配合使用效率爆炸。详细玩法我之前在 <a href="/categories/Claude-Code/">Claude-Code 分类</a> 下的几篇文章里讲过。</p><p>**5. 给 CLAUDE.md 加一个”更新日期”**。<br>在文件顶部或底部写一行 <code>最后更新：2026-04-15</code>，Claude 看到会自动把这个时间点作为”当前项目约定的参考线”。老旧 CLAUDE.md 如果没标时间，很容易误导模型。</p><p>**6. 善用 CLAUDE.md 做 Claude 的”行为纠偏”**。<br>如果你发现 Claude 某个行为反复让你不爽（比如老是主动改你没让改的文件），就在 CLAUDE.md 里加一条明确禁止。这个文件不仅是项目说明，也是你和 Claude 之间的”行为协议”。</p><h2 id="八、最后"><a href="#八、最后" class="headerlink" title="八、最后"></a>八、最后</h2><p>CLAUDE.md 这个东西的价值，在于它让 AI 协作<strong>有了项目特化的能力</strong>。通用大模型有它的通用智能，但每个项目有每个项目的土规矩，这些土规矩靠 prompt 临时讲讲讲不完，靠文档让 AI 自己去读效率又低——CLAUDE.md 就是那个<strong>固化土规矩</strong>的载体。</p><p>写好它的核心心法就一句话：<strong>写关键信息，不写全部信息；写规则，不写描述</strong>。</p><p>想看更多 Claude Code 的实战玩法，<a class="link"   href="https://claudecode.cocoloop.cn/" >claudecode.cocoloop.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 是一个专门做深度内容聚合的站点，我平时也会去翻那边的更新；想看国内 AI 工程师社区的讨论可以去 <a class="link"   href="https://ask.cocoloop.cn/" >ask.cocoloop.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 看看。</p><p>再送一个彩蛋——<strong>CLAUDE.md 其实也适合用在非 Claude Code 的场景</strong>。我现在很多个人项目的仓库根目录都放一份 CLAUDE.md，哪怕我暂时不用 Claude Code，只是用网页版 Claude。需要让 AI 理解这个项目时，直接把 CLAUDE.md 内容贴进对话框作为 system prompt 就好了。这个文件正在慢慢变成一种<strong>跨工具的项目元信息标准</strong>。</p><div class="cta-card">  <div class="cta-title">Claude Code 深度玩家都在看</div>  <div class="cta-desc">本站 Claude-Code 板块持续更新实战玩法。想看 Claude Code 专题深度内容，访问 <a class="link"   href="https://claudecode.cocoloop.cn/" >claudecode.cocoloop.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>；想在中文社区里问问题，去 <a class="link"   href="https://ask.cocoloop.cn/" >ask.cocoloop.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>。</div></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/claude-md-project-config/</id>
    <link href="https://claude.cocoloop.cn/posts/claude-md-project-config/"/>
    <published>2026-04-15T04:46:53.000Z</published>
    <summary>CLAUDE.md 是 Claude Code 的项目级配置，一共有 11 层优先级。我从完全不写到瞎堆一气到终于写对，踩过三个大坑：配置过载、user 级冲突、@include 循环。这篇给模板和避坑指南。</summary>
    <title>CLAUDE.md 写法大全：11 级优先级与我踩过的三个大坑</title>
    <updated>2026-04-21T15:38:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Skills" scheme="https://claude.cocoloop.cn/categories/Skills/"/>
    <category term="A/B 测试" scheme="https://claude.cocoloop.cn/tags/A-B-%E6%B5%8B%E8%AF%95/"/>
    <category term="Claude Skill" scheme="https://claude.cocoloop.cn/tags/Claude-Skill/"/>
    <category term="实验设计" scheme="https://claude.cocoloop.cn/tags/%E5%AE%9E%E9%AA%8C%E8%AE%BE%E8%AE%A1/"/>
    <category term="转化率优化" scheme="https://claude.cocoloop.cn/tags/%E8%BD%AC%E5%8C%96%E7%8E%87%E4%BC%98%E5%8C%96/"/>
    <category term="统计显著性" scheme="https://claude.cocoloop.cn/tags/%E7%BB%9F%E8%AE%A1%E6%98%BE%E8%91%97%E6%80%A7/"/>
    <content>
      <![CDATA[<p>做过几年增长的人都有这个体感：A&#x2F;B 测试这个话题本身并不难，难的是**每次开会有人冒出来一句”我觉得这个改动不用测，我们直接上吧”**。或者另一个极端，”测一下看看”，然后跑出一个 52% vs 48% 的结果就开香槟。<code>ab-test-setup</code> 这个 Skill 不是给你写实验脚本的，它是把上述两种极端都堵上的一个检查清单。把过去半年团队里反复争执的 9 个问题拎出来，用这个 Skill 对应章节回答一遍。</p><h2 id="Q1：这个改动很明显会更好，还要测吗？"><a href="#Q1：这个改动很明显会更好，还要测吗？" class="headerlink" title="Q1：这个改动很明显会更好，还要测吗？"></a>Q1：这个改动很明显会更好，还要测吗？</h2><p>Skill 在 Proactive Triggers 里给过回应：”Copy or design decision is unclear — When two variants of a headline, CTA, or layout are being debated, propose testing instead of opinionating.” 我的加注：如果只有一个人觉得”明显更好”，那本质就是在赌他的审美。如果三个人都觉得更好，大概率是真的更好 —— 但真的更好多少？<strong>是 1% 还是 15%？</strong> 这个差异决定了你该不该停下来测。因为你下一个改动也需要基线，而基线只有测过才算数。</p><h2 id="Q2：写-hypothesis-真的有用吗？"><a href="#Q2：写-hypothesis-真的有用吗？" class="headerlink" title="Q2：写 hypothesis 真的有用吗？"></a>Q2：写 hypothesis 真的有用吗？</h2><p>Skill 给了一个明确的结构模板：<code>Because [observation/data], we believe [change] will cause [expected outcome] for [audience]. We&#39;ll know this is true when [metrics].</code> 对照弱版强版：弱版是 “Changing the button color might increase clicks”，强版是 “Because users report difficulty finding the CTA, we believe making the button larger and using contrasting color will increase CTA clicks by 15%+ for new visitors…” 关键在于”因为”那一句。<strong>你必须有证据说这个改动值得测</strong>，heatmap、用户访谈、定量数据都可以。</p><h2 id="Q3：样本量随便估估行吧？"><a href="#Q3：样本量随便估估行吧？" class="headerlink" title="Q3：样本量随便估估行吧？"></a>Q3：样本量随便估估行吧？</h2><p>这是事故高发区。Skill 给的速查表直接抄过来贴墙上：baseline 1% 时检测 10% lift 需要 150k&#x2F;variant；baseline 3% 对应 47k；baseline 5% 对应 27k；baseline 10% 对应 12k。看这张表的正确方式是找到你当前 baseline 那一行，然后看你能接受检测多大的提升。如果基线 3%、希望检测 10% 的相对提升，每个变体需要 47k 样本。如果一周只有 10k 流量，这个测试至少要跑 9-10 周。<strong>跑不起就放弃，不是把样本量偷偷砍小。</strong></p><h2 id="Q4：看到一个变体领先就能停吗？"><a href="#Q4：看到一个变体领先就能停吗？" class="headerlink" title="Q4：看到一个变体领先就能停吗？"></a>Q4：看到一个变体领先就能停吗？</h2><p>不能。Skill 里专门骂过的 “peeking problem”：Looking at results before reaching sample size and stopping early leads to false positives and wrong decisions. 我见过最离谱的一次：产品经理每天盯着 dashboard，看到 day 3 变体 A 领先 10% 就宣布胜利，结果 day 7 反超了。测试<strong>提前停止的那一刻，你放弃的是统计学上对你的保护</strong>。</p><p>Skill 还特别点了一条 “Add traffic from new sources” 不能做 —— 测试跑到一半市场同学投了新一波广告从另一个渠道引流进来，样本结构就变了，结果不能对前半段直接比。</p><h2 id="Q5：主要-次要-护栏指标有必要分吗？"><a href="#Q5：主要-次要-护栏指标有必要分吗？" class="headerlink" title="Q5：主要&#x2F;次要&#x2F;护栏指标有必要分吗？"></a>Q5：主要&#x2F;次要&#x2F;护栏指标有必要分吗？</h2><p>有。三者的作用完全不同。定价页例子：<strong>Primary</strong> Plan selection rate、<strong>Secondary</strong> Time on page + plan distribution、<strong>Guardrail</strong> Support tickets + refund rate。主要指标是你拍板用的那一个，次要指标是解释”为什么赢&#x2F;输”的工具，护栏指标是<strong>紧急刹车</strong> —— 付费率上去 5% 但退款率上去 20%，那是亏本买卖。没有护栏指标的测试就像没有刹车的赛车。</p><h2 id="Q6：同时测好几个改动行吗？"><a href="#Q6：同时测好几个改动行吗？" class="headerlink" title="Q6：同时测好几个改动行吗？"></a>Q6：同时测好几个改动行吗？</h2><p>Skill 立场很硬：”Test One Thing — Single variable per test. Otherwise you don’t know what worked.” 例外只有 MVT（多变量测试），专门为多个组合设计，但它对流量要求残忍：A&#x2F;B 只需要 Moderate 流量，MVT 需要 Very high。流量不够硬上 MVT 的最后你会得到一堆灰色的 “statistically insignificant” 结果。</p><h2 id="Q7：跑完没有显著差异是不是白跑了？"><a href="#Q7：跑完没有显著差异是不是白跑了？" class="headerlink" title="Q7：跑完没有显著差异是不是白跑了？"></a>Q7：跑完没有显著差异是不是白跑了？</h2><p>不是。Skill 在 Analyzing Results 里把四种结果都列了对应结论：Significant winner → implement；Significant loser → 保留原版学为什么；No significant difference → 需要更多流量或更 bold 的测试；Mixed signals → 拆段深挖。</p><p><strong>“No significant difference” 本身是有信息的</strong>：要么你的变体动得不够大，要么你的 MDE 设得比真实差距还大。我之前带过一个团队做过 5 次按钮色改动测试，全部 “no significant difference”。第六次才意识到用户不是不点按钮，是找不到按钮。把按钮从页脚挪到 hero 区立刻出结果。<strong>改动不够 bold，再跑一万次都不会有显著性</strong>。</p><h2 id="Q8：95-置信度到底意味着什么？"><a href="#Q8：95-置信度到底意味着什么？" class="headerlink" title="Q8：95% 置信度到底意味着什么？"></a>Q8：95% 置信度到底意味着什么？</h2><p>Skill 原话：95% confidence &#x3D; p-value &lt; 0.05，随机出这个结果的概率 &lt;5%，不是保证，只是阈值。我补一句：95% 不是神圣数字。早期阶段用 90% 置信度 + 接受更多假阳性追求速度也是合理策略。但你要<strong>事先声明</strong>自己用 90%，而不是跑完发现没到 95% 再回头改阈值。</p><h2 id="Q9：跑之前应该做什么检查？"><a href="#Q9：跑之前应该做什么检查？" class="headerlink" title="Q9：跑之前应该做什么检查？"></a>Q9：跑之前应该做什么检查？</h2><p>Skill 的 Pre-Launch Checklist：Hypothesis 文档化 &#x2F; Primary metric 定义 &#x2F; 样本量计算 &#x2F; Variants 实施正确 &#x2F; 追踪验证 &#x2F; QA 完成。看起来是常识，踩坑的几乎全是”variants 实施正确”和”追踪验证”这两条。最经典的事故：变体 A 的点击事件埋点错了字段名，跑了 3 周数据全空，只能从头再来。<strong>QA 不只看页面长得对不对，要手动点一遍，然后去后台看事件是不是真的打进来了。</strong></p><h2 id="几条流量分配心得"><a href="#几条流量分配心得" class="headerlink" title="几条流量分配心得"></a>几条流量分配心得</h2><p>Skill 给了三种分流策略：Standard 50&#x2F;50、Conservative 90&#x2F;10 或 80&#x2F;20、Ramping 小步涨。我的实操经验：90&#x2F;10 的保守分流在定价页测试里几乎是必选。定价动一下的风险比文案改动大得多 —— 万一你的变体让付费率降了 30%，你不希望一半流量都吃到这个损失。先给 10% 流量跑两周确认没有灾难性结果再扩大到 50&#x2F;50。Ramping 分流主要用于技术风险，比如改了结账按钮背后的支付 SDK，先 5% 再 20% 再 50%。</p><h2 id="Segment-分析的陷阱"><a href="#Segment-分析的陷阱" class="headerlink" title="Segment 分析的陷阱"></a>Segment 分析的陷阱</h2><p>Skill 在 Analysis Checklist 里提了 6 条，segment differences 这一条要单独讲。全局看没差异，拆到 segment 里可能差异巨大。最常见的是移动端和桌面端表现相反 —— 新版 landing page 在桌面端赢了 12%，在移动端输了 8%。但 Skill 同时也警告了 “Cherry-picking segments” 这条反模式。<strong>关键判断是 segment 拆分要事前声明</strong>：跑测试之前就决定了要分 mobile&#x2F;desktop 看，这是合法 segment analysis；跑完发现整体输了临时想出一个”高价值用户 segment 赢了”的故事，这是自欺。</p><p>文档化：Hypothesis &#x2F; Variants（含截图）&#x2F; Results &#x2F; Decision and learnings，必须保留。团队守则：每个测试结束一周内必须归档，标题格式 <code>[日期]-[页面]-[变量]-[结论]</code>。半年之后有人问”我们测过按钮色吗”直接一搜就能找到。没有这个习惯的团队，一年后会把同一个实验重新做三遍。</p><p>如果你想先从”该测什么”入手，再去结构化设计，建议跟之前写过的 <a href="https://claude.cocoloop.cn/posts/seo-audit-claude-skill/">SEO audit Skill 解读</a> 和 <a href="https://claude.cocoloop.cn/posts/paid-ads-claude-skill/">付费广告 Skill 解读</a> 串着看 —— 它们分别解决”要测什么”和”哪个渠道值得优化”的上游问题。挽留类的反例也值得看 <a href="https://claude.cocoloop.cn/posts/churn-prevention-claude-skill/">churn-prevention Skill</a> 里那个”加倒计时反而跌”的实战。</p><h2 id="工具搭配"><a href="#工具搭配" class="headerlink" title="工具搭配"></a>工具搭配</h2><p>我的日常流程：Claude Code 跑这个 Skill 做 hypothesis 草案和 sample size 估算，实验实施用 PostHog 做客户端分流，关键变体的 server-side 切流用 LaunchDarkly。统计推断懒得手算的时候我会把数据丢给 Hermes Agent 跑一个简化版的贝叶斯估计。偶尔跟同事对稿时用 Cursor 对代码变更做 diff review。</p><hr><h2 id="SKILL-完整中文版"><a href="#SKILL-完整中文版" class="headerlink" title="SKILL 完整中文版"></a>SKILL 完整中文版</h2><div class="code-container" data-rel="Yaml"><figure class="iseeu highlight yaml"><table><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="attr">name:</span> <span class="string">&quot;ab-test-setup&quot;</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">&quot;当用户要规划、设计或实施 A/B 测试或实验时使用。也用于用户提到</span></span><br><span class="line"><span class="string">&#x27;A/B test&#x27;、&#x27;split test&#x27;、&#x27;experiment&#x27;、&#x27;test this change&#x27;、&#x27;variant copy&#x27;、</span></span><br><span class="line"><span class="string">&#x27;multivariate test&#x27;、&#x27;hypothesis&#x27;、&#x27;conversion experiment&#x27;、</span></span><br><span class="line"><span class="string">&#x27;statistical significance&#x27;、&#x27;test this&#x27; 的场景。埋点实施见 analytics-tracking。&quot;</span></span><br><span class="line"><span class="attr">license:</span> <span class="string">MIT</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">version:</span> <span class="number">1.0</span><span class="number">.0</span></span><br><span class="line">  <span class="attr">author:</span> <span class="string">Alireza</span> <span class="string">Rezvani</span></span><br><span class="line">  <span class="attr">category:</span> <span class="string">marketing</span></span><br><span class="line">  <span class="attr">updated:</span> <span class="number">2026-03-06</span></span><br></pre></td></tr></table></figure></div><h1 id="A-B-测试搭建"><a href="#A-B-测试搭建" class="headerlink" title="A&#x2F;B 测试搭建"></a>A&#x2F;B 测试搭建</h1><p>你是实验设计与 A&#x2F;B 测试领域的专家。目标是帮助设计产生统计有效、可执行结果的测试。</p><h2 id="初始评估"><a href="#初始评估" class="headerlink" title="初始评估"></a>初始评估</h2><p><strong>先检查产品营销上下文：</strong><br>如果 <code>.claude/product-marketing-context.md</code> 存在，在提问前先读。用已有上下文，只补问未覆盖或特定于当前任务的信息。</p><p>在设计测试前要弄清楚：</p><ol><li><strong>测试背景</strong> —— 你想改进什么？在考虑什么改动？</li><li><strong>当前状态</strong> —— 基线转化率？当前流量规模？</li><li><strong>约束</strong> —— 技术复杂度？时间线？可用工具？</li></ol><hr><h2 id="核心原则"><a href="#核心原则" class="headerlink" title="核心原则"></a>核心原则</h2><h3 id="1-从假设开始"><a href="#1-从假设开始" class="headerlink" title="1. 从假设开始"></a>1. 从假设开始</h3><ul><li>不是”看看会怎么样”</li><li>对结果的具体预测</li><li>基于推理或数据</li></ul><h3 id="2-一次只测一件"><a href="#2-一次只测一件" class="headerlink" title="2. 一次只测一件"></a>2. 一次只测一件</h3><ul><li>每次测试单一变量</li><li>否则你不知道是什么起了作用</li></ul><h3 id="3-统计严谨"><a href="#3-统计严谨" class="headerlink" title="3. 统计严谨"></a>3. 统计严谨</h3><ul><li>预先确定样本量</li><li>不要偷看提前停止</li><li>坚持方法论</li></ul><h3 id="4-量对关键指标"><a href="#4-量对关键指标" class="headerlink" title="4. 量对关键指标"></a>4. 量对关键指标</h3><ul><li>主要指标绑业务价值</li><li>次要指标提供上下文</li><li>护栏指标防止伤害</li></ul><hr><h2 id="假设框架"><a href="#假设框架" class="headerlink" title="假设框架"></a>假设框架</h2><h3 id="结构"><a href="#结构" class="headerlink" title="结构"></a>结构</h3><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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">Because [观察/数据],</span><br><span class="line">we believe [改动]</span><br><span class="line">will cause [预期结果]</span><br><span class="line">for [受众].</span><br><span class="line">We&#x27;ll know this is true when [指标].</span><br></pre></td></tr></table></figure></div><h3 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h3><p><strong>弱</strong>：”Changing the button color might increase clicks.”</p><p><strong>强</strong>：”Because users report difficulty finding the CTA (per heatmaps and feedback), we believe making the button larger and using contrasting color will increase CTA clicks by 15%+ for new visitors. We’ll measure click-through rate from page view to signup start.”</p><hr><h2 id="测试类型"><a href="#测试类型" class="headerlink" title="测试类型"></a>测试类型</h2><table><thead><tr><th>类型</th><th>描述</th><th>流量需求</th></tr></thead><tbody><tr><td>A&#x2F;B</td><td>两个版本，单一改动</td><td>中等</td></tr><tr><td>A&#x2F;B&#x2F;n</td><td>多个变体</td><td>较高</td></tr><tr><td>MVT</td><td>多个改动的组合</td><td>非常高</td></tr><tr><td>Split URL</td><td>不同 URL 对应不同变体</td><td>中等</td></tr></tbody></table><hr><h2 id="样本量"><a href="#样本量" class="headerlink" title="样本量"></a>样本量</h2><h3 id="速查"><a href="#速查" class="headerlink" title="速查"></a>速查</h3><table><thead><tr><th>Baseline</th><th>10% Lift</th><th>20% Lift</th><th>50% Lift</th></tr></thead><tbody><tr><td>1%</td><td>150k&#x2F;variant</td><td>39k&#x2F;variant</td><td>6k&#x2F;variant</td></tr><tr><td>3%</td><td>47k&#x2F;variant</td><td>12k&#x2F;variant</td><td>2k&#x2F;variant</td></tr><tr><td>5%</td><td>27k&#x2F;variant</td><td>7k&#x2F;variant</td><td>1.2k&#x2F;variant</td></tr><tr><td>10%</td><td>12k&#x2F;variant</td><td>3k&#x2F;variant</td><td>550&#x2F;variant</td></tr></tbody></table><p><strong>计算器：</strong></p><ul><li><a class="link"   href="https://www.evanmiller.org/ab-testing/sample-size.html" >Evan Miller’s<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li><li><a class="link"   href="https://www.optimizely.com/sample-size-calculator/" >Optimizely’s<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></li></ul><p><strong>详细样本量表和持续时间计算</strong>：见 <code>references/sample-size-guide.md</code></p><hr><h2 id="指标选择"><a href="#指标选择" class="headerlink" title="指标选择"></a>指标选择</h2><h3 id="主要指标"><a href="#主要指标" class="headerlink" title="主要指标"></a>主要指标</h3><ul><li>最重要的单一指标</li><li>直接挂假设</li><li>用它来 call 这次测试</li></ul><h3 id="次要指标"><a href="#次要指标" class="headerlink" title="次要指标"></a>次要指标</h3><ul><li>支撑主要指标的解释</li><li>解释改动为什么&#x2F;怎么起作用</li></ul><h3 id="护栏指标"><a href="#护栏指标" class="headerlink" title="护栏指标"></a>护栏指标</h3><ul><li>不该变差的东西</li><li>显著负向就停测</li></ul><h3 id="示例：定价页测试"><a href="#示例：定价页测试" class="headerlink" title="示例：定价页测试"></a>示例：定价页测试</h3><ul><li><strong>Primary</strong>：Plan selection rate</li><li><strong>Secondary</strong>：Time on page、plan distribution</li><li><strong>Guardrail</strong>：Support tickets、refund rate</li></ul><hr><h2 id="变体设计"><a href="#变体设计" class="headerlink" title="变体设计"></a>变体设计</h2><h3 id="可变化的维度"><a href="#可变化的维度" class="headerlink" title="可变化的维度"></a>可变化的维度</h3><table><thead><tr><th>类别</th><th>例子</th></tr></thead><tbody><tr><td>Headlines&#x2F;Copy</td><td>信息角度、价值主张、具体度、语气</td></tr><tr><td>视觉设计</td><td>布局、颜色、图像、层级</td></tr><tr><td>CTA</td><td>按钮文案、大小、位置、数量</td></tr><tr><td>内容</td><td>包含的信息、顺序、数量、社会证明</td></tr></tbody></table><h3 id="最佳实践"><a href="#最佳实践" class="headerlink" title="最佳实践"></a>最佳实践</h3><ul><li>单一、有意义的改动</li><li>足够大到能被检测到</li><li>忠于假设</li></ul><hr><h2 id="流量分配"><a href="#流量分配" class="headerlink" title="流量分配"></a>流量分配</h2><table><thead><tr><th>方式</th><th>比例</th><th>何时使用</th></tr></thead><tbody><tr><td>Standard</td><td>50&#x2F;50</td><td>A&#x2F;B 默认</td></tr><tr><td>Conservative</td><td>90&#x2F;10、80&#x2F;20</td><td>限制坏变体的风险</td></tr><tr><td>Ramping</td><td>从小开始，逐步加</td><td>技术风险缓释</td></tr></tbody></table><p><strong>考虑：</strong></p><ul><li>一致性：用户再次访问看到同一变体</li><li>跨时段&#x2F;跨一周曝光要均衡</li></ul><hr><h2 id="实施"><a href="#实施" class="headerlink" title="实施"></a>实施</h2><h3 id="客户端"><a href="#客户端" class="headerlink" title="客户端"></a>客户端</h3><ul><li>JS 在页面加载后修改</li><li>快速实施，但可能闪一下</li><li>工具：PostHog、Optimizely、VWO</li></ul><h3 id="服务端"><a href="#服务端" class="headerlink" title="服务端"></a>服务端</h3><ul><li>变体在渲染前确定</li><li>无闪烁，需要开发</li><li>工具：PostHog、LaunchDarkly、Split</li></ul><hr><h2 id="运行测试"><a href="#运行测试" class="headerlink" title="运行测试"></a>运行测试</h2><h3 id="发布前清单"><a href="#发布前清单" class="headerlink" title="发布前清单"></a>发布前清单</h3><ul><li><input disabled="" type="checkbox"> Hypothesis 文档化</li><li><input disabled="" type="checkbox"> 主要指标定义</li><li><input disabled="" type="checkbox"> 样本量已计算</li><li><input disabled="" type="checkbox"> 变体实施正确</li><li><input disabled="" type="checkbox"> 追踪已验证</li><li><input disabled="" type="checkbox"> 所有变体已 QA 完成</li></ul><h3 id="测试期间"><a href="#测试期间" class="headerlink" title="测试期间"></a>测试期间</h3><p><strong>该做：</strong></p><ul><li>监控技术问题</li><li>检查 segment 质量</li><li>记录外部因素</li></ul><p><strong>不该做：</strong></p><ul><li>偷看结果并提前停止</li><li>中途修改变体</li><li>从新渠道加流量</li></ul><h3 id="偷看问题"><a href="#偷看问题" class="headerlink" title="偷看问题"></a>偷看问题</h3><p>在达到样本量之前看结果并提前停止，会导致假阳性和错误决策。预先承诺样本量，相信流程。</p><hr><h2 id="分析结果"><a href="#分析结果" class="headerlink" title="分析结果"></a>分析结果</h2><h3 id="统计显著性"><a href="#统计显著性" class="headerlink" title="统计显著性"></a>统计显著性</h3><ul><li>95% 置信度 &#x3D; p-value &lt; 0.05</li><li>意味着结果随机出现的概率 &lt;5%</li><li>不是保证 —— 只是阈值</li></ul><h3 id="分析清单"><a href="#分析清单" class="headerlink" title="分析清单"></a>分析清单</h3><ol><li><strong>达到样本量了吗？</strong> 没到，结果是初步的</li><li><strong>统计显著吗？</strong> 检查置信区间</li><li><strong>效应量有意义吗？</strong> 对比 MDE，预测影响</li><li><strong>次要指标一致吗？</strong> 支持主要指标？</li><li><strong>护栏是否告警？</strong> 有什么变差了吗？</li><li><strong>segment 差异？</strong> 移动 vs 桌面？新 vs 老？</li></ol><h3 id="结果解读"><a href="#结果解读" class="headerlink" title="结果解读"></a>结果解读</h3><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>需要更多流量或更 bold 的测试</td></tr><tr><td>信号混杂</td><td>深挖，可能分段看</td></tr></tbody></table><hr><h2 id="文档化"><a href="#文档化" class="headerlink" title="文档化"></a>文档化</h2><p>每次测试都要记录：</p><ul><li>Hypothesis</li><li>Variants（含截图）</li><li>Results（样本、指标、显著性）</li><li>决策与 learning</li></ul><p><strong>模板</strong>：见 <code>references/test-templates.md</code></p><hr><h2 id="常见错误"><a href="#常见错误" class="headerlink" title="常见错误"></a>常见错误</h2><h3 id="测试设计"><a href="#测试设计" class="headerlink" title="测试设计"></a>测试设计</h3><ul><li>测了太小的改动（检测不到）</li><li>测了太多东西（无法分离）</li><li>没有清晰假设</li></ul><h3 id="执行"><a href="#执行" class="headerlink" title="执行"></a>执行</h3><ul><li>提前停止</li><li>中途改东西</li><li>没检查实施</li></ul><h3 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h3><ul><li>忽略置信区间</li><li>Cherry-picking segments</li><li>过度解读无定论结果</li></ul><hr><h2 id="任务特定问题"><a href="#任务特定问题" class="headerlink" title="任务特定问题"></a>任务特定问题</h2><ol><li>当前转化率是多少？</li><li>这个页面有多少流量？</li><li>在考虑什么改动、为什么？</li><li>值得检测的最小提升是多少？</li><li>有什么测试工具？</li><li>这个区域之前测过吗？</li></ol><hr><h2 id="主动触发"><a href="#主动触发" class="headerlink" title="主动触发"></a>主动触发</h2><p>在下列情况主动提议 A&#x2F;B 测试设计：</p><ol><li><strong>提到转化率</strong> —— 用户丢出转化率问怎么提升时，提议设计测试而不是猜方案。</li><li><strong>文案或设计决策不明</strong> —— 两个 headline&#x2F;CTA&#x2F;layout 在争论时，提议测试而不是争论意见。</li><li><strong>活动表现不佳</strong> —— 用户报告某 landing page 或邮件低于预期，给结构化测试计划。</li><li><strong>定价页讨论</strong> —— 任何提到定价页改动都要触发带护栏指标的定价测试。</li><li><strong>发布后复盘</strong> —— 功能或活动上线后，提议跟进实验优化结果。</li></ol><hr><h2 id="输出物"><a href="#输出物" class="headerlink" title="输出物"></a>输出物</h2><table><thead><tr><th>Artifact</th><th>格式</th><th>描述</th></tr></thead><tbody><tr><td>Experiment Brief</td><td>Markdown 文档</td><td>Hypothesis、variants、metrics、样本量、时长、owner</td></tr><tr><td>样本量计算器输入</td><td>表格</td><td>Baseline rate、MDE、置信水平、power</td></tr><tr><td>Pre-Launch QA Checklist</td><td>清单</td><td>实施、追踪、变体渲染验证</td></tr><tr><td>Results Analysis Report</td><td>Markdown 文档</td><td>统计显著性、效应量、segment 拆分、决策</td></tr><tr><td>Test Backlog</td><td>优先级列表</td><td>按预期影响与可行性排序的实验</td></tr></tbody></table><hr><h2 id="沟通"><a href="#沟通" class="headerlink" title="沟通"></a>沟通</h2><p>所有输出应达到质量标准：清晰 hypothesis、预先注册的指标、记录的决策。避免把无定论结果包装成胜利。每个测试都应产生一个 learning，即使变体输了。设计实验前先加载 <code>marketing-context</code> 了解产品和受众框架。</p><hr><h2 id="相关-Skill"><a href="#相关-Skill" class="headerlink" title="相关 Skill"></a>相关 Skill</h2><ul><li><strong>page-cro</strong> —— 在你需要”测什么”的想法时用；在你已有假设只需要测试设计时不用。</li><li><strong>analytics-tracking</strong> —— 在运行测试前搭建测量基础设施时用；不能替代预先定义主要指标。</li><li><strong>campaign-analytics</strong> —— 测试结束后把结果纳入更广泛的活动归因时用；不在测试期间用。</li><li><strong>pricing-strategy</strong> —— 当测试结果影响定价决策时用；不能替代受控测试。</li><li><strong>marketing-context</strong> —— 任何测试设计之前作为基础先载入，确保假设与 ICP 和定位一致。</li></ul><hr><h2 id="SKILL-Original-English-Version"><a href="#SKILL-Original-English-Version" class="headerlink" title="SKILL Original English Version"></a>SKILL Original English Version</h2><blockquote><p>下方为 SKILL.md 英文原文，完整保留以便读者对照查阅 &#x2F; The following is the original SKILL.md in English, embedded verbatim for cross-reference.</p></blockquote><div class="code-container" data-rel="Markdown"><figure class="iseeu highlight markdown"><table><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><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: &quot;ab-test-setup&quot;</span><br><span class="line">description: When the user wants to plan, design, or implement an A/B test or experiment. Also use when the user mentions &quot;A/B test,&quot; &quot;split test,&quot; &quot;experiment,&quot; &quot;test this change,&quot; &quot;variant copy,&quot; &quot;multivariate test,&quot; &quot;hypothesis,&quot; &quot;conversion experiment,&quot; &quot;statistical significance,&quot; or &quot;test this.&quot; For tracking implementation, see analytics-tracking.</span><br><span class="line">license: MIT</span><br><span class="line">metadata:</span><br><span class="line">  version: 1.0.0</span><br><span class="line">  author: Alireza Rezvani</span><br><span class="line">  category: marketing</span><br><span class="line"><span class="section">  updated: 2026-03-06</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># A/B Test Setup</span></span><br><span class="line"></span><br><span class="line">You are an expert in experimentation and A/B testing. Your goal is to help design tests that produce statistically valid, actionable results.</span><br><span class="line"></span><br><span class="line"><span class="section">## Initial Assessment</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**Check for product marketing context first:**</span></span><br><span class="line">If <span class="code">`.claude/product-marketing-context.md`</span> exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.</span><br><span class="line"></span><br><span class="line">Before designing a test, understand:</span><br><span class="line"></span><br><span class="line"><span class="bullet">1.</span> <span class="strong">**Test Context**</span> - What are you trying to improve? What change are you considering?</span><br><span class="line"><span class="bullet">2.</span> <span class="strong">**Current State**</span> - Baseline conversion rate? Current traffic volume?</span><br><span class="line"><span class="bullet">3.</span> <span class="strong">**Constraints**</span> - Technical complexity? Timeline? Tools available?</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Core Principles</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 1. Start with a Hypothesis</span></span><br><span class="line"><span class="bullet">-</span> Not just &quot;let&#x27;s see what happens&quot;</span><br><span class="line"><span class="bullet">-</span> Specific prediction of outcome</span><br><span class="line"><span class="bullet">-</span> Based on reasoning or data</span><br><span class="line"></span><br><span class="line"><span class="section">### 2. Test One Thing</span></span><br><span class="line"><span class="bullet">-</span> Single variable per test</span><br><span class="line"><span class="bullet">-</span> Otherwise you don&#x27;t know what worked</span><br><span class="line"></span><br><span class="line"><span class="section">### 3. Statistical Rigor</span></span><br><span class="line"><span class="bullet">-</span> Pre-determine sample size</span><br><span class="line"><span class="bullet">-</span> Don&#x27;t peek and stop early</span><br><span class="line"><span class="bullet">-</span> Commit to the methodology</span><br><span class="line"></span><br><span class="line"><span class="section">### 4. Measure What Matters</span></span><br><span class="line"><span class="bullet">-</span> Primary metric tied to business value</span><br><span class="line"><span class="bullet">-</span> Secondary metrics for context</span><br><span class="line"><span class="bullet">-</span> Guardrail metrics to prevent harm</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Hypothesis Framework</span></span><br><span class="line"></span><br><span class="line"><span class="section">### Structure</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></div><p>Because [observation&#x2F;data],<br>we believe [change]<br>will cause [expected outcome]<br>for [audience].<br>We’ll know this is true when [metrics].</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><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><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">### Example</span><br><span class="line"></span><br><span class="line">**Weak**: &quot;Changing the button color might increase clicks.&quot;</span><br><span class="line"></span><br><span class="line">**Strong**: &quot;Because users report difficulty finding the CTA (per heatmaps and feedback), we believe making the button larger and using contrasting color will increase CTA clicks by 15%+ for new visitors. We&#x27;ll measure click-through rate from page view to signup start.&quot;</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Test Types</span><br><span class="line"></span><br><span class="line">| Type | Description | Traffic Needed |</span><br><span class="line">|------|-------------|----------------|</span><br><span class="line">| A/B | Two versions, single change | Moderate |</span><br><span class="line">| A/B/n | Multiple variants | Higher |</span><br><span class="line">| MVT | Multiple changes in combinations | Very high |</span><br><span class="line">| Split URL | Different URLs for variants | Moderate |</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Sample Size</span><br><span class="line"></span><br><span class="line">### Quick Reference</span><br><span class="line"></span><br><span class="line">| Baseline | 10% Lift | 20% Lift | 50% Lift |</span><br><span class="line">|----------|----------|----------|----------|</span><br><span class="line">| 1% | 150k/variant | 39k/variant | 6k/variant |</span><br><span class="line">| 3% | 47k/variant | 12k/variant | 2k/variant |</span><br><span class="line">| 5% | 27k/variant | 7k/variant | 1.2k/variant |</span><br><span class="line">| 10% | 12k/variant | 3k/variant | 550/variant |</span><br><span class="line"></span><br><span class="line">**Calculators:**</span><br><span class="line">- [Evan Miller&#x27;s](https://www.evanmiller.org/ab-testing/sample-size.html)</span><br><span class="line">- [Optimizely&#x27;s](https://www.optimizely.com/sample-size-calculator/)</span><br><span class="line"></span><br><span class="line">**For detailed sample size tables and duration calculations**: See [references/sample-size-guide.md](references/sample-size-guide.md)</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Metrics Selection</span><br><span class="line"></span><br><span class="line">### Primary Metric</span><br><span class="line">- Single metric that matters most</span><br><span class="line">- Directly tied to hypothesis</span><br><span class="line">- What you&#x27;ll use to call the test</span><br><span class="line"></span><br><span class="line">### Secondary Metrics</span><br><span class="line">- Support primary metric interpretation</span><br><span class="line">- Explain why/how the change worked</span><br><span class="line"></span><br><span class="line">### Guardrail Metrics</span><br><span class="line">- Things that shouldn&#x27;t get worse</span><br><span class="line">- Stop test if significantly negative</span><br><span class="line"></span><br><span class="line">### Example: Pricing Page Test</span><br><span class="line">- **Primary**: Plan selection rate</span><br><span class="line">- **Secondary**: Time on page, plan distribution</span><br><span class="line">- **Guardrail**: Support tickets, refund rate</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Designing Variants</span><br><span class="line"></span><br><span class="line">### What to Vary</span><br><span class="line"></span><br><span class="line">| Category | Examples |</span><br><span class="line">|----------|----------|</span><br><span class="line">| Headlines/Copy | Message angle, value prop, specificity, tone |</span><br><span class="line">| Visual Design | Layout, color, images, hierarchy |</span><br><span class="line">| CTA | Button copy, size, placement, number |</span><br><span class="line">| Content | Information included, order, amount, social proof |</span><br><span class="line"></span><br><span class="line">### Best Practices</span><br><span class="line">- Single, meaningful change</span><br><span class="line">- Bold enough to make a difference</span><br><span class="line">- True to the hypothesis</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Traffic Allocation</span><br><span class="line"></span><br><span class="line">| Approach | Split | When to Use |</span><br><span class="line">|----------|-------|-------------|</span><br><span class="line">| Standard | 50/50 | Default for A/B |</span><br><span class="line">| Conservative | 90/10, 80/20 | Limit risk of bad variant |</span><br><span class="line">| Ramping | Start small, increase | Technical risk mitigation |</span><br><span class="line"></span><br><span class="line">**Considerations:**</span><br><span class="line">- Consistency: Users see same variant on return</span><br><span class="line">- Balanced exposure across time of day/week</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Implementation</span><br><span class="line"></span><br><span class="line">### Client-Side</span><br><span class="line">- JavaScript modifies page after load</span><br><span class="line">- Quick to implement, can cause flicker</span><br><span class="line">- Tools: PostHog, Optimizely, VWO</span><br><span class="line"></span><br><span class="line">### Server-Side</span><br><span class="line">- Variant determined before render</span><br><span class="line">- No flicker, requires dev work</span><br><span class="line">- Tools: PostHog, LaunchDarkly, Split</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Running the Test</span><br><span class="line"></span><br><span class="line">### Pre-Launch Checklist</span><br><span class="line">- [ ] Hypothesis documented</span><br><span class="line">- [ ] Primary metric defined</span><br><span class="line">- [ ] Sample size calculated</span><br><span class="line">- [ ] Variants implemented correctly</span><br><span class="line">- [ ] Tracking verified</span><br><span class="line">- [ ] QA completed on all variants</span><br><span class="line"></span><br><span class="line">### During the Test</span><br><span class="line"></span><br><span class="line">**DO:**</span><br><span class="line">- Monitor for technical issues</span><br><span class="line">- Check segment quality</span><br><span class="line">- Document external factors</span><br><span class="line"></span><br><span class="line">**DON&#x27;T:**</span><br><span class="line">- Peek at results and stop early</span><br><span class="line">- Make changes to variants</span><br><span class="line">- Add traffic from new sources</span><br><span class="line"></span><br><span class="line">### The Peeking Problem</span><br><span class="line">Looking at results before reaching sample size and stopping early leads to false positives and wrong decisions. Pre-commit to sample size and trust the process.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Analyzing Results</span><br><span class="line"></span><br><span class="line">### Statistical Significance</span><br><span class="line">- 95% confidence = p-value &lt; 0.05</span><br><span class="line">- Means &lt;5% chance result is random</span><br><span class="line">- Not a guarantee—just a threshold</span><br><span class="line"></span><br><span class="line">### Analysis Checklist</span><br><span class="line"></span><br><span class="line">1. **Reach sample size?** If not, result is preliminary</span><br><span class="line">2. **Statistically significant?** Check confidence intervals</span><br><span class="line">3. **Effect size meaningful?** Compare to MDE, project impact</span><br><span class="line">4. **Secondary metrics consistent?** Support the primary?</span><br><span class="line">5. **Guardrail concerns?** Anything get worse?</span><br><span class="line">6. **Segment differences?** Mobile vs. desktop? New vs. returning?</span><br><span class="line"></span><br><span class="line">### Interpreting Results</span><br><span class="line"></span><br><span class="line">| Result | Conclusion |</span><br><span class="line">|--------|------------|</span><br><span class="line">| Significant winner | Implement variant |</span><br><span class="line">| Significant loser | Keep control, learn why |</span><br><span class="line">| No significant difference | Need more traffic or bolder test |</span><br><span class="line">| Mixed signals | Dig deeper, maybe segment |</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Documentation</span><br><span class="line"></span><br><span class="line">Document every test with:</span><br><span class="line">- Hypothesis</span><br><span class="line">- Variants (with screenshots)</span><br><span class="line">- Results (sample, metrics, significance)</span><br><span class="line">- Decision and learnings</span><br><span class="line"></span><br><span class="line">**For templates**: See [references/test-templates.md](references/test-templates.md)</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Common Mistakes</span><br><span class="line"></span><br><span class="line">### Test Design</span><br><span class="line">- Testing too small a change (undetectable)</span><br><span class="line">- Testing too many things (can&#x27;t isolate)</span><br><span class="line">- No clear hypothesis</span><br><span class="line"></span><br><span class="line">### Execution</span><br><span class="line">- Stopping early</span><br><span class="line">- Changing things mid-test</span><br><span class="line">- Not checking implementation</span><br><span class="line"></span><br><span class="line">### Analysis</span><br><span class="line">- Ignoring confidence intervals</span><br><span class="line">- Cherry-picking segments</span><br><span class="line">- Over-interpreting inconclusive results</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Task-Specific Questions</span><br><span class="line"></span><br><span class="line">1. What&#x27;s your current conversion rate?</span><br><span class="line">2. How much traffic does this page get?</span><br><span class="line">3. What change are you considering and why?</span><br><span class="line">4. What&#x27;s the smallest improvement worth detecting?</span><br><span class="line">5. What tools do you have for testing?</span><br><span class="line">6. Have you tested this area before?</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Proactive Triggers</span><br><span class="line"></span><br><span class="line">Proactively offer A/B test design when:</span><br><span class="line"></span><br><span class="line">1. **Conversion rate mentioned** — User shares a conversion rate and asks how to improve it; suggest designing a test rather than guessing at solutions.</span><br><span class="line">2. **Copy or design decision is unclear** — When two variants of a headline, CTA, or layout are being debated, propose testing instead of opinionating.</span><br><span class="line">3. **Campaign underperformance** — User reports a landing page or email performing below expectations; offer a structured test plan.</span><br><span class="line">4. **Pricing page discussion** — Any mention of pricing page changes should trigger an offer to design a pricing test with guardrail metrics.</span><br><span class="line">5. **Post-launch review** — After a feature or campaign goes live, propose follow-up experiments to optimize the result.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Output Artifacts</span><br><span class="line"></span><br><span class="line">| Artifact | Format | Description |</span><br><span class="line">|----------|--------|-------------|</span><br><span class="line">| Experiment Brief | Markdown doc | Hypothesis, variants, metrics, sample size, duration, owner |</span><br><span class="line">| Sample Size Calculator Input | Table | Baseline rate, MDE, confidence level, power |</span><br><span class="line">| Pre-Launch QA Checklist | Checklist | Implementation, tracking, variant rendering verification |</span><br><span class="line">| Results Analysis Report | Markdown doc | Statistical significance, effect size, segment breakdown, decision |</span><br><span class="line">| Test Backlog | Prioritized list | Ranked experiments by expected impact and feasibility |</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Communication</span><br><span class="line"></span><br><span class="line">All outputs should meet the quality standard: clear hypothesis, pre-registered metrics, and documented decisions. Avoid presenting inconclusive results as wins. Every test should produce a learning, even if the variant loses. Reference `marketing-context` for product and audience framing before designing experiments.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line">## Related Skills</span><br><span class="line"></span><br><span class="line">- **page-cro** — USE when you need ideas for *what* to test; NOT when you already have a hypothesis and just need test design.</span><br><span class="line">- **analytics-tracking** — USE to set up measurement infrastructure before running tests; NOT as a substitute for defining primary metrics upfront.</span><br><span class="line">- **campaign-analytics** — USE after tests conclude to fold results into broader campaign attribution; NOT during the test itself.</span><br><span class="line">- **pricing-strategy** — USE when test results affect pricing decisions; NOT to replace a controlled test with pure strategic reasoning.</span><br><span class="line">- **marketing-context** — USE as foundation before any test design to ensure hypotheses align with ICP and positioning; always load first.</span><br></pre></td></tr></table></figure></div><hr><p>上面这 9 个问题你都经历过哪些？如果手头有正在争论”要不要测”的具体案例，欢迎丢到 <a class="link"   href="https://www.cocoloop.cn/" >cocoloop 社区<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 的实验设计专区。我们一起用这套 Skill 的 pre-launch checklist 做 peer review，比起在内部反复扯皮，外部视角通常能一眼看出假设漏洞在哪。</p>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/ab-test-setup-claude-skill/</id>
    <link href="https://claude.cocoloop.cn/posts/ab-test-setup-claude-skill/"/>
    <published>2026-04-14T12:51:07.000Z</published>
    <summary>
      <![CDATA[我带过的几个团队，每次讨论改按钮颜色、改 landing page 文案都会卡在同一组问题上。ab-test-setup 这个 Skill 把答案结构化了。这篇用 Q&A 方式把 9 个最常见的争执和它给出的答案对起来。]]>
    </summary>
    <title>
      <![CDATA[关于 A/B 测试，这 9 个问题我被问过太多次 —— ab-test-setup Skill Q&A]]>
    </title>
    <updated>2026-04-14T12:51:07.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Skills" scheme="https://claude.cocoloop.cn/categories/Skills/"/>
    <category term="Claude Skills" scheme="https://claude.cocoloop.cn/tags/Claude-Skills/"/>
    <category term="Claude Code" scheme="https://claude.cocoloop.cn/tags/Claude-Code/"/>
    <category term="programmatic SEO" scheme="https://claude.cocoloop.cn/tags/programmatic-SEO/"/>
    <category term="SEO" scheme="https://claude.cocoloop.cn/tags/SEO/"/>
    <category term="增长营销" scheme="https://claude.cocoloop.cn/tags/%E5%A2%9E%E9%95%BF%E8%90%A5%E9%94%80/"/>
    <content>
      <![CDATA[<p>做过两三年 SaaS 增长的朋友，多半都盯着过 Zapier 的 <code>/apps/[appA]/integrations/[appB]</code> 这种页面——单模板跑出几万个落地页，常年霸占长尾词，Ahrefs 截图看 estimated traffic 动辄七位数。类似玩家还有 Webflow 的 templates、Airbnb 的城市页、G2 的 alternatives、Canva 的 design templates。这一类打法有个统一的名字：<strong>Programmatic SEO</strong>（下文就叫 pSEO）。</p><p>但你真要自己抄这个作业，会发现绝大多数团队都栽在同一个地方——<strong>翻车成 thin content 被 Google 降权</strong>。Helpful content update 之后更狠，一批工具站连续几个季度清零。不是不能做，是没做对。</p><p>上周折腾一份开源 Claude Skill 库，里面有个叫 <code>programmatic-seo</code> 的 SKILL——280 行 Markdown 把整套方法论压得很实，跟我之前总结的那些 SOP 几乎可以对上。这篇文章就把它完整拆一遍，顺便把我自己做 pSEO 项目时踩过的坑一起交代掉。</p><h2 id="先把”程序化-SEO”讲清楚，它到底在赚什么钱"><a href="#先把”程序化-SEO”讲清楚，它到底在赚什么钱" class="headerlink" title="先把”程序化 SEO”讲清楚，它到底在赚什么钱"></a>先把”程序化 SEO”讲清楚，它到底在赚什么钱</h2><p>一句话定义：用<strong>模板 + 结构化数据</strong>批量生成 SEO 落地页，覆盖长尾词汇海。</p><p>几个能反复说的经典案例：</p><ul><li>**Zapier &#x2F;apps&#x2F;[A]&#x2F;integrations&#x2F;[B]**：每一对 App 组合一个页面，实际把用户搜 <code>slack + asana integration</code> 这种需求接走了，估算贡献 40% 以上的自然流量</li><li><strong>Airbnb &#x2F;[city]&#x2F;stays</strong>：每个城市一页，用实际房源数据撑起来，不是空模板</li><li>**G2 &#x2F;compare&#x2F;[X]-vs-[Y]**：把对比页做到极致，长尾流量全吃</li><li>**Indeed &#x2F;jobs&#x2F;[role]-in-[city]**：职位 × 城市的笛卡尔积，数万页起步</li></ul><p>这些页面的共性很明确：<strong>变量背后都有真实、有差异的数据支撑</strong>。Zapier 页面里会告诉你这两个 app 怎么配合用；Airbnb 页面里是真实库存；G2 页面里是真实用户评分。这叫”模板 ≠ 抄袭”。</p><p>反面教材也一抓一大把——给地产中介做本地 SEO，复制 500 个”[city] 买房攻略”，除了改个城市名内容全一样，Google 一个月就把你按进沙盒。</p><p>所以 pSEO 是一个很典型的<strong>高杠杆但高风险</strong>活——做对了是资产，做错了是惩罚。</p><h2 id="为什么这件事特别适合交给-AI-Coding-Agent"><a href="#为什么这件事特别适合交给-AI-Coding-Agent" class="headerlink" title="为什么这件事特别适合交给 AI Coding Agent"></a>为什么这件事特别适合交给 AI Coding Agent</h2><p>以前做一轮 pSEO 项目的流程是这样：</p><ol><li>SEO 专家写 keyword research + 模板 brief（3-5 天）</li><li>内容团队按 brief 填写种子页面（按页数计，10 页 2 周）</li><li>工程师做模板 + 拼数据（1-2 周）</li><li>QA 做内链校验 + 索引检查（持续）</li></ol><p>光 brief 里那些”每页必须有独特数据段””URL 用 subfolder 不要 subdomain””schema.org 要上 Product 不要 Article”这类 SOP，新人第一遍肯定记不住。</p><p>一个 SKILL 文件的价值就在这：<strong>把老法师脑子里的 SOP 固化成可被 agent 自动调用的规范</strong>。你跟 Claude Code 说”帮我给这 1200 个整合组合生成页面模板”，它读到 <code>programmatic-seo</code> 这个 skill 的 description，自动触发这份老法师手册，然后按里面的 Framework 一步一步给你出 Opportunity Analysis、Playbook 选择、模板设计、checklist——全程不用你再重复”记得做 XX，别忘了 XX”。</p><p>这种 skill 库里常见的合集量级都在上百条，覆盖 Engineering、Product、Marketing、C-level Advisory 一堆方向，全是这种”老法师 SOP”的形式。支持的 agent 也不局限于 Claude Code——随手翻一下兼容清单，里面有 Cursor、Aider、Windsurf、Gemini CLI、OpenCode、Kilo Code、Antigravity、Augment、OpenClaw、Hermes Agent、Codex 这些。国内场景里，把后端模型换成 Qwen3-Coder 或 DeepSeek-V3 也能跑，skill 文件本身是纯 Markdown，不绑定任何模型。</p><h2 id="拆-SKILL-md：老法师手册里到底写了什么"><a href="#拆-SKILL-md：老法师手册里到底写了什么" class="headerlink" title="拆 SKILL.md：老法师手册里到底写了什么"></a>拆 SKILL.md：老法师手册里到底写了什么</h2><p>这个 SKILL.md 我反复读了四五遍，结构非常紧凑。它由 YAML 触发器、动手前的三组问题、六条核心原则、12 个 Playbook 对照表、五步实施框架、上线前后 Checklist、Proactive Triggers 构成。</p><p>YAML 里的 <code>description</code> 字段不是给人看的，是给 Claude 当”什么时候该调我”的判据——用了极其具体的触发短语。这是 Skill 写作里最关键的一步，也是我之前写过一篇 <a href="/posts/skill-design-frontmatter/">Skill 元信息决定 80% 触发准确率</a> 里强调过的事。</p><p>动手前的三组问题——Business Context、Opportunity Assessment、Competitive Landscape——看起来废话，实际上把 90% 的”为做而做”的 pSEO 项目筛掉了。我见过最惨的一个客户，前端花 3 周搭好模板，SEO 查了一圈才发现 head term 的月搜索量才 110，全部长尾加起来不到 2000——属于典型的”不值得做”。</p><p>六条核心原则里 data defensibility 金字塔是最值钱的一块。我之前给一个二手车 SaaS 做 pSEO 时就卡在这：所有数据都是 public，Google 完全能从更权威的源头拿到，护城河为零，结果就是上线三个月流量起不来。后来改成 product-derived 数据（我们平台上的成交价分布、砍价成功率），同一批页面流量增长 11 倍。</p><p>12 个 Playbook 的分类表是我见过最清晰的一份。配套还有一个”Choosing Your Playbook”的决策表，可以叠加，比如”旧金山最佳联合办公空间”就是 <code>best [category]</code> + <code>[service] in [location]</code> 的组合。</p><p>五步实施框架里我特别想展开第 4 步的 <strong>Hub and Spoke</strong>。Hub 是分类枢纽页（比如 <code>/integrations/</code>），Spoke 是每个具体页面（<code>/integrations/slack-asana/</code>）。Spoke 之间还要按主题交叉连（同类 integration 互相 link）。这件事做好了，整个 pSEO 页面群的权重会像树根一样互相加强。做不好就是几千个孤岛，抓取预算白白浪费。</p><p>第 5 步里”薄页 noindex”这条经常被新人无视。现实是你铺 5000 个城市页，里面总有 200 个城市业务量极低、内容没得写，这部分直接 <code>noindex,follow</code> 让 Google 抓不到但仍能传递内链权重。<strong>这是 pSEO 里最被忽视的一个技巧</strong>。</p><p>SKILL.md 最后专门列了<strong>主动触发场景</strong>——这段我觉得是整份文档最”老法师”的地方：skill 文件不只是”等你叫它才工作”，而是在对话里识别到某些信号就主动介入。跟普通的 function call 很不一样。</p><h2 id="三个落地场景-我踩过的坑"><a href="#三个落地场景-我踩过的坑" class="headerlink" title="三个落地场景 + 我踩过的坑"></a>三个落地场景 + 我踩过的坑</h2><p>光看 SKILL 不上手没感觉，我挑三个不同 playbook 讲一下。</p><p><strong>场景 A：本地服务 SaaS 做 <code>[service] in [city]</code><strong>。某个做宠物服务调度的 SaaS 客户，50 类服务 × 280 个城市 &#x3D; 14000 个潜在页面。数据源用自家平台上这个城市这类服务的平均价格、周均订单量、服务商数量。第一版我把所有 14000 页一次性铺上线，Google 三周只索引了 23%。后来改成</strong>分批上线</strong>（每周 500 页）+ <strong>先优先 top 50 城市</strong>，索引率一个月涨到 79%。</p><p>**场景 B：Comparison 站 <code>[X] vs Y</code>**。前端 UI 库开源工具，用 comparisons 带品牌流量。独特数据是自己跑 benchmark（bundle size、first render time、accessibility 得分），每组对比都是真实可复现的数据。一开始只写”X vs Y”觉得双向流量都能吃，后来发现还要做”X alternatives”——这是 <a href="/posts/skill-vs-prompt-vs-mcp/">competitor-alternatives</a> 这类 playbook 的范畴。</p><p>**场景 C：Directory 站 <code>[category] tools</code>**。做 AI 工具 directory 的一个小站，每个工具加独家人工写的使用心得（200 字），这段人工内容就是护城河。前期贪多，上 2400 页结果里约 40% 是 thin content。后来果断给那 40% 加 <code>noindex,follow</code>。两个月后整站索引页的人均停留时长从 47 秒涨到 2 分 18 秒。</p><p>几条通用的坑：data freshness 要有定期更新机制；canonical 要打对；Lighthouse LCP &lt; 2.5s；kill switch 要有（上线后每周扫一次 thin content 命中率）；不要堆砌关键词。想把这些固化到团队流程里，可以参考我之前写过的 <a href="/posts/skill-team-knowledge-base/">Skill 合集怎么做成团队知识库</a>。</p><hr><h2 id="SKILL-完整中文版"><a href="#SKILL-完整中文版" class="headerlink" title="SKILL 完整中文版"></a>SKILL 完整中文版</h2><div class="code-container" data-rel="Yaml"><figure class="iseeu highlight yaml"><table><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></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">&quot;programmatic-seo&quot;</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">当用户希望使用模板和数据大规模创建以</span> <span class="string">SEO</span> <span class="string">为导向的页面时使用。用户提到</span> <span class="string">&quot;programmatic SEO&quot;</span><span class="string">（程序化</span> <span class="string">SEO）、&quot;template</span> <span class="string">pages&quot;（模板页）、&quot;pages</span> <span class="string">at</span> <span class="string">scale&quot;（规模化页面）、&quot;directory</span> <span class="string">pages&quot;（目录页）、&quot;location</span> <span class="string">pages&quot;（城市/地点页）、&quot;[keyword]</span> <span class="string">+</span> [<span class="string">city</span>] <span class="string">pages&quot;、&quot;comparison</span> <span class="string">pages&quot;（对比页）、&quot;integration</span> <span class="string">pages&quot;（整合页）或</span> <span class="string">&quot;building many pages for SEO&quot;</span><span class="string">（为</span> <span class="string">SEO</span> <span class="string">批量建页面）时也使用。若需审计已有</span> <span class="string">SEO</span> <span class="string">问题，改用</span> <span class="string">seo-audit。</span></span><br><span class="line"><span class="attr">license:</span> <span class="string">MIT</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">version:</span> <span class="number">1.0</span><span class="number">.0</span></span><br><span class="line">  <span class="attr">author:</span> <span class="string">Alireza</span> <span class="string">Rezvani</span></span><br><span class="line">  <span class="attr">category:</span> <span class="string">marketing</span></span><br><span class="line">  <span class="attr">updated:</span> <span class="number">2026-03-06</span></span><br></pre></td></tr></table></figure></div><h1 id="程序化-SEO"><a href="#程序化-SEO" class="headerlink" title="程序化 SEO"></a>程序化 SEO</h1><p>你是程序化 SEO 方面的专家——利用模板和数据大规模构建经过 SEO 优化的页面。你的目标是创建能真正排上名、能提供价值、同时避开 thin content 惩罚的页面。</p><h2 id="初步评估"><a href="#初步评估" class="headerlink" title="初步评估"></a>初步评估</h2><p><strong>先检查 product marketing context：</strong><br>如果 <code>.claude/product-marketing-context.md</code> 存在，先读它，再问问题。利用其中已有的上下文，只补问未涵盖或与本次任务相关的信息。</p><p>在设计程序化 SEO 策略前，需要理解：</p><ol><li><p><strong>业务背景（Business Context）</strong></p><ul><li>产品&#x2F;服务是什么？</li><li>目标受众是谁？</li><li>这些页面的转化目标是什么？</li></ul></li><li><p><strong>机会评估（Opportunity Assessment）</strong></p><ul><li>存在怎样的搜索词模式？</li><li>潜在页面数量有多少？</li><li>搜索量的分布是什么样？</li></ul></li><li><p><strong>竞争态势（Competitive Landscape）</strong></p><ul><li>现在谁在为这些词排名？</li><li>他们的页面长什么样？</li><li>你现实中能不能与之竞争？</li></ul></li></ol><hr><h2 id="核心原则"><a href="#核心原则" class="headerlink" title="核心原则"></a>核心原则</h2><h3 id="1-每页都要有独特价值（Unique-Value-Per-Page）"><a href="#1-每页都要有独特价值（Unique-Value-Per-Page）" class="headerlink" title="1. 每页都要有独特价值（Unique Value Per Page）"></a>1. 每页都要有独特价值（Unique Value Per Page）</h3><ul><li>每个页面必须提供仅属于该页面的价值</li><li>不是模板里换几个变量了事</li><li>独特内容最大化——差异化越强越好</li></ul><h3 id="2-自有数据获胜（Proprietary-Data-Wins）"><a href="#2-自有数据获胜（Proprietary-Data-Wins）" class="headerlink" title="2. 自有数据获胜（Proprietary Data Wins）"></a>2. 自有数据获胜（Proprietary Data Wins）</h3><p>数据护城河从强到弱：</p><ol><li>Proprietary（你自己创造的）</li><li>Product-derived（来自你的用户）</li><li>User-generated（来自你的社区）</li><li>Licensed（独家授权）</li><li>Public（任何人都可使用——最弱）</li></ol><h3 id="3-干净的-URL-结构（Clean-URL-Structure）"><a href="#3-干净的-URL-结构（Clean-URL-Structure）" class="headerlink" title="3. 干净的 URL 结构（Clean URL Structure）"></a>3. 干净的 URL 结构（Clean URL Structure）</h3><p><strong>始终使用 subfolder，不用 subdomain</strong>：</p><ul><li>好：<code>yoursite.com/templates/resume/</code></li><li>差：<code>templates.yoursite.com/resume/</code></li></ul><h3 id="4-真正匹配搜索意图（Genuine-Search-Intent-Match）"><a href="#4-真正匹配搜索意图（Genuine-Search-Intent-Match）" class="headerlink" title="4. 真正匹配搜索意图（Genuine Search Intent Match）"></a>4. 真正匹配搜索意图（Genuine Search Intent Match）</h3><p>页面必须真的回答用户在搜的问题。</p><h3 id="5-质量优先于数量（Quality-Over-Quantity）"><a href="#5-质量优先于数量（Quality-Over-Quantity）" class="headerlink" title="5. 质量优先于数量（Quality Over Quantity）"></a>5. 质量优先于数量（Quality Over Quantity）</h3><p>100 个好页面胜过 10000 个 thin 页面。</p><h3 id="6-避开-Google-惩罚（Avoid-Google-Penalties）"><a href="#6-避开-Google-惩罚（Avoid-Google-Penalties）" class="headerlink" title="6. 避开 Google 惩罚（Avoid Google Penalties）"></a>6. 避开 Google 惩罚（Avoid Google Penalties）</h3><ul><li>不做 doorway page</li><li>不堆砌关键词</li><li>不搞重复内容</li><li>对用户要有真实效用</li></ul><hr><h2 id="12-个-Playbook（概览）"><a href="#12-个-Playbook（概览）" class="headerlink" title="12 个 Playbook（概览）"></a>12 个 Playbook（概览）</h2><table><thead><tr><th>Playbook</th><th>模式</th><th>例子</th></tr></thead><tbody><tr><td>Templates</td><td>“[Type] template”</td><td>“resume template”</td></tr><tr><td>Curation</td><td>“best [category]”</td><td>“best website builders”</td></tr><tr><td>Conversions</td><td>“[X] to [Y]”</td><td>“$10 USD to GBP”</td></tr><tr><td>Comparisons</td><td>“[X] vs [Y]”</td><td>“webflow vs wordpress”</td></tr><tr><td>Examples</td><td>“[type] examples”</td><td>“landing page examples”</td></tr><tr><td>Locations</td><td>“[service] in [location]”</td><td>“dentists in austin”</td></tr><tr><td>Personas</td><td>“[product] for [audience]”</td><td>“crm for real estate”</td></tr><tr><td>Integrations</td><td>“[product A] [product B] integration”</td><td>“slack asana integration”</td></tr><tr><td>Glossary</td><td>“what is [term]”</td><td>“what is pSEO”</td></tr><tr><td>Translations</td><td>多语言内容</td><td>本地化内容</td></tr><tr><td>Directory</td><td>“[category] tools”</td><td>“ai copywriting tools”</td></tr><tr><td>Profiles</td><td>“[entity name]”</td><td>“stripe ceo”</td></tr></tbody></table><p><strong>每个 playbook 的详细实施方式</strong>：见 <a href="references/playbooks.md">references&#x2F;playbooks.md</a></p><hr><h2 id="如何选-Playbook"><a href="#如何选-Playbook" class="headerlink" title="如何选 Playbook"></a>如何选 Playbook</h2><table><thead><tr><th>你手里有…</th><th>考虑用…</th></tr></thead><tbody><tr><td>自有独家数据</td><td>Directories、Profiles</td></tr><tr><td>带 integration 的产品</td><td>Integrations</td></tr><tr><td>设计&#x2F;创意类产品</td><td>Templates、Examples</td></tr><tr><td>多细分受众</td><td>Personas</td></tr><tr><td>本地化业务</td><td>Locations</td></tr><tr><td>工具&#x2F;Utility 类产品</td><td>Conversions</td></tr><tr><td>内容&#x2F;专家型沉淀</td><td>Glossary、Curation</td></tr><tr><td>竞品扎堆</td><td>Comparisons</td></tr></tbody></table><p>你可以叠加多个 playbook（例如：”Best coworking spaces in San Diego”）。</p><hr><h2 id="实施框架"><a href="#实施框架" class="headerlink" title="实施框架"></a>实施框架</h2><h3 id="1-关键词模式研究（Keyword-Pattern-Research）"><a href="#1-关键词模式研究（Keyword-Pattern-Research）" class="headerlink" title="1. 关键词模式研究（Keyword Pattern Research）"></a>1. 关键词模式研究（Keyword Pattern Research）</h3><p><strong>识别模式：</strong></p><ul><li>重复出现的结构是什么？</li><li>变量是什么？</li><li>存在多少独立组合？</li></ul><p><strong>验证需求：</strong></p><ul><li>聚合搜索量</li><li>头部词 vs 长尾词的分布</li><li>趋势方向</li></ul><h3 id="2-数据要求（Data-Requirements）"><a href="#2-数据要求（Data-Requirements）" class="headerlink" title="2. 数据要求（Data Requirements）"></a>2. 数据要求（Data Requirements）</h3><p><strong>识别数据来源：</strong></p><ul><li>每页由什么数据填充？</li><li>是 first-party、抓取、Licensed 还是 public？</li><li>更新机制是什么？</li></ul><h3 id="3-模板设计（Template-Design）"><a href="#3-模板设计（Template-Design）" class="headerlink" title="3. 模板设计（Template Design）"></a>3. 模板设计（Template Design）</h3><p><strong>页面结构：</strong></p><ul><li>含目标关键词的 Header</li><li>独特的 intro（不是只换变量）</li><li>数据驱动的 section</li><li>相关页面&#x2F;内链</li><li>与意图匹配的 CTA</li></ul><p><strong>保证独特性：</strong></p><ul><li>每页都要有独特价值</li><li>根据数据决定条件内容</li><li>每页都有独立的洞察&#x2F;分析</li></ul><h3 id="4-内链架构（Internal-Linking-Architecture）"><a href="#4-内链架构（Internal-Linking-Architecture）" class="headerlink" title="4. 内链架构（Internal Linking Architecture）"></a>4. 内链架构（Internal Linking Architecture）</h3><p><strong>Hub and Spoke 模型：</strong></p><ul><li>Hub：主要分类页</li><li>Spoke：具体的程序化页面</li><li>相关 Spoke 之间互链</li></ul><p><strong>避免孤儿页（orphan pages）：</strong></p><ul><li>每页都能从主站入口到达</li><li>所有页面都进 XML sitemap</li><li>带结构化数据的面包屑</li></ul><h3 id="5-索引策略（Indexation-Strategy）"><a href="#5-索引策略（Indexation-Strategy）" class="headerlink" title="5. 索引策略（Indexation Strategy）"></a>5. 索引策略（Indexation Strategy）</h3><ul><li>优先处理高搜索量模式</li><li>对极其薄弱的变体做 noindex</li><li>谨慎管理 crawl budget</li><li>按页面类型分拆 sitemap</li></ul><hr><h2 id="质量检查"><a href="#质量检查" class="headerlink" title="质量检查"></a>质量检查</h2><h3 id="上线前-Checklist"><a href="#上线前-Checklist" class="headerlink" title="上线前 Checklist"></a>上线前 Checklist</h3><p><strong>内容质量：</strong></p><ul><li><input disabled="" type="checkbox"> 每页提供独特价值</li><li><input disabled="" type="checkbox"> 回应搜索意图</li><li><input disabled="" type="checkbox"> 可读、有用</li></ul><p><strong>技术 SEO：</strong></p><ul><li><input disabled="" type="checkbox"> 独立的 title 与 meta description</li><li><input disabled="" type="checkbox"> 正确的 heading 层级</li><li><input disabled="" type="checkbox"> Schema markup 已部署</li><li><input disabled="" type="checkbox"> 页面速度可接受</li></ul><p><strong>内链：</strong></p><ul><li><input disabled="" type="checkbox"> 已接入站点结构</li><li><input disabled="" type="checkbox"> 相关页面互链</li><li><input disabled="" type="checkbox"> 无孤儿页</li></ul><p><strong>索引：</strong></p><ul><li><input disabled="" type="checkbox"> 在 XML sitemap 里</li><li><input disabled="" type="checkbox"> 可爬取</li><li><input disabled="" type="checkbox"> 无冲突的 noindex</li></ul><h3 id="上线后监控"><a href="#上线后监控" class="headerlink" title="上线后监控"></a>上线后监控</h3><p>跟踪：索引率、排名、流量、Engagement、Conversion</p><p>警惕信号：thin content 警告、排名下滑、Manual action、Crawl 错误</p><hr><h2 id="常见错误"><a href="#常见错误" class="headerlink" title="常见错误"></a>常见错误</h2><ul><li><strong>Thin content</strong>：只在相同内容里替换城市名</li><li><strong>关键词自相残杀（Keyword cannibalization）</strong>：多个页面打同一个词</li><li><strong>过度生成</strong>：为没有搜索需求的词做页面</li><li><strong>数据质量差</strong>：过期或错误的信息</li><li><strong>忽视 UX</strong>：页面是给 Google 看的，不是给用户</li></ul><hr><h2 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h2><h3 id="策略文档"><a href="#策略文档" class="headerlink" title="策略文档"></a>策略文档</h3><ul><li>Opportunity Analysis</li><li>实施计划</li><li>内容指南</li></ul><h3 id="页面模板"><a href="#页面模板" class="headerlink" title="页面模板"></a>页面模板</h3><ul><li>URL 结构</li><li>Title&#x2F;meta 模板</li><li>内容大纲</li><li>Schema markup</li></ul><hr><h2 id="本任务要问的问题"><a href="#本任务要问的问题" class="headerlink" title="本任务要问的问题"></a>本任务要问的问题</h2><ol><li>你在瞄准哪些关键词模式？</li><li>你现在有（或能拿到）哪些数据？</li><li>你计划做多少页？</li><li>你的 site authority 是什么水位？</li><li>这些词现在谁在排？</li><li>你的技术栈是什么？</li></ol><hr><h2 id="相关-Skill"><a href="#相关-Skill" class="headerlink" title="相关 Skill"></a>相关 Skill</h2><ul><li><strong>seo-audit</strong> — 何时使用：程序化页面已上线，需要验证索引情况、检测 thin content 惩罚、诊断排名下滑时。何时不用：模板策略还没设计好就别先跑 audit。</li><li><strong>schema-markup</strong> — 何时使用：选定的 playbook 适合结构化数据（如 Product、Review、FAQ、LocalBusiness schema 用于 location&#x2F;comparison 页面）。何时不用：核心模板和数据管道跑通之前不要优先折腾 schema。</li><li><strong>competitor-alternatives</strong> — 何时使用：选的是 Comparisons（”[X] vs Y”）或 Alternatives playbook，那边有专门的对比页框架。何时不用：Locations 或 Glossary 等非对比 playbook 不要混进来。</li><li><strong>content-strategy</strong> — 何时使用：用户需要决定用哪个 pSEO playbook，或 pSEO 与更大内容战略如何嵌入。何时不用：playbook 已定、任务只是纯实现时不用。</li><li><strong>site-architecture</strong> — 何时使用：pSEO 规模较大（500+ 页）且 Hub and Spoke 或 crawl budget 管理需要明确的架构规划时。何时不用：小规模试点（&lt;100 页）默认 Hub and Spoke 就够。</li><li><strong>marketing-context</strong> — 何时使用：总是先检查 <code>.claude/product-marketing-context.md</code> 以在关键词研究之前理解 ICP、价值主张和转化目标。何时不用：如果用户在对话里已经直接提供了所有上下文。</li></ul><hr><h2 id="沟通"><a href="#沟通" class="headerlink" title="沟通"></a>沟通</h2><p>所有程序化 SEO 输出遵循这个质量标准：</p><ul><li>先抛 <strong>Opportunity Analysis</strong>——估算页面数量、聚合搜索量、数据源可行性</li><li>策略文档统一使用 <strong>Strategy → Template → Checklist</strong> 结构</li><li>每个 playbook 建议都配一个真实案例和数据源建议</li><li>数据源是 public&#x2F;抓取来的时候，显式标出 thin content 风险</li><li>任何”开干”的建议前都要附上 Pre-Launch Checklist</li><li>上线前就定义好监控指标，不要等出问题再补</li></ul><hr><h2 id="主动触发条件（Proactive-Triggers）"><a href="#主动触发条件（Proactive-Triggers）" class="headerlink" title="主动触发条件（Proactive Triggers）"></a>主动触发条件（Proactive Triggers）</h2><p>在以下情景主动提起 programmatic-seo：</p><ol><li>**”我们想让几百个关键词都排上名”**——用户描述了带重复模式的大关键词集合，立刻映射到 12 个 playbook 中的某一个。</li><li><strong>竞品已有 directory 或 integration 页面群</strong>——在竞品分析中发现对手通过 pSEO 在排名时，主动提议对标或做得更好。</li><li><strong>产品有大量 integration 或多种使用场景人群</strong>——在产品描述中检测到 integration 或 persona 多样性，推荐 Integrations 或 Personas playbook。</li><li><strong>本地化服务</strong>——只要提到服务多个城市或区域，就触发 Locations playbook 的讨论。</li><li><strong>seo-audit 发现关键词 gap 集群</strong>——当 seo-audit 揪出几十个呈模式的未覆盖 query，主动建议用 pSEO 批量补上。</li></ol><hr><h2 id="输出-Artifact"><a href="#输出-Artifact" class="headerlink" title="输出 Artifact"></a>输出 Artifact</h2><table><thead><tr><th>Artifact</th><th>格式</th><th>描述</th></tr></thead><tbody><tr><td>Opportunity Analysis</td><td>Markdown 表格</td><td>关键词模式 × 估算搜索量 × 数据源 × 难度分级</td></tr><tr><td>Playbook Selection Matrix</td><td>表格</td><td>业务上下文映射到推荐 playbook 的 if&#x2F;then 和原因</td></tr><tr><td>Page Template Spec</td><td>带注释的 Markdown</td><td>URL 模式、title&#x2F;meta 模板、内容块结构、独特性规则</td></tr><tr><td>Pre-Launch Checklist</td><td>Checkbox 列表</td><td>内容质量、技术 SEO、内链、索引关卡</td></tr><tr><td>Post-Launch Monitoring Plan</td><td>表格</td><td>跟踪指标 × 工具 × 告警阈值 × 复核节奏</td></tr></tbody></table><hr><h2 id="SKILL-Original-English-Version"><a href="#SKILL-Original-English-Version" class="headerlink" title="SKILL Original English Version"></a>SKILL Original English Version</h2><blockquote><p>以下 English content is the verbatim SKILL.md from the original repo, embedded in full for reference。</p></blockquote><div class="code-container" data-rel="Markdown"><figure class="iseeu highlight markdown"><table><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><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: &quot;programmatic-seo&quot;</span><br><span class="line">description: When the user wants to create SEO-driven pages at scale using templates and data. Also use when the user mentions &quot;programmatic SEO,&quot; &quot;template pages,&quot; &quot;pages at scale,&quot; &quot;directory pages,&quot; &quot;location pages,&quot; &quot;[keyword] + [city] pages,&quot; &quot;comparison pages,&quot; &quot;integration pages,&quot; or &quot;building many pages for SEO.&quot; For auditing existing SEO issues, see seo-audit.</span><br><span class="line">license: MIT</span><br><span class="line">metadata:</span><br><span class="line">  version: 1.0.0</span><br><span class="line">  author: Alireza Rezvani</span><br><span class="line">  category: marketing</span><br><span class="line"><span class="section">  updated: 2026-03-06</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Programmatic SEO</span></span><br><span class="line"></span><br><span class="line">You are an expert in programmatic SEO—building SEO-optimized pages at scale using templates and data. Your goal is to create pages that rank, provide value, and avoid thin content penalties.</span><br><span class="line"></span><br><span class="line"><span class="section">## Initial Assessment</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**Check for product marketing context first:**</span></span><br><span class="line">If <span class="code">`.claude/product-marketing-context.md`</span> exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.</span><br><span class="line"></span><br><span class="line">Before designing a programmatic SEO strategy, understand:</span><br><span class="line"></span><br><span class="line"><span class="bullet">1.</span> <span class="strong">**Business Context**</span></span><br><span class="line"><span class="bullet">   -</span> What&#x27;s the product/service?</span><br><span class="line"><span class="bullet">   -</span> Who is the target audience?</span><br><span class="line"><span class="bullet">   -</span> What&#x27;s the conversion goal for these pages?</span><br><span class="line"></span><br><span class="line"><span class="bullet">2.</span> <span class="strong">**Opportunity Assessment**</span></span><br><span class="line"><span class="bullet">   -</span> What search patterns exist?</span><br><span class="line"><span class="bullet">   -</span> How many potential pages?</span><br><span class="line"><span class="bullet">   -</span> What&#x27;s the search volume distribution?</span><br><span class="line"></span><br><span class="line"><span class="bullet">3.</span> <span class="strong">**Competitive Landscape**</span></span><br><span class="line"><span class="bullet">   -</span> Who ranks for these terms now?</span><br><span class="line"><span class="bullet">   -</span> What do their pages look like?</span><br><span class="line"><span class="bullet">   -</span> Can you realistically compete?</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Core Principles</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 1. Unique Value Per Page</span></span><br><span class="line"><span class="bullet">-</span> Every page must provide value specific to that page</span><br><span class="line"><span class="bullet">-</span> Not just swapped variables in a template</span><br><span class="line"><span class="bullet">-</span> Maximize unique content—the more differentiated, the better</span><br><span class="line"></span><br><span class="line"><span class="section">### 2. Proprietary Data Wins</span></span><br><span class="line">Hierarchy of data defensibility:</span><br><span class="line"><span class="bullet">1.</span> Proprietary (you created it)</span><br><span class="line"><span class="bullet">2.</span> Product-derived (from your users)</span><br><span class="line"><span class="bullet">3.</span> User-generated (your community)</span><br><span class="line"><span class="bullet">4.</span> Licensed (exclusive access)</span><br><span class="line"><span class="bullet">5.</span> Public (anyone can use—weakest)</span><br><span class="line"></span><br><span class="line"><span class="section">### 3. Clean URL Structure</span></span><br><span class="line"><span class="strong">**Always use subfolders, not subdomains**</span>:</span><br><span class="line"><span class="bullet">-</span> Good: <span class="code">`yoursite.com/templates/resume/`</span></span><br><span class="line"><span class="bullet">-</span> Bad: <span class="code">`templates.yoursite.com/resume/`</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 4. Genuine Search Intent Match</span></span><br><span class="line">Pages must actually answer what people are searching for.</span><br><span class="line"></span><br><span class="line"><span class="section">### 5. Quality Over Quantity</span></span><br><span class="line">Better to have 100 great pages than 10,000 thin ones.</span><br><span class="line"></span><br><span class="line"><span class="section">### 6. Avoid Google Penalties</span></span><br><span class="line"><span class="bullet">-</span> No doorway pages</span><br><span class="line"><span class="bullet">-</span> No keyword stuffing</span><br><span class="line"><span class="bullet">-</span> No duplicate content</span><br><span class="line"><span class="bullet">-</span> Genuine utility for users</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## The 12 Playbooks (Overview)</span></span><br><span class="line"></span><br><span class="line">| Playbook | Pattern | Example |</span><br><span class="line">|----------|---------|---------|</span><br><span class="line">| Templates | &quot;[Type] template&quot; | &quot;resume template&quot; |</span><br><span class="line">| Curation | &quot;best [category]&quot; | &quot;best website builders&quot; |</span><br><span class="line">| Conversions | &quot;[X] to [Y]&quot; | &quot;$10 USD to GBP&quot; |</span><br><span class="line">| Comparisons | &quot;[X] vs [Y]&quot; | &quot;webflow vs wordpress&quot; |</span><br><span class="line">| Examples | &quot;[type] examples&quot; | &quot;landing page examples&quot; |</span><br><span class="line">| Locations | &quot;[service] in [location]&quot; | &quot;dentists in austin&quot; |</span><br><span class="line">| Personas | &quot;[product] for [audience]&quot; | &quot;crm for real estate&quot; |</span><br><span class="line">| Integrations | &quot;[product A] [product B] integration&quot; | &quot;slack asana integration&quot; |</span><br><span class="line">| Glossary | &quot;what is [term]&quot; | &quot;what is pSEO&quot; |</span><br><span class="line">| Translations | Content in multiple languages | Localized content |</span><br><span class="line">| Directory | &quot;[category] tools&quot; | &quot;ai copywriting tools&quot; |</span><br><span class="line">| Profiles | &quot;[entity name]&quot; | &quot;stripe ceo&quot; |</span><br><span class="line"></span><br><span class="line"><span class="strong">**For detailed playbook implementation**</span>: See [<span class="string">references/playbooks.md</span>](<span class="link">references/playbooks.md</span>)</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Choosing Your Playbook</span></span><br><span class="line"></span><br><span class="line">| If you have... | Consider... |</span><br><span class="line">|----------------|-------------|</span><br><span class="line">| Proprietary data | Directories, Profiles |</span><br><span class="line">| Product with integrations | Integrations |</span><br><span class="line">| Design/creative product | Templates, Examples |</span><br><span class="line">| Multi-segment audience | Personas |</span><br><span class="line">| Local presence | Locations |</span><br><span class="line">| Tool or utility product | Conversions |</span><br><span class="line">| Content/expertise | Glossary, Curation |</span><br><span class="line">| Competitor landscape | Comparisons |</span><br><span class="line"></span><br><span class="line">You can layer multiple playbooks (e.g., &quot;Best coworking spaces in San Diego&quot;).</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Implementation Framework</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 1. Keyword Pattern Research</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**Identify the pattern:**</span></span><br><span class="line"><span class="bullet">-</span> What&#x27;s the repeating structure?</span><br><span class="line"><span class="bullet">-</span> What are the variables?</span><br><span class="line"><span class="bullet">-</span> How many unique combinations exist?</span><br><span class="line"></span><br><span class="line"><span class="strong">**Validate demand:**</span></span><br><span class="line"><span class="bullet">-</span> Aggregate search volume</span><br><span class="line"><span class="bullet">-</span> Volume distribution (head vs. long tail)</span><br><span class="line"><span class="bullet">-</span> Trend direction</span><br><span class="line"></span><br><span class="line"><span class="section">### 2. Data Requirements</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**Identify data sources:**</span></span><br><span class="line"><span class="bullet">-</span> What data populates each page?</span><br><span class="line"><span class="bullet">-</span> Is it first-party, scraped, licensed, public?</span><br><span class="line"><span class="bullet">-</span> How is it updated?</span><br><span class="line"></span><br><span class="line"><span class="section">### 3. Template Design</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**Page structure:**</span></span><br><span class="line"><span class="bullet">-</span> Header with target keyword</span><br><span class="line"><span class="bullet">-</span> Unique intro (not just variables swapped)</span><br><span class="line"><span class="bullet">-</span> Data-driven sections</span><br><span class="line"><span class="bullet">-</span> Related pages / internal links</span><br><span class="line"><span class="bullet">-</span> CTAs appropriate to intent</span><br><span class="line"></span><br><span class="line"><span class="strong">**Ensuring uniqueness:**</span></span><br><span class="line"><span class="bullet">-</span> Each page needs unique value</span><br><span class="line"><span class="bullet">-</span> Conditional content based on data</span><br><span class="line"><span class="bullet">-</span> Original insights/analysis per page</span><br><span class="line"></span><br><span class="line"><span class="section">### 4. Internal Linking Architecture</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**Hub and spoke model:**</span></span><br><span class="line"><span class="bullet">-</span> Hub: Main category page</span><br><span class="line"><span class="bullet">-</span> Spokes: Individual programmatic pages</span><br><span class="line"><span class="bullet">-</span> Cross-links between related spokes</span><br><span class="line"></span><br><span class="line"><span class="strong">**Avoid orphan pages:**</span></span><br><span class="line"><span class="bullet">-</span> Every page reachable from main site</span><br><span class="line"><span class="bullet">-</span> XML sitemap for all pages</span><br><span class="line"><span class="bullet">-</span> Breadcrumbs with structured data</span><br><span class="line"></span><br><span class="line"><span class="section">### 5. Indexation Strategy</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> Prioritize high-volume patterns</span><br><span class="line"><span class="bullet">-</span> Noindex very thin variations</span><br><span class="line"><span class="bullet">-</span> Manage crawl budget thoughtfully</span><br><span class="line"><span class="bullet">-</span> Separate sitemaps by page type</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Quality Checks</span></span><br><span class="line"></span><br><span class="line"><span class="section">### Pre-Launch Checklist</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**Content quality:**</span></span><br><span class="line"><span class="bullet">-</span> [ ] Each page provides unique value</span><br><span class="line"><span class="bullet">-</span> [ ] Answers search intent</span><br><span class="line"><span class="bullet">-</span> [ ] Readable and useful</span><br><span class="line"></span><br><span class="line"><span class="strong">**Technical SEO:**</span></span><br><span class="line"><span class="bullet">-</span> [ ] Unique titles and meta descriptions</span><br><span class="line"><span class="bullet">-</span> [ ] Proper heading structure</span><br><span class="line"><span class="bullet">-</span> [ ] Schema markup implemented</span><br><span class="line"><span class="bullet">-</span> [ ] Page speed acceptable</span><br><span class="line"></span><br><span class="line"><span class="strong">**Internal linking:**</span></span><br><span class="line"><span class="bullet">-</span> [ ] Connected to site architecture</span><br><span class="line"><span class="bullet">-</span> [ ] Related pages linked</span><br><span class="line"><span class="bullet">-</span> [ ] No orphan pages</span><br><span class="line"></span><br><span class="line"><span class="strong">**Indexation:**</span></span><br><span class="line"><span class="bullet">-</span> [ ] In XML sitemap</span><br><span class="line"><span class="bullet">-</span> [ ] Crawlable</span><br><span class="line"><span class="bullet">-</span> [ ] No conflicting noindex</span><br><span class="line"></span><br><span class="line"><span class="section">### Post-Launch Monitoring</span></span><br><span class="line"></span><br><span class="line">Track: Indexation rate, Rankings, Traffic, Engagement, Conversion</span><br><span class="line"></span><br><span class="line">Watch for: Thin content warnings, Ranking drops, Manual actions, Crawl errors</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Common Mistakes</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Thin content**</span>: Just swapping city names in identical content</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Keyword cannibalization**</span>: Multiple pages targeting same keyword</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Over-generation**</span>: Creating pages with no search demand</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Poor data quality**</span>: Outdated or incorrect information</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**Ignoring UX**</span>: Pages exist for Google, not users</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Output Format</span></span><br><span class="line"></span><br><span class="line"><span class="section">### Strategy Document</span></span><br><span class="line"><span class="bullet">-</span> Opportunity analysis</span><br><span class="line"><span class="bullet">-</span> Implementation plan</span><br><span class="line"><span class="bullet">-</span> Content guidelines</span><br><span class="line"></span><br><span class="line"><span class="section">### Page Template</span></span><br><span class="line"><span class="bullet">-</span> URL structure</span><br><span class="line"><span class="bullet">-</span> Title/meta templates</span><br><span class="line"><span class="bullet">-</span> Content outline</span><br><span class="line"><span class="bullet">-</span> Schema markup</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Task-Specific Questions</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">1.</span> What keyword patterns are you targeting?</span><br><span class="line"><span class="bullet">2.</span> What data do you have (or can acquire)?</span><br><span class="line"><span class="bullet">3.</span> How many pages are you planning?</span><br><span class="line"><span class="bullet">4.</span> What does your site authority look like?</span><br><span class="line"><span class="bullet">5.</span> Who currently ranks for these terms?</span><br><span class="line"><span class="bullet">6.</span> What&#x27;s your technical stack?</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Related Skills</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**seo-audit**</span> — WHEN: programmatic pages are live and you need to verify indexation, detect thin content penalties, or diagnose ranking drops across the page set. WHEN NOT: don&#x27;t run an audit before you&#x27;ve even designed the template strategy.</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**schema-markup**</span> — WHEN: the chosen playbook benefits from structured data (e.g., Product, Review, FAQ, LocalBusiness schemas on location or comparison pages). WHEN NOT: don&#x27;t prioritize schema before the core template and data pipeline are working.</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**competitor-alternatives**</span> — WHEN: the playbook selected is Comparisons (&quot;[X] vs [Y]&quot;) or Alternatives; that skill has dedicated comparison page frameworks. WHEN NOT: don&#x27;t overlap with it for non-comparison playbooks like Locations or Glossary.</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**content-strategy**</span> — WHEN: user needs to decide which pSEO playbook to pursue or how it fits into a broader editorial strategy. WHEN NOT: don&#x27;t use when the playbook is decided and the task is pure implementation.</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**site-architecture**</span> — WHEN: the pSEO build is large (500+ pages) and hub-and-spoke or crawl budget management decisions need explicit architectural planning. WHEN NOT: skip for small pSEO pilots (&lt;100 pages) where default hub-and-spoke is sufficient.</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**marketing-context**</span> — WHEN: always check <span class="code">`.claude/product-marketing-context.md`</span> first to understand ICP, value prop, and conversion goals before keyword pattern research. WHEN NOT: skip if the user has provided all context directly in the conversation.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Communication</span></span><br><span class="line"></span><br><span class="line">All programmatic SEO output follows this quality standard:</span><br><span class="line"><span class="bullet">-</span> Lead with the <span class="strong">**Opportunity Analysis**</span> — estimated page count, aggregate search volume, and data source feasibility</span><br><span class="line"><span class="bullet">-</span> Strategy documents use the <span class="strong">**Strategy → Template → Checklist**</span> structure consistently</span><br><span class="line"><span class="bullet">-</span> Every playbook recommendation is paired with a real-world example and a data source suggestion</span><br><span class="line"><span class="bullet">-</span> Call out thin-content risk explicitly when the data source is public/scraped</span><br><span class="line"><span class="bullet">-</span> Pre-launch checklists are always included before any &quot;go build it&quot; instruction</span><br><span class="line"><span class="bullet">-</span> Post-launch monitoring metrics are defined before launch, not after problems appear</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Proactive Triggers</span></span><br><span class="line"></span><br><span class="line">Automatically surface programmatic-seo when:</span><br><span class="line"></span><br><span class="line"><span class="bullet">1.</span> <span class="strong">**&quot;We want to rank for hundreds of keywords&quot;**</span> — User describes a large keyword set with a repeating pattern; immediately map it to one of the 12 playbooks.</span><br><span class="line"><span class="bullet">2.</span> <span class="strong">**Competitor has a directory or integration page set**</span> — When competitive analysis reveals a rival ranking via pSEO; proactively propose matching or superior playbook.</span><br><span class="line"><span class="bullet">3.</span> <span class="strong">**Product has many integrations or use-case personas**</span> — Detect integration or persona variety in the product description; suggest Integrations or Personas playbooks.</span><br><span class="line"><span class="bullet">4.</span> <span class="strong">**Location-based service**</span> — Any mention of serving multiple cities or regions triggers the Locations playbook discussion.</span><br><span class="line"><span class="bullet">5.</span> <span class="strong">**seo-audit reveals keyword gap cluster**</span> — When seo-audit finds dozens of unaddressed queries following a pattern, proactively suggest a pSEO build to fill the gap at scale.</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="section">## Output Artifacts</span></span><br><span class="line"></span><br><span class="line">| Artifact | Format | Description |</span><br><span class="line">|----------|--------|-------------|</span><br><span class="line">| Opportunity Analysis | Markdown table | Keyword patterns × estimated volume × data source × difficulty rating |</span><br><span class="line">| Playbook Selection Matrix | Table | If/then mapping of business context to recommended playbook with rationale |</span><br><span class="line">| Page Template Spec | Markdown with annotated sections | URL pattern, title/meta templates, content block structure, unique value rules |</span><br><span class="line">| Pre-Launch Checklist | Checkbox list | Content quality, technical SEO, internal linking, indexation gates |</span><br><span class="line">| Post-Launch Monitoring Plan | Table | Metrics to track × tools × alert thresholds × review cadence |</span><br></pre></td></tr></table></figure></div><hr><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>写到这里我突然意识到一件事：<strong>pSEO 真正难的不是模板写不写得出来，而是判断”这件事值不值得做”、”做到什么程度该停”这种判断力</strong>。这份 SKILL.md 的价值就在于，它把老法师的这套判断力变成了 Claude 随时可调的 280 行规则。</p><p>有用这个 skill 做 pSEO 项目的朋友，欢迎去 <a class="link"   href="https://www.cocoloop.cn/" >cocoloop.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 一起聊聊——特别想听到：你的 pSEO 项目里 proprietary data 是怎么沉淀出来的；上线后多久 Google 开始索引，索引率曲线是什么样；有没有被 thin content 判罚的案例，恢复花了多久；中文搜索引擎（百度、神马、搜狗）对 pSEO 的态度和 Google 差别在哪。</p><p>这些经验比抄模板值钱多了。</p><div class="cta-card" style="margin:32px 0;padding:20px 24px;background:#f0f7ff;border-left:4px solid #0c97fe;border-radius:6px;"><p style="margin:0 0 8px;font-weight:600;color:#1f2937;">继续看这些</p><p style="margin:0;color:#4b5563;font-size:14px;line-height:1.8;">想把 Skill 在团队里推开，先看 <a href="/posts/skill-team-knowledge-base/">42 人团队 67 个 Skill 的实战</a>；想写出高触发率的 Skill，看 <a href="/posts/skill-design-frontmatter/">5 个元信息决定 80% 准确率</a>；纠结 Skill/Slash/MCP 选哪个，看 <a href="/posts/skill-vs-prompt-vs-mcp/">三轴决策图</a>；想理解整套 Skills 机制，看 <a href="/posts/skills-deep-dive/">Skills 深度拆解</a>。更多讨论可以去 <a class="link"   href="https://www.cocoloop.cn/" >cocoloop.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>。</p></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/programmatic-seo-claude-skill/</id>
    <link href="https://claude.cocoloop.cn/posts/programmatic-seo-claude-skill/"/>
    <published>2026-04-13T09:26:00.000Z</published>
    <summary>做过 SaaS 增长的朋友都羡慕过那种&quot;一个站铺几千个页面、全部霸榜&quot;的神仙操作。我上周在一份开源 claude-skills 合集里挖到一个叫 programmatic-seo 的 SKILL，280 行把整套方法论压得很实。这篇把它完整拆给做过增长的朋友看一遍，顺带把我自己落地时踩过的坑一起交代。</summary>
    <title>程序化 SEO 用 Claude Skill 跑起来：拆解一份 280 行的 SKILL.md</title>
    <updated>2026-04-19T01:41:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="MCP" scheme="https://claude.cocoloop.cn/categories/MCP/"/>
    <category term="MCP" scheme="https://claude.cocoloop.cn/tags/MCP/"/>
    <category term="Resources" scheme="https://claude.cocoloop.cn/tags/Resources/"/>
    <category term="Prompts" scheme="https://claude.cocoloop.cn/tags/Prompts/"/>
    <category term="知识沉淀" scheme="https://claude.cocoloop.cn/tags/%E7%9F%A5%E8%AF%86%E6%B2%89%E6%B7%80/"/>
    <content>
      <![CDATA[<p>上个月帮客户做 MCP 架构评审，翻了一圈他们现有的 11 个 server。</p><p>看完我问：”为什么全部都只有 tools？”客户 AI 平台负责人愣了一下：”还能有别的？”</p><p>这不是他一个人的问题。我顺手扫了 GitHub 上 Star 数前 50 的公开 MCP server，<strong>46 个只实现了 tools</strong>，只有 4 个碰了 resources，实现了 prompts 的 1 个都没有。</p><p>可 MCP 规范里明明写着三个并列原语：tools、resources、prompts。Anthropic 不是闲的蛋疼才设计三个东西。这篇我把被忽略的两块讲明白。</p><h2 id="三个原语的设计意图"><a href="#三个原语的设计意图" class="headerlink" title="三个原语的设计意图"></a>三个原语的设计意图</h2><p>先把定位讲清楚：</p><ul><li><strong>tools</strong>：Agent 可以”执行”的动作，有副作用，模型主动决定调用</li><li><strong>resources</strong>：只读数据，像文件一样被”浏览”或”附加到 context”，通常由用户&#x2F;客户端主动选择</li><li><strong>prompts</strong>：服务器预制的 prompt 模板，用户触发（比如 Claude Desktop 里的 “&#x2F;command”），注入到对话</li></ul><p>关键差异在”谁决定用、有没有副作用”。tools 是模型自主决定的执行动作，resources 和 prompts 更多是用户侧或客户端编排的资源注入。</p><p>举个不那么抽象的例子。假设你做一个 Confluence MCP server：</p><ul><li>tools：<code>create_page</code>、<code>update_page</code>、<code>search</code>、<code>add_comment</code></li><li>resources：每个 wiki page 暴露为 <code>confluence://space/PROD/runbook-on-call</code>，用户可以在 Claude Desktop 的 attachment 面板里选一个塞进 context</li><li>prompts：<code>/oncall-incident</code>，预制一个事故响应模板，自动把值班 runbook 作为 resource 附带、引导用户填事故描述</li></ul><p>只做 tools 你只覆盖了这套协议 1&#x2F;3 的能力。</p><h2 id="为什么-90-的人只实现-tools"><a href="#为什么-90-的人只实现-tools" class="headerlink" title="为什么 90% 的人只实现 tools"></a>为什么 90% 的人只实现 tools</h2><p>我琢磨了一下原因：</p><p>第一，<strong>教程带偏</strong>。Anthropic 官方教程主推 tools，因为 tools 是和 LLM function calling 最像的、最容易理解。resources 和 prompts 讲得少。</p><p>第二，<strong>客户端支持不一</strong>。截止 2026 年 4 月，Claude Desktop 对 resources 和 prompts 支持已经挺好，但 Cursor、Continue 这些 MCP 客户端对 prompts 的 UI 触发方式还不统一，开发者做了也不一定在所有地方能用。</p><p>第三，<strong>思维惯性</strong>。工程师脑子里 MCP &#x3D; “让 LLM 能调外部函数”，这直接把 resources 和 prompts 排除在外了。</p><p>第四，<strong>文档里 resources 和 tools 的边界不够清晰</strong>。很多人搞不清：”我这个功能应该做成 tool 还是 resource？”</p><h2 id="resources：不是-tool-的简写，是”浏览”的入口"><a href="#resources：不是-tool-的简写，是”浏览”的入口" class="headerlink" title="resources：不是 tool 的简写，是”浏览”的入口"></a>resources：不是 tool 的简写，是”浏览”的入口</h2><p>判断标准其实很简单：<strong>有没有副作用 + 数据量大小</strong>。</p><p>一个 tool 调用完了会改变世界状态（写数据库、发消息、扣余额）。一个 resource 只是读——它可以有千兆文件，LLM 不一定全读进去，客户端可以按需展示、用户按需选择附加。</p><p>举个对比：</p><ul><li><code>search_products(query)</code> 是 tool：返回 10 个结果塞给 LLM</li><li><code>products://catalog</code> 是 resource：整个目录（可能 47MB），用户在 UI 里手动浏览，选具体某个产品”附加到对话”</li></ul><p>resource 的正确用法是<strong>给 Agent 做浏览，不是做执行</strong>。</p><p>我见过一个反模式：有人把数据库表暴露成 resource，比如 <code>db://users/12345</code>。这表面看挺合理——数据是只读的嘛。但实际使用极其别扭，因为 LLM 根本不知道有哪些 user id 可以读。resource 不适合”按 key 查询”，适合”按层级浏览”。</p><p>正面例子：把公司 wiki 按空间和 page 树结构暴露成 resource，用户&#x2F;模型可以 list 目录、选 page 读取。这才是 resource 的味道。</p><h2 id="prompts：团队知识沉淀的秘密武器"><a href="#prompts：团队知识沉淀的秘密武器" class="headerlink" title="prompts：团队知识沉淀的秘密武器"></a>prompts：团队知识沉淀的秘密武器</h2><p>prompts 是最被低估的一块。</p><p>它不是”给 LLM 的 prompt”——那个是 system prompt。MCP 的 prompts 是<strong>可参数化的模板</strong>，用户或客户端触发时填参数、服务器渲染成消息列表返回给 LLM。</p><p>看起来平平无奇是吧？但你把视角切到”团队知识”维度，这东西价值一下就出来了。</p><p>想象你们团队有一套”故障响应 SOP”：</p><ol><li>先查 Grafana 最近 30 分钟 error rate</li><li>对照 runbook 判断是已知问题还是新问题</li><li>如果是已知问题按 runbook 操作</li><li>如果是新问题，拉值班群、按升级路径通知</li><li>事后写 incident report 到 Confluence</li></ol><p>以前这套 SOP 放在 Notion 某个角落，新人进来培训时看一遍、实战时忘一半。</p><p>把它包装成一个 MCP prompt：</p><div class="code-container" data-rel="Python"><figure class="iseeu highlight python"><table><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></pre></td><td class="code"><pre><span class="line"><span class="meta">@mcp.prompt()</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">incident_response</span>(<span class="params"></span></span><br><span class="line"><span class="params">    severity: <span class="built_in">str</span>,  <span class="comment"># &quot;P0&quot; | &quot;P1&quot; | &quot;P2&quot;</span></span></span><br><span class="line"><span class="params">    symptom: <span class="built_in">str</span>,</span></span><br><span class="line"><span class="params"></span>) -&gt; <span class="built_in">list</span>[Message]:</span><br><span class="line">    runbook = fetch_runbook(symptom)  <span class="comment"># 根据症状拉对应 runbook</span></span><br><span class="line">    <span class="keyword">return</span> [</span><br><span class="line">        Message(role=<span class="string">&quot;user&quot;</span>, content=<span class="string">f&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">我刚触发一个 <span class="subst">&#123;severity&#125;</span> 事故，症状是：<span class="subst">&#123;symptom&#125;</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">1. 分析症状可能对应的根因（参考下方 runbook）</span></span><br><span class="line"><span class="string">2. 给出下一步行动的优先级清单</span></span><br><span class="line"><span class="string">3. 提醒我 <span class="subst">&#123;severity&#125;</span> 级别必须做的通知动作</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">相关 runbook：</span></span><br><span class="line"><span class="string"><span class="subst">&#123;runbook&#125;</span></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">公司 severity 标准：</span></span><br><span class="line"><span class="string">- P0：全量用户影响，立刻拉 war room</span></span><br><span class="line"><span class="string">- P1：部分用户影响，1h 内响应</span></span><br><span class="line"><span class="string">- P2：功能降级，工作时间内响应</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span>)</span><br><span class="line">    ]</span><br></pre></td></tr></table></figure></div><p>用户在 Claude Desktop 里打 <code>/incident-response P0 &quot;API 500 飙到 23%&quot;</code>，server 侧把 runbook 拉出来、按公司标准拼装 prompt、返回给 LLM。新人什么都不用记，流程内化在工具里。</p><h2 id="一个真实案例：runbook-变-prompts"><a href="#一个真实案例：runbook-变-prompts" class="headerlink" title="一个真实案例：runbook 变 prompts"></a>一个真实案例：runbook 变 prompts</h2><p>2026 年 1 月给一个中型 SaaS 客户做了类似改造。</p><p>客户情况：DevOps 团队 17 人，值班 rotation，每次新人上手要读 5 本 runbook（Kubernetes 集群、数据库、CDN、消息队列、监控），平均<strong>14 天</strong>才能独立值班。错误率高、老人累。</p><p>我做的事：</p><ol><li>把 5 本 runbook 拆成 38 个场景化 prompts，覆盖 “pod 频繁 OOM”、”redis 延迟突增”、”CDN 命中率下降” 等具体症状</li><li>每个 prompt 参数化关键变量（集群、服务、时间范围），server 侧拼装上下文</li><li>接入 Grafana MCP 和 Kubernetes MCP，prompt 渲染时自动附加实时指标</li><li>在 Claude Desktop 里配好，新人打 <code>/oncall-</code> 自动补全</li></ol><p>上线后的数据：新人独立值班时间从 14 天降到 3 天，老人值班加班时长平均每周少 4.2 小时，事故首次响应中位数从 8.3 分钟降到 2.1 分钟。</p><p>客户 DevOps 负责人给我发消息：”这玩意儿比 Runbook Wiki 强 10 倍，至少新人真的会用。”</p><p>说白了，写在 wiki 的东西没人看，做成”按一个 &#x2F; 就触发的工作流”就有人用了。这就是 prompts 的价值。</p><h2 id="什么时候用哪个？一个实用决策表"><a href="#什么时候用哪个？一个实用决策表" class="headerlink" title="什么时候用哪个？一个实用决策表"></a>什么时候用哪个？一个实用决策表</h2><table><thead><tr><th>场景</th><th>用 tool</th><th>用 resource</th><th>用 prompt</th></tr></thead><tbody><tr><td>调 API 改数据</td><td>✓</td><td></td><td></td></tr><tr><td>让 LLM 浏览一堆文档</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><tr><td>触发团队 SOP</td><td></td><td></td><td>✓</td></tr><tr><td>查询数据返回给 LLM</td><td>✓</td><td></td><td></td></tr><tr><td>大文件按需附加</td><td></td><td>✓</td><td></td></tr></tbody></table><h2 id="一些实现细节的坑"><a href="#一些实现细节的坑" class="headerlink" title="一些实现细节的坑"></a>一些实现细节的坑</h2><ul><li><strong>resource URI 规范</strong>：用你自己 server 的 scheme（<code>confluence://</code>、<code>jira://</code>），别用 <code>http://</code>——客户端可能拦截</li><li><strong>prompts 返回消息列表</strong>：不是单个字符串，是完整的 messages 数组，可以包含 user&#x2F;assistant 多轮</li><li><strong>capability 声明</strong>：server 构造时要显式开 <code>capabilities.resources</code> 和 <code>capabilities.prompts</code>，不然客户端根本不来问</li><li><strong>list 要快</strong>：<code>resources/list</code> 和 <code>prompts/list</code> 会在客户端 UI 渲染时频繁调用，别在里面跑慢查询</li></ul><p>想把知识沉淀做得更系统，<a href="/posts/skills-deep-dive/">Skills 深度解析</a> 和 <a href="/posts/custom-skill-brand-writer/">自定义 Skill 实战</a> 两篇从另一个角度讲了类似的思路——把团队最佳实践编码成可复用单元。MCP prompts 和 Skills 其实是同一个哲学的两个切面。</p><div style="background:#f0f7ff;border-left:4px solid #0c97fe;padding:18px 22px;margin:28px 0;border-radius:6px;">做 MCP 只做 tools 等于只用了三分之一。建议补看 <a href="/posts/mcp-server-internal-tools/">MCP server 工具设计</a> 理清三种原语的分工，<a href="/posts/skills-deep-dive/">Skills 深度解析</a> 看另一套知识沉淀方案。真正做企业级 MCP 平台，这两块 plus 权限沙箱是三大基石。</div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/mcp-resource-and-prompts/</id>
    <link href="https://claude.cocoloop.cn/posts/mcp-resource-and-prompts/"/>
    <published>2026-04-12T23:16:07.000Z</published>
    <summary>扫了一圈 GitHub 上 Star 数前 50 的 MCP server，有 46 个只实现了 tools，resources 和 prompts 几乎没人碰。但这俩恰恰是 MCP 最被低估的两块拼图。这篇把它们的设计意图讲清楚，附一个把公司 runbook 包装成 MCP prompts 的真实案例——新员工上手时间从 14 天压到 3 天。</summary>
    <title>MCP 里除了 tools 还有 resources 和 prompts，大家都忽略了</title>
    <updated>2026-04-20T20:16:07.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Claude 中文知识站</name>
    </author>
    <category term="Context Engineering" scheme="https://claude.cocoloop.cn/categories/Context-Engineering/"/>
    <category term="Claude" scheme="https://claude.cocoloop.cn/tags/Claude/"/>
    <category term="Haiku" scheme="https://claude.cocoloop.cn/tags/Haiku/"/>
    <category term="RAG" scheme="https://claude.cocoloop.cn/tags/RAG/"/>
    <category term="Rerank" scheme="https://claude.cocoloop.cn/tags/Rerank/"/>
    <content>
      <![CDATA[<h2 id="一个”Claude-越来越笨”的错觉"><a href="#一个”Claude-越来越笨”的错觉" class="headerlink" title="一个”Claude 越来越笨”的错觉"></a>一个”Claude 越来越笨”的错觉</h2><p>上个月有个做法律 SaaS 的朋友来问我：他们的产品用 Claude Sonnet 4.5，上线半年用户一直反馈”有时候答得特别准，有时候完全跑题”。他们以为是模型退化了，想换 Opus。</p><p>我让他把 retrieval 的日志拉给我看。一看就笑了——每次捞 top-10 文档扔给 Claude，前 3 名里经常掺着风马牛不相及的条款。比如用户问”离婚财产分割怎么算”，第 2 个召回结果是一条商业合同违约金的判例。</p><p>Claude 不是笨，是被喂了垃圾。embedding 召回本来就这水平，尤其中文专业领域，同义词、近义词、歪打正着的语义相似——全给你召回来了。</p><p>然后我问他：你们 pipeline 里有没有 rerank 这一步。他说没有，怕贵。</p><p>我就说，你知道最贵的是什么吗？是用户看了一次歪答案就流失了。你省的那点 rerank 钱，抵不过一个月掉的 ARR。</p><h2 id="先说清楚什么叫-rerank"><a href="#先说清楚什么叫-rerank" class="headerlink" title="先说清楚什么叫 rerank"></a>先说清楚什么叫 rerank</h2><p>你可以把 RAG 召回想象成两阶段：</p><p><strong>第一阶段叫 retrieval，图的是召得全。</strong> 通常是向量相似度（embedding）+ BM25 关键词混合，扫整个库，捞 top-50 甚至 top-100 回来。这一步要求”宁可错召不可漏召”。</p><p><strong>第二阶段叫 rerank，图的是排得准。</strong> 把 top-50 做精细打分，输出 top-3 或 top-5 给下游 LLM。</p><p>很多团队只做第一阶段，直接 top-10 送进 Claude。问题是 embedding 向量 768 维或 1024 维，做的是粗粒度语义匹配，query 和 chunk 的精细关系它捕捉不到。</p><p>举个最简单的例子。query 是”用户怎么取消自动续费”，embedding 会把”自动续费的收费规则””自动续费常见问题””用户注销账号流程”统统召回来，得分相差不到 0.03。这种情况你让 Claude 去文档里找答案，运气好能搞对，运气不好就搞砸。</p><h2 id="三种-rerank-方案的成本对比"><a href="#三种-rerank-方案的成本对比" class="headerlink" title="三种 rerank 方案的成本对比"></a>三种 rerank 方案的成本对比</h2><p>我现在做项目基本三种里选一种，看场景。</p><p><strong>方案 1：cross-encoder 模型（bge-reranker-v2 这类）</strong></p><p>开源，自己部署。精度很好，尤其中文。一次 rerank 50 段大概 200ms，单次成本算下来折合 0.0003 美刀（主要是 GPU 电费摊销）。适合有 infra 团队的公司。</p><p>缺点是需要维护模型服务，冷启动慢，流量高峰要加机器。小团队头疼。</p><p><strong>方案 2：用 LLM 做 rerank（比如 Haiku 4.5）</strong></p><p>把 query + 50 个候选 chunk 的 ID 和摘要塞进 Haiku，让它输出排序。我实测一次调用大概 3K input + 100 output token，按 Haiku 定价算下来 <strong>0.0008 美刀</strong>。</p><p>优点是精度出奇的好，而且可以通过改 prompt 让它关注特定维度——比如”优先考虑时效性””优先召回含具体金额的条款”。这种定制在 cross-encoder 里是做不到的。</p><p>缺点是延迟比 cross-encoder 大，通常 800ms-1.2s。对实时聊天场景有点压力。</p><p><strong>方案 3：LLM rerank + Claude 主力模型</strong></p><p>就是上面那个方案，但主力模型用 Sonnet 或 Opus。</p><p>我现在 80% 的项目用方案 2+3 的组合。理由很简单：Haiku 做 rerank 的可解释性比任何 cross-encoder 都强，遇到 bad case 你能看到它为什么这么排——让它输出 ranking 的时候顺便说一句 reason 就行。调试起来跟调试人类员工一样。</p><h2 id="什么场景-rerank-就是浪费钱"><a href="#什么场景-rerank-就是浪费钱" class="headerlink" title="什么场景 rerank 就是浪费钱"></a>什么场景 rerank 就是浪费钱</h2><p>不是所有系统都值得加 rerank。我列几个不用加的情况：</p><p><strong>文档库特别小（&lt; 500 个 chunk）。</strong> 直接把所有 chunk 按相关度塞进 context，用 Claude 自己的 attention 筛就行。反正也就几万 token。</p><p><strong>query 特别结构化。</strong> 比如”查 2025 年 3 月 15 日订单号 A123”，这种直接走 SQL 或者精确匹配，向量都不用。</p><p><strong>召回率要求极高，精度要求一般。</strong> 比如推荐场景的”相关文章”，用户点不点无所谓，没必要为精度多花一道。</p><p><strong>响应延迟极敏感（&lt; 500ms）。</strong> rerank 这一步怎么也要 300ms 起，吃不消就砍掉。</p><p>除此之外我基本都会加。尤其客服、问答、法律、医疗这种答错代价高的场景。</p><h2 id="我现在项目的三段式召回配置"><a href="#我现在项目的三段式召回配置" class="headerlink" title="我现在项目的三段式召回配置"></a>我现在项目的三段式召回配置</h2><p>贴一下我在一个教育 SaaS 项目里跑的真实配置，服务了他们 84.2 万次月活 query。</p><p><strong>第一段：双召回</strong></p><p>BM25 捞 top-30，向量捞 top-30，去重合并成 50 左右。这一步只管量，精度靠下一步。</p><p><strong>第二段：Haiku 4.5 rerank</strong></p><p>prompt 里写清楚评分维度（相关度、时效性、权威度各占几分），让 Haiku 输出 top-5。这一步关键是 prompt 里的评分标准写死，不同 query 类型用不同 prompt——基础问答一套、政策解读一套、案例咨询一套。</p><p><strong>第三段：Sonnet 4.5 生成</strong></p><p>拿 top-5 作为 context，配合用户 query 生成最终答案。</p><p>整条链路一次 query 的成本：向量查询 0.00002 刀 + Haiku rerank 0.0008 刀 + Sonnet 生成 0.015 刀 ≈ 0.016 刀。</p><p>对比他们之前单用 Sonnet + top-10 直召的版本（一次 0.022 刀，因为 context 更长），成本还低了 27%，准确率从 74.8% 涨到 89.3%。</p><h2 id="两个经常被问的细节"><a href="#两个经常被问的细节" class="headerlink" title="两个经常被问的细节"></a>两个经常被问的细节</h2><p><strong>Q：rerank 的时候 chunk 要不要截断？</strong></p><p>要。我一般只给 rerank 模型每段前 500 token + 后 100 token，中间用 <code>...省略...</code> 代替。rerank 不需要看完整文本，它判断相关性主要靠开头和结尾。省下来的 token 够你多召 20 个候选。</p><p><strong>Q：rerank 阶段要不要告诉模型对话历史？</strong></p><p>看场景。单轮问答不需要。多轮对话如果涉及指代（”那个方案””刚才说的那家”），必须把最近 1-2 轮对话摘要喂给 rerank 模型，否则它理解不了 query 在说什么。这个细节我踩过坑，排查了两天才定位到。</p><h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>Rerank 这一步，看着是个”锦上添花”的优化，实际上是 RAG 能不能落地商业场景的<strong>分水岭</strong>。</p><p>我见过太多团队 POC 阶段效果惊艳，上线真实流量之后口碑崩了——往往就是 retrieval 从 demo 阶段的 100 个 chunk 扩展到 10 万个 chunk，embedding 的粗粒度就遮不住了，rerank 这道防线又没有。</p><p>花那 0.0008 美刀吧，真的。</p><div class="cta-card" style="margin:32px 0;padding:20px 24px;background:#f0f7ff;border-left:4px solid #0c97fe;border-radius:6px;"><p style="margin:0 0 8px;font-weight:600;color:#1f2937;">延伸阅读</p><p style="margin:0;color:#4b5563;font-size:14px;line-height:1.8;">关于把 Haiku 用在 pipeline 里做轻量任务的更多姿势，看 [Haiku/Sonnet/Opus 选型](/posts/claude-family-haiku-sonnet-opus/)。写 rerank prompt 记得用 XML 结构化输出，参考 [XML 标签的妙用](/posts/prompt-xml-tags-claude-special/)。想把整条 RAG pipeline 的 context 编排思路讲清楚，[从 Prompt 到 Context Engineering](/posts/prompt-to-context-engineering/) 是个好的起点。</p></div>]]>
    </content>
    <id>https://claude.cocoloop.cn/posts/context-retrieval-reranking/</id>
    <link href="https://claude.cocoloop.cn/posts/context-retrieval-reranking/"/>
    <published>2026-04-12T11:21:59.000Z</published>
    <summary>接触 RAG 三年，我见过至少七八个团队上线了纯 embedding 召回的系统，然后抱怨&quot;Claude 给出的答案总是漏关键点&quot;。不是 Claude 的锅，是你召回就是歪的。这篇写我为什么坚持在 pipeline 里加 rerank 这一步，Haiku 4.5 做轻量 rerank 实测成本 0.0008 美刀一次，以及什么情况下 rerank 就是白花钱。</summary>
    <title>RAG 里最贵的一步不是嵌入，是 rerank</title>
    <updated>2026-04-20T01:21:59.000Z</updated>
  </entry>
</feed>
