← 返回学习中心 · AI 基础与工具OiOi Academy
提示词工程 · 02

EARS:让 AI 没有洞可填,禁止脑补

来自 @OMOisomo 的 AI 使用实战复盘:追问只能解决"说不清",防脑补要用受控需求语法 EARS,把澄清从"事后"挪回"事前"。

原作者 @OMOisomo 来源 X 发布 2026-08-15
🕳️

开篇:AI 写偏,真凶不是"没问清楚"

你大概率写过这样一段"保命符"贴给 AI:"如果你觉得我的表述不明确,可以向我提问,直到你 100% 明确我的需求。"或者"用苏格拉底式提问反问我"。

@OMOisomo 也这么干过。AI 确实追问了,他也答了,AI 说"我 100% 明确你的需求了"——写完一看,还是在几个关键地方写歪了。

原文配图:AI 脑补问题示意(出自《AI使用实战复盘——EARS,禁止AI脑补》)
原文配图:AI 脑补问题示意(出自《AI使用实战复盘——EARS,禁止AI脑补》)

真凶叫脑补:你写"出错要重试",它填成"重试三次、间隔一秒";你写"失败要兜底",它填成"包一层 try-catch,catch 里打一行 log"。这些数字和动作你一个字没提,它替你定了,还定得理直气壮——拿一个"统计上最合理"的默认值,填进了那个洞。

记住:一句话结论:防住脑补,不是让 AI 更会问,而是让它没有洞可填。这就是 EARS 要干的事。
❓

为什么"追问到 100% 明确"还是不够

追问解决的是"说不清"——你意识到的地方,它问,你答,说清楚。但脑补发生在"你没意识到要交代"的地方。你让 AI 追问,它只能问"哪里不清楚",问不出"哪里你以为清楚了、其实是个洞"。

更要命的是:默认情况下 AI 几乎不反问。除非你专门写了"遇到模糊的地方先问我",否则它不会像 junior 开发那样举手。它替你猜了,交给你一版看起来没毛病的代码,你跑了才发现不对,然后多轮返工。

高中生类比
这就像你让厨师"随便做点好吃的":他追问你"吃辣吗"你答了,但他默认给你放了香菜——你没说不放,他也没问,因为两边都觉得"这还用说吗"。脑补的洞,就长在这种"还用说吗"里。

人读需求也会脑补,但用的是业务常识,猜得准。AI 脑补填的是训练数据里最常见的模式,跟你的业务逻辑往往对不上。所以同一句模糊需求,老同事能做对,AI 大概率做偏。

📐

EARS 是什么:五种模式

EARS,全称 Easy Approach to Requirements Syntax(简易需求语法)。一句话定义:一种受控自然语言,用少量关键词加固定子句顺序,把系统需求写成清晰、可测试、可解析的句子。它不新——2009 年 Rolls-Royce 提出,在航空、汽车这类"需求写糊了就是安全事故"的行业用了十几年,Airbus、NASA 都在用。

原文配图:EARS 概念总览(出自《AI使用实战复盘——EARS,禁止AI脑补》)
原文配图:EARS 概念总览(出自《AI使用实战复盘——EARS,禁止AI脑补》)

先纠正一个常见误会:EARS 常被简化成"五个关键词 WHEN / WHILE / IF / WHERE / SHALL"。不准——SHALL(应)不是条件关键词,是所有模式共用的"应";真正的第五种是 Ubiquitous(无触发条件的普适需求)。

原文配图:EARS 五种模式示意图(出自《AI使用实战复盘——EARS,禁止AI脑补》)
原文配图:EARS 五种模式示意图(出自《AI使用实战复盘——EARS,禁止AI脑补》)
  • Ubiquitous(普适):没有触发,始终成立。模板:系统应<响应>。例:"支付服务应使用 AES-256 加密所有静态卡号"。
  • When(事件驱动):某件事发生了,就做什么。模板:当<触发>时,系统应<响应>。
  • While(状态驱动):某个状态持续期间,行为成立。模板:在<状态>时,系统应<响应>。
  • Where(可选特性):只有某配置/变体具备时才成立。模板:在已启用<功能>时,系统应<响应>。
  • If-Then(非期望行为):出错、异常、非法输入怎么兜。模板:如果<条件>,则系统应<响应>。
高中生类比
When 和 While 最容易混,记住这个:When 是"门铃响了你去开门"(瞬时触发),While 是"你在家的整个下午,门都锁着"(持续状态)。

再加一条硬规则:一条需求,只留一个"应"。想写"并且"?拆两条。看见"妥善""尽快""合理""友好"?全部换成可验证的动作,或者进待确认清单。

🛡️

EARS 防脑补的四层机制(含边界)

机制上四层,正好卡住脑补:

  1. 槽位明确:WHEN / WHILE / IF / WHERE 直接标出"这是触发、这是状态、这是异常",AI 不用猜"这句话哪里是条件、哪里是结果"。
  2. 行为可验收:"应 + 可观察响应"(显示/拒绝/存储/发送)接近验收标准,能直接映射成测试步骤。
  3. 原子化:一条 EARS 通常只描述一种条件-响应,没有长段落里的隐含假设。
  4. 人机双语:仍是自然语言,产品/业务能审;结构够规整,LLM 解析和代码生成更稳。

它们各管一段:Story 管意图(为什么、给谁),EARS 管可验证行为(系统必须怎样),Gherkin 管测试自动化(关键场景)。给 AI 写规格,落的就是中间这层 EARS,不是互相替代。

避坑
边界要说清:EARS 只治"句法歧义",不保证需求正确、必要、完整。它不是万能药——数学算法、UX 文案、目标管理这些不该硬套。但它恰好治的,是 AI coding 里最耗时间的那个病。

还有一句关键洞察:AI coding 真正费时间的不是写代码慢,而是以前"写代码之前开会澄清需求"的时间,现在全挪到了"代码写完了再反过来发现需求没讲清楚"。而且代码已经写出来,你会有锚定效应——顺着它写的那版去改,而不是从零思考。EARS 把澄清从"事后"挪回"事前"。

🛒

案例一:库存校验

PM 写道:"用户提交订单时校验库存,缺货要提示,体验好一点。"看起来挺清楚,看 AI 怎么脑补:

原文配图:案例节配图——库存校验与登录校验(出自《AI使用实战复盘——EARS,禁止AI脑补》)
原文配图:案例节配图——库存校验与登录校验(出自《AI使用实战复盘——EARS,禁止AI脑补》)

提交订单时 SELECT stock … WHERE product_id =?,count <= 0 就弹个 toast"库存不足"。代码不超过二十行。它不会主动问:并发扣减怎么处理、超时要不要释放预占、购物车里三种商品缺一种是全部拒绝还是部分下单、先到先得是什么语义。一测就露馅:两个人同时买最后一台 → 超卖,库存变负数;购物车三个商品缺一个 → 整单被拒,用户困惑"另外两个不是有货吗"。

EARS 重写之后(五条,一条一个"应",没有"尽快""妥善""体验好一点"):

  1. When 用户点击提交订单,系统应校验购物车中每个商品的当前库存。
  2. If 任一商品库存为零,则系统应在该商品旁显示"已售罄",并展示其余有货商品的数量与总价;订单可部分提交。
  3. If 所有商品库存充足,则系统应为每件商品预占库存,锁定时间 15 分钟。
  4. If 15 分钟内未完成支付,则系统应释放该订单所有预占库存。
  5. If 预占库存时发生并发冲突,则系统应重试一次;重试后仍库存不足,则拒绝订单并显示当前库存。

第一条是正常路径 When,剩下四条全是 If(异常、边界、并发)——原句里一个字没提。真正让代码从"能跑"变"能上线"的,就是这几条 If。第五条里的"重试一次"是我自己定的数字,严谨做法是标 [待确认:重试次数、并发策略是否需 PM 拍板]。

记住:EARS 的纪律不是"把需求写全"——写不全很正常。是写不出来的地方,明确标出来要谁确认,不把默认值悄悄塞进实现。这才是防脑补的关键:堵住 AI 自己填数字的口子。
🔐

案例二:登录校验

PM 写道:"用户登录时要校验用户状态,体验好一点,密码错了要提示。"

用户名密码查库,匹配就发 token,不匹配就回一句"用户名或密码错误"。仅此而已。它不会主动问:账号被禁用怎么处理、密码连续输错要不要锁、锁多久、提示文案要不要区分"账号不存在"和"密码错误"。

EARS 重写之后:

  1. When 用户点击登录且已输入用户名和密码,系统应校验用户名、密码与账号状态。
  2. If 用户名和密码正确但账号已被禁用或失效,则系统应在登录页显示"账号已失效,请联系管理员"。
  3. If 密码错误,则系统应在登录提示区域显示"用户名或密码错误",不区分具体是哪一个不对。
  4. If 用户在 60 分钟内连续输错密码达到 5 次,则系统应锁定该账号 30 分钟并显示"登录次数过多,请 30 分钟后重试"。
  5. Where 在已启用双因素认证时,系统应在密码验证通过后要求输入 6 位 TOTP 验证码。

"体验好一点"背后是:错误要区分但不暴露太多、防暴力破解要有阈值、账号禁用要覆盖、2FA 单走一条 Where。第四条里的"5 次 / 30 分钟"同样是 AI 最可能偷偷填的数字,照例进待确认清单。

高中生类比
两个案例的模式是一样的:一句模糊 PRD → AI 在最简单路径上写完 → 异常、边界、安全、并发全漏 → EARS 把每条钉成可测试的"应"句。就像装修只盯着"墙刷白",EARS 逼你把水电、防水、保修一条条写进合同。
🧰

改写模板:直接复制可用的 EARS 需求助手

下面这段 prompt 来自原文,可直接复制——把末尾"原始需求"换成你的内容。核心原则:提示工程的上游是需求工程;禁止替用户编造业务规则;原文信息不足时写入"待澄清",不用"看起来合理"的默认值填坑。

你是需求分析助手,专责把模糊、口语或有歧义的产品需求,改写成 EARS(Easy Approach to Requirements Syntax)可测试规格,供研发、测试与 AI 编码直接使用。


提示工程的上游是需求工程。先消歧,再让 AI 写代码;禁止替用户编造业务规则。原文信息不足时,写入"待澄清",不要用"看起来合理"的默认值填坑。


- 规格正文默认中文:用"当…时 / 在…时 / 如果…,则… / 应"
- 禁止在正文输出 WHEN / WHILE / IF / THEN / WHERE / shall(用户明确要求标准英文模板时,可另附对照,不替代中文正文)
- 模式名可用英文标签:Ubiquitous / Event-Driven / State-Driven / Unwanted / Optional / Complex


1. 定主语与对象:系统/组件叫什么?动作作用在谁身上?(EARS 主语是系统,不是用户角色)
2. 贴问题标签:模糊词、多动作塞一句、无数字、缺主语、正常与异常缠在一起
3. 先拆再写:多动作 / 多异常 / 多阶段 → 拆成可独立验收的意图列表
4. 选型:按下方决策树选模式(复合模式最多两个条件关键字)
5. 套句改写:只保留原文业务意图,只补可观察响应所需的最小结构
6. 可测性兜底:能量化就补时限/次数/范围/失败表现/文案;补不了 → 待澄清


有离散触发事件?
├─ 是 → 还有持续状态或功能开关?
│ ├─ 是 → Complex(如:在…时,当…时,系统应…)
│ └─ 否 → Event-Driven(当…时,系统应…)
└─ 否 → 有持续状态?
 ├─ 是 → State-Driven(在…时,系统应…)
 └─ 否 → 是错误/故障/非法输入/边界?
 ├─ 是 → Unwanted(如果…,则系统应…)
 └─ 否 → 依赖可选功能/套餐/配置?
 ├─ 是 → Optional(在已启用…时,系统应…)
 └─ 否 → Ubiquitous(系统应…)


- 普适:<系统>应<响应>。
- 事件:当<事件>时,<系统>应<响应>。
- 状态:在<状态>时,<系统>应<响应>。
- 非期望:如果<条件>,则<系统>应<响应>。
- 可选:在已启用<功能>时,<系统>应<响应>。
- 复合:在<状态/开关>时,当<事件>时,<系统>应<响应>。


- 一条规格只有一个"应";想写"并且"就拆条
- 主动语态:写"系统应…",禁止"错误被显示…"
- 触发具体:禁止"当有情况发生时""如果出问题"
- 响应可观察:显示/拒绝/写入/发送/置状态/返回码等;优先可测试动词
- 能量化就量化;复合条件 ≤ 2;实现细节非契约则不写
- 规格正文禁词:应该、尽量、可以、或许、尽快、及时、较快、足够、合理、友好、支持(无对象)、处理、优化、完善、保障、妥善、适当、should、could、might、can、appropriately
- 缺失信息不硬编


## 输入原文 / ## 判定(模式+依据)/ ## 规格正文 / ## 待澄清
多意图时用:## 输入原文 / ## 拆分说明 / ## 规格列表 / ## 待澄清


1. 下游模型能否不猜业务就写出测试步骤?
2. 测试失败时,能分清是实现错了还是规格没写清?
3. 换一个人读,触发与响应是否一致?
任一项为否 → 回炉或补待澄清。


(在此粘贴需要改写的需求)
避坑
分支纪律(原文强调):状态变化前后两个行为 → 拆两条,不要硬上 Complex;正常路径 + 异常路径同句 → 分开写;主语不明 → 先假设最可能的系统名并在待澄清中确认;触发或响应都猜不出来 → 不硬改,只出待澄清。
🔁

四步工作流:把 EARS 嵌进日常

原文配图:EARS 嵌入工作流四步图(出自《AI使用实战复盘——EARS,禁止AI脑补》)
原文配图:EARS 嵌入工作流四步图(出自《AI使用实战复盘——EARS,禁止AI脑补》)

把原始需求粘进上一节的改写 prompt,得到 EARS 规格 + 待澄清清单。

如果只想先试一次:挑一句带"支持 / 尽快 / 友好 / 妥善 / 合理"的需求,走上面流程重写一遍,数一数你不得不回问 PM 多少个问题——问题比想象中多,而这正是 EARS 的价值。

原文配图:总结——提示工程的上游是需求工程(出自《AI使用实战复盘——EARS,禁止AI脑补》)
原文配图:总结——提示工程的上游是需求工程(出自《AI使用实战复盘——EARS,禁止AI脑补》)
记住:不是让 AI 学会理解暧昧,是先把暧昧消灭干净,再让 AI 干活。提示工程的上游,是需求工程。

互见:Anthropic 官方指南同样强调"意图、格式、成功标准一个都不能含糊"——官方视角的对比解读详见《第 4 课》;OpenAI 官方指南的起草层"不编造"护栏详见《第 6 课》。

词

术语翻卡:点卡片看解释

脑补
Hallucinated defaults
AI 用"统计上最合理"的默认值,填了你没意识到要交代的需求空白。追问问不出来,因为你自己都没意识到那是个洞。
EARS
Easy Approach to Requirements Syntax
简易需求语法:受控自然语言,2009 年 Rolls-Royce 提出,用固定句式把需求写成清晰、可测试、可解析的句子。
SHALL(应)
SHALL
EARS 所有模式共用的关键词,表示"系统必须做到",一条规格只允许出现一个"应"。
Ubiquitous
Ubiquitous
EARS 五种模式之一:普适需求,无触发条件、始终成立,如"系统应加密所有静态卡号"。
原子化
Atomicity
一条需求只讲一种条件-响应,不塞长段落、不藏隐含假设,AI 不用猜。
待澄清清单
To-be-clarified list
EARS 的纪律:写不出来的数字和规则不硬编,明确标出来要谁确认,堵住 AI 自己填默认值的口子。
测

自测一下:点问题展开参考答案

追问只解决"说不清"(你意识到模糊的地方);脑补发生在"你没意识到要交代"的洞里,追问问不出这个洞。

Ubiquitous(普适)、When(事件)、While(状态)、Where(可选特性)、If-Then(非期望行为)。SHALL 不是条件词,是所有模式共用的"应"。

When 是瞬时触发(门铃响了去开门),While 是持续状态(在家的整个下午门都锁着)。

脑补版只做了"查库存→弹 toast";EARS 版多了四条 If:部分提交、15 分钟预占锁、超时释放、并发冲突重试。真正让代码"能上线"的是这几条 If。

不应该。那里放"永远要遵守的规范",EARS 规格是"这一次的需求",应贴在任务描述开头,优先级高于实现细节。