Prompt工程04:迭代追问
从模糊需求到可执行任务的拆解路径,理解如何通过追问逐步明确目标和约束。
迭代追问是将模糊需求转化为清晰任务的核心方法。大多数时候,用户的需求是不完整的,需要通过多轮追问来明确目标、输入、输出和约束。
为什么需要迭代追问
模糊需求的问题
用户给出的需求往往是模糊的:
- “帮我优化一下代码”
- “写一个数据分析报告”
- “设计一个系统架构”
这些需求缺少关键信息:
- 优化什么指标?
- 分析哪些数据?
- 系统有什么约束?
迭代追问的价值
| 阶段 | 需求状态 | 模型输出 |
|---|---|---|
| 初始需求 | 模糊、不完整 | 质量差、返工多 |
| 第一次追问 | 部分明确 | 质量提升、仍需调整 |
| 第二次追问 | 基本明确 | 质量稳定、少量调整 |
| 最终确认 | 完全明确 | 高质量、一次性通过 |
追问的维度
追问不是随意提问,而是有策略地从多个维度获取信息。
六个核心维度
| 维度 | 追问方向 | 示例问题 |
|---|---|---|
| 目标 | 要达成什么结果 | ”你期望的优化目标是什么?“ |
| 输入 | 需要哪些信息 | ”有相关的代码或文档吗?“ |
| 输出 | 期望什么格式 | ”输出需要包含哪些部分?“ |
| 约束 | 有什么限制 | ”技术栈或时间上有什么限制?“ |
| 标准 | 如何衡量成功 | ”怎么判断结果是否符合要求?“ |
| 背景 | 为什么做这件事 | ”这个需求的业务背景是什么?“ |
追问优先级
- 目标优先:先明确要做什么
- 输入其次:确认有哪些可用信息
- 约束第三:了解限制条件
- 输出第四:确定交付格式
- 标准第五:定义验收标准
- 背景最后:理解业务意图
追问的策略
开放式追问
开放式追问用于获取初步信息,适合需求完全模糊的情况。
你提到要优化代码,我想了解更多细节:
1. 这是什么类型的代码?(前端/后端/算法)
2. 你希望优化哪些方面?(性能/可读性/安全性)
3. 有没有相关的代码或性能报告?
封闭式追问
封闭式追问用于确认具体选项,适合需求部分明确的情况。
关于技术栈,我想确认:
1. 后端使用 Java 还是 Python?
2. 数据库使用 MySQL 还是 PostgreSQL?
3. 需要支持高并发吗?(是/否)
递进式追问
递进式追问从宏观到微观,逐步深入。
第一轮(宏观):
"这个系统主要做什么?有多少用户?"
第二轮(中观):
"核心业务流程是什么?有哪些关键模块?"
第三轮(微观):
"这个模块的具体实现逻辑是什么?有哪些接口?"
假设式追问
假设式追问用于验证理解,避免误解。
根据我的理解,你需要:
1. 优化用户登录接口的响应时间
2. 目标是从 500ms 降到 200ms 以下
3. 使用 Redis 缓存用户信息
我的理解对吗?有没有遗漏或错误?
追问的流程
标准追问流程
1. 确认目标
↓
2. 收集输入
↓
3. 明确约束
↓
4. 定义输出
↓
5. 建立标准
↓
6. 确认理解
↓
7. 开始执行
追问流程图
用户提出需求
↓
需求是否清晰?
↓ 否
追问关键信息
↓
用户补充信息
↓
再次判断需求是否清晰
↓ 是
开始执行任务
追问的技巧
避免追问过多
| 情况 | 处理方式 |
|---|---|
| 用户不耐烦 | 减少追问次数,先给出初步方案 |
| 时间紧张 | 基于现有信息给出方案,后续迭代 |
| 用户不确定 | 提供选项让用户选择 |
追问的语言艺术
| 技巧 | 示例 |
|---|---|
| 表达理解 | ”我理解你需要…” |
| 说明原因 | ”为了更好地…” |
| 提供选项 | ”你更倾向于A还是B?“ |
| 确认反馈 | ”我的理解对吗?“ |
追问的节奏控制
| 阶段 | 追问频率 | 原因 |
|---|---|---|
| 初期 | 频繁追问 | 需求模糊,需要大量信息 |
| 中期 | 适度追问 | 需求逐渐清晰,确认细节 |
| 后期 | 少量追问 | 需求基本明确,确认关键点 |
追问的常见误区
误区1:追问太笼统
错误:“还有什么需要补充的吗?”
正确:“关于技术栈,你有什么偏好吗?“
误区2:追问太细节
错误:“这个变量命名用驼峰还是下划线?”
正确:“代码风格有什么要求吗?“
误区3:追问无目的
错误:随机提问,没有逻辑顺序
正确:按照目标→输入→约束→输出的顺序追问
误区4:忽视用户反馈
错误:用户已经回答过的问题再次提问
正确:记录用户回答,避免重复提问
追问与上下文的关系
追问是上下文的补充
每次追问都是在补充任务上下文:
初始上下文:{"目标": "优化代码"}
第一次追问后:{"目标": "优化代码", "类型": "Java后端", "指标": "响应时间"}
第二次追问后:{"目标": "优化代码", "类型": "Java后端", "指标": "响应时间", "代码": "..."}
追问的结果应该记录
每次追问的结果应该作为上下文保存,用于后续交互:
[对话历史]
用户:帮我优化代码
追问:什么类型的代码?
用户:Java后端
追问:优化什么指标?
用户:响应时间,目标500ms以内
追问:有相关代码吗?
用户:[代码片段]
[当前上下文]
角色:资深Java后端工程师
目标:优化Java后端代码的响应时间,目标500ms以内
输入:[代码片段]
项目判断清单
- 需求模糊不清 → 使用开放式追问获取初步信息
- 需求部分明确 → 使用封闭式追问确认细节
- 用户不确定需求 → 提供选项让用户选择
- 需要验证理解 → 使用假设式追问
- 用户不耐烦 → 减少追问,先给出初步方案
- 需要长期协作 → 记录追问历史,建立上下文
- 追问效果不好 → 检查追问策略和语言表达
- 需求频繁变更 → 在追问阶段建立变更控制机制