在这里插入图片描述


一、课程导览:为什么复盘比学习更重要

经过前16节课的学习,你已经掌握了Prompt设计、优化策略、多轮对话、行业定制和工具组合等技能。但真正的高手,不只学得快,更懂得从自己的实践中提炼规律

复盘的核心价值:

  • 固化成功经验:把偶然的好结果变成可复现的方法论
  • 暴露隐性盲点:那些“我以为没问题”但实际存在偏差的细节
  • 提升决策速度:下次遇到类似场景,10秒内就能判断用哪种Prompt策略

本课将深度复盘4个典型技术场景:

  1. 代码生成与调试
  2. 技术问题排查
  3. 技术文档撰写
  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.sessionAffinityexternalTrafficPolicy

第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
}

业务规则

  1. 验证码为6位随机数字,有效期5分钟,存储在Redis(key: sms:code:{phone})
  2. 同一手机号60秒内只能发送一次,每天上限10次
  3. 同一手机号发送新验证码时,旧验证码立即失效

错误码定义

错误码 含义 前端处理建议
10001 手机号格式错误 提示用户重新输入
10010 发送太频繁,请等待X秒 显示倒计时
10011 今日次数已达上限 提示次日再试
10020 短信网关异常 提示稍后重试或联系客服

文档结构要求(按顺序)

  1. 接口描述(一句话功能+适用场景)
  2. 请求URL + Method
  3. 请求参数(表格)
  4. 响应参数(表格,分别列出code/message/data含义)
  5. 请求示例(curl命令,带注释)
  6. 响应示例(成功 + 失败至少2个)
  7. 错误码说明(表格)
  8. 注意事项(防刷机制、有效期、幂等性说明)

格式要求

  • 使用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条)
- 

提交与讨论

完成自我复盘后,建议:

  1. 将复盘笔记存入自己的“Prompt成长日志”
  2. 与同事或学习小组交换复盘案例,互补盲点
  3. 一个月后再次复盘同一案例,观察进步

八、课程收束:从“会写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模板库,方便后续落地使用。


🌟 感谢您耐心阅读到这里!
💡 如果本文对您有所启发欢迎:
👍 点赞📌 收藏 📤 分享给更多需要的伙伴。
🗣️ 期待在评论区看到您的想法, 共同进步。
🔔 关注我,持续获取更多干货内容~
🤗 我们下篇文章见~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐