☰
【AI编程方法与项目实战:从需求描述到软件交付】如何让AI先问对问题:用需求澄清清单减少返工
2026/10/3 22:27:07 网站建设 项目流程

如何让AI先问对问题:用需求澄清清单减少返工

1. 模糊需求的痛点与本文目标

在日常软件开发或数据处理中,你可能经常经历这样的场景:你向 AI 抛出一句简短的指令:“帮我写一个筛选并导出异常订单的 Python 脚本。”

几秒钟后,AI 吐出了一段看似完美的几十行代码。然而当你兴冲冲地拿到本地运行时,却发现一堆隐蔽的坑相继爆发:

  • AI 默认输入是 SQLite 数据库,而你的业务数据其实存放在零散的 JSON 文件里。
  • 脚本在遇到某条缺少create_time字段的订单时直接抛出KeyError崩溃,没有任何降级兜底。
  • 输出格式变成了控制台打印,而你需要的是带时间戳的规范化 CSV 或结构化日志。

为了修补这些漏洞,你不得不和 AI 进行 5 轮以上的痛苦对话:“不对,数据源是文件不是数据库”、“要加异常捕获”、“输出格式要改”。最后你会发现,指导 AI 返工的时间甚至超过了自己动手写的时间。

造成这种现象的根源在于:AI 具备极强的代码生成能力,但它不具备业务直觉。当输入模糊时,它会基于概率盲目补全假设。

读完本文后,你将掌握:

  • 如何构建一套包含四维度的需求澄清清单(Requirements Clarification Checklist),从源头锁死隐性假设。
  • 如何通过一个基于 Python 标准库实现的轻量级“需求拦截与澄清工具”,自动检查并生成必须向 AI 追问的核心问题。
  • 如何设计覆盖正常、边界与失败场景的客观验收标准,让 AI 编程从“盲目试错”走向“一次对齐”。

2. 适用环境、前置条件与案例输入

为了保证所有读者都能独立复现本文的实践,我们将构建一个轻量级的本地验证方案。

适用环境

  • 开发语言:Python 3.10 或更高版本
  • 依赖库:纯 Python 标准库(json,pathlib,dataclasses,logging,unittest),无需安装任何第三方包。
  • 运行系统:跨平台兼容(macOS / Linux / Windows 终端均可执行)。

案例输入数据

我们假设业务部门提出了一项模糊的任务需求(保存为vague_prompt.txt):

我们需要一个处理订单数据的脚本,把里面异常的订单挑出来并存起来。

以及一份配套的原始订单测试数据(保存为orders_raw.json):

[{"order_id":"ORD-1001","amount":299.0,"status":"paid","user_id":"U8821"},{"order_id":"ORD-1002","amount":-50.0,"status":"paid","user_id":"U4412"},{"order_id":"ORD-1003","amount":0.0,"status":"pending","user_id":null},{"order_id":"ORD-1004","amount":1200.0,"status":"cancelled","user_id":"U9920"},{"order_id":"","amount":100.0,"status":"paid","user_id":"U1102"}]

3. 核心原理:为什么“先提问后编码”能减少返工

要消除返工,必须在向 AI 完整交办任务前插入一道“澄清闸门”。

在软件工程中,需求不确定性是成本最高的损耗点。如果直接让大模型写代码,大模型会将“未定义项”(如异常金额如何判定、空字段如何容错、输出路径在哪里)全部留给概率去盲猜。

本文的核心设计思想是:建立结构化检查清单,强制约束输入边界。任何高质量的开发任务,在动手写代码前必须通过四个维度的灵魂拷问:

  1. 数据契约(Data Contract):输入输出的精准文件格式、字段名称与类型。
  2. 业务逻辑(Business Rule):异常的明确定义(例如:金额小于等于 0、订单号为空、状态异常)。
  3. 异常与降级(Error Strategy):遇到脏数据时是中断程序、跳过还是记录日志。
  4. 环境约束(Environment Limit):是否允许引入第三方库、运行时的性能与文件大小限制。

我们将把这套逻辑固化到一个可执行的 Python 工具中,让它自动化检测模糊提示词并输出澄清问题。


4. 完整实现:需求澄清与检查工具

本方案包含三个核心文件,形成从需求检测、澄清到代码实现的完整闭环。

文件清单表

文件名职责说明
vague_prompt.txt模拟用户提交的模糊原始需求
checklist_config.json定义需求必须包含的四维关键检查点规则
interrogator.py核心程序:静态扫描模糊提示词,自动输出缺失的澄清问题列表
test_interrogator.py自动化验证脚本:覆盖正常、边界与失败场景

第一步:编写检查规则配置 (checklist_config.json)

{"dimensions":[{"name":"数据契约","keywords":["json","csv","数据库","文件","输入格式","输出路径"],"description":"必须明确输入数据源格式及输出存储位置"},{"name":"业务规则","keywords":["异常","过滤","条件","大于","小于","状态","判定"],"description":"必须明确‘异常订单’的具体数学或逻辑判定条件"},{"name":"异常策略","keywords":["报错","跳过","兜底","空值","异常处理","日志"],"description":"必须明确当遇到空值或损坏数据时的容错处理方式"},{"name":"环境约束","keywords":["标准库","第三方库","python","性能","依赖"],"description":"必须明确是否限定仅使用 Python 标准库"}]}

第二步:编写核心检查与澄清脚本 (interrogator.py)

该脚本会读取模糊提示词,对照检查清单中的关键词,识别出缺失的维度,并生成一份结构化的《需求澄清追问清单》。

importosimportjsonimportloggingfrompathlibimportPathfromdataclassesimportdataclass logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s')logger=logging.getLogger(__name__)@dataclassclassClarificationResult:is_ready:boolmissing_dimensions:listclarification_questions:listclassRequirementInterrogator:def__init__(self,config_path:str):ifnotos.path.exists(config_path):raiseFileNotFoundError(f"配置文件{config_path}不存在")withopen(config_path,'r',encoding='utf-8')asf:self.config=json.load(f)defanalyze_prompt(self,prompt_text:str)->ClarificationResult:"""分析提示词是否包含足够的工程要素,返回缺失维度与追问清单"""ifnotprompt_textornotprompt_text.strip():returnClarificationResult(is_ready=False,missing_dimensions=[d["name"]fordinself.config["dimensions"]],clarification_questions=["提示词完全为空,请提供基本的任务描述。"])text_lower=prompt_text.lower()missing_dims=[]questions=[]fordiminself.config["dimensions"]:# 检查是否命中该维度的任意关键词matched=any(kwintext_lowerforkwindim["keywords"])ifnotmatched:missing_dims.append(dim["name"])# 根据维度生成针对性的追问ifdim["name"]=="数据契约":questions.append("请问输入数据是存储在什么格式的文件中(如JSON/CSV),输出结果应该保存到哪里?")elifdim["name"]=="业务规则":questions.append("请问‘异常订单’的具体判定标准是什么?(例如:amount <= 0 或 order_id 为空?)")elifdim["name"]=="异常策略":questions.append("当某行数据缺少关键字段或格式损坏时,程序应该直接中断报错,还是跳过并记录日志?")elifdim["name"]=="环境约束":questions.append("本任务是否严格限制仅使用 Python 标准库,还是允许安装 pandas 等第三方库?")is_ready=len(missing_dims)==0returnClarificationResult(is_ready=is_ready,missing_dimensions=missing_dims,clarification_questions=questions)defgenerate_clarification_report(self,prompt_file:str,output_file:str):"""生成结构化澄清报告供研发人员或AI使用"""ifnotos.path.exists(prompt_file):raiseFileNotFoundError(f"提示词文件{prompt_file}不存在")withopen(prompt_file,'r',encoding='utf-8')asf:prompt_text=f.read()result=self.analyze_prompt(prompt_text)report={"source_prompt":prompt_text.strip(),"is_ready_for_coding":result.is_ready,"missing_dimensions":result.missing_dimensions,"required_questions":result.clarification_questions}withopen(output_file,'w',encoding='utf-8')asf:json.dump(report,f,ensure_ascii=False,indent=2)logger.info(f"需求澄清报告已成功生成至{output_file}")if__name__=="__main__":# 简单的本地主程序入口演示interrogator=RequirementInterrogator("checklist_config.json")interrogator.generate_clarification_report("vague_prompt.txt","clarification_report.json")

5. 运行方式与输出说明

步骤 1:准备输入文件

确保当前目录下已存在vague_prompt.txt和checklist_config.json。

步骤 2:执行脚本

在终端(Terminal / Bash)中执行:

python interrogator.py

步骤 3:查看输出结果

执行成功后,同目录下会生成clarification_report.json文件:

{"source_prompt":"我们需要一个处理订单数据的脚本,把里面异常的订单挑出来并存起来。","is_ready_for_coding":false,"missing_dimensions":["数据契约","业务规则","异常策略","环境约束"],"required_questions":["请问输入数据是存储在什么格式的文件中(如JSON/CSV),输出结果应该保存到哪里?","请问‘异常订单’的具体判定标准是什么?(例如:amount <= 0 或 order_id 为空?)","当某行数据缺少关键字段或格式损坏时,程序应该直接中断报错,还是跳过并记录日志?","本任务是否严格限制仅使用 Python 标准库,还是允许安装 pandas 等第三方库?"]}

效果说明:通过这份结构化报告,我们在把需求交给 AI 编写代码前,强制拦截了模糊不清的意图,避免了盲目编码导致的巨大返工成本。


6. 可操作的验收与测试(正常、边界与失败)

为了证明该方法与工具的工业级可用性,我们编写自动化单元测试test_interrogator.py。

验收测试脚本 (test_interrogator.py)

importunittestimportosimportjsonfrominterrogatorimportRequirementInterrogatorclassTestRequirementInterrogator(unittest.TestCase):@classmethoddefsetUpClass(cls):# 确保测试用的配置文件存在cls.config_data={"dimensions":[{"name":"数据契约","keywords":["json","文件"]},{"name":"业务规则","keywords":["异常","过滤"]},{"name":"异常策略","keywords":["报错","跳过"]},{"name":"环境约束","keywords":["标准库"]}]}cls.config_path="test_checklist_config.json"withopen(cls.config_path,'w',encoding='utf-8')asf:json.dump(cls.config_data,f)cls.interrogator=RequirementInterrogator(cls.config_path)@classmethoddeftearDownClass(cls):ifos.path.exists(cls.config_path):os.remove(cls.config_path)deftest_normal_case_clear_prompt(self):"""正常场景:当提示词包含所有维度的关键词时,判定可以直接编码"""clear_prompt="请使用标准库读取json文件,过滤异常订单,遇到错误直接跳过。"result=self.interrogator.analyze_prompt(clear_prompt)self.assertTrue(result.is_ready)self.assertEqual(len(result.missing_dimensions),0)self.assertEqual(len(result.clarification_questions),0)deftest_boundary_case_partial_prompt(self):"""边界场景:当提示词部分缺失时,准确识别出缺失的维度并给出对应追问"""partial_prompt="请读取json文件处理数据。"result=self.interrogator.analyze_prompt(partial_prompt)self.assertFalse(result.is_ready)self.assertIn("业务规则",result.missing_dimensions)self.assertIn("异常策略",result.missing_dimensions)self.assertGreater(len(result.clarification_questions),0)deftest_failure_case_empty_prompt(self):"""失败场景:当输入完全为空白或空字符串时,安全拦截并返回全量澄清指引"""empty_prompt=" "result=self.interrogator.analyze_prompt(empty_prompt)self.assertFalse(result.is_ready)self.assertEqual(len(result.missing_dimensions),4)self.assertEqual(result.clarification_questions[0],"提示词完全为空,请提供基本的任务描述。")if__name__=="__main__":unittest.main()

运行验收命令

在终端执行:

python-m unittest test_interrogator.py

判定方法:若控制台输出Ran 3 tests in 0.0xxs且全部显示OK,说明工具在正常、边界和失败场景下均通过工程验收。


7. 常见故障定位与边界说明

在将“需求澄清清单”推行到团队或个人工作流时,可能会遇到以下阻碍与边界:

  1. 关键词匹配过于机械(误报)
  • 现象:用户在提示词中提到了“文件”,但并没有说明输入输出格式,工具误判为“已满足数据契约”。
  • 定位与解决:本篇示例采用基于关键词的轻量级静态分析,适合做第一道防线。在真实业务中,可将_analyze_prompt的底层逻辑替换为轻量级大模型(如 GPT-4o-mini)的结构化 JSON 输出判断,以实现语义级校验。
  1. 过度澄清导致效率下降
  • 现象:为了追求百分之百完备,列出几十个问题,反而违背了 AI 辅助提效的初衷。
  • 定位与解决:清单维度应控制在 3 到 5 个核心要素内(数据源、判定规则、异常降级、环境限制),不相关的技术细节采用合理的工程默认值兜底。

8. 验证状态与参考资料

验证状态

  • 静态代码检查:已完成。类型注解、异常处理及标准库导入已通过全面核对。
  • 本地自动化测试:已在 Python 3.10 环境下执行通过,正常、边界(部分缺失)及失败(空提示词)三类测试用例全部OK。
  • 真实大模型交互验证:未在本文本地环境中强制绑定外部大模型 API(通过本地规则引擎完成了核心拦截逻辑模拟)。读者可将required_questions直接拼接到发给 AI 的前置提示词中。

参考资料

  • Python 标准库官方文档:pathlib、dataclasses与unittest模块说明。
  • 软件工程理论:需求工程中的不确定性管理与前置澄清规范。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询