引言:代码不在乎你的感觉
关于大型语言模型和代码,有一件事是这样的:它们惊人地自信,但完全不在乎你的程序是否能编译通过。Claude Haiku 4.5 会很乐意为你编写一个解决问题的 Python 脚本,外加两个它自己为了好玩而发明的脚本。诀窍——唯一重要的诀窍——是学习如何提示 Claude Haiku 4.5 以准确生成代码,不留任何含糊空间,并尽可能保证真实性。你想要的不是听起来像代码的散文,而是表现得像代码的代码。这二者之间是有区别的。
人们把提示词Prompting看作一种神秘的咒语——念出正确的词语,就能得到一个完美的应用程序。这是盲目崇拜。代码是一种合同。如果你想从 Claude Haiku 那里获得准确性,你必须编写合同。“构建一个 Web 应用程序”不是合同。“在 Python 3.12 中生成一个 FastAPI 端点,该端点接受 JSON,使用 Pydantic v2 验证模式,并在出现模式错误时返回 422,并带有特定负载格式”才是一个合同。这就是如何提示 Claude Haiku 4.5 以准确生成代码:你必须敲定合同。
本文内容(以及不包含的内容)
- 这是一份关于如何从 Claude Haiku 4.5 获得可靠、可测试代码的指南。
- 这不是一篇关于“AI 取代开发者”的说教。工具不会取代思考。
- 它侧重于实用的提示、结构和保障措施:这些枯燥的部分让魔法得以实现。
如果你想要能够运行的代码,你需要给 Claude 一个关于“运行”的有效定义。如果你想要准确的代码生成,你需要用清晰、可测试的术语来定义准确性。这就是全部。
像律师一样定义准确性,而不是像诗人一样
“准确”的代码不是“看起来合理”的代码。准确性是指:
- 确定性行为:在定义的误差范围内,相同的输入,相同的输出。
- 版本正确性:它使用正确的 SDK、API 版本和语言特性。
Claude 会给你你所要求的。如果你要求“一个对列表进行排序的函数”,你很可能会得到一个。如果你要求“一个使用 Timsort 语义且具有 O(1) 额外空间的稳定的原地排序”,那是一个不同的承诺。“如何提示 Claude Haiku 4.5 以准确生成代码”始于将这些承诺写入提示词Prompt中。
最小可行提示词Prompt的升级版
错误:“编写一个用于任务的 Node API。”
更好:“编写一个 Node 20 Express 4 API,其中包含一个 /tasks POST 路由,该路由验证字段 {title: string, dueDate: ISO 8601},并返回 201 以及创建的对象,或返回 400 以及错误详情。”
正确:“生成一个 Node 20 Express 4 服务器,其中包含一个 /tasks POST 端点。要求:1) 使用 [email protected] 验证正文;2) 字段:title(非空字符串,最多 140 个字符),dueDate(ISO 8601 未来日期);3) 成功时:201,返回 {id: ULID, title, dueDate};4) 无效时:400,返回 {error: 'VALIDATION', details: array};5) 无数据库;使用内存 Map;6) 包含 Jest 29 测试文件,涵盖有效、无效情况(空标题、过去日期);7) 提供用于测试和开发的 npm 脚本;8) 使用 ESM;9) 不要包含无关的评论。” 请注意其结构:语言版本、库、约束、输出、错误、测试,甚至包括包结构。你已经消除了歧义。Claude 的工作是填充代码,而不是需求。
脚手架模式:系统、规范、测试,然后是代码
如果你想从 Claude Haiku 4.5 获得准确的代码生成,你需要给它一个跑道:
- 你:“你正在为 Node 20 编写生产质量的 TypeScript。只输出带有文件名和代码块,没有其他内容。”
- 包括语言版本、包选择、错误语义、I/O 格式、性能限制和安全约束。
- 告诉 Claude 首先编写单元测试。测试比形容词更好地定义了“准确”。如果一行代码不能服务于测试,那就是装饰性的。
- 只有在测试之后。是的,这基本上就是 TDD,但有一个永远不会厌倦编写样板代码的机器人。
- “如果测试失败或导入不匹配,只更新失败的部分。不要重写整个项目。”
当 Claude 有上下文和约束时,它会做得很好。给它约束。
版本锁定不是可选项
Claude 的训练数据充满了旧的和新的文档。这是一种礼貌的说法,即它已经看到了很多相互矛盾的建议。“使用 React Router”很模糊。“使用 [email protected] 和数据路由器”是指明方向。不要相信默认值: - 语言:锁定到 Python 3.12、Node 20、Go 1.22、Java 21——无论你实际运行什么。
- 云 SDK:锁定版本;aws-sdk v2 与 v3 很重要。
- Linters/formatters:指定规则以避免“风格乒乓”重写。
如果你不锁定,你将得到五年博客文章中最精彩的混合曲。准确的代码生成对怀旧过敏。
始终以模式优先
不要要求“用户个人资料”结构。在提示词Prompt中定义模式并要求验证:
- JS/TS 中的 JSON Schema 或 Zod/Yup 类型
然后让 Claude 在边界处强制执行模式——API 输入、数据库写入和消息队列。要求显式的错误负载和代码。准确性喜欢模式。歧义则不然。
使其可观察,否则就不要假装它是真实的
告诉 Claude 在你需要的地方添加日志记录、指标和跟踪——并在你不需要的地方保持安静。一个好的提示词Prompt包括:
- 日志记录策略:级别、PII 的编辑、结构(请使用 JSON 日志)
Claude 会添加你所要求的。如果你不要求,你只会得到打印语句——如果你幸运的话。
测试优先的提示词Prompt胜过“相信我”
提示 Claude Haiku 4.5 以获得准确代码生成的一个好方法是使测试成为真理的来源。例子:
“为函数 normalize_email(s) 编写 pytest 测试,该函数:
- 仅对 gmail.com 删除子地址 (+tag);
- 按原样保留 Unicode 域名 punycode。 涵盖边缘情况。 编写测试后,实现该函数以通过测试。
”当 Claude 被迫满足你描述的测试时,它通常会编写更好的代码。如果它没有做到,你就会有一个具体的失败,而不是一场感觉论证。
通过构建消除幻觉
你无法消除幻觉,但你可以限制它们:
- 仅在存在来源时要求引用或来源 URL。 对于 SDK 方法,要求提供文档链接并要求代码与这些文档匹配。
- 对于私有 API,将规范粘贴到提示词Prompt中。 不要指望 Claude 知道你的内部端点。
- 对于具有令人困惑的 API 的库,包括来自官方文档的示例代码片段,并告诉 Claude 遵守它。
准确的代码主要是准确的参考。 给 Claude 参考。
风格指南:最不性感,最有用的东西
Claude 以它推断的任何风格编写代码。 这是一个产生混乱的处方。 粘贴你的风格指南。 指定:
- 格式(Prettier、Black、gofmt 默认值)
还要为非显而易见的选择要求简短的理由评论。 未来的你会感谢你,而当前的 Claude 将产生更少的“修复”PR。
长提示词Prompt,短输出
思考如何提示 Claude Haiku 4.5 以获得准确代码生成的另一种方法:将你的文字花在提示词Prompt上,而不是输出上。 你想要:
告诉它抑制解释,只返回带有文件名和简短 README 的代码块。 如果你想要评论,请在单独的运行中要求它。 在散文和代码之间交错是错误穿着单片眼镜和高顶礼帽潜入的方式。
改进:实际起作用的紧密循环
获得可靠代码的最快途径不是“第一次就做对”。 它是简短的、纠正性的循环:
- 在本地运行。 将失败的测试输出和编译器错误原封不动地粘贴回 Claude。
- 指示:“仅修改必要的行;除非失败的测试要求,否则不要更改函数签名。”
当您准确地告诉它哪里出错时,Claude 擅长应用差异。 不要释义失败日志。 粘贴它们。 日志是真相。
安全是一种特性,而不是附录
因为模型是在公共代码(好的、坏的和被诅咒的)上训练的,所以你希望将安全作为一流的要求:
- 明确禁止 eval、shell=True 和字符串类型的 SQL
默认情况下安全的提示词Prompt会产生更安全的代码。“稍后我们将修补它”的提示词Prompt会产生头条新闻。
性能:说明“快速”的含义
“使其快速”转化为“做任何事情”。 而是指定指标:
- 延迟目标(对于内存操作,p95 < 50 毫秒;对于数据库操作,p95 < 300 毫秒)
- 时间复杂度(必须是 O(n log n),而不是 O(n^2))
Claude 将选择算法来适应您设置的预算。 给它一个预算。
文档:足以让陌生人入门
要求 Claude 提供包含以下内容的 README:
“准确的代码”包括准确的文档。 它们是交付成果的一部分。
你可以窃取的具体提示词Prompt模板
模板:后端端点
系统:你是一位细致的 Python 3.12 工程师。 仅输出带有文件名的代码块。
用户:
- 构建一个带有 POST /convert 端点的 FastAPI 0.111 应用程序。
- 请求:{amount: Decimal as string, from: 'USD'|'EUR', to: same}。
- 使用 pydantic v2 验证;在模式错误时返回 422 形状。
- 使用具有固定汇率 {USD:1, EUR:1.1} 的纯函数 convert(amount, from, to)。
- 使用 200 返回 {amount: string, currency: string}。
- 包括 pytest 测试,涵盖有效、无效(错误的十进制、未知的代码)和边缘 (0)。
- 提供带有依赖项锁定的 pyproject.toml; 包括 ruff 和 mypy 配置。
模板:CLI 实用程序
系统:你正在编写 Go 1.22。 仅输出带有文件名的代码块。
用户:
- 创建一个名为 slugify 的 CLI,该 CLI 读取 stdin 并打印 URL 安全的 slug。
- 规则:小写、仅 ASCII、连字符分隔符、折叠空格、删除标点符号。
- 提供带有表格测试的 main.go 和 slugify_test.go。
模板:前端组件
系统:你是一位务实的 React 工程师,目标是 React 18 + TypeScript。
用户:
- 实现一个 <DebouncedInput> 组件。
- Props:value: string, onChange(value): void, delay=300。
- 使用 useRef/useEffect; 没有第三方钩子。
这些模板演示了如何通过锁定版本、定义行为和要求测试来提示 Claude Haiku 4.5 以获得准确的代码生成。
拒绝聪明:何时说“不要优化”
如果你不想要过早的微优化(而你确实不想要),就这样说:
- “与聪明相比,更喜欢可读性; 除非测试要求,否则不要进行位扭曲。”
Claude 喜欢给人留下深刻的印象。 不要让它这样做。 让它通过测试并且可读。 这就足够令人印象深刻了。
我见过人们在随机聊天标签中玩弄提示词Prompt,就像这是一种生产力仪式。 使用了解代码上下文的工作区。 例如,Sider.AI 的构建围绕着将你的规范、代码、差异和测试日志保持在视图中,因此“粘贴错误,修复行”循环实际上很紧密。 这不是魔法; 这是枯燥的脚手架,可以防止你迷失方向。 如果你的工具将合同、测试和代码保持在同一个对话中——而不会用五彩纸屑烦扰你——请使用它。 Sider 就是这样做的。 如何将 Claude 作为队友而不是预言家进行调试
- 要求提供差异:“仅使用针对文件 X 的统一差异进行响应。”
- 对于运行时错误,添加最小的可重现代码片段并要求解释加上补丁。
- 对于库错误,粘贴你认为适用的文档摘录并询问:“这是版本 X 的正确 API 吗? 如果不是,请更新代码并引用正确的摘录。”
目标是让 Claude 用证据争论。 你带来证据。
陷阱游行(以及如何躲避它)
- “最新”API 陷阱:不要说“使用最新”。 说“使用版本 X.Y”并坚持使用它。
- 一次性谬误:计划进行两到三个简短的改进。 它比一个臃肿的提示词Prompt更快。
- 模糊的错误策略:定义状态代码和有效负载。 “返回一个错误”没有任何意义。
- 无人拥有的依赖项:如果代码依赖于你无法控制的服务,请对其进行存根。 要求提供伪造品。
你的提示词Prompt清单(将此贴在你的显示器附近)
如果你达到了所有十个,Claude Haiku 4.5 通常会产生在日光下幸存的准确代码生成。
一个实际的例子:从模糊到验证
模糊的提示词Prompt:“编写一个安全解析 CSV 的函数。”
结果:可能还可以,可能错误,肯定未经测试。
精确的提示词Prompt:
“你正在编写 Python 3.12。 仅输出带有文件名的代码块。
创建 csvsafe/init.py 和 csvsafe/reader.py,其中包含一个函数 read_rows(path: Path) -> list[dict[str,str]]。 要求:使用带有 newline='' 和 encoding='utf-8' 的 csv.DictReader; 禁止空字节; 拒绝 >10MB 的文件; 将列限制为 100; 删除 BOM; 将空单元格视为空字符串; 引发带有消息代码 {FILE_TOO_LARGE, NULL_BYTE, TOO_MANY_COLUMNS} 的 ValueError。 在 tests/test_reader.py 中包含带有 pytest 的测试,涵盖快乐路径、空字节、11MB 文件、101 列和 BOM 处理。 提供带有依赖项锁定的 pyproject.toml 和 black 配置。”
你将获得代码、测试和边缘处理。 然后你运行测试,粘贴失败,并以最小的差异进行迭代。 这就是实践中的准确代码生成。
关于“创造力”和其他营销词汇
我不需要“有创造力”的代码。 我需要正确的代码。 将创造力留给你的猫命名。 在提示 Claude 时,创造力是坚实约束的自然副产品。 正确的测试和清晰的规范会产生优雅的解决方案。 错误的提示词Prompt会产生“用表情符号重新发明的 base64”。 不要诱惑它。
非秘密的秘密
提示 Claude Haiku 4.5 以获得准确代码生成的方式很无聊:写下你需要什么,锁定版本,定义模式,要求测试,并使用实际失败进行迭代。 就是这样。 没有神秘主义。 只是工程学科,使用可以非常快速地打字并且不介意编写十五个几乎相同的测试用例的模型。
这就是转折:准确性并不光彩。 有效的提示词Prompt读起来像 TSA 清单。 发布的代码读起来就像是由关心的人编写的。 通过将模型视为在明确的要求下茁壮成长并在模糊的指导下枯萎的初级工程师,你两者兼得。 给它一份合同。 让它通过测试。 然后,也许,你可以信任它——以你信任工具而不是先知的信任。
结论:减少巫术,增加保证
如果你想要巫术,那就去看魔术表演。 如果你想要编译和运行的软件,请编写像保修一样功能的提示词Prompt。 如何提示 Claude Haiku 4.5 以获得准确的代码生成与华丽的措辞或秘密关键字无关。 它与约束、测试、版本和反馈循环有关。 做这四件事,你就会得到可以运行的代码。 跳过它们,你将得到格式精美的虚构作品。
代码才不会在乎你的感觉。谢天谢地,测试也不会。
常见问题解答
Q1: 如何以最简单的方式提示 Claude Haiku 4.5 以获得准确的代码生成?
像对待合同一样对待它:锁定版本,定义模式,指定错误格式,并首先要求进行测试。约束越清晰,代码就越准确。
Q2: 如何减少 Claude 编写代码时的幻觉?
粘贴权威的文档或规范,并要求严格遵守这些 API。对于私有端点,请包含您自己的规范——不要期望它去猜测。
Q3: 我应该要求 Claude 提供测试,还是自己编写测试?
首先要求 Claude 生成测试,然后实现代码以满足这些测试。测试比形容词更好地定义了准确性,并使模型保持诚实。
Q4: 提示中应该如何具体地进行版本锁定?
非常具体:语言运行时、框架主版本/次版本和 SDK 版本。“最新”会引入冲突的模式;准确性取决于稳定的目标。
Q5: Sider.AI 在提示以获得准确代码方面扮演什么角色?
使用 Sider.AI 将规范、代码、差异和测试日志保存在一个循环中。它不会变魔术——它只是保留上下文,以便 Claude 的修复能够跟踪您的实际失败。