第17课:Prompt 实战案例复盘【典型场景深度拆解】

文章目录
一、课程导览:为什么复盘比学习更重要
经过前16节课的学习,你已经掌握了Prompt设计、优化策略、多轮对话、行业定制和工具组合等技能。但真正的高手,不只学得快,更懂得从自己的实践中提炼规律。
复盘的核心价值:
- 固化成功经验:把偶然的好结果变成可复现的方法论
- 暴露隐性盲点:那些“我以为没问题”但实际存在偏差的细节
- 提升决策速度:下次遇到类似场景,10秒内就能判断用哪种Prompt策略
本课将深度复盘4个典型技术场景:
- 代码生成与调试
- 技术问题排查
- 技术文档撰写
- 技术文章创作
每个案例都包含:原始需求 → 初始Prompt → 输出问题分析 → 优化思路 → 优化后Prompt → 最终效果 → 经验提炼。
建议:读案例时,不要只看“正确答案”,而是代入自己的思考——如果是我,第一次会怎么写Prompt?哪里会踩坑?
二、复盘案例1:代码生成与调试
2.1 场景回顾
需求:编写一个Python脚本,读取Excel文件中的销售数据,进行清洗(去除无效行、格式标准化),统计各产品类别的总销售额和平均销售额,最后生成一个新的Excel报表。
技术背景:使用pandas库,数据量约5万行,列包括:订单ID、产品类别、销售额、销售日期、区域。
2.2 原始Prompt及输出
初始Prompt(用户第一版):
“写一个Python处理Excel的工具,能读取、清洗、统计数据,导出为新的Excel。”
AI输出(节选):
import pandas as pd
def process_excel(input_file, output_file):
df = pd.read_excel(input_file)
# 清洗数据
df.dropna(inplace=True)
# 统计
result = df.groupby('产品类别').sum()
result.to_excel(output_file)
用户困惑:
- 只删除了空行,但“销售额”列存在负数、零值,未处理
- “产品类别”列有大小写不一致(“电子产品” vs “电子产 品”带空格),统计时会分成不同组
- 没有按照“总销售额”和“平均销售额”分别输出
- 缺少异常处理(文件不存在、空文件)
2.3 问题诊断(对照第13课偏差分类)
| 偏差类型 | 具体表现 |
|---|---|
| 指令模糊 | “清洗”过于宽泛,AI默认只做了dropna |
| 上下文不足 | 未说明数据特征(负数、空格、大小写问题) |
| 格式未明确 | 未指定输出报表的具体列和结构 |
| 质量期望缺失 | 没要求异常处理和日志 |
2.4 优化后的Prompt
基于问题分析,重新设计Prompt,融合了场景约束+业务规则+格式示例:
【Python数据处理脚本生成】
请编写一个Python脚本,使用pandas库处理Excel销售数据。
## 输入文件
- 路径:`sales.xlsx`
- 包含列:订单ID(文本)、产品类别(文本)、销售额(数值,单位元)、销售日期(日期)、区域(文本)
## 数据处理要求
1. **读取**:使用`pd.read_excel()`,如果文件不存在则抛出友好提示
2. **清洗规则**(按顺序执行):
- 删除“订单ID”为空的行
- 删除“销售额”为空或≤0的行
- 删除“产品类别”为空的行
- 将“产品类别”列统一转为字符串,去除首尾空格,并将首字母大写(如“电子产品”、“电子 产品”→“电子产品”)
- 将“销售额”列格式化为两位小数(保留原有数值,仅输出时控制)
3. **统计要求**:
- 按“产品类别”分组
- 计算每个类别的“总销售额”和“平均销售额”
- 统计每个类别的“订单数量”
4. **输出**:
- 生成一个新的Excel文件`sales_report.xlsx`
- 包含两个sheet:
- `清洗后数据`:清洗后的原始数据(保留所有列)
- `统计报表`:包含“产品类别”、“总销售额”、“平均销售额”、“订单数量”四列
5. **异常处理**:
- 如果输入文件为空或缺少必要列,打印错误信息并退出
- 如果清洗后没有剩余数据,输出警告
## 代码要求
- 包含详细注释(说明每个步骤的目的)
- 使用`if __name__ == "__main__":`封装主逻辑
- 添加`try-except`捕获`FileNotFoundError`和`KeyError`
## 输出格式
直接输出完整的`.py`文件代码,可复制运行。
2.5 优化后的输出效果
AI生成了约120行代码,关键部分展示:
"""
Excel销售数据处理工具
功能:清洗原始销售数据,生成按产品类别汇总的统计报表
"""
import pandas as pd
import sys
def clean_data(df: pd.DataFrame) -> pd.DataFrame:
"""
清洗数据:删除无效行、标准化类别名称
"""
original_count = len(df)
# 1. 删除订单ID为空的行
df = df.dropna(subset=['订单ID'])
# 2. 删除销售额为空或<=0的行
df = df.dropna(subset=['销售额'])
df = df[df['销售额'] > 0]
# 3. 删除产品类别为空的行
df = df.dropna(subset=['产品类别'])
# 4. 标准化产品类别:去空格、首字母大写
df['产品类别'] = df['产品类别'].astype(str).str.strip().str.capitalize()
# 可选:记录清洗掉的记录数
removed = original_count - len(df)
print(f"清洗完成,移除了 {removed} 条无效记录,剩余 {len(df)} 条")
return df
def generate_report(df: pd.DataFrame) -> pd.DataFrame:
"""
按产品类别分组汇总
"""
report = df.groupby('产品类别').agg(
总销售额=('销售额', 'sum'),
平均销售额=('销售额', 'mean'),
订单数量=('订单ID', 'count')
).reset_index()
# 格式化销售额保留两位小数
report['总销售额'] = report['总销售额'].round(2)
report['平均销售额'] = report['平均销售额'].round(2)
return report
def main(input_file='sales.xlsx', output_file='sales_report.xlsx'):
try:
# 读取数据
df = pd.read_excel(input_file)
print(f"成功读取 {input_file},共 {len(df)} 行")
# 检查必要列
required_cols = ['订单ID', '产品类别', '销售额']
if not all(col in df.columns for col in required_cols):
raise KeyError(f"缺少必要列,需要包含:{required_cols}")
# 清洗
cleaned_df = clean_data(df)
if len(cleaned_df) == 0:
print("警告:清洗后无有效数据,将生成空报表")
# 统计
report_df = generate_report(cleaned_df)
# 输出到Excel(两个sheet)
with pd.ExcelWriter(output_file) as writer:
cleaned_df.to_excel(writer, sheet_name='清洗后数据', index=False)
report_df.to_excel(writer, sheet_name='统计报表', index=False)
print(f"报表已生成:{output_file}")
except FileNotFoundError:
print(f"错误:文件 {input_file} 不存在,请检查路径")
sys.exit(1)
except KeyError as e:
print(f"错误:{e}")
sys.exit(1)
except Exception as e:
print(f"未知错误:{e}")
sys.exit(1)
if __name__ == "__main__":
# 可自定义输入输出文件名
main()
2.6 复盘总结
| 维度 | 初始Prompt | 优化后Prompt | 经验提炼 |
|---|---|---|---|
| 指令具体性 | “清洗”→ AI理解为你dropna |
列出5条明确规则(删除空行、过滤负数、去空格、大小写统一等) | 规则要可计算:不要用“清洗”这类抽象动词,要给出“如果……则……”的条件 |
| 输出格式 | 未指定 | 明确两个sheet的结构和列名 | 给出输出模板:用表格或文字描述期望的最终结果 |
| 健壮性 | 未提及 | 异常处理、空数据警告 | 边界优先:写Prompt时先想“什么情况下会出bug” |
| 代码质量 | 无要求 | 注释、主函数封装、类型提示(可加) | 附带上团队规范:比如“函数必须带docstring” |
可复用经验:
- ✅ 数据处理类Prompt,必须包含数据样例(哪怕只写列名和类型)和业务规则序列
- ✅ 使用“按顺序执行”这样的词汇,减少AI自由发挥
- ✅ 要求输出同时保留中间结果和最终报表,方便人工验证
三、复盘案例2:技术问题排查
3.1 场景回顾
问题现象:Spring Boot应用(版本2.7.5)部署在Kubernetes集群中,运行一段时间后(约6-8小时),部分Pod会突然出现“Connection reset by peer”异常,重启后恢复正常。无明显的CPU/内存峰值。数据库连接池使用HikariCP,数据库为MySQL 8.0。
3.2 原始排查Prompt与AI回答
用户Prompt:
“Spring Boot应用出现连接重置错误,是什么原因?”
AI初步回答(节选):
- 可能是网络不稳定
- 检查MySQL的
wait_timeout参数 - 增加重试配置
问题:回答太泛化,没有针对K8s环境和长运行时间给出针对性排查。
3.3 多轮对话优化过程
第2轮(补充上下文):
环境补充:
- 运行在K8s中,副本数3,使用Service负载均衡
- 数据库连接池:HikariCP,配置maximumPoolSize=20,idleTimeout=600000,maxLifetime=1800000
- MySQL的wait_timeout=28800秒(8小时)
- 错误出现时间间隔大约6-8小时,所有Pod几乎同时出现?
请分析可能的根因,并给出验证方法。
AI回答:指出maxLifetime(30分钟)远小于MySQL的wait_timeout(8小时),按理不会出现服务端主动断开。但K8s的Service闲置连接超时或网络策略可能导致长连接被中间设备重置。建议检查K8s Service的spec.sessionAffinity和externalTrafficPolicy。
第3轮(要求具体诊断步骤):
请给出在K8s环境中的具体诊断命令和 Spring Boot 配置调整方案,以确认是“连接池连接被服务端或中间设备关闭”问题。要求输出kubectl抓包命令、应用端日志分析SQL、以及HikariCP的keepalive配置。
最终AI给出可操作方案:
# application.yml 新增 keepalive 检测
spring:
datasource:
hikari:
keepalive-time: 300000 # 5分钟发送一次心跳,避免连接被中间设备关闭
validation-timeout: 5000
connection-test-query: SELECT 1
以及排查命令:
# 监控Pod中的连接状态
kubectl exec -it <pod> -- netstat -an | grep :3306
# 临时增加MySQL日志记录闲置断开
SET GLOBAL log_warnings = 2;
# 然后观察错误日志
3.4 复盘总结
| 排查阶段 | 问题点 | 优化方法 |
|---|---|---|
| 首次提问 | 信息太少,AI只能给通用原因 | 遵循“5W1H”提供上下文:环境、频率、配置、现象 |
| 第二轮 | AI给出了可能原因但没有验证步骤 | 要求“给出诊断命令+配置修改方案” |
| 第三轮 | 需要区分“服务端断开” vs “中间设备断开” | 要求提供两种情况的区分证据(如抓包对比) |
可复用经验:
- ✅ 问题排查Prompt黄金结构:现象描述 + 环境清单 + 已尝试过的操作 + 期望的排查方向(如“请分析日志”或“给出抓包命令”)
- ✅ 要求AI提供验证假设的方法,而不是直接给结论
- ✅ 涉及超时/断连类问题,主动问连接池配置、负载均衡器闲置超时、容器网络策略
四、复盘案例3:技术文档撰写
4.1 场景回顾
需求:为团队新开发的“短信验证码发送接口”撰写技术文档,供前端和移动端开发同事调用。接口已上线,但文档缺失。
接口规范(手写草稿):
- URL:
POST /api/v1/sms/send - 参数:
phone(手机号)、scene(场景,可选,默认login) - 响应: 成功
{code:0, message:"发送成功"}, 失败{code:xxxx, message:"原因"} - 限制: 同一手机号60秒内只能发1次,每天最多10次
4.2 初始Prompt及问题
Prompt:
“写一个发送短信验证码的接口文档,给前端用。”
AI输出:
- 只写了请求参数表、一个成功示例。
- 没有错误码枚举,没有调用注意事项,没有curl示例。
- 语言较口语化:“你得传手机号,然后就能收到短信了。”
问题诊断:
- 受众指定了“前端”,但没有对专业度做要求(导致口语化)
- 没有提供结构模板
- 没有要求表格格式和错误码清单
4.3 优化后Prompt
参考第11课模板,结合具体接口信息:
【接口文档撰写 - 生产级】
请为以下短信验证码发送接口撰写完整的API文档。
## 接口基本信息
- 接口名称:发送登录/注册验证码
- 请求路径:POST /api/v1/sms/send
- 框架:Spring Boot 2.7
- 认证:无需JWT(公开接口)
## 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|--------|------|------|------|------|
| phone | String | 是 | 11位中国大陆手机号 | 13812345678 |
| scene | String | 否 | 场景:login/register/reset_pwd,默认login | login |
## 响应格式
统一使用 `Result<T>` 结构:
```json
{
"code": 0, // 0表示成功,其他为失败
"message": "string",
"data": null
}
业务规则
- 验证码为6位随机数字,有效期5分钟,存储在Redis(key: sms:code:{phone})
- 同一手机号60秒内只能发送一次,每天上限10次
- 同一手机号发送新验证码时,旧验证码立即失效
错误码定义
| 错误码 | 含义 | 前端处理建议 |
|---|---|---|
| 10001 | 手机号格式错误 | 提示用户重新输入 |
| 10010 | 发送太频繁,请等待X秒 | 显示倒计时 |
| 10011 | 今日次数已达上限 | 提示次日再试 |
| 10020 | 短信网关异常 | 提示稍后重试或联系客服 |
文档结构要求(按顺序)
- 接口描述(一句话功能+适用场景)
- 请求URL + Method
- 请求参数(表格)
- 响应参数(表格,分别列出code/message/data含义)
- 请求示例(curl命令,带注释)
- 响应示例(成功 + 失败至少2个)
- 错误码说明(表格)
- 注意事项(防刷机制、有效期、幂等性说明)
格式要求
- 使用Markdown,标题用##和###
- 代码块标注语言(bash, json)
- 表格左对齐
- 专业术语统一
请直接输出完整文档。
### 4.4 优化后输出亮点
AI生成的文档涵盖了:
- 清晰的章节导航
- 带真实请求/响应数据的curl示例
- 补充了“调用后前端应做60秒倒计时”的前端建议
- 添加了“使用HTTPS防止抓包”的安全提示
**与初版对比提升**:
| 维度 | 初版 | 优化版 |
|------|------|--------|
| 结构完整性 | 缺失错误码、缺失示例 | 完全符合API文档规范 |
| 语言专业度 | “你得传手机号” | “phone为必填参数,需符合手机号正则验证” |
| 可用性 | 前端不知道如何处理错误 | 给出错误码及处理建议 |
| 安全性 | 未提及 | 补充了防刷和HTTPS提醒 |
### 4.5 可复用经验
- ✅ **给AI看一个“好文档的样子”**:在Prompt中粘贴一份你满意的接口文档结构作为模板(或者详细列出章节顺序)
- ✅ **明确受众的前置知识**:“给前端” 可进一步限制“假设前端会用axios,需要给出完整的请求代码示例”
- ✅ **业务规则单独成段**:不要混在参数表里,避免遗漏
---
## 五、复盘案例4:技术文章创作
### 5.1 场景回顾
**需求**:写一篇面向初级开发者的博客,主题为“使用Redis实现分布式限流”。要求包含原理、代码实现、压测对比和生产注意事项。
### 5.2 初始尝试(Prompt不足导致内容泛泛)
**初始Prompt**:
> “写一篇Redis实现分布式限流的技术博客,要深入浅出。”
**AI输出问题**:
- 开头大段介绍“什么是限流”,占30%篇幅
- 代码部分是伪代码,没有可运行的Java示例
- 没有压测数据,只说“性能很好”
- 结尾没有总结
### 5.3 使用多轮对话+分步Prompt优化(参考第14课)
**第1轮:框架搭建**
```markdown
请为一篇技术博客搭建详细框架,选题:Redis分布式限流(令牌桶算法)。要求结构:背景痛点→算法原理对比→代码实战→压测验证→生产建议→总结。每个章节下列出3-5个小节标题。
第2轮:核心代码填充
基于你的框架,请填充【代码实战】章节。要求:使用Java + Jedis + Lua脚本实现令牌桶。代码必须完整可运行,包含Lua脚本、获取令牌的方法、测试main方法。注释详细,并解释为什么用Lua。
第3轮:压测数据补充
请模拟一个压测场景:使用JMeter,5线程持续请求令牌桶(容量10,生成速率每秒5个)。请给出预期的拒绝率、平均延迟表格,以及如何解读数据。
第4轮:润色与升华
在文章末尾增加“拓展思考”部分,提出3个问题(如:集群模式下如何同步?如何动态调整速率?限流后的降级策略?)。同时全文中将核心观点加粗,优化语言流畅度。
5.4 最终文章效果
最终成文约3500字,包含:
- 开头:用一个“秒杀超卖”的痛点故事引入
- 原理:对比固定窗口、滑动窗口、令牌桶,配Mermaid流程图
- 代码:完整的Lua脚本+Java调用+单元测试
- 压测:表格对比不同QPS下的拒绝率
- 生产:监控指标、降级策略、Redis单点风险
- 结尾:3个拓展思考 + 推荐资料
5.5 复盘提炼
| 模块 | 初版问题 | 多轮对话优化 |
|---|---|---|
| 选题 | 泛泛而谈 | 提前确定聚焦“令牌桶算法”,不面面俱到 |
| 代码 | 伪代码,不可运行 | 要求完整可运行,带注释 |
| 数据 | 无数据支撑 | 要求给出压测模拟表格 |
| 结构 | 比例失调 | 搭建框架明确各章节篇幅占比 |
可复用经验:
- ✅ 技术博客不要一次性写完整Prompt,按“框架 → 代码 → 数据 → 润色”四轮进行
- ✅ 明确要求“不写什么”:如“跳过基础Redis安装步骤,假设读者已了解”
- ✅ 要求提供可复现的代码仓库链接或粘贴完整代码,不要截图
六、复盘总结:五大通用规律
从以上四个案例中,提炼出跨场景的Prompt设计共性原则:
规律1:输入输出样例是最高效的约束
无论是代码生成、文档还是排查问题,给AI一个“预期输出样例”(哪怕是表格草稿),比写100字描述更有效。
规律2:边界与异常要显式声明
不要默认AI会考虑“文件不存在”或“参数为空”。请在Prompt中用“如果……请……”句式明确列出边界行为。
规律3:多轮对话适用于所有复杂任务
不要奢求一次完美。第1轮出框架,第2轮填细节,第3轮修bug,第4轮润色。每轮只改1-2个点。
规律4:元指令(关于指令的指令)提升可控性
例如:“请先复述一遍我的需求,确认理解正确后再生成代码。”这一条可大幅减少理解偏差。
规律5:保存成功Prompt模板,持续迭代
为你的高频任务(写CRUD接口、生成测试用例、周报)建立专属Prompt模板,每次使用后根据输出质量微调。
七、实操任务:自我复盘
请选择你在前16课中完成过的任意一个实战案例(可以是课程作业,也可以是工作中的真实案例),按照以下模板进行复盘。
复盘模板
## 案例名称:________________
### 1. 原始需求描述
[一句话说清楚要做什么]
### 2. 初始Prompt(粘贴原版)
### 3. 输出结果分析
- 满意的地方:
- 不满意/偏差的地方:
### 4. 偏差原因归类(对照第13课)
- [ ] 指令模糊
- [ ] 上下文不足
- [ ] 格式未明确
- [ ] 冗余干扰
- [ ] 隐含假设错误
### 5. 优化后的Prompt(改进版)
### 6. 优化效果对比
| 维度 | 优化前 | 优化后 |
|------|--------|--------|
| 准确性 | | |
| 完整度 | | |
| 可用性 | | |
### 7. 可复用经验(1-2条)
-
提交与讨论
完成自我复盘后,建议:
- 将复盘笔记存入自己的“Prompt成长日志”
- 与同事或学习小组交换复盘案例,互补盲点
- 一个月后再次复盘同一案例,观察进步
八、课程收束:从“会写Prompt”到“会思考Prompt”
16课走来,我们经历了:
- 📘 基础篇:认清技术文档、Prompt核心设计
- 📗 实战篇:涵盖文档、文章、测试、代码生成
- 📙 进阶篇:优化策略、多轮对话、行业定制、工具组合
- 📕 复盘篇:深度拆解典型场景
现在,你已经拥有了一套完整的Prompt工程能力体系。但请记住:工具和技术都是为“解决问题”服务的。最好的Prompt,是能让你更专注于创造价值、而非机械调参。
最后一句话送给你:AI不会取代你,但会用AI的人会。而你,正在成为那个人。
🔗阅读Prompt系列相关课程
模块一:入门奠基(第1-4节课,建立Prompt核心认知,零基础可快速上手)
模块说明:聚焦Prompt基础理论,用技术领域通俗案例拆解核心概念,规避入门误区,帮助所有读者建立对Prompt技术的正确认知,明确其在技术领域的应用价值,为后续学习打下坚实基础。
模块二:核心技巧(第5-8节课,拆解Prompt设计方法论,可直接落地)
模块说明:聚焦Prompt设计的核心技巧,结合技术领域高频需求(代码、技术文章、问题解决),拆解每一个技巧的具体用法,配套实操案例,让读者掌握“精准设计Prompt”的核心能力,摆脱“凭感觉写指令”的困境。
模块三:场景实战(第9-12节课,聚焦技术高频场景,学完就能用)
模块说明:聚焦技术领域最常用的4个核心场景,每节课对应一个实战场景,配套具体的Prompt模板、实操步骤和案例拆解,让读者结合实际需求,动手实操,真正实现“学完就能用”,解决实际工作中的痛点。
模块四:进阶提升(13-16节课,针对有基础读者,突破能力瓶颈)
模块说明:针对有一定Prompt基础的读者(已掌握基础技巧、能完成简单场景实操),讲解高阶Prompt技巧,结合行业专属需求和AI工具,提升Prompt设计的深度和效率,实现“精准适配、高效落地”,突破能力瓶颈。
模块五:实战复盘(第17-20节课,巩固所学,形成个人方法论)
模块说明:通过案例复盘、常见问题解答、实战作业点评、专栏总结,帮助读者巩固前面所学的Prompt技巧,解决学习过程中的疑问,形成自己的Prompt设计思路,同时提供可直接复用的Prompt模板库,方便后续落地使用。
🌟 感谢您耐心阅读到这里!
💡 如果本文对您有所启发欢迎:
👍 点赞📌 收藏 📤 分享给更多需要的伙伴。
🗣️ 期待在评论区看到您的想法, 共同进步。
🔔 关注我,持续获取更多干货内容~
🤗 我们下篇文章见~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)