[{"data":1,"prerenderedAt":3136},["ShallowReactive",2],{"navigation":3,"\u002Fmindset\u002Fprompt-design":189,"\u002Fmindset\u002Fprompt-design-surround":3131},[4,35,57,75,101,123,149,171],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":34},"第 1 章：认识 Claude Code","i-lucide-rocket","\u002Fintro","1.intro",[10,14,18,22,26,30],{"title":11,"path":12,"stem":13},"什么是 Claude Code","\u002Fintro\u002Fwhat-is-claude-code","1.intro\u002F1.what-is-claude-code",{"title":15,"path":16,"stem":17},"Claude Code 与 Copilot、Cursor、Windsurf 的本质区别","\u002Fintro\u002Fvs-competitors","1.intro\u002F2.vs-competitors",{"title":19,"path":20,"stem":21},"AI 编程助手生态全景与选型指南","\u002Fintro\u002Fecosystem-guide","1.intro\u002F3.ecosystem-guide",{"title":23,"path":24,"stem":25},"LLM 的概率本质","\u002Fintro\u002Fllm-probability","1.intro\u002F4.llm-probability",{"title":27,"path":28,"stem":29},"从聊天机器人到 Agent","\u002Fintro\u002Ffrom-chatbot-to-agent","1.intro\u002F5.from-chatbot-to-agent",{"title":31,"path":32,"stem":33},"Claude Code 的 Agentic Loop 全拆解","\u002Fintro\u002Fagentic-loop","1.intro\u002F6.agentic-loop",false,{"title":36,"icon":37,"path":38,"stem":39,"children":40,"page":34},"第 2 章：安装与配置","i-lucide-settings","\u002Fsetup","2.setup",[41,45,49,53],{"title":42,"path":43,"stem":44},"系统要求与安装方式","\u002Fsetup\u002Fsystem-requirements","2.setup\u002F1.system-requirements",{"title":46,"path":47,"stem":48},"认证、登录与多账户管理","\u002Fsetup\u002Fauthentication","2.setup\u002F2.authentication",{"title":50,"path":51,"stem":52},"选择你的界面","\u002Fsetup\u002Fchoose-interface","2.setup\u002F3.choose-interface",{"title":54,"path":55,"stem":56},"Coding Plan","\u002Fsetup\u002Fcoding-plan","2.setup\u002F4.coding-plan",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":34},"第 3 章：快速上手","i-lucide-hand","\u002Fquickstart","3.quickstart",[63,67,71],{"title":64,"path":65,"stem":66},"启动、交互模式与基本命令","\u002Fquickstart\u002Fstartup","3.quickstart\u002F1.startup",{"title":68,"path":69,"stem":70},"让 Claude 理解你的项目","\u002Fquickstart\u002Fcodebase-understanding","3.quickstart\u002F2.codebase-understanding",{"title":72,"path":73,"stem":74},"第一次代码变更","\u002Fquickstart\u002Ffirst-change","3.quickstart\u002F3.first-change",{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":34},"第 4 章：核心功能","i-lucide-laptop","\u002Fcore-features","4.core-features",[81,85,89,93,97],{"title":82,"path":83,"stem":84},"代码库全景扫描与模块关系分析","\u002Fcore-features\u002Fcodebase-scan","4.core-features\u002F1.codebase-scan",{"title":86,"path":87,"stem":88},"代码编辑与生成","\u002Fcore-features\u002Fedit-generate","4.core-features\u002F2.edit-generate",{"title":90,"path":91,"stem":92},"测试与调试","\u002Fcore-features\u002Ftest-debug","4.core-features\u002F3.test-debug",{"title":94,"path":95,"stem":96},"Git 工作流","\u002Fcore-features\u002Fgit-workflow","4.core-features\u002F4.git-workflow",{"title":98,"path":99,"stem":100},"工具链执行","\u002Fcore-features\u002Ftoolchain","4.core-features\u002F5.toolchain",{"title":102,"icon":103,"path":104,"stem":105,"children":106,"page":34},"第 5 章：进阶配置","i-lucide-wrench","\u002Fadvanced","5.advanced",[107,111,115,119],{"title":108,"path":109,"stem":110},"CLAUDE.md","\u002Fadvanced\u002Fclaude-md","5.advanced\u002F1.claude-md",{"title":112,"path":113,"stem":114},"Skills","\u002Fadvanced\u002Fskills","5.advanced\u002F2.skills",{"title":116,"path":117,"stem":118},"MCP","\u002Fadvanced\u002Fmcp","5.advanced\u002F3.mcp",{"title":120,"path":121,"stem":122},"Hooks 与 Plan 模式","\u002Fadvanced\u002Fhooks-plan","5.advanced\u002F4.hooks-plan",{"title":124,"icon":125,"path":126,"stem":127,"children":128,"page":34},"第 6 章：实战开发","i-lucide-hammer","\u002Fpractice","6.practice",[129,133,137,141,145],{"title":130,"path":131,"stem":132},"需求分析与架构设计","\u002Fpractice\u002Frequirements-architecture","6.practice\u002F1.requirements-architecture",{"title":134,"path":135,"stem":136},"项目脚手架搭建与技术选型","\u002Fpractice\u002Fscaffolding","6.practice\u002F2.scaffolding",{"title":138,"path":139,"stem":140},"核心功能实现","\u002Fpractice\u002Fcore-features","6.practice\u002F3.core-features",{"title":142,"path":143,"stem":144},"测试覆盖、代码审查与质量调优","\u002Fpractice\u002Ftesting-quality","6.practice\u002F4.testing-quality",{"title":146,"path":147,"stem":148},"部署上线与成果分享","\u002Fpractice\u002Fdeployment","6.practice\u002F5.deployment",{"title":150,"icon":151,"path":152,"stem":153,"children":154,"page":34},"第 7 章：心法层","i-lucide-brain","\u002Fmindset","7.mindset",[155,159,163,167],{"title":156,"path":157,"stem":158},"提示词设计原则","\u002Fmindset\u002Fprompt-design","7.mindset\u002F1.prompt-design",{"title":160,"path":161,"stem":162},"上下文管理策略","\u002Fmindset\u002Fcontext-management","7.mindset\u002F2.context-management",{"title":164,"path":165,"stem":166},"安全与权限控制","\u002Fmindset\u002Fsecurity","7.mindset\u002F3.security",{"title":168,"path":169,"stem":170},"Boris Cherny 的 9 条实战心法与团队推广经验","\u002Fmindset\u002Fboris-cherny-tips","7.mindset\u002F4.boris-cherny-tips",{"title":172,"icon":173,"path":174,"stem":175,"children":176,"page":34},"附录","i-lucide-paperclip","\u002Fappendix","8.appendix",[177,181,185],{"title":178,"path":179,"stem":180},"常用命令速查表","\u002Fappendix\u002Fa.command-cheatsheet","8.appendix\u002Fa.command-cheatsheet",{"title":182,"path":183,"stem":184},"AI 核心术语汇编","\u002Fappendix\u002Fb.ai-terminology","8.appendix\u002Fb.ai-terminology",{"title":186,"path":187,"stem":188},"资源链接与延伸阅读","\u002Fappendix\u002Fc.resources","8.appendix\u002Fc.resources",{"id":190,"title":156,"body":191,"description":3124,"extension":3125,"links":3126,"meta":3127,"navigation":614,"path":157,"seo":3129,"stem":158,"__hash__":3130},"docs\u002F7.mindset\u002F1.prompt-design.md",{"type":192,"value":193,"toc":3075},"minimark",[194,198,201,204,207,220,227,234,241,244,247,252,255,260,263,266,279,286,293,311,315,321,327,337,343,347,362,365,375,378,385,387,391,394,398,401,404,430,726,733,736,743,749,752,756,759,765,772,779,785,788,792,795,798,804,807,810,816,819,823,826,832,835,839,842,848,851,858,860,864,867,871,878,884,887,894,900,903,910,916,920,926,932,935,941,945,952,958,965,972,983,986,990,993,999,1002,1006,1016,1022,1029,1036,1038,1042,1045,1048,1052,1055,1061,1065,1071,1075,1081,1085,1088,1099,1106,1112,1116,1119,1125,1128,1134,1137,1141,1144,1150,1153,1157,1163,1169,1171,1175,1178,1182,1185,1191,1195,1198,1204,1208,1211,1217,1220,1224,1230,1236,1239,1242,1248,1251,1255,1258,1264,1267,1269,1273,1276,1280,1283,1419,1423,1430,1444,1447,1451,1454,1468,1471,1474,1924,1928,1931,1942,1949,1952,1956,1959,1962,1989,2487,2490,2494,2497,2500,2520,2523,2525,2529,2532,2538,2544,2547,2552,2558,2561,2566,2572,2575,2580,2586,2592,2702,2705,2736,2739,2741,2745,2748,2753,2760,2765,2772,2777,2780,2785,2796,2801,2804,2809,2812,2817,2820,2825,2832,2837,2848,2853,2856,2860,2863,2866,2869,2880,2883,2890,2892,2898,2901,2949,2956,2959,2962,3071],[195,196,197],"p",{},"前面六章我们走完了从安装、配置、Skills 编写到典型工作流的所有实战环节。从这一节开始，本书进入心法层：不再讨论某个具体功能怎么用，而是回过头审视一个更基础也更被低估的问题——你到底应该怎么和 Claude 说话。",[195,199,200],{},"很多人以为提示词工程（Prompt Engineering）是某种秘籍：背一些「请你扮演资深架构师」「Let's think step by step」的口诀就能召唤出更聪明的模型。这种理解会让你长期停留在「碰运气」阶段。本书的立场是：提示词不是咒语，而是一份你和模型之间的「对话契约」（Conversation Contract）。契约写得清楚，输出就稳定；契约含糊，输出就漂移。Claude Code 的特殊之处在于，它不仅要理解你写下的那一段文字，还要把对话和文件系统、Git、Skills、CLAUDE.md 等一起编织成一个庞大的执行上下文。提示词的好坏，直接决定了它进入哪条执行路径。",[195,202,203],{},"本节会带你建立一套可以稳定复用的提示词写作方法论：从底层注意力机制讲起，到五大原则、Claude Code 特有模式、对话节奏、PM 与工程师的不同视角，最后是团队级的工程化沉淀。",[195,205,206],{},"读完本节，你应当能够回答这些问题：为什么同样一个需求，今天 Claude 写得很好、明天却不行？为什么资深工程师写出来的提示词，初级工程师照抄一遍效果会差很多？为什么有些团队用了一年 Claude Code 之后，效率不增反减？这些问题的答案，几乎都可以归结到提示词的「契约性」是否被尊重。",[195,208,209,210,214,215,219],{},"需要提前说明：本节讨论的所有原则，",[211,212,213],"strong",{},"对所有 LLM 都适用","，不只是 Claude。但 Claude Code 因为深度集成了文件系统、Git、Skills，提示词的物理形态（路径、",[216,217,218],"code",{},"@"," 引用、Plan 模式）和聊天版有显著差异，因此本节会专门拆出一节讨论这些 Claude Code 独有的写法。",[195,221,222,223,226],{},"阅读建议：如果你是产品经理（PM），可以重点关注一、二、四、五章——它们覆盖了「不写代码也能用 Claude Code 推动项目」需要的全部要点。如果你是工程师，建议把三、六、七章作为重点——它们针对 Claude Code 特有的工作流，能立刻拿到效率提升。无论哪个角色，",[211,224,225],{},"请不要跳过第二章「五大底层原则」","，这是后面所有技巧的根基。",[195,228,229,230,233],{},"最后还有一个常被忽视的事实：提示词工程的进步速度，几乎完全取决于",[211,231,232],{},"你是否愿意把每一次失败的对话拿出来复盘","。不复盘的话，你会反复踩同一个坑十次还不自知。复盘的成本极低——花两分钟问自己「这次为什么 Claude 没理解我？是哪一段话写糊了？下次怎么改？」——但收益却是复利式的。本节后面给出的 checklist、回归测试、Playbook 都只是工具，真正起作用的是这种「肯回头看」的习惯。希望你读完本节后，能在自己的工作流里养出这种习惯。",[195,235,236,237,240],{},"补充一点行业背景：Anthropic 自己在工程团队内部就极度重视提示词的工程化。他们出版的多份技术报告和官方博客（本节延伸阅读里列出了主要篇目）都反复强调一个观点：",[211,238,239],{},"模型的能力天花板由 Anthropic 决定，但用户实际拿到的能力上限，由你的提示词决定","。这个差距比大多数人想象的要大。同一个 Claude Opus，在专业用户手里和新手手里，产出的代码质量差距可能高达数倍。这种差距的根因，几乎全部落在提示词上。",[195,242,243],{},"换句话说：模型已经够强了，剩下的事，由你来决定它能拿出多少能力。本节就是教你怎么提取这些能力。读完后请立刻找一个真实任务实战一遍——肌肉记忆比读再多遍都管用。也建议把本节链接收藏到团队 wiki，作为新人入职时必读的「Claude Code 提示词入门」材料；当你团队规模超过 5 人时，统一的提示词风格本身就是一种生产力，能省下大量沟通成本与返工时间。",[245,246],"hr",{},[248,249,251],"h2",{"id":250},"一为什么提示词决定了-80-的产出质量","一、为什么提示词决定了 80% 的产出质量",[195,253,254],{},"零基础导引：在进入具体技巧之前，先回答一个根本性问题——为什么要花这么大力气研究提示词？毕竟 Claude 已经很聪明了，随便说点什么它也能给出像样的回答。这一节会解释：为什么「随便说点什么」恰恰是浪费 Claude 能力的最快方式。",[256,257,259],"h3",{"id":258},"_11-llm-的注意力机制如何决定它读到了什么","1.1 LLM 的注意力机制如何决定「它读到了什么」",[195,261,262],{},"零基础导引：你可以把大语言模型（Large Language Model，LLM）想象成一位记忆力惊人但注意力有限的同事。它能在一秒内读完一本几百页的代码，但真正会被它「重点关照」的，只是其中一部分。提示词的作用，就是告诉它「请重点看这里」。",[195,264,265],{},"技术上，Claude 这样的模型基于 Transformer 架构。每一个生成的 token（词元）都会通过注意力机制（Attention）回头看上下文里的所有 token，并按相关度加权。这意味着：",[267,268,269,273,276],"ul",{},[270,271,272],"li",{},"越靠近问题、越具体的描述，权重越高。",[270,274,275],{},"信息密度高的位置（比如代码块、明确的结构化指令）比散落的形容词更容易被采纳。",[270,277,278],{},"长上下文里位于「中段」的内容，常常被弱化，这是著名的「中间迷失」（Lost in the Middle）现象。",[195,280,281,282,285],{},"对 PM 来说，这条原理的含义是：你必须把「最关键的约束」放在指令的开头或者最末尾，而不是埋在第三段说明里。对工程师来说，这意味着即使你贴了一千行代码，如果不主动告诉 Claude「请重点关注 ",[216,283,284],{},"validate()"," 函数的边界条件」，它很可能给你一个泛泛的回答。",[195,287,288,289,292],{},"进一步：Claude 不是「读完所有内容然后思考」，而是「边读边在每个 token 决定关注哪些前文」。这就是为什么把同一份信息以不同顺序呈现，输出会有显著差异。一条经验法则是：",[211,290,291],{},"先放素材，后放任务","——把代码、文档、数据放在前面，把「请你做什么」的指令放在最后。这样指令在生成时拥有最强的注意力权重。",[195,294,295,296,299,300,303,304,303,307,310],{},"另一条容易被忽视的事实是：模型对",[211,297,298],{},"结构化标记","（Markdown 标题、XML 标签、代码块）非常敏感。Anthropic 官方明确推荐使用 XML 标签包裹不同种类的素材，比如 ",[216,301,302],{},"\u003Ccontext>...\u003C\u002Fcontext>","、",[216,305,306],{},"\u003Ctask>...\u003C\u002Ftask>",[216,308,309],{},"\u003Coutput_format>...\u003C\u002Foutput_format>","。这些标签本身没有语义魔法，它们的价值在于告诉模型「这几块内容性质不同，请分别处理」。",[256,312,314],{"id":313},"_12-三类常见的提示词翻车场景","1.2 三类常见的提示词翻车场景",[195,316,317,320],{},[211,318,319],{},"场景一：信息过载。"," 把整个需求文档、所有相关文件、五年来的讨论记录一股脑丢给模型，期待它「自己理解」。结果是模型把注意力均匀分散，反而抓不到重点。常见症状是：模型回答看似全面，但每一条都浅尝辄止；让它给出建议，它就给出五条都正确但都不够锋利的建议。这种「中庸输出」的根因，几乎都是上下文过载。",[195,322,323,326],{},[211,324,325],{},"场景二：语义模糊。"," 比如「帮我优化这个函数」。优化什么？性能、可读性、内存占用、错误处理？每一个方向的改动都不一样，但提示词没有给出取舍标准。模糊提示词的另一种典型变体是「让它更好」「让它更专业」——「好」和「专业」都是高度主观的形容词，不同的模型会按训练数据里的「主流答案」来执行，于是你得到的可能是一个非常平庸的「平均答案」。",[195,328,329,332,333,336],{},[211,330,331],{},"场景三：角色错位。"," 让 Claude 扮演「最厉害的全栈工程师」，但给的任务其实是「请帮我读这段日志找出 502 错误的原因」。前者激发的是发散性创造，后者需要的是收敛性诊断，两者风格冲突，输出会摇摆。一个简单的判断方法：如果你的任务有「唯一正确答案」（比如调试、定位 bug），就",[211,334,335],{},"不要","让模型扮演任何角色，直接陈述事实即可；如果任务是开放的（比如设计、命名），扮演角色才有意义。",[195,338,339,342],{},[211,340,341],{},"场景四：隐式假设过多。"," 这是一类隐蔽但极其常见的翻车。比如「帮我把这个 API 接好」——你以为「接好」包括错误处理、超时、重试、日志，但模型可能只接通了 happy path（顺利路径）。任何你认为「显然应该做」的事情，对模型而言都不显然。把它显式写出来。",[256,344,346],{"id":345},"_13-把提示词理解为对话契约而非咒语","1.3 把「提示词」理解为「对话契约」而非「咒语」",[195,348,349,350,353,354,357,358,361],{},"契约的核心要素有三个：",[211,351,352],{},"输入","（你给了什么材料）、",[211,355,356],{},"约束","（不许做什么、必须做什么）、",[211,359,360],{},"输出","（期望的形态）。任何一条提示词都可以套这个三段论审视一遍。如果其中一项缺失或模糊，输出就会不稳定。",[195,363,364],{},"举例对比：",[366,367,372],"pre",{"className":368,"code":370,"language":371},[369],"language-text","[咒语式提示词]\n你是一个 React 大师，请帮我写一个登录组件，要好看。\n\n[契约式提示词]\n输入：我有一份 Figma 设计稿（已贴在下方），技术栈是 React 18 + TypeScript + Tailwind。\n约束：必须支持邮箱+密码两种字段，必须做空值校验，禁止引入新的 UI 库。\n输出：单个 .tsx 文件，导出名为 LoginForm 的默认组件，用 200 字以内说明 props 设计。\n","text",[216,373,370],{"__ignoreMap":374},"",[195,376,377],{},"后者无论交给哪个模型、在哪一天、由谁来读，都能产出基本一致的结果。前者每次都像抽卡。",[195,379,380,381,384],{},"契约思维还有一个隐藏好处：它强迫你在提问之前",[211,382,383],{},"先想清楚自己要什么","。很多时候我们写不出好提示词，不是因为不会写，而是因为我们自己也没想清楚。当你被迫填写「输入是什么、约束是什么、期望输出是什么」这三栏时，那些原本模糊的需求会迅速变得清晰。这也是为什么资深工程师写提示词往往很慢——他们大部分时间花在「想清楚」上，写下来反而是最快的一步。",[245,386],{},[248,388,390],{"id":389},"二五大底层原则","二、五大底层原则",[195,392,393],{},"零基础导引：以下五条原则是本节的核心。它们彼此独立、可单独训练、可叠加使用。建议读完后立刻挑一条在下一次和 Claude 的对话里实践。理论再好，没有肌肉记忆都是空谈。",[256,395,397],{"id":396},"_21-明确输出约束格式长度字段必填项","2.1 明确输出约束（格式、长度、字段、必填项）",[195,399,400],{},"零基础导引：和模型沟通时，最便宜的提质方式是把你「期望看到的样子」描述清楚。模型不擅长猜测你的审美，但极其擅长按模板填空。",[195,402,403],{},"常见可约束的维度：",[267,405,406,412,418,424],{},[270,407,408,411],{},[211,409,410],{},"格式","：Markdown 表格、JSON、TypeScript 接口、Mermaid 图、纯文本。",[270,413,414,417],{},[211,415,416],{},"长度","：词数上限、行数上限、章节数。",[270,419,420,423],{},[211,421,422],{},"字段","：必含字段、可选字段、字段顺序。",[270,425,426,429],{},[211,427,428],{},"风格","：正式\u002F口语、第一人称\u002F第三人称、是否带 emoji。",[366,431,435],{"className":432,"code":433,"language":434,"meta":374,"style":374},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F 对话片段：让 Claude 输出严格 JSON\n\u002F\u002F User:\n请把以下用户故事拆解为开发任务，输出严格 JSON：\n{\n  \"epic\": string,\n  \"tasks\": Array\u003C{\n    \"id\": string,            \u002F\u002F T-001 这样的编号\n    \"title\": string,         \u002F\u002F 不超过 30 字\n    \"estimate_hours\": number, \u002F\u002F 整数\n    \"depends_on\": string[]   \u002F\u002F 没有依赖时给空数组\n  }>\n}\n不要加任何解释，不要 Markdown 包裹。\n\n\u002F\u002F Claude（合规输出，可直接 JSON.parse）:\n{\"epic\":\"用户登录\",\"tasks\":[{\"id\":\"T-001\",\"title\":\"邮箱密码登录接口\",\"estimate_hours\":4,\"depends_on\":[]}, ...]}\n","ts",[216,436,437,446,452,459,466,489,508,532,551,571,591,597,603,609,616,622],{"__ignoreMap":374},[438,439,442],"span",{"class":440,"line":441},"line",1,[438,443,445],{"class":444},"sHwdD","\u002F\u002F 对话片段：让 Claude 输出严格 JSON\n",[438,447,449],{"class":440,"line":448},2,[438,450,451],{"class":444},"\u002F\u002F User:\n",[438,453,455],{"class":440,"line":454},3,[438,456,458],{"class":457},"sTEyZ","请把以下用户故事拆解为开发任务，输出严格 JSON：\n",[438,460,462],{"class":440,"line":461},4,[438,463,465],{"class":464},"sMK4o","{\n",[438,467,469,472,476,479,483,486],{"class":440,"line":468},5,[438,470,471],{"class":464},"  \"",[438,473,475],{"class":474},"sfazB","epic",[438,477,478],{"class":464},"\"",[438,480,482],{"class":481},"swJcz",": ",[438,484,485],{"class":457},"string",[438,487,488],{"class":464},",\n",[438,490,492,494,497,499,501,505],{"class":440,"line":491},6,[438,493,471],{"class":464},[438,495,496],{"class":474},"tasks",[438,498,478],{"class":464},[438,500,482],{"class":481},[438,502,504],{"class":503},"s2Zo4","Array",[438,506,507],{"class":464},"\u003C{\n",[438,509,511,514,517,519,522,526,529],{"class":440,"line":510},7,[438,512,513],{"class":464},"    \"",[438,515,516],{"class":474},"id",[438,518,478],{"class":464},[438,520,521],{"class":464},":",[438,523,525],{"class":524},"sBMFI"," string",[438,527,528],{"class":464},",",[438,530,531],{"class":444},"            \u002F\u002F T-001 这样的编号\n",[438,533,535,537,540,542,544,546,548],{"class":440,"line":534},8,[438,536,513],{"class":464},[438,538,539],{"class":474},"title",[438,541,478],{"class":464},[438,543,521],{"class":464},[438,545,525],{"class":524},[438,547,528],{"class":464},[438,549,550],{"class":444},"         \u002F\u002F 不超过 30 字\n",[438,552,554,556,559,561,563,566,568],{"class":440,"line":553},9,[438,555,513],{"class":464},[438,557,558],{"class":474},"estimate_hours",[438,560,478],{"class":464},[438,562,521],{"class":464},[438,564,565],{"class":524}," number",[438,567,528],{"class":464},[438,569,570],{"class":444}," \u002F\u002F 整数\n",[438,572,574,576,579,581,583,585,588],{"class":440,"line":573},10,[438,575,513],{"class":464},[438,577,578],{"class":474},"depends_on",[438,580,478],{"class":464},[438,582,521],{"class":464},[438,584,525],{"class":524},[438,586,587],{"class":481},"[]   ",[438,589,590],{"class":444},"\u002F\u002F 没有依赖时给空数组\n",[438,592,594],{"class":440,"line":593},11,[438,595,596],{"class":464},"  }>\n",[438,598,600],{"class":440,"line":599},12,[438,601,602],{"class":464},"}\n",[438,604,606],{"class":440,"line":605},13,[438,607,608],{"class":457},"不要加任何解释，不要 Markdown 包裹。\n",[438,610,612],{"class":440,"line":611},14,[438,613,615],{"emptyLinePlaceholder":614},true,"\n",[438,617,619],{"class":440,"line":618},15,[438,620,621],{"class":444},"\u002F\u002F Claude（合规输出，可直接 JSON.parse）:\n",[438,623,625,628,630,632,634,636,638,641,643,645,647,649,651,654,656,658,660,662,664,666,669,671,673,675,677,679,681,683,686,688,690,692,694,696,698,702,704,706,708,710,712,715,718,721,724],{"class":440,"line":624},16,[438,626,627],{"class":464},"{",[438,629,478],{"class":464},[438,631,475],{"class":474},[438,633,478],{"class":464},[438,635,521],{"class":481},[438,637,478],{"class":464},[438,639,640],{"class":474},"用户登录",[438,642,478],{"class":464},[438,644,528],{"class":464},[438,646,478],{"class":464},[438,648,496],{"class":474},[438,650,478],{"class":464},[438,652,653],{"class":481},":[",[438,655,627],{"class":464},[438,657,478],{"class":464},[438,659,516],{"class":481},[438,661,478],{"class":464},[438,663,521],{"class":464},[438,665,478],{"class":464},[438,667,668],{"class":474},"T-001",[438,670,478],{"class":464},[438,672,528],{"class":464},[438,674,478],{"class":464},[438,676,539],{"class":481},[438,678,478],{"class":464},[438,680,521],{"class":464},[438,682,478],{"class":464},[438,684,685],{"class":474},"邮箱密码登录接口",[438,687,478],{"class":464},[438,689,528],{"class":464},[438,691,478],{"class":464},[438,693,558],{"class":481},[438,695,478],{"class":464},[438,697,521],{"class":464},[438,699,701],{"class":700},"sbssI","4",[438,703,528],{"class":464},[438,705,478],{"class":464},[438,707,578],{"class":481},[438,709,478],{"class":464},[438,711,521],{"class":464},[438,713,714],{"class":481},"[]",[438,716,717],{"class":464},"},",[438,719,720],{"class":464}," ...",[438,722,723],{"class":481},"]",[438,725,602],{"class":464},[195,727,728,729,732],{},"工程上一个非常实用的小习惯：当你需要把 Claude 的输出灌进下游程序时，",[211,730,731],{},"永远要给一个可机读的 schema","，而不是「请输出 JSON 格式」这样的口头约定。",[195,734,735],{},"更进一步：可以在 schema 后面加一句「如果某个字段无法确定，请填写 null 而不是省略」。这条小约定能避免下游 JSON.parse 之后出现「字段时有时无」的鬼故事。对长字符串字段，还可以加上「不要包含换行符」之类的硬约束，让结果直接可用于 CSV、SQL 等下游格式。",[195,737,738,739,742],{},"PM 视角的应用：如果你需要 Claude 帮你产出会议纪要、用户访谈摘要、需求文档，",[211,740,741],{},"也应当先给模板","。比如：",[366,744,747],{"className":745,"code":746,"language":371},[369],"请按以下结构输出会议纪要：\n\n## 参会人\n- ...\n\n## 议题与决议（必填）\n| 议题 | 决议 | 负责人 | Deadline |\n|---|---|---|---|\n\n## 待跟进事项\n- [ ] ...\n\n## 未达成共识的问题\n- ...\n",[216,748,746],{"__ignoreMap":374},[195,750,751],{},"模板比「请帮我写一份会议纪要」稳定十倍。",[256,753,755],{"id":754},"_22-提供具体示例胜过抽象描述","2.2 提供具体示例胜过抽象描述",[195,757,758],{},"少样本提示（Few-Shot Prompting）是 Anthropic 官方推荐的核心技巧之一。一条「再来一个像这样的」往往比五条「请保持专业且简洁」更有效。",[366,760,763],{"className":761,"code":762,"language":371},[369],"[抽象描述，效果差]\n请把客户反馈分类，标签要专业。\n\n[少样本，效果稳]\n请按下面的样例风格分类（标签必须从 [bug, feature_request, ux, billing, other] 五选一）：\n\n样例 1：\n反馈：\"登录后页面一直转圈圈，过了 30 秒才出来。\"\n分类：bug\n\n样例 2：\n反馈：\"希望能批量导出订单到 Excel。\"\n分类：feature_request\n\n现在请分类：\n反馈：\"找设置入口找了五分钟。\"\n分类：\n",[216,764,762],{"__ignoreMap":374},[195,766,767,768,771],{},"经验法则：",[211,769,770],{},"两到三个差异化样例","通常就足够稳定。给太多反而会让模型过拟合到样例的格式细节而忽略真实输入。",[195,773,774,775,778],{},"样例的「差异化」非常关键。常见错误是给三个高度相似的正面样例，模型会以为「所有输入都长这样」，遇到边界情况就崩。更好的做法是覆盖",[211,776,777],{},"典型样例 + 边界样例 + 反例","：",[366,780,783],{"className":781,"code":782,"language":371},[369],"样例 1（典型）：\n反馈：\"登录后页面一直转圈圈。\"\n分类：bug\n\n样例 2（边界——表面像功能但其实是 ux）：\n反馈：\"找设置入口找了五分钟。\"\n分类：ux\n\n样例 3（反例——看似有抱怨实则无效）：\n反馈：\"不知道说什么，先随便填一下。\"\n分类：other\n",[216,784,782],{"__ignoreMap":374},[195,786,787],{},"这三个样例覆盖了「明显类」「容易被误分类的」「模糊噪声」三种典型情况，模型的鲁棒性会显著提升。",[256,789,791],{"id":790},"_23-分步骤分阶段避免一次性塞入复杂任务","2.3 分步骤分阶段，避免一次性塞入复杂任务",[195,793,794],{},"零基础导引：不要把「设计、实现、测试、写文档」捆成一句话扔过去。模型在多目标任务里非常容易出现「全都做了一点但都不到位」的状况。",[195,796,797],{},"推荐做法是显式分阶段：",[366,799,802],{"className":800,"code":801,"language":371},[369],"我们一起做一个新功能，分三步走：\n\n第一步【现在做】：列出三种可行的技术方案，每种给出优缺点和大致工作量。\n第二步【等我确认后做】：基于我选定的方案，输出详细设计文档。\n第三步【再次确认后做】：开始编码。\n\n请先只完成第一步，等我说\"进入第二步\"再继续。\n",[216,803,801],{"__ignoreMap":374},[195,805,806],{},"这种「显式 checkpoint」可以避免模型抢跑，也方便你在中途调整方向。",[195,808,809],{},"分阶段还能配合「思维链」（Chain of Thought，CoT）使用。要求模型在每一步先「想」再「做」，能显著提升复杂任务的正确率：",[366,811,814],{"className":812,"code":813,"language":371},[369],"对每一步：\n1. 先用 1-2 句话说出你的思考（为什么这么做、有没有更好方案）\n2. 再给出实际产出（代码 \u002F 设计 \u002F 决策）\n3. 最后用一句话点出风险或不确定的地方\n",[216,815,813],{"__ignoreMap":374},[195,817,818],{},"这种结构化的「思考-产出-反思」三段，对调试、设计、重构这类需要权衡的任务尤其有效。",[256,820,822],{"id":821},"_24-主动暴露上下文边界不要做-x忽略-y","2.4 主动暴露上下文边界（「不要做 X」「忽略 Y」）",[195,824,825],{},"很多人只写「请做什么」，忽略了「不要做什么」。后者在工程任务中往往更有杀伤力，因为它直接砍掉错误分支。",[366,827,830],{"className":828,"code":829,"language":371},[369],"请重构 src\u002Fservices\u002Fpayment.ts。\n\n约束：\n- 不要修改对外的 export 签名\n- 不要新增依赖\n- 不要触碰 src\u002Fservices\u002F 之外的文件\n- 忽略 .test.ts 文件，由我自己更新测试\n- 如果发现需要破坏上述约束，先停下来问我\n",[216,831,829],{"__ignoreMap":374},[195,833,834],{},"「先停下来问我」这一句尤其重要。它把模型从「贸然修改」拉回「先沟通再行动」。",[256,836,838],{"id":837},"_25-让-claude-先复述需求再开始执行","2.5 让 Claude 先复述需求再开始执行",[195,840,841],{},"复述（Restate）是检测理解偏差成本最低的方式。零基础导引：相当于点餐后让服务员把单子念一遍，避免做错菜。",[366,843,846],{"className":844,"code":845,"language":371},[369],"在动手之前，请先用三段话复述：\n1. 你认为我要解决的核心问题是什么？\n2. 你打算采取的方案大致是什么？\n3. 有哪些地方你不确定、需要我补充？\n\n我确认后你再开始。\n",[216,847,845],{"__ignoreMap":374},[195,849,850],{},"这一招在长任务、高风险任务里几乎是必选项。我个人的统计是，约有 30% 的复述会暴露出我自己都没意识到的需求歧义。",[195,852,853,854,857],{},"复述还有一个进阶变体：",[211,855,856],{},"让 Claude 先给出反例","。比如：「在动手之前，请先列举三种我可能并不想要的解读方式。」这种「主动找茬」会逼出最容易被误解的边角，比单纯复述更狠。例如你说「优化这个查询」，模型可能反问：「你说的『优化』，是指——A. 减少 SQL 执行时间，B. 减少应用层调用次数，C. 减少索引占用，D. 增强可读性？这四种我会做出完全不同的改动。」一句反问，省下半小时返工。",[245,859],{},[248,861,863],{"id":862},"三claude-code-特有的提示词模式","三、Claude Code 特有的提示词模式",[195,865,866],{},"零基础导引：聊天版 Claude 和 Claude Code 最大的差别在于「执行权」。前者只能产出文本，后者可以读写文件、执行命令、调用 Skills。这一节讨论的所有模式，都建立在「Claude Code 拥有执行权」这一事实之上，写法因此和聊天版有显著差异。",[256,868,870],{"id":869},"_31-文件路径前缀","3.1 文件路径前缀",[195,872,873,874,877],{},"零基础导引：在 Claude Code 里，",[211,875,876],{},"说清楚是哪个文件","比说清楚要做什么还重要。模型一旦定位错文件，后面所有改动都白费。",[366,879,882],{"className":880,"code":881,"language":371},[369],"[模糊]\n帮我修改用户文件，加一个手机号字段。\n\n[精确]\n请修改 \u002Fsrc\u002Ftypes\u002Fuser.ts，在 User 接口中新增 phone: string | null 字段，\n并同步更新 \u002Fsrc\u002Fservices\u002Fuser.service.ts 里所有 new User(...) 的调用点。\n",[216,883,881],{"__ignoreMap":374},[195,885,886],{},"绝对路径或者带项目根的相对路径都比口语化的「那个文件」可靠得多。",[195,888,889,890,893],{},"这条原则的延伸：",[211,891,892],{},"行号也是一种锚点","。当文件很长时，加上行号能进一步缩小注意力范围。",[366,895,898],{"className":896,"code":897,"language":371},[369],"请在 src\u002Futils\u002Fformat.ts 的第 45-78 行（即 formatCurrency 函数）增加对 JPY 的支持，\n其他函数不要动。\n",[216,899,897],{"__ignoreMap":374},[195,901,902],{},"行号的好处是：即使模型读到了整个文件，它也知道你的兴趣区间。配合 Git diff 输出，行号还能帮助 Claude 快速定位「最近改过哪里」。",[195,904,905,906,909],{},"另一个 Claude Code 用户经常忽略的细节：",[211,907,908],{},"项目根的位置","。如果你打开了多个 git 仓库的工作区，Claude 默认会把当前工作目录视为根。明确写出仓库名能避免错位：",[366,911,914],{"className":912,"code":913,"language":371},[369],"请在 frontend 仓的 src\u002Fpages\u002Flogin.vue 中加一个忘记密码链接，\n不要去 backend 仓里找。\n",[216,915,913],{"__ignoreMap":374},[256,917,919],{"id":918},"_32-使用-语法引用具体文件作为上下文","3.2 使用 @ 语法引用具体文件作为上下文",[195,921,922,923,925],{},"Claude Code 支持在提示词中用 ",[216,924,218],{}," 直接引用文件，模型会自动把内容拉进上下文。这比手动复制粘贴更可靠，也省 token。",[366,927,930],{"className":928,"code":929,"language":371},[369],"请阅读 @src\u002Fservices\u002Fauth.ts 和 @docs\u002Fauth-flow.md，\n找出实现与文档不一致的地方，列成表格。\n",[216,931,929],{"__ignoreMap":374},[195,933,934],{},"进阶用法：批量引用整个目录。",[366,936,939],{"className":937,"code":938,"language":371},[369],"请阅读 @src\u002Fcomponents\u002Fforms\u002F 下的所有组件，总结它们共享的表单模式，\n然后建议是否值得抽象出一个 useFormBase hook。\n",[216,940,938],{"__ignoreMap":374},[256,942,944],{"id":943},"_33-用-plan-模式预审计划避免野蛮执行","3.3 用 Plan 模式预审计划，避免「野蛮执行」",[195,946,947,948,951],{},"Claude Code 提供了 Plan Mode（计划模式，按 Shift+Tab 切换）。在这个模式下，Claude 只输出计划而不真正执行。零基础用户应当",[211,949,950],{},"默认在所有结构性改动前进入 Plan 模式","。",[366,953,956],{"className":954,"code":955,"language":371},[369],"[进入 Plan 模式]\n\n请规划：把当前的 REST 后端迁移到 tRPC，至少给我看到：\n1. 影响的文件清单\n2. 改动顺序与依赖关系\n3. 风险点和回滚方案\n\n不要写任何代码，先给我计划。\n",[216,957,955],{"__ignoreMap":374},[195,959,960,961,964],{},"Plan 模式的真实价值不是「让 Claude 慢一点」，而是",[211,962,963],{},"强制把执行决策从模型搬回到人","。在没有 Plan 模式的工具里（比如普通的 ChatGPT 网页版），模型会习惯性地一次性给出长篇代码，你要么全盘接受，要么逐行评审，没有中间地带。Plan 模式则让你可以在「方向」层面做决定，把「实现」交给模型——这才是人机分工最合理的边界。",[195,966,967,968,971],{},"什么时候",[211,969,970],{},"不需要"," Plan 模式？三类情况：",[267,973,974,977,980],{},[270,975,976],{},"改动范围 \u003C 20 行且只涉及一个文件",[270,978,979],{},"任务是查询性质（「告诉我这个变量在哪里被引用」）",[270,981,982],{},"你已经写好了非常详细的实现指令",[195,984,985],{},"其他时候，进入 Plan 模式几乎都是正确选择。",[256,987,989],{"id":988},"_34-对长任务使用checkpoint指令","3.4 对长任务使用「checkpoint」指令",[195,991,992],{},"长任务最常见的问题是中途偏航。可以在提示词里嵌入显式 checkpoint：",[366,994,997],{"className":995,"code":996,"language":371},[369],"本任务分为 5 个阶段。每完成一个阶段：\n1. 提交一次 git（用 conventional commits 风格的中文 message）\n2. 输出一句话总结：本阶段做了什么、下一阶段要做什么\n3. 等我说\"继续\"再进入下一阶段\n",[216,998,996],{"__ignoreMap":374},[195,1000,1001],{},"这种节奏特别适合超过 30 分钟的重构任务，能极大降低重做成本。",[256,1003,1005],{"id":1004},"_35-让-claude-引用-claudemd-与-skills-而非重复描述","3.5 让 Claude 引用 CLAUDE.md 与 Skills 而非重复描述",[195,1007,1008,1009,1011,1012,1015],{},"如果你已经在 ",[216,1010,108],{}," 中写了项目规范，",[211,1013,1014],{},"不要在每次提示词里重复","，否则容易和 CLAUDE.md 冲突。正确做法是引用：",[366,1017,1020],{"className":1018,"code":1019,"language":371},[369],"请遵循 CLAUDE.md 里关于命名约定和测试要求的部分。\n本次只处理 @src\u002Fapi\u002Forder.ts，其他规则照旧。\n",[216,1021,1019],{"__ignoreMap":374},[195,1023,1024,1025,1028],{},"Skills 也一样。如果你有一个名为 ",[216,1026,1027],{},"git-commit"," 的 Skill，直接说「调用 git-commit skill 帮我提交」即可，不要把 Skill 的步骤再口述一遍。",[195,1030,1031,1032,1035],{},"这条原则可以推广为「",[211,1033,1034],{},"单一信息源","（Single Source of Truth）」。任何规则、约定、模板，都应该只有一份权威定义。要么在 CLAUDE.md，要么在 Skill，要么在你的提示词里——三选一，不要重复。重复定义不仅浪费 token，还会在不一致时让模型纠结到底听谁的。我见过最离谱的一次：有人在 CLAUDE.md 里写「使用 4 空格缩进」，又在提示词里写「使用 2 空格缩进」，结果 Claude 在同一个文件里混用了两种缩进。",[245,1037],{},[248,1039,1041],{"id":1040},"四对话节奏与迭代提示词","四、对话节奏与迭代提示词",[195,1043,1044],{},"零基础导引：本节前面讨论的是「单条」提示词的写法，从这一节开始我们关心「多条」提示词如何组合成一段成功的对话。把和 Claude 的协作类比为打乒乓球——你的击球质量重要，但更重要的是你能不能维持住一个稳定的节奏。",[195,1046,1047],{},"提示词不是一锤子买卖。在 Claude Code 这种交互式环境里，你和模型之间的「节奏」往往比单条提示词的措辞更影响最终结果。",[256,1049,1051],{"id":1050},"_41-第一轮广而粗让-claude-列方案","4.1 第一轮：广而粗（让 Claude 列方案）",[195,1053,1054],{},"第一轮的目标不是拿到答案，而是看清解空间。",[366,1056,1059],{"className":1057,"code":1058,"language":371},[369],"我想给现有的电商后台加一个促销引擎。\n请先不要写代码，列出至少三种架构方向（不少于：规则引擎、DSL、可视化编排），\n对比它们在以下维度的表现：\n- 实施成本\n- 运营友好度\n- 后续可扩展性\n- 与我们现有 NestJS 后端的契合度\n",[216,1060,1058],{"__ignoreMap":374},[256,1062,1064],{"id":1063},"_42-第二轮缩小范围人工选-让-claude-详化","4.2 第二轮：缩小范围（人工选 + 让 Claude 详化）",[366,1066,1069],{"className":1067,"code":1068,"language":371},[369],"选定方向二：基于 DSL。请进一步：\n1. 设计这套 DSL 的语法（给 5 条样例规则）\n2. 给出解释器的核心数据结构\n3. 估算 MVP 的工作量（人天）\n",[216,1070,1068],{"__ignoreMap":374},[256,1072,1074],{"id":1073},"_43-第三轮执行-验证","4.3 第三轮：执行 + 验证",[366,1076,1079],{"className":1077,"code":1078,"language":371},[369],"现在开始实现。先做解释器的核心：\n- 文件路径：@src\u002Fpromo\u002Finterpreter.ts\n- 必须有单元测试（@src\u002Fpromo\u002Finterpreter.test.ts），覆盖你给出的 5 条样例规则\n- 不要触碰 controller 层\n",[216,1080,1078],{"__ignoreMap":374},[256,1082,1084],{"id":1083},"_44-何时该开新会话而不是继续旧会话","4.4 何时该开新会话而不是继续旧会话",[195,1086,1087],{},"这是被严重低估的技能。常见信号：",[267,1089,1090,1093,1096],{},[270,1091,1092],{},"上下文里堆积了过多无关的文件读取（>100K tokens）",[270,1094,1095],{},"Claude 开始重复问已经回答过的问题",[270,1097,1098],{},"任务方向已经发生根本变化",[195,1100,1101,1102,1105],{},"正确做法是：",[211,1103,1104],{},"在旧会话中让 Claude 总结当前状态，然后开新会话粘贴这份总结","。这是「人工压缩上下文」的最佳实践。",[366,1107,1110],{"className":1108,"code":1109,"language":371},[369],"[在旧会话末尾]\n请用 200 字以内总结本次会话的：当前进度、关键决定、未解决问题，\n方便我开新会话时粘贴。\n",[216,1111,1109],{"__ignoreMap":374},[256,1113,1115],{"id":1114},"_46-降级与升级的提示词","4.6 「降级」与「升级」的提示词",[195,1117,1118],{},"当模型反复给出过于复杂的方案时，你可以「降级」要求：",[366,1120,1123],{"className":1121,"code":1122,"language":371},[369],"请给我一个最简陋但能跑的版本，明确写在注释里哪些是占位符。\n我先看跑通流程，再决定哪些需要真正实现。\n",[216,1124,1122],{"__ignoreMap":374},[195,1126,1127],{},"反过来，当模型给出的是过度简化的方案时，可以「升级」要求：",[366,1129,1132],{"className":1130,"code":1131,"language":371},[369],"你刚才的版本只考虑了 happy path。\n请增补：错误处理、超时、并发控制、日志。\n每一处都说明为什么需要、能防止什么样的事故。\n",[216,1133,1131],{"__ignoreMap":374},[195,1135,1136],{},"「降级\u002F升级」是控制对话节奏最实用的两个操作。把它们当作单独的快捷键，而不是临时想到的描述。",[256,1138,1140],{"id":1139},"_47-请你给我一个反对意见","4.7 「请你给我一个反对意见」",[195,1142,1143],{},"模型有讨好倾向，对用户的方案默认会先肯定再补充。当你想得到真实评判时，明确请求反对意见：",[366,1145,1148],{"className":1146,"code":1147,"language":371},[369],"我刚才给出的设计你觉得有什么致命弱点？\n请你站在「半年后维护这套代码的新同事」的视角，\n列出最让人头疼的三个地方，并说明为什么。\n不要先肯定我，直接进入批评。\n",[216,1149,1147],{"__ignoreMap":374},[195,1151,1152],{},"这种「逆向 review」往往能拿到比常规 review 高得多的信息密度。",[256,1154,1156],{"id":1155},"_45-用我现在的目标是-x替代你刚才做错了","4.5 用「我现在的目标是 X」替代「你刚才做错了」",[195,1158,1159,1160,778],{},"当 Claude 偏离方向时，很多人下意识写「不对，重做」。这种否定式提示词信息量极低，模型只能靠猜来调整。更高效的写法是",[211,1161,1162],{},"重申目标",[366,1164,1167],{"className":1165,"code":1166,"language":371},[369],"[低效]\n你刚才那个不对，重写。\n\n[高效]\n我现在的目标是：让这个表单在 iOS Safari 下也能正确触发软键盘。\n你刚才的改动专注在 Android Chrome，请重新规划，\n优先验证 iOS 的 inputmode + autocomplete 组合。\n",[216,1168,1166],{"__ignoreMap":374},[245,1170],{},[248,1172,1174],{"id":1173},"五pm-与工程师的不同提示词风格","五、PM 与工程师的不同提示词风格",[195,1176,1177],{},"同一个 Claude Code，PM 和工程师用起来可以判若两人。原因不在于工具本身，而在于他们带入的「锚点」（Anchor）不同。",[256,1179,1181],{"id":1180},"_51-pm-视角从用户故事开始让-claude-拆解为技术任务","5.1 PM 视角：从用户故事开始，让 Claude 拆解为技术任务",[195,1183,1184],{},"PM 通常没有现成的代码上下文，但有清晰的业务诉求。最适合的开局是用户故事（User Story）+ 验收标准（Acceptance Criteria）。",[366,1186,1189],{"className":1187,"code":1188,"language":371},[369],"作为一个零售门店店长，\n我希望能在每天闭店时一键导出当日销售汇总，\n以便我快速核对账目并发到老板群。\n\n验收标准：\n- 一键操作（不超过 2 次点击）\n- 包含：总笔数、总金额、客单价、退款笔数\n- 导出 Excel，列名中文\n- 失败时有明确提示\n\n请帮我：\n1. 列出涉及到的前后端模块\n2. 拆解为不超过 8 小时一颗的开发任务\n3. 标出需要 PM 进一步确认的点\n",[216,1190,1188],{"__ignoreMap":374},[256,1192,1194],{"id":1193},"_52-工程师视角从代码现状开始让-claude-提议变更","5.2 工程师视角：从代码现状开始，让 Claude 提议变更",[195,1196,1197],{},"工程师有丰富的代码上下文，最适合的开局是「现状 + 痛点 + 期望」。",[366,1199,1202],{"className":1200,"code":1201,"language":371},[369],"现状：@src\u002Fservices\u002Fnotification.ts 当前同步发送邮件，QPS 上不去。\n痛点：高峰期接口 P99 从 200ms 飙升到 3s。\n期望：改成异步队列，但不引入 Redis 之外的新组件。\n\n请提议三种实现方式（基于现有 BullMQ、基于 Redis Streams、基于 PostgreSQL LISTEN\u002FNOTIFY），\n对比代码改动量和运维负担。\n",[216,1203,1201],{"__ignoreMap":374},[256,1205,1207],{"id":1206},"_53-跨角色协作让-claude-充当翻译层","5.3 跨角色协作：让 Claude 充当「翻译层」",[195,1209,1210],{},"PM 和工程师沟通成本高的根因之一是术语错位。Claude 在这件事上是天然的翻译器。",[366,1212,1215],{"className":1213,"code":1214,"language":371},[369],"请把下面这段技术决策（工程师写的）翻译成 PM 能理解的版本，\n保留所有关键信息但去掉实现细节，控制在 200 字内：\n\n\"我们决定把订单状态机从 enum 切换到 XState，\n原因是当前的 if-else 已经在 isCancellable 这类衍生状态上滋生了 bug，\n预计可以减少 40% 的状态相关单元测试代码。\"\n",[216,1216,1214],{"__ignoreMap":374},[195,1218,1219],{},"反向翻译同理：把 PM 的需求翻译成给工程师看的接口草案。",[256,1221,1223],{"id":1222},"_54-何时让-claude-主动发问","5.4 何时让 Claude 主动发问",[195,1225,1226,1227,951],{},"这是一条对所有角色都管用的元原则：",[211,1228,1229],{},"当你自己也不确定时，把不确定性外包给模型",[366,1231,1234],{"className":1232,"code":1233,"language":371},[369],"我现在脑子里这个需求还很模糊。\n请你扮演一个有经验的产品经理，问我 5 个最关键的澄清问题。\n我会逐条回答，然后我们再一起写需求文档。\n",[216,1235,1233],{"__ignoreMap":374},[195,1237,1238],{},"这种「让 AI 反向访谈我」的模式，在需求阶段比任何模板都好用。",[195,1240,1241],{},"发问的质量和提问者的人设强相关。同一句话，让 Claude 「以资深 PM 视角发问」和「以质疑型架构师视角发问」会得到完全不同的问题清单。组合使用可以覆盖更全面的盲区：",[366,1243,1246],{"className":1244,"code":1245,"language":371},[369],"请分别以三种身份审视我刚才的需求，每种身份给出 3 个最关键的疑问：\n1. 资深产品经理（关心用户价值与业务可行性）\n2. 后端架构师（关心数据一致性与性能）\n3. QA 主管（关心边界条件与可测性）\n\n发问后等我逐一回答。\n",[216,1247,1245],{"__ignoreMap":374},[195,1249,1250],{},"这个「多身份发问」模式本质上是把「提示词工程」推向了「角色工程」（Role Engineering），用低成本得到了一次跨职能评审。",[256,1252,1254],{"id":1253},"_55-pm-与工程师共用的澄清协议","5.5 PM 与工程师共用的「澄清协议」",[195,1256,1257],{},"无论是 PM 还是工程师，都应该和 Claude 之间约定一个固定的澄清协议。这能极大降低误解成本。一个可推荐的协议如下：",[366,1259,1262],{"className":1260,"code":1261,"language":371},[369],"约定：\n- 当我说\"先列方案\"，你只列方案不写代码\n- 当我说\"开干\"，你按之前确认的方案执行\n- 当我说\"暂停\"，你立刻停下并输出当前进度\n- 当我说\"回滚\"，你撤销最近一次改动并解释为什么撤销\n- 任何阶段，你不确定 ≥30% 的需求时，必须主动发问而不是猜测\n\n请确认你理解了这个协议。\n",[216,1263,1261],{"__ignoreMap":374},[195,1265,1266],{},"把这段协议放进项目的 CLAUDE.md，整个团队就有了一致的「打招呼方式」。",[245,1268],{},[248,1270,1272],{"id":1271},"六提示词的工程化沉淀","六、提示词的工程化沉淀",[195,1274,1275],{},"零基础导引：好的提示词不应该只活在某个人的脑子里。它应该像代码一样被版本化、被复用、被度量。",[256,1277,1279],{"id":1278},"_61-skills-把高频提示词模板封装为可复用资产","6.1 Skills 把高频提示词模板封装为可复用资产",[195,1281,1282],{},"Claude Code 的 Skills 机制（详见第三章）本质上就是「提示词工程化」的官方答案。当你发现自己反复写类似的提示词，就是该把它升级为 Skill 的信号。",[366,1284,1288],{"className":1285,"code":1286,"language":1287,"meta":374,"style":374},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 一个 skill 的最小骨架\n# ~\u002F.claude\u002Fskills\u002Fcode-review-zh\u002FSKILL.md\n\n---\nname: code-review-zh\ndescription: 中文代码审查，按 [可读性, 健壮性, 性能, 安全性] 四维度打分\n---\n\n## 步骤\n\n1. 读取 git diff\n2. 按四个维度逐项打分（1-5 分）\n3. 用中文输出 Markdown 报告\n4. 在「严重问题」一节列出必须修复的项\n\n## 输出模板\n...\n","bash",[216,1289,1290,1295,1300,1304,1309,1317,1340,1344,1348,1353,1357,1371,1382,1396,1404,1408,1413],{"__ignoreMap":374},[438,1291,1292],{"class":440,"line":441},[438,1293,1294],{"class":444},"# 一个 skill 的最小骨架\n",[438,1296,1297],{"class":440,"line":448},[438,1298,1299],{"class":444},"# ~\u002F.claude\u002Fskills\u002Fcode-review-zh\u002FSKILL.md\n",[438,1301,1302],{"class":440,"line":454},[438,1303,615],{"emptyLinePlaceholder":614},[438,1305,1306],{"class":440,"line":461},[438,1307,1308],{"class":524},"---\n",[438,1310,1311,1314],{"class":440,"line":468},[438,1312,1313],{"class":524},"name:",[438,1315,1316],{"class":474}," code-review-zh\n",[438,1318,1319,1322,1325,1328,1331,1334,1337],{"class":440,"line":491},[438,1320,1321],{"class":524},"description:",[438,1323,1324],{"class":474}," 中文代码审查，按",[438,1326,1327],{"class":457}," [可读性, ",[438,1329,1330],{"class":474},"健壮性,",[438,1332,1333],{"class":474}," 性能,",[438,1335,1336],{"class":474}," 安全性]",[438,1338,1339],{"class":474}," 四维度打分\n",[438,1341,1342],{"class":440,"line":510},[438,1343,1308],{"class":524},[438,1345,1346],{"class":440,"line":534},[438,1347,615],{"emptyLinePlaceholder":614},[438,1349,1350],{"class":440,"line":553},[438,1351,1352],{"class":444},"## 步骤\n",[438,1354,1355],{"class":440,"line":573},[438,1356,615],{"emptyLinePlaceholder":614},[438,1358,1359,1362,1365,1368],{"class":440,"line":593},[438,1360,1361],{"class":524},"1.",[438,1363,1364],{"class":474}," 读取",[438,1366,1367],{"class":474}," git",[438,1369,1370],{"class":474}," diff\n",[438,1372,1373,1376,1379],{"class":440,"line":599},[438,1374,1375],{"class":524},"2.",[438,1377,1378],{"class":474}," 按四个维度逐项打分（1-5",[438,1380,1381],{"class":474}," 分）\n",[438,1383,1384,1387,1390,1393],{"class":440,"line":605},[438,1385,1386],{"class":524},"3.",[438,1388,1389],{"class":474}," 用中文输出",[438,1391,1392],{"class":474}," Markdown",[438,1394,1395],{"class":474}," 报告\n",[438,1397,1398,1401],{"class":440,"line":611},[438,1399,1400],{"class":524},"4.",[438,1402,1403],{"class":474}," 在「严重问题」一节列出必须修复的项\n",[438,1405,1406],{"class":440,"line":618},[438,1407,615],{"emptyLinePlaceholder":614},[438,1409,1410],{"class":440,"line":624},[438,1411,1412],{"class":444},"## 输出模板\n",[438,1414,1416],{"class":440,"line":1415},17,[438,1417,1418],{"class":503},"...\n",[256,1420,1422],{"id":1421},"_62-团队级提示词手册prompt-playbook的维护","6.2 团队级「提示词手册」（Prompt Playbook）的维护",[195,1424,1425,1426,1429],{},"如果你的团队有超过 3 个人在用 Claude Code，强烈建议建立一份 ",[216,1427,1428],{},"prompts\u002F"," 目录或 wiki 页面，记录：",[267,1431,1432,1435,1438,1441],{},[270,1433,1434],{},"高频任务的标准提示词",[270,1436,1437],{},"反例（哪些写法翻过车）",[270,1439,1440],{},"各 Skill 的使用场景",[270,1442,1443],{},"团队约定的「黑名单」（比如禁止让模型自动 commit）",[195,1445,1446],{},"这份文档应当像 ESLint 配置一样进入代码评审流程，定期更新。",[256,1448,1450],{"id":1449},"_63-度量提示词效果的简易指标","6.3 度量提示词效果的简易指标",[195,1452,1453],{},"你不需要搞复杂的 A\u002FB 测试。两个简单指标就够：",[267,1455,1456,1462],{},[270,1457,1458,1461],{},[211,1459,1460],{},"一次通过率","：提示词发出去后，第一轮输出是否可以直接用，无需人工修订。",[270,1463,1464,1467],{},[211,1465,1466],{},"平均轮数","：完成一个任务平均往返几次。",[195,1469,1470],{},"记录一段时间后，针对一次通过率最低、平均轮数最高的提示词重点优化，往往能拿到最大收益。",[195,1472,1473],{},"更可执行的做法是把这套度量嵌入团队的周会。每周花 15 分钟，看看本周 Top 3 的「难搞提示词」，集体改进。这种轻量化的 Prompt Review，比任何花哨的 LLMOps 平台都更早能产生价值。",[366,1475,1477],{"className":432,"code":1476,"language":434,"meta":374,"style":374},"\u002F\u002F 一个超轻量的本地度量脚本（伪代码）\ntype PromptLog = {\n  promptId: string;\n  passedFirstTry: boolean;\n  totalRounds: number;\n  date: string;\n};\n\nfunction summarize(logs: PromptLog[]) {\n  const byId = new Map\u003Cstring, PromptLog[]>();\n  for (const log of logs) {\n    const arr = byId.get(log.promptId) ?? [];\n    arr.push(log);\n    byId.set(log.promptId, arr);\n  }\n  return [...byId.entries()].map(([id, arr]) => ({\n    id,\n    samples: arr.length,\n    firstTryRate: arr.filter(l => l.passedFirstTry).length \u002F arr.length,\n    avgRounds: arr.reduce((s, l) => s + l.totalRounds, 0) \u002F arr.length,\n  }));\n}\n",[216,1478,1479,1484,1499,1511,1523,1534,1545,1550,1554,1580,1615,1641,1679,1697,1723,1728,1776,1783,1800,1847,1908,1919],{"__ignoreMap":374},[438,1480,1481],{"class":440,"line":441},[438,1482,1483],{"class":444},"\u002F\u002F 一个超轻量的本地度量脚本（伪代码）\n",[438,1485,1486,1490,1493,1496],{"class":440,"line":448},[438,1487,1489],{"class":1488},"spNyl","type",[438,1491,1492],{"class":524}," PromptLog",[438,1494,1495],{"class":464}," =",[438,1497,1498],{"class":464}," {\n",[438,1500,1501,1504,1506,1508],{"class":440,"line":454},[438,1502,1503],{"class":481},"  promptId",[438,1505,521],{"class":464},[438,1507,525],{"class":524},[438,1509,1510],{"class":464},";\n",[438,1512,1513,1516,1518,1521],{"class":440,"line":461},[438,1514,1515],{"class":481},"  passedFirstTry",[438,1517,521],{"class":464},[438,1519,1520],{"class":524}," boolean",[438,1522,1510],{"class":464},[438,1524,1525,1528,1530,1532],{"class":440,"line":468},[438,1526,1527],{"class":481},"  totalRounds",[438,1529,521],{"class":464},[438,1531,565],{"class":524},[438,1533,1510],{"class":464},[438,1535,1536,1539,1541,1543],{"class":440,"line":491},[438,1537,1538],{"class":481},"  date",[438,1540,521],{"class":464},[438,1542,525],{"class":524},[438,1544,1510],{"class":464},[438,1546,1547],{"class":440,"line":510},[438,1548,1549],{"class":464},"};\n",[438,1551,1552],{"class":440,"line":534},[438,1553,615],{"emptyLinePlaceholder":614},[438,1555,1556,1559,1562,1565,1569,1571,1573,1575,1578],{"class":440,"line":553},[438,1557,1558],{"class":1488},"function",[438,1560,1561],{"class":503}," summarize",[438,1563,1564],{"class":464},"(",[438,1566,1568],{"class":1567},"sHdIc","logs",[438,1570,521],{"class":464},[438,1572,1492],{"class":524},[438,1574,714],{"class":457},[438,1576,1577],{"class":464},")",[438,1579,1498],{"class":464},[438,1581,1582,1585,1588,1590,1593,1596,1599,1601,1603,1605,1607,1610,1613],{"class":440,"line":573},[438,1583,1584],{"class":1488},"  const",[438,1586,1587],{"class":457}," byId",[438,1589,1495],{"class":464},[438,1591,1592],{"class":464}," new",[438,1594,1595],{"class":503}," Map",[438,1597,1598],{"class":464},"\u003C",[438,1600,485],{"class":524},[438,1602,528],{"class":464},[438,1604,1492],{"class":524},[438,1606,714],{"class":481},[438,1608,1609],{"class":464},">",[438,1611,1612],{"class":481},"()",[438,1614,1510],{"class":464},[438,1616,1617,1621,1624,1627,1630,1633,1636,1639],{"class":440,"line":593},[438,1618,1620],{"class":1619},"s7zQu","  for",[438,1622,1623],{"class":481}," (",[438,1625,1626],{"class":1488},"const",[438,1628,1629],{"class":457}," log",[438,1631,1632],{"class":464}," of",[438,1634,1635],{"class":457}," logs",[438,1637,1638],{"class":481},") ",[438,1640,465],{"class":464},[438,1642,1643,1646,1649,1651,1653,1656,1659,1661,1664,1666,1669,1671,1674,1677],{"class":440,"line":599},[438,1644,1645],{"class":1488},"    const",[438,1647,1648],{"class":457}," arr",[438,1650,1495],{"class":464},[438,1652,1587],{"class":457},[438,1654,1655],{"class":464},".",[438,1657,1658],{"class":503},"get",[438,1660,1564],{"class":481},[438,1662,1663],{"class":457},"log",[438,1665,1655],{"class":464},[438,1667,1668],{"class":457},"promptId",[438,1670,1638],{"class":481},[438,1672,1673],{"class":464},"??",[438,1675,1676],{"class":481}," []",[438,1678,1510],{"class":464},[438,1680,1681,1684,1686,1689,1691,1693,1695],{"class":440,"line":605},[438,1682,1683],{"class":457},"    arr",[438,1685,1655],{"class":464},[438,1687,1688],{"class":503},"push",[438,1690,1564],{"class":481},[438,1692,1663],{"class":457},[438,1694,1577],{"class":481},[438,1696,1510],{"class":464},[438,1698,1699,1702,1704,1707,1709,1711,1713,1715,1717,1719,1721],{"class":440,"line":611},[438,1700,1701],{"class":457},"    byId",[438,1703,1655],{"class":464},[438,1705,1706],{"class":503},"set",[438,1708,1564],{"class":481},[438,1710,1663],{"class":457},[438,1712,1655],{"class":464},[438,1714,1668],{"class":457},[438,1716,528],{"class":464},[438,1718,1648],{"class":457},[438,1720,1577],{"class":481},[438,1722,1510],{"class":464},[438,1724,1725],{"class":440,"line":618},[438,1726,1727],{"class":464},"  }\n",[438,1729,1730,1733,1736,1739,1742,1744,1747,1750,1752,1755,1757,1760,1762,1764,1766,1769,1772,1774],{"class":440,"line":624},[438,1731,1732],{"class":1619},"  return",[438,1734,1735],{"class":481}," [",[438,1737,1738],{"class":464},"...",[438,1740,1741],{"class":457},"byId",[438,1743,1655],{"class":464},[438,1745,1746],{"class":503},"entries",[438,1748,1749],{"class":481},"()]",[438,1751,1655],{"class":464},[438,1753,1754],{"class":503},"map",[438,1756,1564],{"class":481},[438,1758,1759],{"class":464},"([",[438,1761,516],{"class":1567},[438,1763,528],{"class":464},[438,1765,1648],{"class":1567},[438,1767,1768],{"class":464},"])",[438,1770,1771],{"class":1488}," =>",[438,1773,1623],{"class":481},[438,1775,465],{"class":464},[438,1777,1778,1781],{"class":440,"line":1415},[438,1779,1780],{"class":457},"    id",[438,1782,488],{"class":464},[438,1784,1786,1789,1791,1793,1795,1798],{"class":440,"line":1785},18,[438,1787,1788],{"class":481},"    samples",[438,1790,521],{"class":464},[438,1792,1648],{"class":457},[438,1794,1655],{"class":464},[438,1796,1797],{"class":457},"length",[438,1799,488],{"class":464},[438,1801,1803,1806,1808,1810,1812,1815,1817,1820,1822,1825,1827,1830,1832,1834,1836,1839,1841,1843,1845],{"class":440,"line":1802},19,[438,1804,1805],{"class":481},"    firstTryRate",[438,1807,521],{"class":464},[438,1809,1648],{"class":457},[438,1811,1655],{"class":464},[438,1813,1814],{"class":503},"filter",[438,1816,1564],{"class":481},[438,1818,1819],{"class":1567},"l",[438,1821,1771],{"class":1488},[438,1823,1824],{"class":457}," l",[438,1826,1655],{"class":464},[438,1828,1829],{"class":457},"passedFirstTry",[438,1831,1577],{"class":481},[438,1833,1655],{"class":464},[438,1835,1797],{"class":457},[438,1837,1838],{"class":464}," \u002F",[438,1840,1648],{"class":457},[438,1842,1655],{"class":464},[438,1844,1797],{"class":457},[438,1846,488],{"class":464},[438,1848,1850,1853,1855,1857,1859,1862,1864,1866,1869,1871,1873,1875,1877,1880,1883,1885,1887,1890,1892,1895,1897,1900,1902,1904,1906],{"class":440,"line":1849},20,[438,1851,1852],{"class":481},"    avgRounds",[438,1854,521],{"class":464},[438,1856,1648],{"class":457},[438,1858,1655],{"class":464},[438,1860,1861],{"class":503},"reduce",[438,1863,1564],{"class":481},[438,1865,1564],{"class":464},[438,1867,1868],{"class":1567},"s",[438,1870,528],{"class":464},[438,1872,1824],{"class":1567},[438,1874,1577],{"class":464},[438,1876,1771],{"class":1488},[438,1878,1879],{"class":457}," s",[438,1881,1882],{"class":464}," +",[438,1884,1824],{"class":457},[438,1886,1655],{"class":464},[438,1888,1889],{"class":457},"totalRounds",[438,1891,528],{"class":464},[438,1893,1894],{"class":700}," 0",[438,1896,1638],{"class":481},[438,1898,1899],{"class":464},"\u002F",[438,1901,1648],{"class":457},[438,1903,1655],{"class":464},[438,1905,1797],{"class":457},[438,1907,488],{"class":464},[438,1909,1911,1914,1917],{"class":440,"line":1910},21,[438,1912,1913],{"class":464},"  }",[438,1915,1916],{"class":481},"))",[438,1918,1510],{"class":464},[438,1920,1922],{"class":440,"line":1921},22,[438,1923,602],{"class":464},[256,1925,1927],{"id":1926},"_64-反模式把提示词写成咒语收藏夹","6.4 反模式：把提示词写成「咒语收藏夹」",[195,1929,1930],{},"最后一个警告。网上流传着大量「神级提示词大全」，鼓吹「一句话让 GPT 变身十倍工程师」之类。请保持警惕：",[267,1932,1933,1936,1939],{},[270,1934,1935],{},"这些咒语大多是在某个特定模型版本、特定任务上的偶然观察。",[270,1937,1938],{},"它们违反了本节强调的「契约思维」——把不可解释性当作护城河。",[270,1940,1941],{},"跨模型、跨版本、跨任务时，咒语的有效性极不稳定。",[195,1943,1944,1945,1948],{},"更可持续的策略是：",[211,1946,1947],{},"理解原理 + 沉淀团队 Playbook + 定期度量","。这三件事做好，比背一千条咒语都管用。",[195,1950,1951],{},"最后给你一个识别「咒语收藏夹」的简易检测器：如果一条提示词技巧的卖点是「不告诉模型理由就能让它表现更好」，多半是噪声；如果一条技巧能用注意力机制、训练数据分布、对齐目标这类原理解释清楚，多半是真知识。带着这个尺子去看互联网上的提示词分享，你会过滤掉 80% 的水分。",[256,1953,1955],{"id":1954},"_65-提示词的版本化与回归测试","6.5 提示词的版本化与回归测试",[195,1957,1958],{},"零基础导引：当一条提示词被多个团队成员复用、又在线上跑了几个月之后，你会发现修改它变得非常危险——谁也说不准微调一句话会不会让某些边界 case 翻车。这时就需要把提示词当作代码来管理。",[195,1960,1961],{},"实践要点：",[267,1963,1964,1977,1983],{},[270,1965,1966,1969,1970,1972,1973,1976],{},[211,1967,1968],{},"存进 Git 仓库","。建立一个 ",[216,1971,1428],{}," 目录，每个提示词一个文件，文件名带版本号（例如 ",[216,1974,1975],{},"code-review.v3.md","）。Diff 历史就是改进史。",[270,1978,1979,1982],{},[211,1980,1981],{},"建立小型回归集","。挑 10-20 个有代表性的输入，每次改提示词时跑一遍，比较新旧输出。可以人工评审，也可以让另一个模型做评审员（LLM-as-a-Judge）。",[270,1984,1985,1988],{},[211,1986,1987],{},"写 changelog","。每次改提示词，写一行「为什么改 + 预期改善」。三个月后回头看，你会感谢自己。",[366,1990,1992],{"className":432,"code":1991,"language":434,"meta":374,"style":374},"\u002F\u002F 一个最小的提示词回归测试结构\ntype PromptCase = {\n  id: string;\n  input: string;\n  mustContain?: string[];   \u002F\u002F 输出必须包含的关键词\n  mustNotContain?: string[]; \u002F\u002F 输出必须不包含的关键词\n};\n\nconst cases: PromptCase[] = [\n  {\n    id: 'jpy-currency',\n    input: '把 1234 转成日元显示',\n    mustContain: ['¥', '1,234'],\n    mustNotContain: ['$', 'USD'],\n  },\n  \u002F\u002F ...更多 case\n];\n\nasync function runRegression(prompt: string, cases: PromptCase[]) {\n  const failed: PromptCase[] = [];\n  for (const c of cases) {\n    const out = await callClaude(prompt + '\\n\\n输入：' + c.input);\n    const passContain = (c.mustContain ?? []).every(s => out.includes(s));\n    const passExclude = (c.mustNotContain ?? []).every(s => !out.includes(s));\n    if (!passContain || !passExclude) failed.push(c);\n  }\n  return failed;\n}\n",[216,1993,1994,1999,2010,2021,2032,2050,2066,2070,2074,2094,2099,2116,2132,2161,2190,2195,2200,2206,2210,2244,2263,2282,2326,2378,2429,2468,2473,2482],{"__ignoreMap":374},[438,1995,1996],{"class":440,"line":441},[438,1997,1998],{"class":444},"\u002F\u002F 一个最小的提示词回归测试结构\n",[438,2000,2001,2003,2006,2008],{"class":440,"line":448},[438,2002,1489],{"class":1488},[438,2004,2005],{"class":524}," PromptCase",[438,2007,1495],{"class":464},[438,2009,1498],{"class":464},[438,2011,2012,2015,2017,2019],{"class":440,"line":454},[438,2013,2014],{"class":481},"  id",[438,2016,521],{"class":464},[438,2018,525],{"class":524},[438,2020,1510],{"class":464},[438,2022,2023,2026,2028,2030],{"class":440,"line":461},[438,2024,2025],{"class":481},"  input",[438,2027,521],{"class":464},[438,2029,525],{"class":524},[438,2031,1510],{"class":464},[438,2033,2034,2037,2040,2042,2044,2047],{"class":440,"line":468},[438,2035,2036],{"class":481},"  mustContain",[438,2038,2039],{"class":464},"?:",[438,2041,525],{"class":524},[438,2043,714],{"class":457},[438,2045,2046],{"class":464},";",[438,2048,2049],{"class":444},"   \u002F\u002F 输出必须包含的关键词\n",[438,2051,2052,2055,2057,2059,2061,2063],{"class":440,"line":491},[438,2053,2054],{"class":481},"  mustNotContain",[438,2056,2039],{"class":464},[438,2058,525],{"class":524},[438,2060,714],{"class":457},[438,2062,2046],{"class":464},[438,2064,2065],{"class":444}," \u002F\u002F 输出必须不包含的关键词\n",[438,2067,2068],{"class":440,"line":510},[438,2069,1549],{"class":464},[438,2071,2072],{"class":440,"line":534},[438,2073,615],{"emptyLinePlaceholder":614},[438,2075,2076,2078,2081,2083,2085,2088,2091],{"class":440,"line":553},[438,2077,1626],{"class":1488},[438,2079,2080],{"class":457}," cases",[438,2082,521],{"class":464},[438,2084,2005],{"class":524},[438,2086,2087],{"class":457},"[] ",[438,2089,2090],{"class":464},"=",[438,2092,2093],{"class":457}," [\n",[438,2095,2096],{"class":440,"line":573},[438,2097,2098],{"class":464},"  {\n",[438,2100,2101,2103,2105,2108,2111,2114],{"class":440,"line":593},[438,2102,1780],{"class":481},[438,2104,521],{"class":464},[438,2106,2107],{"class":464}," '",[438,2109,2110],{"class":474},"jpy-currency",[438,2112,2113],{"class":464},"'",[438,2115,488],{"class":464},[438,2117,2118,2121,2123,2125,2128,2130],{"class":440,"line":599},[438,2119,2120],{"class":481},"    input",[438,2122,521],{"class":464},[438,2124,2107],{"class":464},[438,2126,2127],{"class":474},"把 1234 转成日元显示",[438,2129,2113],{"class":464},[438,2131,488],{"class":464},[438,2133,2134,2137,2139,2141,2143,2146,2148,2150,2152,2155,2157,2159],{"class":440,"line":605},[438,2135,2136],{"class":481},"    mustContain",[438,2138,521],{"class":464},[438,2140,1735],{"class":457},[438,2142,2113],{"class":464},[438,2144,2145],{"class":474},"¥",[438,2147,2113],{"class":464},[438,2149,528],{"class":464},[438,2151,2107],{"class":464},[438,2153,2154],{"class":474},"1,234",[438,2156,2113],{"class":464},[438,2158,723],{"class":457},[438,2160,488],{"class":464},[438,2162,2163,2166,2168,2170,2172,2175,2177,2179,2181,2184,2186,2188],{"class":440,"line":611},[438,2164,2165],{"class":481},"    mustNotContain",[438,2167,521],{"class":464},[438,2169,1735],{"class":457},[438,2171,2113],{"class":464},[438,2173,2174],{"class":474},"$",[438,2176,2113],{"class":464},[438,2178,528],{"class":464},[438,2180,2107],{"class":464},[438,2182,2183],{"class":474},"USD",[438,2185,2113],{"class":464},[438,2187,723],{"class":457},[438,2189,488],{"class":464},[438,2191,2192],{"class":440,"line":618},[438,2193,2194],{"class":464},"  },\n",[438,2196,2197],{"class":440,"line":624},[438,2198,2199],{"class":444},"  \u002F\u002F ...更多 case\n",[438,2201,2202,2204],{"class":440,"line":1415},[438,2203,723],{"class":457},[438,2205,1510],{"class":464},[438,2207,2208],{"class":440,"line":1785},[438,2209,615],{"emptyLinePlaceholder":614},[438,2211,2212,2215,2218,2221,2223,2226,2228,2230,2232,2234,2236,2238,2240,2242],{"class":440,"line":1802},[438,2213,2214],{"class":1488},"async",[438,2216,2217],{"class":1488}," function",[438,2219,2220],{"class":503}," runRegression",[438,2222,1564],{"class":464},[438,2224,2225],{"class":1567},"prompt",[438,2227,521],{"class":464},[438,2229,525],{"class":524},[438,2231,528],{"class":464},[438,2233,2080],{"class":1567},[438,2235,521],{"class":464},[438,2237,2005],{"class":524},[438,2239,714],{"class":457},[438,2241,1577],{"class":464},[438,2243,1498],{"class":464},[438,2245,2246,2248,2251,2253,2255,2257,2259,2261],{"class":440,"line":1849},[438,2247,1584],{"class":1488},[438,2249,2250],{"class":457}," failed",[438,2252,521],{"class":464},[438,2254,2005],{"class":524},[438,2256,2087],{"class":481},[438,2258,2090],{"class":464},[438,2260,1676],{"class":481},[438,2262,1510],{"class":464},[438,2264,2265,2267,2269,2271,2274,2276,2278,2280],{"class":440,"line":1910},[438,2266,1620],{"class":1619},[438,2268,1623],{"class":481},[438,2270,1626],{"class":1488},[438,2272,2273],{"class":457}," c",[438,2275,1632],{"class":464},[438,2277,2080],{"class":457},[438,2279,1638],{"class":481},[438,2281,465],{"class":464},[438,2283,2284,2286,2289,2291,2294,2297,2299,2301,2303,2305,2308,2311,2313,2315,2317,2319,2322,2324],{"class":440,"line":1921},[438,2285,1645],{"class":1488},[438,2287,2288],{"class":457}," out",[438,2290,1495],{"class":464},[438,2292,2293],{"class":1619}," await",[438,2295,2296],{"class":503}," callClaude",[438,2298,1564],{"class":481},[438,2300,2225],{"class":457},[438,2302,1882],{"class":464},[438,2304,2107],{"class":464},[438,2306,2307],{"class":457},"\\n\\n",[438,2309,2310],{"class":474},"输入：",[438,2312,2113],{"class":464},[438,2314,1882],{"class":464},[438,2316,2273],{"class":457},[438,2318,1655],{"class":464},[438,2320,2321],{"class":457},"input",[438,2323,1577],{"class":481},[438,2325,1510],{"class":464},[438,2327,2329,2331,2334,2336,2338,2341,2343,2346,2349,2352,2354,2357,2359,2361,2363,2365,2367,2370,2372,2374,2376],{"class":440,"line":2328},23,[438,2330,1645],{"class":1488},[438,2332,2333],{"class":457}," passContain",[438,2335,1495],{"class":464},[438,2337,1623],{"class":481},[438,2339,2340],{"class":457},"c",[438,2342,1655],{"class":464},[438,2344,2345],{"class":457},"mustContain",[438,2347,2348],{"class":464}," ??",[438,2350,2351],{"class":481}," [])",[438,2353,1655],{"class":464},[438,2355,2356],{"class":503},"every",[438,2358,1564],{"class":481},[438,2360,1868],{"class":1567},[438,2362,1771],{"class":1488},[438,2364,2288],{"class":457},[438,2366,1655],{"class":464},[438,2368,2369],{"class":503},"includes",[438,2371,1564],{"class":481},[438,2373,1868],{"class":457},[438,2375,1916],{"class":481},[438,2377,1510],{"class":464},[438,2379,2381,2383,2386,2388,2390,2392,2394,2397,2399,2401,2403,2405,2407,2409,2411,2414,2417,2419,2421,2423,2425,2427],{"class":440,"line":2380},24,[438,2382,1645],{"class":1488},[438,2384,2385],{"class":457}," passExclude",[438,2387,1495],{"class":464},[438,2389,1623],{"class":481},[438,2391,2340],{"class":457},[438,2393,1655],{"class":464},[438,2395,2396],{"class":457},"mustNotContain",[438,2398,2348],{"class":464},[438,2400,2351],{"class":481},[438,2402,1655],{"class":464},[438,2404,2356],{"class":503},[438,2406,1564],{"class":481},[438,2408,1868],{"class":1567},[438,2410,1771],{"class":1488},[438,2412,2413],{"class":464}," !",[438,2415,2416],{"class":457},"out",[438,2418,1655],{"class":464},[438,2420,2369],{"class":503},[438,2422,1564],{"class":481},[438,2424,1868],{"class":457},[438,2426,1916],{"class":481},[438,2428,1510],{"class":464},[438,2430,2432,2435,2437,2440,2443,2446,2448,2451,2453,2456,2458,2460,2462,2464,2466],{"class":440,"line":2431},25,[438,2433,2434],{"class":1619},"    if",[438,2436,1623],{"class":481},[438,2438,2439],{"class":464},"!",[438,2441,2442],{"class":457},"passContain",[438,2444,2445],{"class":464}," ||",[438,2447,2413],{"class":464},[438,2449,2450],{"class":457},"passExclude",[438,2452,1638],{"class":481},[438,2454,2455],{"class":457},"failed",[438,2457,1655],{"class":464},[438,2459,1688],{"class":503},[438,2461,1564],{"class":481},[438,2463,2340],{"class":457},[438,2465,1577],{"class":481},[438,2467,1510],{"class":464},[438,2469,2471],{"class":440,"line":2470},26,[438,2472,1727],{"class":464},[438,2474,2476,2478,2480],{"class":440,"line":2475},27,[438,2477,1732],{"class":1619},[438,2479,2250],{"class":457},[438,2481,1510],{"class":464},[438,2483,2485],{"class":440,"line":2484},28,[438,2486,602],{"class":464},[195,2488,2489],{},"这套机制不需要复杂的 LLMOps 平台，一份 Markdown 测试样本 + 50 行脚本就能跑起来。早期低门槛，后期再考虑专业工具。",[256,2491,2493],{"id":2492},"_66-提示词的可解释性检查","6.6 提示词的「可解释性」检查",[195,2495,2496],{},"最后一条工程化原则：每条进入团队 Playbook 的提示词，都应当能用一句话解释「为什么这么写」。如果你写下一条提示词却说不清楚每一段约束的目的，那这条提示词大概率是抄来的、没有内化的。",[195,2498,2499],{},"写一个简单的 review checklist：",[267,2501,2502,2505,2508,2511,2514,2517],{},[270,2503,2504],{},"输入素材是否齐全？（少了什么会让 Claude 瞎猜？）",[270,2506,2507],{},"约束是否覆盖了「不要做什么」？",[270,2509,2510],{},"输出格式是否能被下游程序消费？",[270,2512,2513],{},"是否给了至少一个样例？",[270,2515,2516],{},"是否埋了 checkpoint？",[270,2518,2519],{},"是否冗余了 CLAUDE.md \u002F Skill 的内容？",[195,2521,2522],{},"把这份 checklist 写进团队的 Code Review 模板里，每次新增 Skill 或 Playbook 条目时走一遍，团队的提示词水平会以肉眼可见的速度提升。",[245,2524],{},[248,2526,2528],{"id":2527},"七综合演练把一个糟糕提示词改造成契约式提示词","七、综合演练：把一个糟糕提示词改造成契约式提示词",[195,2530,2531],{},"零基础导引：理论讲再多，不如手把手改一次。这一节我们拿一个真实场景里典型的糟糕提示词，按本节方法论一步步重写，看看每一步能拿掉哪些不确定性。",[195,2533,2534,2537],{},[211,2535,2536],{},"原始提示词","（典型用户写法）：",[366,2539,2542],{"className":2540,"code":2541,"language":371},[369],"帮我把那个登录功能改一下，最近老有人反映登不上，\n你看着办，搞得专业点。\n",[216,2543,2541],{"__ignoreMap":374},[195,2545,2546],{},"这段话至少踩中了七个雷：「那个」（指代不明）、「登录功能」（哪个文件）、「老有人反映」（多少人？什么时间？什么环境？）、「登不上」（症状是什么）、「你看着办」（无约束）、「专业点」（无标准）、缺少输出形态约定。",[195,2548,2549],{},[211,2550,2551],{},"第一轮改造：补输入",[366,2553,2556],{"className":2554,"code":2555,"language":371},[369],"我们的登录组件在 @src\u002Fcomponents\u002FLogin.tsx，使用邮箱+密码登录，\n后端走 @src\u002Fapi\u002Fauth.ts 的 POST \u002Fapi\u002Flogin。\n\n最近一周客服收到 12 条投诉，都是 iOS Safari 用户，\n现象是点击登录按钮后无反应，控制台报 net::ERR_FAILED。\n桌面端和 Android 都正常。\n",[216,2557,2555],{"__ignoreMap":374},[195,2559,2560],{},"仅这一步，问题已经从「玄学故障」收敛到「iOS Safari 上的网络层问题」。",[195,2562,2563],{},[211,2564,2565],{},"第二轮改造：补约束",[366,2567,2570],{"className":2568,"code":2569,"language":371},[369],"约束：\n- 不要触碰后端代码（auth.ts 不动）\n- 不要引入新的 npm 依赖\n- 兼容性目标：iOS Safari 14+\n- 如果你怀疑根因在后端，停下来告诉我，不要改前端代码绕过\n",[216,2571,2569],{"__ignoreMap":374},[195,2573,2574],{},"这一步把「乱改」「滥改」「绕过本质问题」的可能性都封死了。",[195,2576,2577],{},[211,2578,2579],{},"第三轮改造：补输出与节奏",[366,2581,2584],{"className":2582,"code":2583,"language":371},[369],"请按以下节奏推进：\n\n第一步：复述你对问题的理解（3 段话内）。\n第二步：列出 3-5 个最可能的原因，按概率排序，每条说明排查方法。\n第三步：等我确认排查方向后，再给出代码改动建议。\n\n每一步结束都停下，等我说\"继续\"。\n",[216,2585,2583],{"__ignoreMap":374},[195,2587,2588,2591],{},[211,2589,2590],{},"完整版","（三步合一）：",[366,2593,2597],{"className":2594,"code":2595,"language":2596,"meta":374,"style":374},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ccontext>\n登录组件：@src\u002Fcomponents\u002FLogin.tsx（邮箱+密码）\n登录接口：@src\u002Fapi\u002Fauth.ts 中的 POST \u002Fapi\u002Flogin\n故障范围：iOS Safari 14+，桌面与 Android 正常\n症状：点击登录按钮无反应，console: net::ERR_FAILED\n反馈量：一周 12 例\n\u003C\u002Fcontext>\n\n\u003Cconstraints>\n- 不修改后端代码\n- 不引入新依赖\n- 怀疑根因在后端时停下来沟通\n\u003C\u002Fconstraints>\n\n\u003Ctask>\n分三步推进：\n1) 复述理解（≤3 段）\n2) 排序列出 3-5 个最可能的原因 + 排查方法\n3) 等我确认后再给代码建议\n每步结束停下等\"继续\"。\n\u003C\u002Ftask>\n","xml",[216,2598,2599,2604,2609,2614,2619,2624,2629,2634,2638,2643,2648,2653,2658,2663,2667,2672,2677,2682,2687,2692,2697],{"__ignoreMap":374},[438,2600,2601],{"class":440,"line":441},[438,2602,2603],{},"\u003Ccontext>\n",[438,2605,2606],{"class":440,"line":448},[438,2607,2608],{},"登录组件：@src\u002Fcomponents\u002FLogin.tsx（邮箱+密码）\n",[438,2610,2611],{"class":440,"line":454},[438,2612,2613],{},"登录接口：@src\u002Fapi\u002Fauth.ts 中的 POST \u002Fapi\u002Flogin\n",[438,2615,2616],{"class":440,"line":461},[438,2617,2618],{},"故障范围：iOS Safari 14+，桌面与 Android 正常\n",[438,2620,2621],{"class":440,"line":468},[438,2622,2623],{},"症状：点击登录按钮无反应，console: net::ERR_FAILED\n",[438,2625,2626],{"class":440,"line":491},[438,2627,2628],{},"反馈量：一周 12 例\n",[438,2630,2631],{"class":440,"line":510},[438,2632,2633],{},"\u003C\u002Fcontext>\n",[438,2635,2636],{"class":440,"line":534},[438,2637,615],{"emptyLinePlaceholder":614},[438,2639,2640],{"class":440,"line":553},[438,2641,2642],{},"\u003Cconstraints>\n",[438,2644,2645],{"class":440,"line":573},[438,2646,2647],{},"- 不修改后端代码\n",[438,2649,2650],{"class":440,"line":593},[438,2651,2652],{},"- 不引入新依赖\n",[438,2654,2655],{"class":440,"line":599},[438,2656,2657],{},"- 怀疑根因在后端时停下来沟通\n",[438,2659,2660],{"class":440,"line":605},[438,2661,2662],{},"\u003C\u002Fconstraints>\n",[438,2664,2665],{"class":440,"line":611},[438,2666,615],{"emptyLinePlaceholder":614},[438,2668,2669],{"class":440,"line":618},[438,2670,2671],{},"\u003Ctask>\n",[438,2673,2674],{"class":440,"line":624},[438,2675,2676],{},"分三步推进：\n",[438,2678,2679],{"class":440,"line":1415},[438,2680,2681],{},"1) 复述理解（≤3 段）\n",[438,2683,2684],{"class":440,"line":1785},[438,2685,2686],{},"2) 排序列出 3-5 个最可能的原因 + 排查方法\n",[438,2688,2689],{"class":440,"line":1802},[438,2690,2691],{},"3) 等我确认后再给代码建议\n",[438,2693,2694],{"class":440,"line":1849},[438,2695,2696],{},"每步结束停下等\"继续\"。\n",[438,2698,2699],{"class":440,"line":1910},[438,2700,2701],{},"\u003C\u002Ftask>\n",[195,2703,2704],{},"对比最初的「你看着办」，这版提示词在以下维度全部具备可预测性：",[267,2706,2707,2713,2719,2725,2731],{},[270,2708,2709,2712],{},[211,2710,2711],{},"范围确定","：只看两个文件",[270,2714,2715,2718],{},[211,2716,2717],{},"症状清晰","：iOS Safari + ERR_FAILED + 12 例",[270,2720,2721,2724],{},[211,2722,2723],{},"失败模式有兜底","：怀疑后端会停下来",[270,2726,2727,2730],{},[211,2728,2729],{},"节奏可控","：分三步，可以中途纠偏",[270,2732,2733,2735],{},[211,2734,298],{},"：用 XML 标签把上下文、约束、任务分开",[195,2737,2738],{},"你会发现，整个改造过程其实就是「把脑子里所有的隐式假设显式化」。这不是「写得啰嗦」，而是「把契约写完整」。一旦养成这个习惯，你会反过来发现：和模型的沟通效率，倒逼你把和人沟通时也变得更结构化、更准确。这是提示词工程最被低估的副作用。",[245,2740],{},[248,2742,2744],{"id":2743},"八常见问答faq","八、常见问答（FAQ）",[195,2746,2747],{},"零基础导引：本节最后整理了在内部分享和读者来信中被反复问到的疑问。如果你刚学完前面的原则，先扫一眼这些问答，能帮你避开 80% 的初学者坑。",[195,2749,2750],{},[211,2751,2752],{},"Q1：英文提示词是不是比中文提示词效果好？",[195,2754,2755,2756,2759],{},"不绝对。Claude 在中英双语上的能力都很强。Anthropic 训练数据中英文比例较高，",[211,2757,2758],{},"严肃技术文档与论文场景","用英文确实可能更稳；但日常工作流、和中文代码库结合的任务，用中文反而更顺。建议是：术语用英文（接口名、库名），叙述用中文，混合使用即可。本书全部范例都用中文写作，就是这个理由。",[195,2761,2762],{},[211,2763,2764],{},"Q2：提示词越长越好吗？",[195,2766,2767,2768,2771],{},"不。提示词长度和质量没有正相关。一份 2000 字的提示词如果信息密度低、结构混乱，效果远不如一份 300 字、契约清晰的提示词。检验标准是：",[211,2769,2770],{},"每删一句话，看输出会不会变差","。如果删了没影响，就该删。",[195,2773,2774],{},[211,2775,2776],{},"Q3：要不要给 Claude 加「请你深呼吸」「这关系到我的职业生涯」这类情绪化前缀？",[195,2778,2779],{},"早期一些研究确实发现某些情绪化前缀能轻微提升表现，但这种效应在新模型上越来越弱，且非常不稳定。在 Claude 这种已经做了大量对齐训练的模型上，这种「情感勒索式提示词」收益极低，还会污染你的提示词风格。不推荐。",[195,2781,2782],{},[211,2783,2784],{},"Q4：用 Claude Code 时该不该给「请检查并修正」这类指令？",[195,2786,2787,2788,2791,2792,2795],{},"应该，但要具体。「请自检」太空泛，模型会做表面功夫。改成「请用 ",[216,2789,2790],{},"pnpm lint && pnpm test"," 验证你的改动，并把输出贴回来」，效果立竿见影。把「自检」转化为「",[211,2793,2794],{},"可执行的自检命令","」，是 Claude Code 提示词最重要的进阶。",[195,2797,2798],{},[211,2799,2800],{},"Q5：长会话越来越笨怎么办？",[195,2802,2803],{},"这是上下文管理问题，下一节 7.2 会专门讲。短答：在旧会话里让 Claude 输出「状态总结」，开新会话粘贴。",[195,2805,2806],{},[211,2807,2808],{},"Q6：和 Claude 沟通时，是用「你」还是「请」更好？",[195,2810,2811],{},"无显著差异。Claude 对礼貌程度并不敏感（这一点和早期 GPT-3 略有不同）。重要的是指令清晰度。本书风格倾向用祈使语气直陈，因为这更接近「写代码注释」的状态——你不会在注释里写「请这个函数返回布尔值」，对模型也一样。",[195,2813,2814],{},[211,2815,2816],{},"Q7：可以让 Claude 直接读 PDF \u002F 图片吗？",[195,2818,2819],{},"可以。Claude Code 支持图片和 PDF 输入。但需要注意：图片里的文字识别（OCR）质量会受图片分辨率影响，复杂表格容易错位。重要素材建议先转 Markdown 或 CSV 再交给 Claude 处理。",[195,2821,2822],{},[211,2823,2824],{},"Q8：长提示词会被「截断」吗？",[195,2826,2827,2828,2831],{},"Claude 系列模型有上下文窗口限制（具体大小随版本而定）。超过窗口的部分会被丢弃，丢弃顺序通常是「最早的优先丢」。但实际工作中，",[211,2829,2830],{},"你远在窗口物理限制之前就已经面临「中间迷失」","——也就是说，性能下降比硬性截断早得多。所以「能塞就塞」是错误策略，「精炼后塞」才对。",[195,2833,2834],{},[211,2835,2836],{},"Q9：当 Claude 给出明显错误的代码时，最好的纠正方式是什么？",[195,2838,2839,2840,2843,2844,2847],{},"不是骂它「错了」，而是",[211,2841,2842],{},"贴出错误证据","。比如：「我跑了一下，控制台报 ",[216,2845,2846],{},"TypeError: Cannot read property 'id' of undefined","，发生在第 17 行。请定位原因并修。」证据越具体，模型修复越准。",[195,2849,2850],{},[211,2851,2852],{},"Q10：能不能让 Claude 直接帮我写提示词？",[195,2854,2855],{},"能，而且效果不错。一个常用 meta-prompt 是：「我想让 Claude 帮我做 X 任务。请你以提示词工程师的身份，写一份高质量提示词，包含输入、约束、输出格式、样例。」这种「让 AI 写给 AI」的元提示词，往往比人手写更结构化。前提是你能讲清楚 X 是什么。",[248,2857,2859],{"id":2858},"九写在最后把提示词当作一项可训练的肌肉","九、写在最后：把提示词当作一项可训练的肌肉",[195,2861,2862],{},"零基础导引：技巧和原则都讲完了，最后想留给你一段「心法」。",[195,2864,2865],{},"提示词工程不是一次性掌握的知识，更不是某种考过就完事的技能。它更像跑步、写作或者弹琴——你每天都能用，但每天都还能再进步一点。",[195,2867,2868],{},"我个人对自己的要求是：每周至少回头审视三条本周用过的提示词，问自己：",[267,2870,2871,2874,2877],{},[270,2872,2873],{},"这条提示词的输入、约束、输出哪一段最弱？",[270,2875,2876],{},"如果让一个完全陌生的同事按这条提示词去做，他能复现我的结果吗？",[270,2878,2879],{},"哪些地方依赖了我隐式的偏好？这些偏好能不能变成 CLAUDE.md 里的一行规则？",[195,2881,2882],{},"这种「一周一回顾」的习惯，能让你在三个月后回看自己的提示词，发现它们已经从「碰运气」进化到「工程艺术品」。这种进步是肉眼可见的，也是真实可复用的。",[195,2884,2885,2886,2889],{},"最后留下一道作业。请挑出你最近一周里最不满意的一条和 Claude 的对话，按本节方法论重写一次提示词，然后",[211,2887,2888],{},"把新旧版本并列贴在团队 wiki 上","。如果有同事看了之后说「啊，原来还能这么写」，那本节就达成了它的目的。",[245,2891],{},[195,2893,2894,2895,2897],{},"提示词是你和 Claude 之间的对话契约。明确输入、约束、输出三段，结合 Claude Code 特有的 ",[216,2896,218],{}," 引用、Plan 模式、CLAUDE.md\u002FSkills 引用，再配合「先复述、分阶段、显式 checkpoint」的对话节奏，你能把一次性碰运气式的交互，变成可复制、可度量、可团队化的工程实践。",[195,2899,2900],{},"回顾本节的核心要点：",[2902,2903,2904,2910,2916,2922,2931,2937,2943],"ol",{},[270,2905,2906,2909],{},[211,2907,2908],{},"注意力机制决定一切","——把关键信息放在开头或结尾，结构化标记比形容词管用。",[270,2911,2912,2915],{},[211,2913,2914],{},"契约思维","——任何提示词都应明确输入、约束、输出三段。",[270,2917,2918,2921],{},[211,2919,2920],{},"五大原则","——明确输出、给样例、分阶段、暴露边界、强制复述。",[270,2923,2924,2927,2928,2930],{},[211,2925,2926],{},"Claude Code 特色","——文件路径前缀、",[216,2929,218],{}," 引用、Plan 模式、checkpoint、引用 CLAUDE.md。",[270,2932,2933,2936],{},[211,2934,2935],{},"对话节奏","——广而粗 → 缩范围 → 执行验证；该开新会话时果断开。",[270,2938,2939,2942],{},[211,2940,2941],{},"角色差异","——PM 从用户故事出发，工程师从代码现状出发，Claude 可以做翻译层。",[270,2944,2945,2948],{},[211,2946,2947],{},"工程化沉淀","——Skills、Playbook、度量、版本化、回归测试、可解释性 checklist。",[195,2950,2951,2952,2955],{},"如果你只能从本节带走一句话，请带走这一句：",[211,2953,2954],{},"把和 Claude 的每一次对话，当作在写一份会被自己一年后阅读的契约。"," 只要你能做到这一点，其他所有技巧都会自然落地。",[195,2957,2958],{},"提示词只是基础设施的第一层。下一节 7.2，我们会把视角从「单条提示词」放大到「整段对话的上下文」，讨论上下文管理（Context Management）策略：什么时候该清空、什么时候该压缩、什么时候该开新会话，以及如何用 CLAUDE.md 与 Memory 工具构建跨会话的长期记忆。",[248,2960,2961],{"id":2961},"延伸阅读",[267,2963,2964,2973,2980,2987,2994,3001,3008,3015,3022,3029,3036,3043,3050,3057,3064],{},[270,2965,2966,2967],{},"Anthropic 官方提示词工程概览：",[2968,2969,2970],"a",{"href":2970,"rel":2971},"https:\u002F\u002Fdocs.anthropic.com\u002Fen\u002Fdocs\u002Fbuild-with-claude\u002Fprompt-engineering\u002Foverview",[2972],"nofollow",[270,2974,2975,2976],{},"Anthropic Prompt Engineering Tutorial（GitHub）：",[2968,2977,2978],{"href":2978,"rel":2979},"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fprompt-eng-interactive-tutorial",[2972],[270,2981,2982,2983],{},"Anthropic Cookbook（含丰富 prompt 示例）：",[2968,2984,2985],{"href":2985,"rel":2986},"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fanthropic-cookbook",[2972],[270,2988,2989,2990],{},"Boris Cherny《How I Use Claude Code》（Claude Code 作者实战）：",[2968,2991,2992],{"href":2992,"rel":2993},"https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fclaude-code-best-practices",[2972],[270,2995,2996,2997],{},"OpenAI Prompt Engineering Guide（跨模型通用原则参考）：",[2968,2998,2999],{"href":2999,"rel":3000},"https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fprompt-engineering",[2972],[270,3002,3003,3004],{},"Lilian Weng《Prompt Engineering》深度综述：",[2968,3005,3006],{"href":3006,"rel":3007},"https:\u002F\u002Flilianweng.github.io\u002Fposts\u002F2023-03-15-prompt-engineering\u002F",[2972],[270,3009,3010,3011],{},"《Lost in the Middle: How Language Models Use Long Contexts》（中间迷失论文）：",[2968,3012,3013],{"href":3013,"rel":3014},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2307.03172",[2972],[270,3016,3017,3018],{},"Anthropic《Building Effective Agents》：",[2968,3019,3020],{"href":3020,"rel":3021},"https:\u002F\u002Fwww.anthropic.com\u002Fresearch\u002Fbuilding-effective-agents",[2972],[270,3023,3024,3025],{},"《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》：",[2968,3026,3027],{"href":3027,"rel":3028},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2201.11903",[2972],[270,3030,3031,3032],{},"DAIR.AI Prompt Engineering Guide（社区维护的中英双语手册）：",[2968,3033,3034],{"href":3034,"rel":3035},"https:\u002F\u002Fwww.promptingguide.ai\u002Fzh",[2972],[270,3037,3038,3039],{},"Anthropic《Long context prompting tips》：",[2968,3040,3041],{"href":3041,"rel":3042},"https:\u002F\u002Fdocs.anthropic.com\u002Fen\u002Fdocs\u002Fbuild-with-claude\u002Fprompt-engineering\u002Flong-context-tips",[2972],[270,3044,3045,3046],{},"Anthropic《Use XML tags to structure your prompts》：",[2968,3047,3048],{"href":3048,"rel":3049},"https:\u002F\u002Fdocs.anthropic.com\u002Fen\u002Fdocs\u002Fbuild-with-claude\u002Fprompt-engineering\u002Fuse-xml-tags",[2972],[270,3051,3052,3053],{},"《The Prompt Report: A Systematic Survey of Prompting Techniques》：",[2968,3054,3055],{"href":3055,"rel":3056},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2406.06608",[2972],[270,3058,3059,3060],{},"LangChain 官方 Prompt Templates 文档（工程化模板示例）：",[2968,3061,3062],{"href":3062,"rel":3063},"https:\u002F\u002Fpython.langchain.com\u002Fdocs\u002Fconcepts\u002Fprompt_templates\u002F",[2972],[270,3065,3066,3067],{},"Anthropic《Claude Code 官方介绍页》（产品入口与最新特性）：",[2968,3068,3069],{"href":3069,"rel":3070},"https:\u002F\u002Fwww.anthropic.com\u002Fclaude-code",[2972],[3072,3073,3074],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":374,"searchDepth":441,"depth":448,"links":3076},[3077,3082,3089,3096,3105,3112,3120,3121,3122,3123],{"id":250,"depth":448,"text":251,"children":3078},[3079,3080,3081],{"id":258,"depth":454,"text":259},{"id":313,"depth":454,"text":314},{"id":345,"depth":454,"text":346},{"id":389,"depth":448,"text":390,"children":3083},[3084,3085,3086,3087,3088],{"id":396,"depth":454,"text":397},{"id":754,"depth":454,"text":755},{"id":790,"depth":454,"text":791},{"id":821,"depth":454,"text":822},{"id":837,"depth":454,"text":838},{"id":862,"depth":448,"text":863,"children":3090},[3091,3092,3093,3094,3095],{"id":869,"depth":454,"text":870},{"id":918,"depth":454,"text":919},{"id":943,"depth":454,"text":944},{"id":988,"depth":454,"text":989},{"id":1004,"depth":454,"text":1005},{"id":1040,"depth":448,"text":1041,"children":3097},[3098,3099,3100,3101,3102,3103,3104],{"id":1050,"depth":454,"text":1051},{"id":1063,"depth":454,"text":1064},{"id":1073,"depth":454,"text":1074},{"id":1083,"depth":454,"text":1084},{"id":1114,"depth":454,"text":1115},{"id":1139,"depth":454,"text":1140},{"id":1155,"depth":454,"text":1156},{"id":1173,"depth":448,"text":1174,"children":3106},[3107,3108,3109,3110,3111],{"id":1180,"depth":454,"text":1181},{"id":1193,"depth":454,"text":1194},{"id":1206,"depth":454,"text":1207},{"id":1222,"depth":454,"text":1223},{"id":1253,"depth":454,"text":1254},{"id":1271,"depth":448,"text":1272,"children":3113},[3114,3115,3116,3117,3118,3119],{"id":1278,"depth":454,"text":1279},{"id":1421,"depth":454,"text":1422},{"id":1449,"depth":454,"text":1450},{"id":1926,"depth":454,"text":1927},{"id":1954,"depth":454,"text":1955},{"id":2492,"depth":454,"text":2493},{"id":2527,"depth":448,"text":2528},{"id":2743,"depth":448,"text":2744},{"id":2858,"depth":448,"text":2859},{"id":2961,"depth":448,"text":2961},"让 Claude 准确理解你的意图","md",null,{"date":3128},"2026-04-26",{"title":156,"description":3124},"BnEJiqmIidP33j_iSdiDUH8fEkO3bKRc3jc6GEZ5AXY",[3132,3134],{"title":146,"path":147,"stem":148,"description":3133,"children":-1},"6.4 的尾声留下一句承诺：带着\"质量已达标\"的代码进入部署上线环节。这一节兑现承诺。部署不是开发的下游，而是产品价值真正开始流动的起点——代码静静躺在仓库里时它的价值是零，只有当真实用户在真实场景中调用它，价值才被点亮。",{"title":160,"path":161,"stem":162,"description":3135,"children":-1},"避免窗口溢出的实战技巧",1777395306168]