首页 / 文章

受限提示:防止人工智能助手创建平行系统栈

为何模糊的功能需求会导致编码助手添加重复的库和封装层,以及如何通过带有路径、不变条件与强制终止点的受限提示来解决这一问题。

发布者:REACTAPP.TOP阅读约 6 分钟1323 词

来源: AI Doesn’t Need Better Prompts. It Needs Boundaries.

如果你让编程助手“创建一个用户设置页面”,通常会得到一个能够编译、渲染且看起来完整的界面。但仔细查看后就会发现,其中往往包含自己的状态存储、数据获取辅助函数以及你的代码库从未用过的验证库。虽然没有任何功能出错,但这正是问题能轻易通过审查的原因。本文将解释为何模糊的请求会导致此类问题、添加形容词为何无济于事,以及如何编写有明确范围的提示语,还会提供一个可重复使用的检查清单,确保生成的代码能融入你现有的架构中。

模糊请求为何会悄然失败

想象一个团队正在使用 React 和 TypeScript 开发客户管理应用。该代码库已包含表单基础组件、共享的 API 客户端以及通知钩子。有人用一句话向助手请求添加一个设置页面。最终结果包括标签页、表单、提示消息、加载骨架屏以及一个小型的状态存储。但实际上,这些改动与现有代码库存在矛盾:

  • 表单状态是由项目并未使用的库来管理的。
  • 新的 fetch 封装与共享的 API 客户端并存。
  • 提示消息是直接内联生成的,而非通过项目中的通知钩子发送。
  • 验证规则忽略了 types/ 中已定义的结构。
  • 客户端的“设置存储”中存放了本应存在于服务器上的三个字段。
  • 加载骨架屏与仪表板的其余部分不匹配。

这些操作都不会引发错误,除非有人打开 package.json,否则即便快速检查也能通过。问题就在于:模糊的提示只会导致轻微的问题。它们会引入另一种实现方式,而团队早已解决了原有问题,后续的维护者则不得不同时使用这两种方式。助手擅长处理它能看到的代码;而那些它从未打开过的文件,才决定了该功能是否真的适合加入你的应用中。

为何更长的提示并非解决方案

通常的建议是更加具体。自然的第二次尝试会要求一个“经过优化、可投入生产的”设置页面,具备“简洁的用户界面、良好的 TypeScript 代码以及完善的错误处理机制”。

这样就能形成相同的并行架构,只不过更加确定可靠。文字描述的是风格偏好,而风格让模型完全可以自由地构建结构。所缺的从来不是表达能力,而是界限:明确规定模型可以使用什么、不得添加什么,以及何时算完成。

编写有限版本的提示词

下面的有限版本提示词要求实现相同的功能,但读起来更像一份工作描述。它指明了需要重用的具体组件、钩子、API客户端和架构文件,列出了标签页及提交行为,定义了测试要求,并最后明确了禁止事项。

Build a user settings page in React and TypeScript.
Use ONLY these existing pieces:
- `src/components/FormField.tsx`
- `src/components/Button.tsx`
- `src/hooks/useNotify.ts`
- `src/api/client.ts` (no new fetch wrappers)
- validation schemas from `src/types/userSettings.ts`
Behavior:
- Tabs: Profile, Notifications, Security
- Preserve unsaved edits when switching tabs
- Show server field errors beside the matching inputs
- Disable submit while in flight
- Ignore duplicate submits
Tests:
- loading, success, server error, duplicate click
- empty required fields
Do NOT:
- add a state-management library
- add a toast library
- create a new API client
- invent types that duplicate `src/types/userSettings.ts`

这与其说是一份更优的提示词,不如说是一条模型必须遵循的架构说明。与简短版相比,它明确了之前由运气决定的七项内容:

  1. 哪些现有组件可以重用。
  • 验证的权威数据来源所在位置。
  • 交互规则,例如在多个标签页之间保留未保存的编辑内容。
  • 错误应显示的位置。
  • 并发行为:处理进行中的操作状态及重复提交问题。
  • 定义“完成”标准的测试用例。
  • 对新依赖项的严格限制。
  • 在这些约束条件下,生成的差异结果会显得相当单调。它使用相同的FormField、相同的useNotify以及相同的api/client。各个标签页会保留其未保存状态,而不需要新的存储机制;重复提交则通过禁用按钮和测试用例来处理,而非仅留下“稍后处理”的备注。现有的代码库中已存在相应的模式,提示的作用就是将这些模式清晰地呈现出来,确保模型不会忽略它们。

    这也解释了为何经验丰富的开发者能从助手那里获得更好的结果。他们的优势不在于措辞,而在于能够提前判断哪些细节才是关键。重要的是传达架构思路,而非仅仅修饰提示语。

    界定范围的快速测试

    如果你的提示语粘贴到世界上的任何代码库中依然通顺,那就说明它尚未被界定范围。一个好的提示语在您自己的代码库之外应该会略显无用,因为它依赖于您的路径、数据类型以及约定规范。

    可重复使用的预检清单

    在每个功能需求上方保留模板有助于养成规范化的习惯。下方的模板将问题分为上下文、不变量、行为、约束条件以及完成标准几类。其中“不变量”部分最常被忽略:提前确定数据应存储在服务器上、URL中还是本地UI状态中,就能从源头上避免“为三个字段创建存储空间”的问题。

    CONTEXT
    - Stack: React + TypeScript
    - Relevant paths: ...
    - Patterns to copy: ...
    
    INVARIANTS
    - Where does data live (server / URL / local UI state)?
    - What must survive refresh?
    - What is the source of truth for types/validation?
    
    BEHAVIOR
    - Happy path
    - Empty / invalid input
    - Server errors (field-level + form-level)
    - Slow network / double submit
    - Permission failure
    
    CONSTRAINTS
    - Do not add: ...
    - Do not invent parallel: API client / store / toast / form lib
    - Prefer editing: [files]
    
    DONE
    - Tests for: ...
    - Manual checks: ...
    

    可将该模板用作代码生成的准入标准。如果无法填妥约束条件及相关路径信息,就说明尚未准备好生成代码,仍需继续设计。在设计方案尚未确定时就开始生成代码,正是第二种架构悄然出现的途径。此检查清单中的固定部分可保存在项目说明文件中;详情请参阅我们关于编写高效CLAUDE.md文件的指南。

    哪些内容仍需人工审核

    受限提示虽能去除大部分冗余信息,但无法替代人工判断。在审核差异时,仍需检查:

    • 是否有未经任何人批准的新包。
    • 是否存在调用 API 的另一种方式。
    • 类型是否偏离了服务器契约的定义。
    • 是否存在本应由服务器管理的客户端状态数据。
    • 测试是否仅覆盖了模型预设的正常流程,而没有其他情况。

    编写提示语是相对简单的工作;而明确了解该代码库中哪些限制条件至关重要,这才是难点,这类知识由团队共同掌握。

    今天最应做的最小改动

    如果完整的检查清单显得过于繁琐,只需在下一个功能需求中添加三行内容:应使用的路径、不得添加的库,以及“完成”的标准,其中至少要包含一种失败场景。

    Use only: [paths]
    Do not add: [libs]
    Done when: [2–3 behaviors + one failure path]
    

    总结

    • 模糊的提示语很少会导致程序崩溃;它们只会创建看似已完成但实际上会带来后续成本的重复基础设施。
    • 更多的形容词只能改变输出的语气,无法改变其结构;真正能改变结构的是约束条件。
    • 一个明确的提示语能够指定可重用的文件名、数据与类型的真实来源、边界情况处理方式、测试用例以及不可使用的依赖项。
    • 当模型在限定范围之外生成内容时,应将其视为边界缺失的问题:修正提示语后重新生成内容,而非仅仅优化措辞。