把 Claude Code 变成靠谱"协作开发":一份真的能落地的 Code 提示词指南
如果你直接把「帮我写一个 xxx 组件」丢给 Claude Code,
那它也会用"玩具"的标准对待你。
想让它变成靠谱的协作开发同事 ,
提示词(prompt)必须从"聊天"升级成"协议(protocol)"。
这篇文章不是讲入门级的「如何让 Claude Code 写代码」,
而是帮你解决三个更现实的问题:
- 如何让 Claude 写的代码真正契合你的工程上下文?
- 如何在多文件、接口变更、重构等复杂场景里安全协作?
- 如何用提示词降低"逻辑幻觉"(悄悄改逻辑)的风险?
如果你已经习惯用大模型写代码,但总觉得"不够稳",
这篇可以当成一份可直接复用的「工程级提示词模板」。
一、先搞清楚:Claude Code 在写代码时到底在"看什么"?
对 Claude 来说,你的提示词就是它的"世界观"。
它不会真正"理解你的项目",而是在做这件事:
在你给的所有文字条件下,
预测最可能出现的下一段代码 / 文本。
这对代码任务有三个重要含义:
1. 输出需要高度结构化
代码和文章最大区别:
- 有明确的语法结构(函数、类型、模块)
- 有固定的文件组织形式(组件、tools、hooks 等)
- 有规范的输出格式(代码块、diff、测试)
如果你的提示是:
帮我写一个分页组件。
Claude 只能靠"见过的平均形态"往外写;
而你项目里的真实需求(技术栈、风格、约束)完全没被表达出来。
2. 正确性强依赖上下文
对文本任务,缺一点上下文问题不大;
对代码任务,缺上下文直接导致"瞎补":
- 把 TS 写成 JS
- 用错第三方库版本(比如旧版 React Router)
- 默认用它自己熟悉的状态管理方案
- 随便改你的类型结构
这些在执行时才会暴露,而你在提示层面其实完全可以避免。
3. "幻觉"在代码里是"悄悄改逻辑"
文本幻觉你一眼就能看出不对劲;
代码幻觉往往是:
- 多加 / 少加一个字段
- 默默放宽 / 收紧某个校验
- 修改了副作用发生的时机
- 改变了错误处理方式(直接抛异常 → 静默吞掉)
这类问题即便过了编译,线上照样能炸。
所以结论是:
对代码任务,提示词必须从"聊天"升级为"契约",
明确告诉 Claude:你是谁、你要做什么、你不能做什么、你要怎么交付。
二、一个"工程级 Code Prompt"应该长什么样?
先给一个比较完整、但不复杂的示例。场景:
让 Claude 写一个前端分页列表组件。
2.1 常见"错误写法"
帮我写一个 React 的分页列表组件,显示用户列表。
问题:
- 没有技术栈细节(TS 吗?用什么 UI?状态管理?)
- 没有上下文(数据从哪来?组件负责请求还是只负责 UI?)
- 没有约束(能不能引第三方?要不要考虑移动端?)
- 没有输出格式(你是想要思路?还是完整文件?)
Claude 只好自己脑补一堆设定,你大概率不满意。
2.2 升级版:结构化"协议"写法
下面这个版本,已经接近工程可用级别:
css
[ROLE]
你是一个资深前端工程师,熟悉 React 18 + TypeScript + TailwindCSS。
[TASK]
实现一个通用分页列表组件 <PaginatedTable>,用于展示用户数据。
[CONTEXT]
- 技术栈:React 18 + TypeScript + Vite
- 数据结构:
- 接口返回:{ list: User[]; total: number }
- User: { id: string; name: string; email: string; createdAt: string }
[REQUIREMENTS]
- 组件只负责 UI 和交互,数据由父组件通过 props 传入。
- 支持显示:当前页、每页数量、总条数。
- 点击页码时,通过 props 回调把新页码回传,不在组件内部发请求。
[CONSTRAINTS]
- 使用函数组件 + hooks。
- 不引入第三方分页库。
- 不写死任何与"用户"强绑定的文案,尽量保持通用。
[OUTPUT_FORMAT]
1. 用 3~6 行解释你的设计思路(props、内部状态、交互流程)。
2. 给出完整的 PaginatedTable 组件代码(用代码块,TypeScript 写法)。
3. 额外给一个父组件的使用示例,展示如何传入数据和处理分页回调。
你可以观察到几个核心变化:
-
信息被分成块 :
[ROLE] / [TASK] / [CONTEXT] / [REQUIREMENTS] / [CONSTRAINTS] / [OUTPUT_FORMAT] -
每个块承担清晰职责:
- 角色:你是谁
- 任务:做什么
- 上下文:在什么环境做
- 约束:什么不能乱做
- 输出:怎么交付
-
整个 prompt 已经很接近一份"接口定义文档",而不是一段闲聊。
这类结构对 Claude 来说非常好理解,也更容易稳定输出符合预期的代码。
三、写 Code Prompt 时,必须显式包含的 5 个要素
上面示例可以抽象成一套通用"5 要素模型":
-
ROLE:角色 / 能力设定
让 Claude 带着正确的"人格"和"技能树"上场:
你是一个有 5 年经验的前端工程师,熟悉 React 18 + TypeScript + Zustand, 习惯遵循 Airbnb TypeScript Style Guide。 -
TASK:任务目标
一句话搞清楚要干嘛:
帮我重构现有的用户列表页面,使其适配新的用户查询接口。 -
CONTEXT:工程上下文
包含技术栈 + 关键约定 + 必要代码片段:
diff- 技术栈:Next.js App Router + React 18 + TypeScript - 状态管理:Zustand - 请求层:基于 fetch 的轻封装 client - 下面是当前 UserList 页面代码:[这里粘贴代码] -
CONSTRAINTS:约束条件
diff- 不引入新的第三方库。 - 不修改公共组件的对外 props 结构,除非有明确理由。 - 尽量保持最小修改,不做与本次需求无关的重构。 -
OUTPUT_FORMAT:输出格式
markdown1. 先用 5 行以内说明重构思路。 2. 然后给出修改后的代码,使用代码块包裹。 3. 如有删减逻辑,请在最后单独列出"行为变更点"。
只要你把这 5 个要素写全,Claude 一般就能以"工程协作者"而不是"写代码 bot"的方式来响应你。
四、复杂工程场景:用"三段式工作流"拆解任务
现实工作中,你很少只改一个文件。更常见的是:
- 一次 API 迭代影响多个页面
- 一个模块需要整体重构
- 状态管理方案切换(Redux → Zustand 等)
如果你一句话上来就说:
帮我把整个用户模块改成用新接口。
Claude 在上下文有限的情况下,只能"尽力猜",出问题是大概率。
更稳的做法:强制自己和 Claude 都走"三段式流程" :
- 先让 Claude 做规划(Plan)
- 再让它针对具体文件 输出局部修改(Patch)
- 最后你在本地 应用补丁并验证
4.1 阶段一:规划(Plan)
先谈"改哪儿",再谈"怎么改"。
csharp
[ROLE]
你是本项目的前端技术负责人。
[TASK]
根据旧接口、新接口和模块说明,规划需要修改的文件和改动点。
[CONTEXT]
- 旧接口结构:...
- 新接口结构:...
- 模块说明:用户列表 + 用户详情 + 用户编辑页。
[OUTPUT_FORMAT]
1. 用 10 行以内的文字总结:这次接口变更对模块行为有哪些影响。
2. 列出一个 Markdown 列表,每一项包含:
- 文件路径
- 需要修改的点(1~3 行)
- 是否存在风险(是 / 否 + 一句话理由)
注意:这一阶段只做规划,不输出具体代码。
这一步得到的是"一份变更清单"。
你可以先人工看一眼:
- 有没有文件漏掉?
- 有没有理解偏差?
确认没问题,再进入下一阶段。
4.2 阶段二:基于真实代码的精确修改(Patch)
对每个文件单独开一个对话,拼接完整的上下文。
css
[TASK]
现在只处理下面这个文件,请根据之前的规划生成精确修改。
[CONTEXT]
当前文件代码如下:
[这里粘贴完整文件或核心片段]
这是你在规划阶段对该文件的描述:
[把它之前对该文件的概述贴回来]
[CONSTRAINTS]
- 做与本次接口变更直接相关的最小修改。
- 不重命名现有公共函数 / 组件。
- 不要输出整文件,只输出 diff。
[OUTPUT_FORMAT]
1. 用 3~5 行说明你会修改哪些地方,以及原因。
2. 使用 unified diff 的形式给出补丁(old → new)。
3. 如果某处改动存在潜在风险,请在最后单独列一个 "RISKS" 小节。
你得到的是一个紧凑的、可读性很强的 patch,而不是一份乱糟糟的整文件。
4.3 阶段三:应用补丁与验证(本地完成)
这一步没有特别的 prompt 设计,核心是工作流:
- 用编辑器 / 脚本 / git apply 把 diff 应用到代码库
- 跑测试、手动验证关键路径
- 如果出了问题,再把"实际报错 + 对应代码片段"喂给 Claude,继续迭代
重要的是:
你已经把 Claude 的职责限定在"规划 + 提出修改建议",
真正的合入决策权还在你手里。
五、降低"逻辑幻觉":用"行为约束"而不是"流程描述"
很多时候 Prompt 写得不稳,是因为只交代了"做什么",没有交代"必须保持什么不变"。
5.1 让 Claude 先"说出原代码在做什么",再改
Bug 修复 / 重构时可以这样写:
markdown
在给出任何代码修改之前,请先完成以下两步:
1. 从原始代码中提取 3~5 条核心行为和边界条件,
用项目符号列出,并引用对应的函数 / 变量名。
2. 对每一条行为说明:
- 你如何验证它当前是否被正确实现?
- 在你的修改中将如何保证它仍然成立?
完成上述两步后,再给出修改建议或 diff。
这一步有点像"口头单测":
- 你能看到 Claude 是不是理解对了行为
- 它会围绕这些行为来设计修改方案,而不是瞎重构
5.2 用"不变量(Property)"描述逻辑,而不仅是"流程"
举个金额计算的例子。
普通写法:
帮我实现一个订单总价计算函数,支持优惠券和运费。
更专业的写法:
diff
请实现一个订单总价计算函数,并保证以下性质始终成立:
- 性质 1:如果没有任何商品项,结果总价为 0。
- 性质 2:即使优惠券金额大于商品总价,结果总价也不得为负。
- 性质 3:在不改变单价、优惠券和运费的前提下,增加任意商品数量,总价应单调不减。
再配合测试要求:
在实现函数之后,请基于上述性质设计至少 3 条单元测试,
使用 Jest 风格,断言这些性质是否被满足。
你会发现:
Claude 输出的代码和测试会围绕这些"性质"展开,而不是凭感觉写一堆 if/else。
六、Few-shot:用真实示例教 Claude 你的"工程风格"
单纯说"写专业一点"没什么用。
Claude 真正擅长的是:模仿示例。
6.1 示例:给它一条你满意的 Code Review
ini
[REVIEW_EXAMPLE]
总体看,这次改动方向合理,命名清晰,逻辑直观。
下面有几点建议:
1. [边界条件漏检 - handleSubmit 中的 amount 判空逻辑]
- 问题:当前只判断 amount === 0,没有处理 NaN 和 null。
- 影响:后续在 formatAmount 时可能抛异常。
- 建议:统一使用 isValidAmount(...) 封装判断,保持边界逻辑一致。
2. [重复逻辑 - formatDate 的实现]
- 问题:formatDate 实现与 utils/date.ts 中的同名函数重复。
- 建议:直接复用已有工具函数,并补一条单元测试覆盖当前用例。
6.2 要求它"严格模仿这种结构"
css
请严格模仿 [REVIEW_EXAMPLE] 的结构和细致程度,
对下面这段代码进行评审:
[这里粘贴需要评审的代码]
Claude 会自动学会:
- 先给总体评价
- 每个问题用「标题 + 问题 + 影响 + 建议」的形式展开
- 重点关注边界条件、重复逻辑、可维护性
你得到的就是"能直接贴进 PR 评论区"的内容,而不是一堆泛泛而谈的建议。
七、一份可以直接复用的"专业级 Code Prompt 模板"
最后,把前面的要点收束成一份可直接复制的通用模板,你可以按项目做简单修改。
7.1 通用「精确修改」模板
markdown
[ROLE]
你是本项目的协作前端开发者,熟悉:
- React 18 + TypeScript
- React Query 或 Zustand
- 常见前端工程规范(例如 Airbnb TypeScript Style Guide)
[TASK]
在不破坏现有外部行为的前提下,对现有代码进行「精确修改」,以实现:
- 【在这里写具体目标:例如 API 替换 / bug 修复 / 状态迁移等】
[CONTEXT]
- 技术栈:...
- 项目约定:...
- 相关文件说明:...
- 我会在后续消息中提供具体代码内容。
[GLOBAL_CONSTRAINTS]
- 只做与本任务直接相关的最小必要改动。
- 不引入新的第三方依赖。
- 不更改公共 API(除非你明确说明理由并标出影响范围)。
[PROCESS]
Step 1 --- 行为理解(BEHAVIOR)
1. 从给出的代码中,总结当前实现的核心行为和重要边界条件(3~7 条)。
2. 指出本次修改可能影响到哪些行为。
Step 2 --- 修改规划(PLAN)
1. 列出需要修改的文件列表。
2. 对每个文件,说明:
- 需要修改的点
- 是否存在潜在风险(是 / 否 + 原因)
Step 3 --- 具体修改(PATCHES)
1. 使用 unified diff 的形式给出每个文件的补丁。
2. 每段 diff 前用一行简短文字说明"修改动机"。
3. 不要输出整文件,只输出涉及修改的部分。
Step 4 --- 校验与测试建议(TESTS)
1. 基于修改内容,列出 3~5 条需要重点验证的测试点(手测或自动化)。
2. 如有必要,提供 1~2 个 Jest 或 Vitest 的示例测试。
[OUTPUT_FORMAT]
请严格按以下顺序输出四个小节:
1. BEHAVIOR
2. PLAN
3. PATCHES
4. TESTS
如果你认为当前信息不足,请在开始 Step 1 之前,
先以 "QUESTIONS" 小节列出最多 3 个关键问题。
你可以基于这份模板衍生:
- 专门用于「写新组件」的版本
- 专门用于「Code Review」的版本
- 专门用于「阅读源码并讲解」的版本
本质都是同一套思路:
把 Claude 纳入你的工程流程,让它在你的"协议"下工作。
总结
简单回顾一下整篇文章的脉络:
- 先理解模型行为 :
Claude 不知道你的项目,它只是在你给的条件下预测下一个 token。
所以你必须把"角色、任务、上下文、约束、输出格式"说清楚。 - 把提示词写成"协议"而不是一句话 :
用结构化区块([ROLE][TASK][CONTEXT][CONSTRAINTS][OUTPUT_FORMAT])
显式告诉它:你是谁、要干嘛、在什么环境下干、怎么交付。 - 复杂工程场景用三段式工作流 :
规划(Plan)→ 局部修改(Patch)→ 本地应用补丁(Apply)。
避免一次性让 Claude "改完所有东西"。 - 用行为约束和不变量降低逻辑幻觉 :
先让 Claude 说清楚"原代码在做什么",
再让它围绕"不变量(properties)"设计实现与测试。 - 用 Few-shot 示例教会它你的工程风格 :
不要只是说"写专业一点",
直接给它一条你满意的 Code Review / 组件实现,让它模仿。 - 最终落地为一份自己的 Prompt 模板库 :
这才是"从会用到用得专业"的关键:
把这些协议变成你的日常工程工具,而不是一次性的灵感。
如果你已经在用大模型写代码,却时不时被"幻觉""乱改"坑到,
可以从今天开始,
把这套结构化、工程化的提示词,
真正用在你下一个需求、下一个 PR、下一次重构里。