面向Java程序员的思维链(CoT)提示词写法学习指南

面向Java程序员的思维链(CoT)提示词写法学习指南

目录

  1. 思维链(CoT)提示词基础概念讲解
  2. Java开发场景下CoT提示词的关键构成要素拆解
  3. 复杂Java技术需求拆解为AI可理解步骤的实操案例
  4. Java开发人员使用CoT提示词的避坑指南与优化技巧
  5. 实战练习任务设计

1. 思维链(CoT)提示词基础概念讲解

1.1 CoT提示词的核心定义

思维链(Chain of Thought,CoT)提示词是一种引导AI进行逐步推理的提示词编写方法。其核心思想是将复杂问题拆解为一系列逻辑连贯的中间步骤,让AI按照人类思考问题的方式,逐步推导出最终答案。

对于Java开发人员而言,CoT提示词的本质可以类比为代码逻辑流程

  • 传统提示词:类似于直接调用一个黑盒方法,只关注输入输出,不关心内部实现
  • CoT提示词:类似于编写一个包含多个步骤的方法,每一步都有明确的逻辑和中间结果,最终组合成完整的解决方案

类比示例

java 复制代码
// 传统提示词(黑盒调用)
String result = processComplexBusiness(data); // AI直接给出结果,过程不透明

// CoT提示词(步骤化推理)
// 步骤1:数据校验
if (!validateInput(data)) {
    throw new ValidationException("输入数据不合法");
}
// 步骤2:业务逻辑处理
BusinessResult businessResult = executeBusinessLogic(data);
// 步骤3:结果封装
String result = formatResult(businessResult);

1.2 CoT提示词在Java开发场景中的价值

1.2.1 辅助解决复杂Java问题

场景1:多线程并发调试

  • 无CoT提示词:直接询问"如何解决Java多线程死锁问题?"
  • 有CoT提示词
    1. 先分析死锁产生的条件(互斥资源、持有并等待、不可抢占、循环等待)
    2. 使用jstack或jvisualvm定位死锁线程
    3. 分析线程调用栈,找出资源竞争点
    4. 提供解决方案(避免嵌套锁、使用超时锁、调整锁顺序)

场景2:框架源码分析

  • 无CoT提示词:询问"Spring Boot自动配置原理是什么?"
  • 有CoT提示词
    1. 从@SpringBootApplication注解入手
    2. 分析@EnableAutoConfiguration的导入机制
    3. 追踪spring.factories文件的加载流程
    4. 理解条件注解(@ConditionalOnClass等)的匹配逻辑
    5. 总结自动配置的完整链路
1.2.2 生成结构化技术方案

场景:Spring Boot项目架构设计

CoT提示词示例

diff 复制代码
请帮我设计一个Spring Boot微服务项目的架构方案,请按以下步骤思考:

步骤1:明确业务边界
- 识别核心业务模块(用户服务、订单服务、支付服务)
- 确定服务间的依赖关系

步骤2:技术选型
- Web框架:Spring Boot 3.x
- 服务注册与发现:Nacos
- 配置中心:Nacos Config
- 网关:Spring Cloud Gateway
- 数据库:MySQL 8.0 + Redis 7.0
- 消息队列:RocketMQ

步骤3:分层架构设计
- Controller层:RESTful API设计
- Service层:业务逻辑封装
- Repository层:数据访问抽象
- 公共模块:统一响应格式、异常处理、工具类

步骤4:非功能性需求
- 接口限流:使用Sentinel
- 分布式事务:Seata
- 日志追踪:SkyWalking
- 监控告警:Prometheus + Grafana

请按照以上步骤,输出完整的架构设计方案。
1.2.3 优化AI生成代码的准确性

场景:避免语法错误和设计模式问题

无CoT提示词:直接要求"写一个单例模式"

有CoT提示词

diff 复制代码
请实现一个线程安全的单例模式,请按以下步骤思考:

步骤1:选择实现方式
- 考虑场景:是否需要延迟加载?是否需要序列化支持?
- 推荐:双重检查锁定(DCL)或枚举单例

步骤2:实现核心逻辑
- 私有化构造函数
- 提供静态获取实例方法
- 添加volatile关键字保证可见性(如使用DCL)

步骤3:考虑边界情况
- 反射攻击防护
- 序列化/反序列化防护
- 多线程环境下的安全性验证

步骤4:编写单元测试
- 验证单例性
- 验证线程安全性

请按照以上步骤,输出完整的代码实现和测试用例。

2. Java开发场景下CoT提示词的关键构成要素拆解

一个高质量的Java开发CoT提示词应包含以下四个核心模块:

2.1 模块1:需求边界定义

作用:明确问题的范围、约束条件和预期目标,避免AI生成范围偏差或不符合实际需求的代码。

Java场景示例:实现基于Redis的Java缓存工具类

无边界定义

复制代码
写一个Redis缓存工具类

有边界定义的CoT提示词

diff 复制代码
请实现一个基于Redis的Java缓存工具类,请先明确以下边界条件:

边界1:功能范围
- 支持String、Object类型的缓存读写
- 支持设置过期时间(支持固定时间和相对时间)
- 支持批量操作(批量读取、批量删除)
- 不支持分布式锁功能(后续单独实现)

边界2:异常处理要求
- Redis连接失败:抛出自定义CacheException,包含原始异常信息
- 序列化失败:记录日志并返回null,不中断业务流程
- 键值对不存在:返回null,不抛异常

边界3:与Spring框架集成方式
- 使用Spring Data Redis作为底层客户端
- 支持通过@Autowired注入使用
- 配置类使用@Configuration,支持条件装配(@ConditionalOnClass(RedisTemplate.class))

边界4:性能要求
- 批量操作使用Pipeline减少网络往返
- 对象序列化使用Jackson(避免Java原生序列化的性能问题)

请按照以上边界条件,设计并实现该缓存工具类。

2.2 模块2:技术栈限定

作用:指定具体的技术版本和依赖,确保AI生成的代码符合当前项目技术栈,减少适配成本。

Java场景示例:微服务接口开发

无技术栈限定

复制代码
开发一个用户查询接口

有技术栈限定的CoT提示词

diff 复制代码
请开发一个用户查询接口,技术栈要求如下:

技术栈限定:
- Java版本:Java 17(使用record类型定义DTO)
- Web框架:Spring Boot 3.2.0
- 数据库:MySQL 8.0
- ORM框架:MyBatis-Plus 3.5.3
- 参数校验:Hibernate Validator 8.0.0
- 响应格式:统一使用Result<T>封装(code、message、data字段)
- 日志框架:SLF4J + Logback

请按照以上技术栈,输出完整的接口代码(Controller、Service、Mapper、实体类)。

2.3 模块3:步骤化推理引导

作用:将复杂需求拆解为清晰的步骤序列,引导AI按照Java开发的标准流程输出代码。

Java场景示例:开发Java接口并实现数据校验

无步骤引导

复制代码
开发一个用户注册接口,需要数据校验

有步骤引导的CoT提示词

markdown 复制代码
请开发一个用户注册接口并实现数据校验,请按以下步骤实现:

步骤1:定义接口请求参数实体类
- 创建UserRegisterRequest类
- 使用Hibernate Validator注解标注校验规则:
  * @NotNull + @Size:用户名(3-20字符)
  * @NotNull + @Email:邮箱格式校验
  * @NotNull + @Pattern:手机号格式校验(11位数字)
  * @NotNull + @Size(min=8):密码长度校验

步骤2:编写接口Controller层
- 使用@RestController + @RequestMapping
- 方法参数使用@Valid注解触发校验
- 方法参数使用@RequestBody接收JSON请求

步骤3:编写接口Service层逻辑
- 实现用户注册业务逻辑
- 检查用户名、邮箱、手机号是否已存在
- 密码使用BCrypt加密存储
- 返回用户ID

步骤4:全局异常处理校验失败场景
- 创建@ControllerAdvice全局异常处理器
- 捕获MethodArgumentNotValidException
- 提取校验失败的字段和错误信息
- 返回统一的错误响应格式(code=400,message包含具体校验错误)

步骤5:编写单元测试
- 测试正常注册场景
- 测试各种校验失败场景(用户名过短、邮箱格式错误等)

请按照以上步骤,输出完整的代码实现。

2.4 模块4:输出格式要求

作用:明确AI输出的格式和规范,确保生成的代码可直接复用,符合团队编码规范。

Java场景示例:缓存工具类实现

无输出格式要求

复制代码
实现一个缓存工具类

有输出格式要求的CoT提示词

markdown 复制代码
请实现一个Redis缓存工具类,输出格式要求如下:

输出格式要求:
1. 代码结构
   - 完整的类代码(包含package、import、类注释)
   - 关键方法需包含JavaDoc注释(@param、@return、@throws)
   - 代码需符合阿里巴巴Java开发手册规范:
     * 类名使用UpperCamelCase
     * 方法名使用lowerCamelCase
     * 常量使用UPPER_SNAKE_CASE
     * 每行代码不超过120字符

2. 关键步骤注释
   - 每个核心方法内部需添加步骤注释,说明逻辑流程
   - 复杂逻辑需解释设计思路(如为什么使用Pipeline)

3. 测试用例
   - 提供JUnit 5测试类
   - 包含正常场景和异常场景的测试用例
   - 测试类命名:CacheUtilTest

4. 使用示例
   - 提供Spring Boot配置类示例
   - 提供Controller中使用缓存工具类的示例代码

请按照以上格式要求,输出完整的实现代码。

3. 复杂Java技术需求拆解为AI可理解步骤的实操案例

案例1:实现分布式事务(Seata)在微服务中的集成

第一步:明确需求核心痛点

核心痛点

  • 微服务架构下,跨服务的数据一致性难以保证
  • 部分服务执行成功、部分服务执行失败时,已成功的数据无法回滚
  • 需要实现分布式事务的ACID特性(特别是原子性和一致性)

业务场景示例

  • 订单服务创建订单
  • 库存服务扣减库存
  • 支付服务处理支付
  • 任何一个服务失败,都需要回滚所有已执行的操作
第二步:拆解技术实现子步骤

步骤拆解

markdown 复制代码
步骤1:引入Seata依赖(指定版本)
- 在订单服务、库存服务、支付服务的pom.xml中添加Seata依赖
- 使用Seata 1.7.1版本(与Spring Boot 3.x兼容)
- 依赖包括:seata-spring-boot-starter、seata-all

步骤2:配置Seata事务组、注册中心地址
- 在application.yml中配置:
  * seata.application-id:应用ID
  * seata.tx-service-group:事务组名称(需与Seata Server配置一致)
  * seata.config.type:配置中心类型(nacos/file)
  * seata.registry.type:注册中心类型(nacos/eureka)
  * seata.registry.nacos.server-addr:Nacos地址

步骤3:编写业务服务(含@GlobalTransactional注解使用)
- 在订单服务中创建订单方法上添加@GlobalTransactional注解
- 调用库存服务和支付服务时,确保使用Feign或RestTemplate进行HTTP调用
- 注意:@GlobalTransactional只能标注在发起事务的服务方法上

步骤4:配置数据源代理
- 配置Seata的数据源代理,替换原有的DataSource
- 使用SeataDataSourceBeanPostProcessor自动代理数据源
- 注意:需排除Spring Boot的自动数据源配置,避免冲突

步骤5:测试事务回滚场景
- 模拟库存服务抛出异常
- 验证订单服务和支付服务的数据是否被回滚
- 查看Seata Server的事务日志,确认事务状态
第三步:标注每个子步骤的技术关键点

技术关键点标注

  • 步骤1关键点:Seata版本需与Spring Boot版本匹配,Spring Boot 3.x需使用Seata 1.7.1+
  • 步骤2关键点:tx-service-group需在Seata Server的file.conf中配置对应的集群名称
  • 步骤3关键点:@GlobalTransactional注解需放在事务发起方,被调用方不需要添加
  • 步骤4关键点:数据源代理配置需注意与Spring Boot自动配置的兼容,避免数据源冲突;需配置undo_log表用于存储回滚日志
  • 步骤5关键点:测试时需确保Seata Server正常运行,且各服务的注册中心配置正确
第四步:设计对应的CoT提示词

完整CoT提示词

diff 复制代码
请帮我实现Seata分布式事务在Spring Boot微服务中的集成,请按以下步骤思考并实现:

【需求背景】
我需要在一个包含订单服务、库存服务、支付服务的微服务系统中,实现分布式事务。
当订单服务创建订单后,需要调用库存服务扣减库存,然后调用支付服务处理支付。
如果任何一个服务失败,都需要回滚所有已执行的操作。

【技术栈限定】
- Spring Boot 3.2.0
- Java 17
- Seata 1.7.1
- Nacos 2.2.0(作为注册中心和配置中心)
- MySQL 8.0
- MyBatis-Plus 3.5.3

【实现步骤】

步骤1:引入Seata依赖
- 在三个服务的pom.xml中添加Seata相关依赖
- 指定Seata版本为1.7.1(确保与Spring Boot 3.x兼容)
- 依赖包括:seata-spring-boot-starter、seata-all

步骤2:配置Seata事务组和注册中心
- 在application.yml中配置Seata相关参数:
  * seata.application-id:各服务的应用ID(order-service、inventory-service、payment-service)
  * seata.tx-service-group:事务组名称(my_test_tx_group)
  * seata.config.type:nacos
  * seata.config.nacos.server-addr:127.0.0.1:8848
  * seata.registry.type:nacos
  * seata.registry.nacos.server-addr:127.0.0.1:8848
- 注意:tx-service-group需与Seata Server的file.conf中配置的集群名称一致

步骤3:编写业务服务代码
- 在订单服务的OrderService中创建createOrder方法
- 方法上添加@GlobalTransactional(rollbackFor = Exception.class)注解
- 方法内部依次调用:
  1. 本地数据库插入订单记录
  2. 通过Feign调用库存服务扣减库存
  3. 通过Feign调用支付服务处理支付
- 注意:@GlobalTransactional只能标注在事务发起方(订单服务),被调用方不需要添加

步骤4:配置数据源代理
- 创建SeataConfig配置类
- 使用@Configuration注解
- 配置SeataDataSourceBeanPostProcessor自动代理数据源
- 排除Spring Boot的自动数据源配置(使用@SpringBootApplication(exclude = DataSourceAutoConfiguration.class))
- 在各服务的数据库中创建undo_log表(用于存储Seata的回滚日志)

步骤5:测试事务回滚场景
- 编写测试用例,模拟库存服务抛出异常
- 验证订单服务的数据是否被回滚(订单记录不应存在)
- 查看Seata Server的控制台,确认事务状态为Rollbacked

【输出要求】
1. 提供三个服务的完整配置代码(application.yml)
2. 提供订单服务的完整业务代码(Controller、Service、Mapper)
3. 提供SeataConfig配置类代码
4. 提供undo_log表的SQL脚本
5. 提供测试用例代码
6. 代码需符合阿里巴巴Java开发手册规范,包含必要的注释

请按照以上步骤,输出完整的实现方案。
第五步:对比"无CoT提示词"与"有CoT提示词"的AI输出差异

无CoT提示词

复制代码
请帮我集成Seata分布式事务

AI输出特点

  • 可能只给出部分配置代码,缺少关键步骤
  • 没有说明@GlobalTransactional的使用位置
  • 缺少数据源代理配置
  • 没有提供测试用例
  • 代码注释不完整

有CoT提示词

  • 输出完整的三个服务的配置和代码
  • 明确说明@GlobalTransactional的使用场景和注意事项
  • 包含数据源代理配置和undo_log表创建脚本
  • 提供完整的测试用例
  • 代码包含详细注释和关键点说明
  • 输出结构清晰,可直接按照步骤实施

案例2:开发Java定时任务并实现动态启停与参数调整

第一步:明确需求核心痛点

核心痛点

  • 传统@Scheduled注解实现的定时任务无法动态启停
  • 任务执行参数需要重启应用才能修改
  • 需要支持多个定时任务的管理,每个任务可独立控制
第二步:拆解技术实现子步骤

步骤拆解

diff 复制代码
步骤1:设计定时任务管理接口
- 定义TaskScheduler接口,包含启动、停止、更新参数方法
- 使用ThreadPoolTaskScheduler作为任务调度器
- 使用ScheduledFuture保存任务句柄,用于后续停止任务

步骤2:实现任务配置存储
- 创建TaskConfig实体类(任务名称、cron表达式、是否启用、任务参数)
- 使用数据库存储任务配置(支持动态修改)
- 提供TaskConfigService用于配置的CRUD操作

步骤3:实现动态任务调度核心逻辑
- 创建DynamicTaskScheduler类,实现TaskScheduler接口
- 实现startTask方法:根据配置创建ScheduledFuture并启动任务
- 实现stopTask方法:通过ScheduledFuture取消任务
- 实现updateTask方法:先停止旧任务,再启动新任务

步骤4:实现任务配置变更监听
- 使用@EventListener监听配置变更事件
- 当配置变更时,自动更新对应的定时任务
- 支持任务的启用/禁用切换

步骤5:提供管理接口
- 创建TaskManageController,提供RESTful API
- 接口包括:启动任务、停止任务、更新任务配置、查询任务状态
- 使用统一响应格式封装返回结果
第三步:标注每个子步骤的技术关键点

技术关键点

  • 步骤1关键点:ThreadPoolTaskScheduler需配置线程池大小,避免任务过多导致线程耗尽
  • 步骤2关键点:任务参数使用JSON格式存储,方便扩展;需考虑配置的并发修改问题
  • 步骤3关键点:ScheduledFuture的cancel方法需传入true参数,确保正在执行的任务也能被中断
  • 步骤4关键点:配置变更监听需考虑事务提交时机,避免配置已更新但任务未更新的不一致状态
  • 步骤5关键点:管理接口需添加权限控制,避免未授权用户操作定时任务
第四步:设计对应的CoT提示词

完整CoT提示词

markdown 复制代码
请帮我实现Java定时任务的动态启停与参数调整功能,请按以下步骤思考并实现:

【需求背景】
我需要实现一个定时任务管理系统,支持:
1. 动态启动和停止定时任务(无需重启应用)
2. 动态修改任务的执行参数和cron表达式
3. 支持多个定时任务的独立管理
4. 任务配置存储在数据库中,支持持久化

【技术栈限定】
- Spring Boot 3.2.0
- Java 17
- MySQL 8.0
- MyBatis-Plus 3.5.3
- Spring Task(使用ThreadPoolTaskScheduler)

【实现步骤】

步骤1:设计定时任务管理接口
- 创建TaskScheduler接口,定义以下方法:
  * void startTask(String taskName):启动指定任务
  * void stopTask(String taskName):停止指定任务
  * void updateTask(String taskName, TaskConfig config):更新任务配置
  * TaskStatus getTaskStatus(String taskName):获取任务状态
- 使用ThreadPoolTaskScheduler作为底层调度器
- 使用ConcurrentHashMap<String, ScheduledFuture>保存任务句柄,key为任务名称

步骤2:实现任务配置存储
- 创建TaskConfig实体类,包含字段:
  * taskName:任务名称(唯一)
  * cronExpression:cron表达式
  * enabled:是否启用
  * taskParams:任务参数(JSON格式存储)
  * description:任务描述
- 创建task_config表,使用MyBatis-Plus进行CRUD操作
- 创建TaskConfigService,提供配置的增删改查方法

步骤3:实现动态任务调度核心逻辑
- 创建DynamicTaskScheduler类,实现TaskScheduler接口
- 实现startTask方法:
  1. 从数据库查询任务配置
  2. 检查任务是否已存在,如存在则先停止
  3. 根据cron表达式创建ScheduledFuture
  4. 将ScheduledFuture保存到Map中
- 实现stopTask方法:
  1. 从Map中获取ScheduledFuture
  2. 调用cancel(true)取消任务(true表示中断正在执行的任务)
  3. 从Map中移除任务句柄
- 实现updateTask方法:
  1. 更新数据库中的任务配置
  2. 调用stopTask停止旧任务
  3. 调用startTask启动新任务

步骤4:实现任务配置变更监听
- 创建TaskConfigChangeEvent事件类
- 在TaskConfigService的更新方法中发布事件
- 创建TaskConfigChangeListener,使用@EventListener监听事件
- 监听器中调用DynamicTaskScheduler的updateTask方法更新任务

步骤5:提供管理接口
- 创建TaskManageController,提供以下RESTful API:
  * POST /api/task/start/{taskName}:启动任务
  * POST /api/task/stop/{taskName}:停止任务
  * PUT /api/task/{taskName}:更新任务配置
  * GET /api/task/{taskName}/status:查询任务状态
  * GET /api/task/list:查询所有任务列表
- 使用统一响应格式Result<T>封装返回结果
- 添加参数校验和异常处理

【输出要求】
1. 提供完整的实体类、Service、Controller代码
2. 提供数据库表创建SQL脚本
3. 提供ThreadPoolTaskScheduler的配置类代码
4. 提供使用示例(如何定义一个可动态管理的定时任务)
5. 代码需包含详细注释,说明关键逻辑
6. 提供API测试用例(使用Postman或curl命令)

请按照以上步骤,输出完整的实现方案。

案例3:优化Java项目中MySQL慢查询(含SQL改写、索引设计)

第一步:明确需求核心痛点

核心痛点

  • 生产环境出现慢查询,影响系统性能
  • 需要识别慢查询SQL,分析执行计划
  • 通过SQL改写和索引优化提升查询性能
第二步:拆解技术实现子步骤

步骤拆解

diff 复制代码
步骤1:开启MySQL慢查询日志
- 配置slow_query_log=ON
- 设置long_query_time阈值(如1秒)
- 配置slow_query_log_file路径

步骤2:分析慢查询SQL
- 使用mysqldumpslow工具分析慢查询日志
- 识别高频慢查询SQL
- 使用EXPLAIN分析SQL执行计划

步骤3:SQL改写优化
- 避免SELECT *,只查询需要的字段
- 使用JOIN替代子查询
- 避免在WHERE子句中使用函数
- 使用LIMIT限制返回结果集大小

步骤4:索引设计优化
- 分析WHERE、ORDER BY、GROUP BY字段
- 创建合适的索引(单列索引、复合索引)
- 注意索引的选择性和覆盖索引的使用
- 避免创建过多索引(影响写入性能)

步骤5:验证优化效果
- 对比优化前后的执行时间
- 使用EXPLAIN对比执行计划变化
- 监控慢查询日志,确认慢查询数量减少
第三步:标注每个子步骤的技术关键点

技术关键点

  • 步骤1关键点:生产环境开启慢查询日志需注意磁盘空间,定期清理日志文件
  • 步骤2关键点:EXPLAIN重点关注type字段(ALL最差,index最好)、key字段(是否使用索引)、rows字段(扫描行数)
  • 步骤3关键点:SQL改写需保证业务逻辑不变,建议先在测试环境验证
  • 步骤4关键点:复合索引遵循最左前缀原则;索引字段顺序需考虑查询频率和选择性
  • 步骤5关键点:优化后需持续监控,避免出现新的慢查询
第四步:设计对应的CoT提示词

完整CoT提示词

sql 复制代码
请帮我优化Java项目中的MySQL慢查询问题,请按以下步骤分析并优化:

【问题背景】
生产环境出现慢查询,影响系统性能。需要识别慢查询SQL,通过SQL改写和索引优化提升查询性能。

【当前环境】
- MySQL 8.0
- Spring Boot 3.2.0
- MyBatis-Plus 3.5.3
- 主要慢查询表:order表(1000万数据)、user表(500万数据)

【优化步骤】

步骤1:开启MySQL慢查询日志
- 在MySQL配置文件中设置:
  * slow_query_log = ON
  * long_query_time = 1(超过1秒的查询记录为慢查询)
  * slow_query_log_file = /var/log/mysql/slow-query.log
- 提供开启慢查询日志的SQL命令和配置文件示例

步骤2:分析慢查询SQL
- 使用mysqldumpslow工具分析慢查询日志:
  * mysqldumpslow -s t -t 10 slow-query.log(按执行时间排序,显示前10条)
- 识别高频慢查询SQL,重点关注:
  * 执行次数最多的SQL
  * 平均执行时间最长的SQL
  * 总耗时最长的SQL
- 对每个慢查询SQL使用EXPLAIN分析执行计划:
  * 重点关注type字段(ALL表示全表扫描,需优化)
  * 关注key字段(是否使用了索引)
  * 关注rows字段(扫描的行数)

步骤3:SQL改写优化
针对以下常见慢查询场景,提供SQL改写方案:
- 场景1:SELECT * FROM order WHERE user_id = ? AND create_time > ?
  * 改写:只查询需要的字段,避免全字段查询
- 场景2:SELECT * FROM order WHERE id IN (SELECT order_id FROM order_item WHERE product_id = ?)
  * 改写:使用JOIN替代子查询
- 场景3:SELECT * FROM order WHERE DATE(create_time) = '2024-01-01'
  * 改写:避免在WHERE子句中使用函数,改为范围查询
- 场景4:SELECT * FROM order ORDER BY create_time DESC LIMIT 10
  * 改写:如果只需要前10条,确保有索引支持排序

步骤4:索引设计优化
针对order表和user表,设计合适的索引:
- order表索引设计:
  * 主键索引:id(已存在)
  * 复合索引:(user_id, create_time) - 用于用户订单查询和排序
  * 单列索引:status - 用于订单状态筛选
  * 注意:避免创建过多索引,影响INSERT/UPDATE性能
- user表索引设计:
  * 主键索引:id(已存在)
  * 唯一索引:email - 用于登录查询
  * 复合索引:(phone, status) - 用于手机号和状态联合查询
- 索引创建SQL示例:
  * CREATE INDEX idx_user_create_time ON order(user_id, create_time);
  * CREATE INDEX idx_status ON order(status);

步骤5:验证优化效果
- 对比优化前后的执行时间:
  * 使用SELECT BENCHMARK(1000000, SQL)测试执行时间
  * 或使用EXPLAIN ANALYZE(MySQL 8.0.18+)查看实际执行时间
- 使用EXPLAIN对比执行计划变化:
  * 优化前:type=ALL, rows=10000000
  * 优化后:type=ref, rows=100, key=idx_user_create_time
- 监控慢查询日志,确认慢查询数量减少

【输出要求】
1. 提供MySQL慢查询日志配置示例(my.cnf或my.ini)
2. 提供慢查询分析脚本(shell脚本或Python脚本)
3. 提供至少3个SQL改写示例(改写前后的SQL对比)
4. 提供完整的索引设计SQL脚本
5. 提供索引设计说明文档(说明每个索引的设计理由)
6. 提供优化效果验证方法(包括测试SQL和预期结果)
7. 提供Java代码层面的优化建议(如使用MyBatis-Plus的批量查询、分页查询优化)

请按照以上步骤,输出完整的优化方案。

4. Java开发人员使用CoT提示词的避坑指南与优化技巧

4.1 常见问题及优化方案

问题1:步骤拆解过于笼统

问题表现

复制代码
请开发一个Java缓存工具类

问题分析

  • 未拆解缓存更新策略、并发安全处理等关键步骤
  • AI可能输出简单粗糙的实现,缺少必要的功能
  • 没有明确技术选型和异常处理要求

优化方案

优化后的CoT提示词

diff 复制代码
请开发一个Java缓存工具类,请按以下步骤实现:

步骤1:定义缓存接口
- 定义Cache接口,包含get、put、delete、clear方法
- 考虑泛型设计,支持不同类型的缓存值

步骤2:实现核心缓存逻辑
- 使用ConcurrentHashMap作为底层存储(保证线程安全)
- 实现基本的get、put、delete方法
- 考虑缓存容量限制(LRU淘汰策略)

步骤3:实现缓存过期机制
- 为每个缓存项添加过期时间字段
- 实现定时清理过期缓存的机制(使用ScheduledExecutorService)
- 在get方法中检查是否过期,过期则返回null并删除

步骤4:处理并发安全
- 使用ConcurrentHashMap保证并发读写安全
- 对于缓存更新操作,使用synchronized或ReentrantLock保证原子性
- 考虑缓存穿透问题(对不存在的key也进行缓存,设置较短的过期时间)

步骤5:编写单元测试
- 测试基本功能(get、put、delete)
- 测试过期机制
- 测试并发场景(使用CountDownLatch模拟多线程)

请按照以上步骤,输出完整的代码实现。

优化要点

  • 按"定义接口→实现核心逻辑→处理异常→编写测试"的Java开发流程拆解步骤
  • 每个步骤补充1-2个技术细节(如使用ConcurrentHashMap、LRU策略)
  • 明确异常场景的处理方式(缓存穿透)

问题2:未限定技术细节

问题表现

复制代码
请实现文件上传功能

问题分析

  • 未说明使用Java NIO还是传统IO流
  • 未指定文件存储方式(本地存储、OSS、MinIO)
  • AI可能生成不符合项目技术选型的代码

优化方案

优化后的CoT提示词

markdown 复制代码
请实现文件上传功能,技术细节要求如下:

【技术栈限定】
- 使用Spring Boot 3.2.0
- 文件存储:本地文件系统(不使用OSS或MinIO)
- 文件处理:使用Apache Commons FileUpload(不使用Java NIO)
- 文件大小限制:单个文件最大10MB,总请求大小最大50MB
- 支持的文件类型:jpg、png、pdf、doc、docx

【实现步骤】

步骤1:配置文件上传参数
- 在application.yml中配置:
  * spring.servlet.multipart.max-file-size: 10MB
  * spring.servlet.multipart.max-request-size: 50MB
  * spring.servlet.multipart.enabled: true

步骤2:实现文件上传Controller
- 使用@PostMapping接收multipart/form-data请求
- 使用@RequestParam("file") MultipartFile接收文件
- 文件类型校验:检查文件扩展名是否在允许列表中
- 文件大小校验:检查文件大小是否超过限制

步骤3:实现文件存储逻辑
- 创建FileStorageService服务类
- 生成唯一文件名(UUID + 原始文件扩展名)
- 将文件保存到指定目录(如:/data/uploads/yyyy/MM/dd/)
- 按日期创建子目录,避免单个目录文件过多

步骤4:实现文件信息记录
- 创建FileInfo实体类(文件名、原始文件名、文件路径、文件大小、上传时间)
- 将文件信息保存到数据库(用于后续文件管理和下载)

步骤5:异常处理
- 文件大小超限:抛出FileSizeLimitExceededException
- 文件类型不支持:抛出UnsupportedFileTypeException
- 文件保存失败:抛出FileStorageException
- 使用@ControllerAdvice统一处理异常,返回错误响应

请按照以上技术细节和步骤,输出完整的实现代码。

优化要点

  • 明确指定技术选型(本地存储、Commons FileUpload)
  • 限定具体的技术参数(文件大小、支持类型)
  • 说明每个步骤的技术实现细节

问题3:忽略异常场景引导

问题表现

复制代码
请实现Redis缓存工具类

问题分析

  • 未要求AI考虑Redis连接超时、序列化失败等异常场景
  • 生成的代码可能缺乏健壮性,生产环境容易出问题

优化方案

优化后的CoT提示词

markdown 复制代码
请实现Redis缓存工具类,请特别关注异常场景的处理:

【技术栈限定】
- Spring Boot 3.2.0
- Spring Data Redis
- Jackson序列化

【实现步骤】

步骤1:实现基本缓存操作
- 实现get、put、delete、exists方法
- 使用RedisTemplate进行操作

步骤2:处理Redis连接异常场景
- Redis连接超时:捕获RedisConnectionFailureException
  * 记录错误日志(包含原始异常信息)
  * 返回null或false,不中断业务流程
  * 考虑实现降级策略(连接失败时使用本地缓存)
- Redis命令执行失败:捕获RedisException
  * 记录错误日志
  * 根据异常类型决定是否重试(如网络超时可重试,命令错误不重试)

步骤3:处理序列化异常场景
- 对象序列化失败:捕获JsonProcessingException
  * 记录错误日志(包含序列化失败的key和对象类型)
  * 返回null,不抛异常
  * 考虑使用try-catch包裹序列化操作
- 对象反序列化失败:捕获JsonMappingException
  * 记录错误日志
  * 返回null,并删除该key(避免下次再次反序列化失败)

步骤4:处理缓存穿透场景
- 对于查询不存在的key,也进行缓存(缓存null值,设置较短过期时间)
- 使用布隆过滤器(BloomFilter)预先判断key是否存在(可选)

步骤5:编写异常场景测试用例
- 测试Redis连接断开场景
- 测试序列化失败场景
- 测试缓存穿透场景
- 验证异常情况下系统不会崩溃

【输出要求】
- 代码需包含完整的异常处理逻辑
- 每个异常场景都需有对应的日志记录
- 提供异常场景的测试用例
- 说明异常处理的设计思路

请按照以上步骤,输出完整的实现代码。

优化要点

  • 明确列出需要处理的异常场景(连接超时、序列化失败等)
  • 要求AI为每个异常场景提供处理方案
  • 要求提供异常场景的测试用例

4.2 通用优化技巧总结

技巧1:使用"先分析后实现"的CoT结构

模板

diff 复制代码
请帮我实现[功能描述],请按以下步骤思考:

步骤1:需求分析
- 明确功能的核心目标
- 识别关键的技术难点
- 列出需要处理的边界情况

步骤2:技术选型
- 选择合适的技术方案
- 说明选型理由
- 列出技术栈版本要求

步骤3:详细设计
- 设计类结构和接口
- 设计数据模型
- 设计异常处理机制

步骤4:编码实现
- 按照设计实现代码
- 添加必要的注释
- 遵循编码规范

步骤5:测试验证
- 编写单元测试
- 编写集成测试
- 验证边界情况

请按照以上步骤,输出完整的实现方案。
技巧2:使用"对比优化"的CoT结构

模板

diff 复制代码
请帮我优化[现有功能],请按以下步骤分析:

步骤1:现状分析
- 分析当前实现的优缺点
- 识别性能瓶颈
- 找出潜在问题

步骤2:优化方案设计
- 设计优化方案
- 对比优化前后的差异
- 评估优化效果

步骤3:实施优化
- 按照优化方案修改代码
- 保持功能兼容性
- 添加必要的注释

步骤4:验证优化效果
- 对比优化前后的性能指标
- 验证功能正确性
- 确认无回归问题

请按照以上步骤,输出优化方案和代码。
技巧3:使用"场景驱动"的CoT结构

模板

css 复制代码
请帮我实现[功能描述],请针对以下场景分别设计解决方案:

场景1:[场景描述]
- 需求特点:[特点说明]
- 实现方案:[方案说明]
- 关键技术点:[技术点说明]

场景2:[场景描述]
- 需求特点:[特点说明]
- 实现方案:[方案说明]
- 关键技术点:[技术点说明]

...

请针对每个场景,输出对应的实现代码和说明。

5. 实战练习任务设计

5.1 练习任务

任务描述

请按照本指南所学的方法,自行拆解以下复杂Java需求,并设计对应的CoT提示词:

需求:开发一个基于RabbitMQ的Java消息队列生产者/消费者,实现消息可靠投递(含确认机制、死信队列)与延迟消息功能。

要求

  1. 将需求拆解为5-7个清晰的步骤
  2. 每个步骤需包含技术细节说明
  3. 明确技术栈限定和输出格式要求
  4. 考虑异常场景的处理
  5. 设计完整的CoT提示词

5.2 参考拆解思路

第一步:明确需求核心痛点

核心痛点

  • 消息在传输过程中可能丢失(网络故障、服务重启)
  • 消费者处理消息失败后,消息需要重新投递或进入死信队列
  • 需要支持延迟消息功能(如订单30分钟未支付自动取消)
第二步:拆解技术实现子步骤

步骤拆解

markdown 复制代码
步骤1:引入RabbitMQ依赖和配置连接
- 在pom.xml中添加spring-boot-starter-amqp依赖
- 配置RabbitMQ连接信息(host、port、username、password、virtual-host)
- 配置RabbitMQTemplate和ConnectionFactory

步骤2:实现消息可靠投递机制(生产者端)
- 开启发布确认模式(publisher-confirm-type: correlated)
- 实现ConfirmCallback回调,处理消息发送成功/失败的回调
- 开启返回模式(publisher-returns: true),处理路由失败的消息
- 实现ReturnCallback回调,处理路由失败的消息
- 消息持久化:设置delivery-mode为2(持久化)

步骤3:实现消息确认机制(消费者端)
- 设置手动确认模式(acknowledge-mode: manual)
- 在消费者方法中使用Channel.basicAck确认消息
- 实现消息处理失败时的拒绝机制(basicNack或basicReject)
- 设置requeue参数,决定是否重新入队

步骤4:实现死信队列机制
- 创建死信交换机(DLX)和死信队列(DLQ)
- 在业务队列上绑定死信交换机,设置x-dead-letter-exchange参数
- 配置消息进入死信队列的条件(消息被拒绝且不重新入队、消息过期、队列达到最大长度)
- 创建死信队列的消费者,处理死信消息(记录日志、告警等)

步骤5:实现延迟消息功能
- 方案1:使用RabbitMQ延迟消息插件(rabbitmq-delayed-message-exchange)
  * 安装延迟消息插件
  * 创建延迟交换机(类型为x-delayed-message)
  * 发送消息时设置x-delay头部(延迟时间,单位毫秒)
- 方案2:使用TTL+死信队列实现延迟消息
  * 创建延迟队列,设置TTL
  * 延迟队列的消息过期后进入死信队列(实际是目标队列)
  * 消费者从目标队列消费消息

步骤6:实现消息生产者服务
- 创建MessageProducerService服务类
- 实现sendMessage方法,发送普通消息
- 实现sendDelayedMessage方法,发送延迟消息
- 实现sendReliableMessage方法,发送可靠消息(带确认回调)

步骤7:实现消息消费者服务
- 创建MessageConsumerService服务类
- 使用@RabbitListener注解监听队列
- 实现消息处理逻辑,包含异常处理
- 处理成功后调用basicAck确认,失败后调用basicNack拒绝
第三步:标注每个子步骤的技术关键点

技术关键点

  • 步骤1关键点:RabbitMQ版本需与Spring Boot版本匹配,Spring Boot 3.x需使用RabbitMQ 3.12+
  • 步骤2关键点:发布确认模式需在配置类中设置RabbitTemplate的ConfirmCallback和ReturnCallback
  • 步骤3关键点:手动确认模式下,必须调用basicAck,否则消息会一直留在队列中;异常情况下需调用basicNack并设置requeue=false,让消息进入死信队列
  • 步骤4关键点:死信队列的绑定需在队列声明时设置参数,不能后续修改
  • 步骤5关键点:延迟消息插件方案更简单直接,但需要安装插件;TTL方案无需插件,但实现较复杂
  • 步骤6关键点:消息持久化需同时设置delivery-mode和队列的durable属性
  • 步骤7关键点:消费者方法需捕获异常,避免异常导致消息丢失;建议使用try-catch包裹业务逻辑
第四步:设计对应的CoT提示词

完整CoT提示词

markdown 复制代码
请帮我实现基于RabbitMQ的Java消息队列生产者/消费者,实现消息可靠投递和延迟消息功能,请按以下步骤思考并实现:

【需求背景】
我需要实现一个消息队列系统,要求:
1. 消息可靠投递:确保消息不丢失,支持发送确认和消费确认
2. 死信队列:处理失败的消息,避免消息丢失
3. 延迟消息:支持延迟指定时间后投递消息(如订单30分钟未支付自动取消)

【技术栈限定】
- Spring Boot 3.2.0
- Java 17
- RabbitMQ 3.12.0
- Spring AMQP(spring-boot-starter-amqp)

【实现步骤】

步骤1:引入RabbitMQ依赖和配置连接
- 在pom.xml中添加spring-boot-starter-amqp依赖
- 在application.yml中配置RabbitMQ连接信息:
  * spring.rabbitmq.host: 127.0.0.1
  * spring.rabbitmq.port: 5672
  * spring.rabbitmq.username: guest
  * spring.rabbitmq.password: guest
  * spring.rabbitmq.virtual-host: /
- 配置RabbitMQTemplate和ConnectionFactory(使用自动配置即可)

步骤2:实现消息可靠投递机制(生产者端)
- 在application.yml中开启发布确认和返回模式:
  * spring.rabbitmq.publisher-confirm-type: correlated
  * spring.rabbitmq.publisher-returns: true
- 创建RabbitMQConfig配置类:
  * 配置RabbitTemplate的ConfirmCallback,处理消息发送成功/失败的回调
  * 配置RabbitTemplate的ReturnCallback,处理路由失败的消息
  * 设置mandatory=true,确保路由失败的消息能触发ReturnCallback
- 消息持久化设置:
  * 在发送消息时设置MessageProperties的delivery-mode为2(持久化)
  * 声明队列时设置durable=true

步骤3:实现消息确认机制(消费者端)
- 在application.yml中设置手动确认模式:
  * spring.rabbitmq.listener.simple.acknowledge-mode: manual
- 在消费者方法中:
  * 使用@RabbitListener注解监听队列
  * 方法参数包含Channel和Message(或使用@Payload和@Header)
  * 消息处理成功后调用channel.basicAck(deliveryTag, false)确认消息
  * 消息处理失败时调用channel.basicNack(deliveryTag, false, false)拒绝消息(不重新入队,进入死信队列)

步骤4:实现死信队列机制
- 创建死信交换机(DLX)和死信队列(DLQ):
  * 死信交换机名称:dlx.exchange
  * 死信队列名称:dlq.queue
  * 绑定关系:dlq.queue绑定到dlx.exchange,routing-key为dlq.routing.key
- 在业务队列声明时设置死信参数:
  * x-dead-letter-exchange: dlx.exchange
  * x-dead-letter-routing-key: dlq.routing.key
- 创建死信队列的消费者:
  * 监听dlq.queue队列
  * 处理死信消息(记录日志、发送告警、持久化到数据库等)

步骤5:实现延迟消息功能
- 使用RabbitMQ延迟消息插件方案(推荐):
  * 安装rabbitmq-delayed-message-exchange插件
  * 在RabbitMQConfig中声明延迟交换机(类型为x-delayed-message,arguments包含x-delayed-type: direct)
  * 创建延迟队列,绑定到延迟交换机
  * 发送消息时设置x-delay头部(延迟时间,单位毫秒)
- 如果无法安装插件,使用TTL+死信队列方案:
  * 创建延迟队列,设置TTL(通过队列参数x-message-ttl或消息属性expiration)
  * 延迟队列绑定到死信交换机,设置x-dead-letter-exchange和x-dead-letter-routing-key指向目标队列
  * 消息在延迟队列中过期后,自动进入目标队列

步骤6:实现消息生产者服务
- 创建MessageProducerService服务类:
  * 注入RabbitTemplate
  * 实现sendMessage方法:发送普通消息到指定队列
  * 实现sendDelayedMessage方法:发送延迟消息(设置x-delay头部)
  * 实现sendReliableMessage方法:发送可靠消息(设置delivery-mode=2,持久化)
- 消息发送方法需包含异常处理:
  * 捕获AmqpException异常
  * 记录错误日志
  * 考虑实现重试机制(使用Spring Retry)

步骤7:实现消息消费者服务
- 创建MessageConsumerService服务类:
  * 使用@RabbitListener注解监听业务队列
  * 方法参数:@Payload String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag
  * 实现消息处理逻辑,使用try-catch包裹:
    - 处理成功:调用channel.basicAck(deliveryTag, false)
    - 处理失败:调用channel.basicNack(deliveryTag, false, false),让消息进入死信队列
  * 记录处理日志(成功和失败都要记录)

【异常场景处理】
1. RabbitMQ连接失败:
   - 捕获AmqpConnectException异常
   - 记录错误日志
   - 考虑实现连接重试机制

2. 消息发送失败:
   - 在ConfirmCallback中处理发送失败的回调
   - 记录失败消息内容,考虑持久化到数据库,后续重试

3. 消息消费异常:
   - 捕获业务异常,调用basicNack拒绝消息
   - 记录异常日志,包含消息内容和异常堆栈
   - 避免无限重试,设置最大重试次数

4. 死信队列消息处理:
   - 死信消息需持久化到数据库,便于后续分析和人工处理
   - 发送告警通知(邮件、短信等)

【输出要求】
1. 提供完整的配置文件(application.yml)
2. 提供RabbitMQConfig配置类代码(包含交换机、队列声明,ConfirmCallback、ReturnCallback配置)
3. 提供MessageProducerService服务类代码(包含所有发送方法)
4. 提供MessageConsumerService服务类代码(包含消费者方法和异常处理)
5. 提供死信队列消费者的代码
6. 提供数据库表设计(用于存储死信消息)
7. 提供使用示例(Controller中调用生产者服务发送消息)
8. 代码需符合阿里巴巴Java开发手册规范,包含详细注释
9. 提供测试用例(使用@SpringBootTest测试消息发送和消费)

请按照以上步骤,输出完整的实现方案。

5.3 自我检查清单

完成CoT提示词设计后,请对照以下清单检查:

  • 需求边界是否清晰:是否明确了功能范围、技术约束、异常处理要求?
  • 技术栈是否限定:是否指定了具体的版本号和依赖?
  • 步骤是否细化:每个步骤是否包含具体的技术实现细节?
  • 关键点是否标注:是否说明了每个步骤的技术关键点和注意事项?
  • 异常场景是否考虑:是否列出了需要处理的异常场景和处理方案?
  • 输出格式是否明确:是否要求了代码格式、注释规范、测试用例等?
  • 实用性是否足够:生成的提示词是否可以直接用于AI交互,解决实际问题?

总结

通过本指南的学习,Java开发人员应掌握:

  1. CoT提示词的核心概念:理解CoT提示词的本质是步骤化推理,类似于代码逻辑流程
  2. CoT提示词的构成要素:掌握需求边界定义、技术栈限定、步骤化推理引导、输出格式要求四个核心模块
  3. 复杂需求的拆解方法:学会将复杂Java技术需求拆解为AI可理解的步骤序列
  4. 避坑技巧:了解常见问题(步骤过于笼统、未限定技术细节、忽略异常场景)及优化方案
  5. 实战应用能力:能够独立设计高质量的CoT提示词,解决实际开发问题

下一步行动建议

  • 在实际工作中尝试使用CoT提示词解决技术问题
  • 根据实际效果不断优化和调整提示词结构
  • 积累不同场景下的CoT提示词模板,形成个人知识库
  • 与团队成员分享CoT提示词的使用经验,共同提升AI辅助开发的效率

附录:常用CoT提示词模板

模板1:功能开发类

css 复制代码
请帮我实现[功能描述],请按以下步骤思考并实现:

【需求背景】
[详细描述需求背景和业务场景]

【技术栈限定】
- [技术1]:[版本号]
- [技术2]:[版本号]
- ...

【实现步骤】
步骤1:[步骤描述]
- [技术细节1]
- [技术细节2]

步骤2:[步骤描述]
- [技术细节1]
- [技术细节2]

...

【异常场景处理】
1. [异常场景1]:[处理方案]
2. [异常场景2]:[处理方案]

【输出要求】
1. [要求1]
2. [要求2]
...

请按照以上步骤,输出完整的实现方案。

模板2:问题优化类

css 复制代码
请帮我优化[现有功能/问题],请按以下步骤分析并优化:

【问题背景】
[描述当前存在的问题和影响]

【现状分析】
- [现状1]
- [现状2]

【优化目标】
- [目标1]
- [目标2]

【优化步骤】
步骤1:[步骤描述]
- [优化方案]
- [关键技术点]

步骤2:[步骤描述]
- [优化方案]
- [关键技术点]

...

【验证方法】
- [验证方法1]
- [验证方法2]

【输出要求】
1. [要求1]
2. [要求2]
...

请按照以上步骤,输出优化方案和代码。

本文档持续更新中,欢迎反馈和改进建议。

相关推荐
一只小小Java1 天前
Java面试场景高频题
java·开发语言·面试
沛沛老爹1 天前
Web开发者快速上手AI Agent:基于Function Calling的12306自动订票系统实战
java·人工智能·agent·web转型
CRUD酱1 天前
后端使用POI解析.xlsx文件(附源码)
java·后端
亓才孓1 天前
多态:编译时看左边,运行时看右边
java·开发语言
2501_941802481 天前
从缓存更新到数据一致性的互联网工程语法实践与多语言探索
java·后端·spring
拆房老料1 天前
文档预览开源选型对比:BaseMetas FileView 与 KK FileView,谁更适合你的系统?
java·开源·java-rocketmq·开源软件
Frank_refuel1 天前
C++之内存管理
java·数据结构·c++
钱多多_qdd1 天前
springboot注解(五)
java·spring boot·后端
2501_941822751 天前
面向灰度发布与风险隔离的互联网系统演进策略与多语言工程实践分享方法论记录思考汇总稿件
android·java·人工智能