如何使用 Claude Sonnet 5 写代码
我之前正搞到一个庞大重构项目的半截——把老掉牙的 Express.js 单体架构迁移到模块化的 Fastify 架构——就在那时,我发现自己的工作流快崩了。我之前一直是在用 Sonnet 4.6 搞点快活,用 Opus 4.8 干重活,但来回切换真的太打断节奏了。而且月底一看账单,那数字也相当扎眼。
后来 Claude Sonnet 5 发布了,它的承诺很吸引人:以 Sonnet 的价格,提供媲美 Opus 的性能。在拿真实的业务代码高强度试用了几周后,我终于摸索出了一套好用的工作流。以下是我的心得。
起点:简单的模型替换
首先要说的是,迁移到 Sonnet 5 简单得让人发困。如果你已经在用 API,基本上只要换个模型 ID 就行:
# 旧
claude-sonnet-4-6
# 新
claude-sonnet-5
就这样。Sonnet 5 底层换了个新的分词器(tokenizer),但你这边完全不需要改任何代码。你现有的结构化输出、系统提示词指令,还有 output_config.format 设置,都能原封不动地照搬过来。
入门价格是每百万输入 token 2 美元,每百万输出 token 10 美元(该价格持续到 2026 年 8 月 31 日,之后会调整为 3 美元/15 美元)。跟 Opus 的价格比起来,这对日常写代码来说差得可不是一星半点。
Sonnet 5 写代码到底强在哪
官方宣传说 Sonnet 5 “缩小了”跟 Opus 4.8 的差距。在实际写代码时,这具体体现在以下几个方面:
1. 多步连贯任务终于能撑住了。 以前的 Sonnet 模型在重构任务上一开始表现得很猛,但到了第 4 步或第 5 步就容易断片。Sonnet 5 在更长的智能体调用链(agentic chains)中能保持上下文连贯。我让它把一个 2000 行的服务文件拆分成 8 个独立模块,期间还要更新所有的 import 和测试,它居然没有凭空捏造任何一个缺失的依赖。
2. 工具调用靠谱多了。 如果你在用 Claude Code,或者给模型开放了终端和浏览器的权限,你会发现 Sonnet 5 串联工具调用的能力明显变强了。它能自己读文件、定位问题、写修复代码、跑测试套件、看报错信息,然后再调整——全程不需要你手把手教。
3. “努力程度”调节是真的管用。 Sonnet 5 对 effort level(努力程度)的响应非常实在。写个简单的函数,调低努力程度,它就能给你又快又干净的答案;遇到复杂的架构决策,把努力程度拉满,它的推理深度肉眼可见地提升。这不是个摆设旋钮——在啃硬骨头时,它真的能改变输出质量。
好用的提示词套路
在烧了一大堆 token 做实验后,我总结出这些跟 Sonnet 5 搭配最稳的提示词套路:
把架构要求说清楚
像“重构这段代码”这种含糊的提示词,只能得到含糊的结果。给 Sonnet 5 加上限制条件,它才会大放异彩:
我有一个 Express.js 的路由处理器,已经膨胀到 400 行了。我想把它重构成:
- 路由定义文件(只放端点和中间件)
- 控制器(请求验证和响应格式化)
- 服务层(业务逻辑)
- 数据访问层(数据库查询)
项目用的是 TypeScript,Zod 做验证,Prisma 做 ORM。
这是当前的文件:[贴代码]
从数据访问层开始,往上写。给每一层都写测试。
这种结构给 Sonnet 5 划定了边界,它就能写出干净、解耦的代码。
让它先规划再动手
但凡超过写一个简单函数的活儿,都让 Sonnet 5 先出个计划:
在写任何代码之前,先给我一个实现 [功能] 的分步计划。包括:
1. 需要创建或修改的文件
2. 改动的顺序
3. 潜在的风险或边缘情况
4. 我们如何验证每一步是否生效
等我确认了再往下进行。
这就是智能体能力提升最明显的地方。Sonnet 5 做的计划逻辑严密,而且只要你开绿灯,它真的会严格按计划执行。
用系统提示词设定项目背景
别在每条消息里重复你的技术栈和规范。设一次就行:
你正在参与一个 TypeScript monorepo 项目,使用:
- pnpm workspaces
- Next.js 14 (App Router) 做前端
- Fastify 做后端
- Prisma ORM + PostgreSQL
- Zod 做运行时验证
- Vitest 做测试
规范:
- 使用命名导出,不用默认导出
- 组合优于继承
- 所有 API 路由必须有 Zod 输入验证
- 任何新的 service 或 utility 都要写测试
这能省 token,还能让整个会话的输出风格更一致。
Sonnet 5 栽跟头的地方
没有完美的模型,我也踩到了几个坑:
复杂的状态管理 Bug。 我有个 WebSocket 处理器里的竞态条件,涉及三个不同的事件发射器和一个共享的可变状态。Sonnet 5 确实找准了症状,但给出的修复方案根本没解决时序问题。而 Opus 4.8 一次就搞定了。这也印证了 Anthropic 自己的评估——面对最难的调试任务,Sonnet 5 的能力还是稍逊一筹。
简单任务过度设计。 放任不管的话,Sonnet 5 有时会过度抽象。你让它“加个错误处理”,它可能给你搞出一整套自定义错误类继承体系,而其实一个简单的 try/catch 就够了。所以一定要把任务范围限定死。
长上下文性能衰退。 虽然 Sonnet 5 支持 1M token 的上下文窗口,但我发现如果在单次对话里塞进超过大约 80K token 的代码,输出质量就会下降。处理大型代码库时,最好用 Claude Code 的文件读取工具,而不是把所有代码一股脑贴进聊天框。
我的日常工作流
经过几周的磨合,这是我目前日常使用 Sonnet 5 的真实方式:
90% 的任务交给 Sonnet 5。 写函数、调试、重构、生成测试、写文档、解释代码——Sonnet 5 又好又便宜,全包了。
10% 的任务交给 Opus。 那些棘手的并发 Bug、需要权衡十几个利弊的复杂架构决策、必须做到滴水不漏的安全核心代码。把贵的模型留在刀刃上。
我把 Claude Code 作为主力界面,并为常见工作流配置了自定义命令:
# .claude/commands/refactor.md
分析提供的代码,并根据项目规范进行重构。
先制定计划,然后带测试逐步执行。
# .claude/commands/debug.md
我遇到了这个错误:$ARGUMENTS
读取相关文件,追踪执行路径,找出根本原因,并提出修复方案。等我确认后再实施。
实用建议
先用 Sonnet 5,不行再上 Opus。 别动不动就默认用最贵的模型。先试试 Sonnet 5,大概率它就够用了。
需要固定格式时,用结构化输出。 如果你需要 JSON 响应、函数签名或特定的数据格式,直接用结构化输出功能。这比让 Sonnet 5 输出自由文本然后你自己去解析要靠谱得多。
把大任务拆成小任务。 虽然 Sonnet 5 处理多步任务比前代强了不少,但把大功能拆解成聚焦的子任务,你得到的代码质量还是会更高。
一定要自己跑测试。 Sonnet 5 会信誓旦旦地说它的代码没问题。有时候确实没问题。但有时候,它写的测试虽然能跑通,却根本没验证到你想要的行为。自己验证一遍。
不断迭代你的系统提示词。 前期在系统提示词上花的功夫,会在后续每次交互中带来复利。发现模型容易犯哪种规范上的错误,就针对性地补充提示词。
大实话时间
Claude Sonnet 5 是我用过的同价位里最顺手的日常写代码模型。对大多数实际编码任务来说,它跟 Opus 4.8 的差距确实存在,但已经很微弱了。它在智能体能力上的提升——持续的多步执行、靠谱的工具调用、严密的规划——绝不是挤牙膏。它们实实在在地改变了你能放心交给 AI 去做的工作量。
它的局限也是真实的。当你遇到极其恶心的 Bug,或者需要推演复杂的分布式系统时,你还是得请出 Opus。而且它那爱过度设计的毛病,意味着你必须把需求范围定得死死的。
但对于我绝大多数的编码工作——写功能、重构、调试、测试、写文档——Sonnet 5 干得已经够好了,我都不用去想别的模型。只要花 Opus 几分之一的钱,这笔买卖我乐意做。